<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>elver.me - everything (RSS)</title>
    <link>https://elver.me/</link>
    <description>Recent content on elver.me</description>
    <language>en-gb</language>
    <lastBuildDate>Sun, 07 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://elver.me/feed.rss" rel="self" type="application/x-rss+xml" />
    <item>
      <title>Weeknotes 258: Blog post drought</title>
      <link>https://elver.me/weeknotes/258/</link>
      <pubDate>Sun, 07 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/258/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://stopmakingarrs.org/&#34;&gt;STOP MAKING *ARRS&lt;/a&gt; &amp;ndash; I could not agree more. This is like &lt;code&gt;active_bobbins&lt;/code&gt;
in the Ruby on Rails world all over again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hypercritical.co/2026/05/29/ev-stupidity-checklist&#34;&gt;EV Stupidity Checklist&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;…when today&amp;rsquo;s automakers decide to make an electric vehicle (EV), they
seemingly forget much of what they once knew, creating new versions of
features that are objectively, obviously worse than the time-tested designs
they replace.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was playing around with yet another Phoenix app headed towards abandonment
this week and decided to get it deployed as soon as possible. It is easier to
deploy an app that does nothing than an app that does something.&lt;/p&gt;
&lt;p&gt;The obvious place to deploy it quickly was Fly.io, as I&amp;rsquo;ve done before, and
enjoyed doing so. A problem quickly reared its head though. They no longer
offer an unmanaged cheap Postgres option.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt; had mentioned &lt;a href=&#34;https://planetscale.com/&#34;&gt;PlanetScale&lt;/a&gt; to me recently so I decided to give that a
try. It was not as straightforward as I would&amp;rsquo;ve hoped. I broke a five year
blog post drought and &lt;a href=&#34;/blog/how-to-use-planet-scale-with-phoenix-on-fly-io/&#34;&gt;wrote up the quite easy in the end solution&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://burntsushi.net/encephalitis/&#34;&gt;Encephalitis&lt;/a&gt; - &lt;code&gt;burntsushi&lt;/code&gt; aka Andrew Gallant of &lt;a href=&#34;https://github.com/BurntSushi/ripgrep&#34;&gt;ripgrep&lt;/a&gt; fame has had a
terrible time of it recently. Scary stuff. Thank god he&amp;rsquo;s on the mend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve always been concerned about hosting databases and apps in different
locations. I know this is extremely common now, but I&amp;rsquo;m old and it just felt
wrong some how. I chose the &lt;code&gt;lhr&lt;/code&gt; region for both my app on Fly and my
database on PlanetScale. That at least puts them somewhere in the vicinity of
London. But whether they&amp;rsquo;re in the same data center or not, I do not know.&lt;/p&gt;
&lt;p&gt;I measured query time and my worries were unfounded with them only taking low
single digit milliseconds to complete. And the web app itself feels very
snappy. Not exhaustive of course, but a good representation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve had quite a good time making something this week. This is how is can be.
Making a thing and then being glad you made it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://medium.com/@tridge60/rsync-and-outrage-d9849599e5a0&#34;&gt;rsync and outrage&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;for the people saying things like &amp;ldquo;I&amp;rsquo;m a PhD from xyz uni and I&amp;rsquo;m telling
your LLMs are just stochastic tools that make everything up and the world
will fall apart if you use them&amp;rdquo;, I&amp;rsquo;m here to tell you that you are out of
date.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.rubygems.org/2026/06/03/cooldown-let-new-gems-be-vetted.html&#34;&gt;Cool down before you install: give new gems a few days to be vetted&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;It&amp;rsquo;s about you, your insecurities, and your privileges&amp;rdquo; — I suppose it was
possible that one day I would agree with DHH on something, and today is that
day, partially. I don&amp;rsquo;t necessarily agree with his examples, but I do think
there is gate keeping going on. Still not linking to it though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hauleth.dev/post/review-requires-reading/&#34;&gt;Reviewing code requires reading&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What would it take for you to feel comfortable shipping code to production
without reading it?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=neaxEWkrWL8&#34;&gt;Christopher MacArthur-Boyd | Scary Times&lt;/a&gt; &amp;ndash; Thank me later.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>How to use PlanetScale with Phoenix on Fly.io</title>
      <link>https://elver.me/blog/how-to-use-planet-scale-with-phoenix-on-fly-io/</link>
      <pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/how-to-use-planet-scale-with-phoenix-on-fly-io/</guid>
      <description>&lt;p&gt;I had a small Elixir Phoenix app that I wanted to deploy somewhere for testing.
I reached for &lt;a href=&#34;https://fly.io/&#34;&gt;Fly.io&lt;/a&gt; because I&amp;rsquo;ve played around with the service before and
found it interesting. Unfortunately Fly don&amp;rsquo;t offer the cheap
good-enough-for-testing self-managed Postgres they used to. They only offer
Managed Postgres at Managed Postgres prices now.&lt;/p&gt;
&lt;p&gt;I decided to give &lt;a href=&#34;https://planetscale.com/&#34;&gt;PlanetScale&lt;/a&gt; a go.&lt;/p&gt;
&lt;p&gt;The next step should be as simple as as setting the &lt;code&gt;DATABASE_URL&lt;/code&gt; correctly,
right? Unfortunately not.&lt;/p&gt;
&lt;p&gt;These are the configuration changes I made to get connected to PlanetScale from
my Phoenix app. You may have to make additional changes to get your app fully
deployed.&lt;/p&gt;
&lt;h2 id=&#34;deploy-the-app&#34;&gt;Deploy the app&lt;/h2&gt;
&lt;p&gt;First off, I started the process of deploying my app to Fly.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to set the &lt;code&gt;DATABASE_URL&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fly secrets &lt;span style=&#34;color:#0086b3&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;DATABASE_URL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;postgresql://&amp;lt;username&amp;gt;:&amp;lt;password&amp;gt;@aws-eu-west-2-1.pg.psdb.cloud:5432/postgres?sslmode=verify-full&amp;amp;sslrootcert=system&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, in the app directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fly launch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will generate a &lt;code&gt;Dockerfile&lt;/code&gt; and other config needed for deploying to Fly.
It won&amp;rsquo;t be quite right though, so we&amp;rsquo;ll need to tweak it. The deploy is going
to fail.&lt;/p&gt;
&lt;h2 id=&#34;configure-ssl&#34;&gt;Configure SSL&lt;/h2&gt;
&lt;p&gt;Postgres on PlanetScale is SSL only, so we need to enable that in
&lt;code&gt;config/runtime.exs&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   maybe_ipv6 = if System.get_env(&amp;#34;ECTO_IPV6&amp;#34;) in ~w(true 1), do: [:inet6], else: []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   config :example_app, ExampleApp.Repo,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;-    # ssl: true,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    ssl: true,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;&lt;/span&gt;     url: database_url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     pool_size: String.to_integer(System.get_env(&amp;#34;POOL_SIZE&amp;#34;) || &amp;#34;10&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     # For machines with several cores, consider starting multiple pools of `pool_size`
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     # pool_count: 4,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     socket_options: maybe_ipv6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ipv6-configuration&#34;&gt;IPv6 configuration&lt;/h2&gt;
&lt;p&gt;When Fly configures your app it sets it up to work with their own internal
networking, which uses IPv6 &amp;ndash; very modern. This doesn&amp;rsquo;t work when we are
trying to connect to PlanetScale though.&lt;/p&gt;
&lt;p&gt;We need to tell Ecto to not use IPv6 in &lt;code&gt;rel/env.sh.eex&lt;/code&gt;. This file will have
been generated by &lt;code&gt;fly launch&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; #!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; if [ -n &amp;#34;$FLY_APP_NAME&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   export DNS_CLUSTER_QUERY=&amp;#34;${FLY_APP_NAME}.internal&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   export RELEASE_NODE=&amp;#34;${FLY_APP_NAME}-${FLY_IMAGE_REF##*-}@${FLY_PRIVATE_IP}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   # configure node for distributed erlang with IPV6 support
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   export ERL_AFLAGS=&amp;#34;-proto_dist inet6_tcp&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+  export ECTO_IPV6=&amp;#34;false&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;&lt;/span&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;database-pool-size&#34;&gt;Database pool size&lt;/h2&gt;
&lt;p&gt;Now, that should technically be it for getting us connected to the database, but
I got errors due to the amount of database connections. I just wanted this app
to work, so I lowered the number in &lt;code&gt;config/runtime.exs&lt;/code&gt; and it worked.&lt;/p&gt;
&lt;p&gt;You should likely not follow this advice.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   maybe_ipv6 = if System.get_env(&amp;#34;ECTO_IPV6&amp;#34;) in ~w(true 1), do: [:inet6], else: []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   config :example_app, ExampleApp.Repo,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     ssl: true,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     url: database_url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;-    pool_size: String.to_integer(System.get_env(&amp;#34;POOL_SIZE&amp;#34;) || &amp;#34;10&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    pool_size: String.to_integer(System.get_env(&amp;#34;POOL_SIZE&amp;#34;) || &amp;#34;2&amp;#34;),
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;&lt;/span&gt;     # For machines with several cores, consider starting multiple pools of `pool_size`
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     # pool_count: 4,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     socket_options: maybe_ipv6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Additionally, it should be noted that I am connecting directly to Postgres in
this example, not via PlanetScale&amp;rsquo;s PgBouncer setup, which uses port other than
&lt;code&gt;5432&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This should get you connected.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 257: Hesitant</title>
      <link>https://elver.me/weeknotes/257-hesitant/</link>
      <pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/257-hesitant/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.haxx.se/blog/2026/05/26/the-pressure/&#34;&gt;THE PRESSURE&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am jealous of those projects that shipped a horrible bug at some point in
the past that made the world burn for a while. They got attention and some
of them then got funding and financial muscles to get them staff and hire
multiple full time engineers. I sometimes think we would be better off if we
also had one of those.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was discussing something similar to this recently. Doing the job of proper
software engineering, where you change the code to work a different way,
whilst maintaining a running system, doesn&amp;rsquo;t get any attention (or in this
case, funding) at work. You get the attention when you fail or when you add a
new feature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.joshwcomeau.com/animation/css-vs-javascript/&#34;&gt;CSS vs. JavaScript&lt;/a&gt; &amp;ndash; &amp;ldquo;Exploring the performance implications of different
animation strategies&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We saw &lt;a href=&#34;https://www.instagram.com/macarthur.boyd/&#34;&gt;Christopher Macarthur-Boyd&lt;/a&gt; on Thursday and he was excellent. I&amp;rsquo;m
really glad I got to see him after losing &lt;a href=&#34;https://www.instagram.com/guillotinepod/&#34;&gt;Here Comes The Guillotine&lt;/a&gt;. That
concludes our planned comedy outings until July when we see &lt;a href=&#34;https://www.danielkitson.com/&#34;&gt;Daniel Kitson&lt;/a&gt;,
which I am hesitant about, not because he isn&amp;rsquo;t the best comedian of his
generation, he is, but because of what happened last time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We tried a Korean tasting menu for dinner before the comedy. It was an
interesting experience, but I would not bother again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had some time to kill on Sunday so decided to treat myself to a cinema trip.
I went to see &lt;a href=&#34;https://www.themoviedb.org/movie/1083381-backrooms&#34;&gt;Backrooms&lt;/a&gt;. I thought the first half was good but it lost it&amp;rsquo;s
way in the second. I&amp;rsquo;m probably too stupid to notice what the message of the
film is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daringfireball.net/2026/05/what_is_a_dickover&#34;&gt;What Is a Dickover?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://bsky.app/profile/danielpunkass.punkitup.com/post/3mmqcikjkjn2t&#34;&gt;Daniel Jalkut&lt;/a&gt; via &lt;a href=&#34;https://daringfireball.net/linked/2026/05/30/jalkut-on-ai&#34;&gt;Gruber&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My take on AI is, essentially, everybody who’s against is too against it and
everybody who&amp;rsquo;s for it is too for it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dpc.pw/posts/i-dont-want-your-prs-anymore/&#34;&gt;I don&amp;rsquo;t want your PRs anymore&lt;/a&gt; &amp;ndash; Seems fair to me.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 256: DEGRADED state</title>
      <link>https://elver.me/weeknotes/256-degraded-state/</link>
      <pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/256-degraded-state/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hot innit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.blog/security/investigating-unauthorized-access-to-githubs-internal-repositories/&#34;&gt;Investigating unauthorized access to GitHub-owned repositories&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Procrastination in it&amp;rsquo;s purest form raised it&amp;rsquo;s head this week as I decided to
fix a Game Boy project that&amp;rsquo;s been sitting on the side, in plain view, for
months. It is still not finished.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://shkspr.mobi/blog/2026/05/gds-weighs-in-on-the-nhss-decision-to-retreat-from-open-source/&#34;&gt;GDS weighs in on the NHS&amp;rsquo;s decision to retreat from Open Source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I made Focaccia, which was going swimmingly until I realised I&amp;rsquo;d left out one
of the key ingredients after having folded and proved it four times over the
course of a couple of hours. Still, I baked it anyway, and it was nice as all
freshly baked bread tends to be. I will do it again some time given how it
easy it was.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We continued the comedy this week with &lt;a href=&#34;https://en.wikipedia.org/wiki/John_Kearns&#34;&gt;John Kearns&lt;/a&gt;, who was excellent. His
support act, &lt;a href=&#34;https://en.wikipedia.org/wiki/Pat_Cahill&#34;&gt;Pat Cahill&lt;/a&gt;, was also great and not someone who I&amp;rsquo;d heard of
before, so that was a bonus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I started reading &lt;a href=&#34;https://en.wikipedia.org/wiki/Dungeon_Crawler_Carl&#34;&gt;Dungeon Crawler Carl&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I feel like every time I use an &lt;a href=&#34;https://en.wikipedia.org/wiki/Dash#Em_dash&#34;&gt;em dash&lt;/a&gt; now people are going to think I&amp;rsquo;ve
used an LLM to write text, but the fact of the matter is that I was quite
partial to the em dash before!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some fun and games with my ZFS pool this week. I just happened upon the fact
that ZFS thought the pool was in a &lt;code&gt;DEGRADED&lt;/code&gt; state. Mild panic.
(Incidentally, I really need to setup some sort of notifications for such
events.)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ zpool status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pool: storage
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; state: DEGRADED
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;status: One or more devices could not be used because the label is missing or
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        invalid.  Sufficient replicas exist for the pool to continue
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        functioning in a degraded state.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;action: Replace the device using &amp;#39;zpool replace&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  scan: resilvered 424K in 00:00:01 with 0 errors on Tue Apr 14 11:33:06 2026
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        NAME                      STATE     READ WRITE CKSUM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        storage                   DEGRADED     0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-0                DEGRADED     0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sdf                   ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            10150489895668176262  FAULTED      0     0     0  was /dev/sdc1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-1                DEGRADED     1     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sdb                   ONLINE       0     0     2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            1079001000417129426   FAULTED      0     0     0  was /dev/sdd1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-2                ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sda                   ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sde                   ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It seems something had caused the disks to change names causing ZFS to react
like &amp;ldquo;where my disks at?&amp;rdquo;. Understandable from ZFS&amp;rsquo; point of view.&lt;/p&gt;
&lt;p&gt;Then I realised that the disks which were found by ZFS where being referenced
using traditional device names like &lt;code&gt;/dev/sd*&lt;/code&gt; whereas I had setup the pool
using the disk IDs from &lt;code&gt;/dev/disk/by-id/&lt;/code&gt; which is meant to bypass this exact
kind of thing.&lt;/p&gt;
&lt;p&gt;So why have the device names changed and why was my pool &lt;code&gt;DEGRADED&lt;/code&gt; now? Well,
I ran some Ubuntu updates by accident trying to update a single package. (I&amp;rsquo;ve
done this before. Whether this is user error, or poor UX, or a combination of
both is left up to you to decide. Just never update software.)&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not 100% sure what caused the issue, but this seems like a Linux device
naming issue rather than a ZFS thing to me, and the &lt;a href=&#34;https://en.wikipedia.org/wiki/Udev&#34;&gt;udev&lt;/a&gt; was one of the
packages updated. I&amp;rsquo;m not interested enough to investigate further.&lt;/p&gt;
&lt;p&gt;After trying various things to get the disks online I figured the best way out
of this mess was the classic turn it off and on again. I&amp;rsquo;d noticed that the
system updates had also generated a new kernel image and if we haven&amp;rsquo;t
rebooted we&amp;rsquo;re not running that image. I wondered if there was some Kernel vs
userland incompatibility, and a reboot is the quickest way out of that.&lt;/p&gt;
&lt;p&gt;I rebooted, and the missing disks were found, and ZFS kicked off the
resilvering process automatically. It said it was going to take over a day to
complete, but it was done in minutes instead.&lt;/p&gt;
&lt;p&gt;I was left with a working pool, but some checksum errors so I decided to run a
pool scrub, which ran overnight, and found no issues.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ zpool status -P
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pool: storage
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; state: ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;status: One or more devices has experienced an unrecoverable error.  An
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        attempt was made to correct the error.  Applications are unaffected.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;action: Determine if the device needs to be replaced, and clear the errors
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        using &amp;#39;zpool clear&amp;#39; or replace the device with &amp;#39;zpool replace&amp;#39;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-9P
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  scan: scrub repaired 0B in 14:38:04 with 0 errors on Wed May 20 23:25:59 2026
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        NAME           STATE     READ WRITE CKSUM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        storage        ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-0     ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sda1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sdd1  ONLINE       0     0     1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-1     ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sde1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sdf1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-2     ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sdc1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sdb1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;errors: No known data errors
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I then cleared the errors with &lt;code&gt;zpool clear storage&lt;/code&gt; and now I just have a
message about not having access to the latest ZFS features &amp;ndash; that&amp;rsquo;s for
another day.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ zpool status -P
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pool: storage
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; state: ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;status: Some supported and requested features are not enabled on the pool.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        The pool can still be used, but some features are unavailable.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;action: Enable all features using &amp;#39;zpool upgrade&amp;#39;. Once this is done,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        the pool may no longer be accessible by software that does not support
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        the features. See zpool-features(7) for details.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  scan: scrub repaired 0B in 14:38:04 with 0 errors on Wed May 20 23:25:59 2026
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        NAME           STATE     READ WRITE CKSUM
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        storage        ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-0     ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sda1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sdd1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-1     ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sde1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sdf1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-2     ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sdc1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            /dev/sdb1  ONLINE       0     0     0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;errors: No known data errors
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;m still running the pool using device names rather than the IDs I had
originally setup. I would like to fix that. And I will one day.&lt;/p&gt;
&lt;p&gt;This incident has actually increased my confidence in ZFS. It should be noted
that the ZFS pool stayed &lt;em&gt;online&lt;/em&gt; during all of this. Some disks went missing,
and ZFS still maintained a working pool. This doesn&amp;rsquo;t seem like it was a ZFS
problem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finished &lt;a href=&#34;/weeknotes/255-i-guess-im-bored-of-that/#:~:text=I%20started%20reading%20another%20Patrick%20Radden%20Keefe%20book%2C%20Say%20Nothing&#34;&gt;reading Say Nothing&lt;/a&gt; and started &lt;a href=&#34;https://www.themoviedb.org/tv/245256-say-nothing&#34;&gt;watching Say Nothing&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went to see &lt;a href=&#34;https://www.themoviedb.org/movie/1228710-the-mandalorian-and-grogu&#34;&gt;The Mandalorian and Grogu&lt;/a&gt;. It&amp;rsquo;s a long episode of the TV
series, and I didn&amp;rsquo;t mind a bit. I&amp;rsquo;ll take all the Baby Yoda ya got!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 255: I guess I&#39;m bored of that</title>
      <link>https://elver.me/weeknotes/255-i-guess-im-bored-of-that/</link>
      <pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/255-i-guess-im-bored-of-that/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=_jBRSVFXLEk&#34;&gt;I had to see the scale for myself to understand&lt;/a&gt; &amp;ndash; This video from Alex at
KTZ Systems is really thought-provoking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went to see &lt;a href=&#34;https://en.wikipedia.org/wiki/John_Robins_(comedian)&#34;&gt;John Robins&lt;/a&gt; talk about his new book, &lt;a href=&#34;https://www.goodreads.com/book/show/240831988-thirst&#34;&gt;Thirst: Twelve Drinks
That Changed My Life&lt;/a&gt;, on Sunday evening. You might have guessed it&amp;rsquo;s about
his alcoholism. It was raw and revealing. I drew many parallels between his
problems with drinking, and mine, with eating.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HMRC like it when you pay by bank transfer, they get their money, more or
less, instantly. When you get a refund from them, they send you a cheque. Why
do they send you a cheque? Well, I&amp;rsquo;m not saying it&amp;rsquo;s a conspiracy, but I&amp;rsquo;m
damn sure that all the cheques they send don&amp;rsquo;t get paid in. Why don&amp;rsquo;t all the
cheques get paid in? Because it&amp;rsquo;s 2026.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The cluster of comedian shows continues next week with &lt;a href=&#34;https://en.wikipedia.org/wiki/John_Kearns&#34;&gt;John Kearns&lt;/a&gt; and then
&lt;a href=&#34;https://www.instagram.com/macarthur.boyd/&#34;&gt;Christopher Macarthur-Boyd&lt;/a&gt; the week after. Nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That Spotify celebratory icon is an ug-o isn&amp;rsquo;t it, temporary or not.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I started reading another &lt;a href=&#34;https://en.wikipedia.org/wiki/Patrick_Radden_Keefe&#34;&gt;Patrick Radden Keefe&lt;/a&gt; book, &lt;a href=&#34;https://www.goodreads.com/book/show/40163119-say-nothing&#34;&gt;Say Nothing: A True
Story of Murder and Memory in Northern Ireland&lt;/a&gt;, which I &lt;a href=&#34;/weeknotes/254-loft-hatch/#:~:text=Goodreads%20has%20no%20memory%20of%20it%2C%20so%20neither%20do%20I&#34;&gt;may or may not have
read&lt;/a&gt; before. The benefit of not having a good memory is enjoying things a
second time like they were brand new. This book is also excellent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I realised I haven&amp;rsquo;t used the 3D printer in quite some time. I guess I&amp;rsquo;m bored
of that hobby now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://amiemcnee.substack.com/p/i-didnt-want-a-job&#34;&gt;I don&amp;rsquo;t want a job&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What I was trying to say was this: the system fucking sucks. I don&amp;rsquo;t want to
spend most of my life doing something that doesn&amp;rsquo;t light me the fuck up. I
don&amp;rsquo;t want to spend my days working for someone else, for their purpose.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you actually consume YouTube in a sensible way? Of course I diligently
Like and Subscribe and then the notification counter constantly says &amp;ldquo;9+&amp;rdquo; and
then what?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If I were using my ZSA Navigator, then I might be tempted to buy this new
&lt;a href=&#34;https://www.zsa.io/voyager/navigator/buy?trackpad=true&#34;&gt;Trackpad module&lt;/a&gt;, but I&amp;rsquo;m not, so I won&amp;rsquo;t.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 254: Loft hatch</title>
      <link>https://elver.me/weeknotes/254-loft-hatch/</link>
      <pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/254-loft-hatch/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nytimes.com/2026/03/18/podcasts/serial-theidiot.html&#34;&gt;The Idiot&lt;/a&gt; from Serial Productions was really enjoyable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.fastmail.com/&#34;&gt;Fastmail&lt;/a&gt;, my email provider, sent an email saying they are increasing
prices. Fair dos, nothing stays the same forever. I&amp;rsquo;ve paid $50 USD a year for
a long time. Now it&amp;rsquo;s going to increase to 54. Not too bad.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We have listened to user requests and will now bill you in GBP rather than
US dollars — no more currency conversion fees, and a stable price.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No one likes conversion fees. However, they are planning on charging me that
54 &lt;em&gt;in GBP&lt;/em&gt; now. Nearly a 47% increase in one go.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://notepad-plus-plus.org/news/npp-trademark-infringement/&#34;&gt;Trademark Violation: Fake Notepad++ for Mac&lt;/a&gt; &amp;ndash; As &lt;a href=&#34;https://mastodon.social/@jaygooby/116515346469956862&#34;&gt;pointed out to me by Jay
Gooby&lt;/a&gt;, the Notepad++ people are unhappy about their trademark being infringed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After coming back from our jaunt to Oslo I&amp;rsquo;d finally run out of excuses to put
off installing the new loft hatch I&amp;rsquo;d purchased week(s) earlier. Projects are
so much easier to complete in your head. With a pep talk from Harry I forced
myself to start, and once you have a hole in the ceiling you really do have to
finish.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d installed a loft hatch once before in an old house, but with help and
support of a friend. This time I was going it alone. Because I&amp;rsquo;d done it
before I felt I understood the basic process of what I was attempting. And I&amp;rsquo;d
watched a load of YouTube videos. I even made a diagram of where I was cutting
and joining. This is professional stuff.&lt;/p&gt;
&lt;p&gt;So now we have a new loft hatch, and the gap where the old one was is covered
over and sealed up. I&amp;rsquo;m still &amp;ldquo;making good&amp;rdquo; in terms of filling and
decorating, but that will come over the next week or so as I wait for layers
of filler to dry.&lt;/p&gt;
&lt;p&gt;I managed to split pair of trousers &lt;em&gt;at the crotch&lt;/em&gt; in the process though. It
wasn&amp;rsquo;t all plain sailing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s becoming clear that LLM tokens are rather cheap at the moment. Time to
build?! Is this a golden age?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ryangjchandler.co.uk/posts/overcoming-ai-anxiety&#34;&gt;Overcoming AI anxiety&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That distinction is what matters. The responsibility of software design and
software engineering hasn&amp;rsquo;t moved. You&amp;rsquo;re still the one deciding what to
build, why it matters, and whether the solution is actually correct. Not
just syntactically, but architecturally and contextually.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=z-m9Yeihk-U&#34;&gt;Build a Tailscale Exit Node in 1 Minute with Flatcar Linux&lt;/a&gt; &amp;ndash; this is a cool
thing I won&amp;rsquo;t do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finished &lt;a href=&#34;/weeknotes/253-ai-written-cv/#:~:text=London%20Falling&#34;&gt;reading London Falling&lt;/a&gt;, which in itself should be testament to
how much I enjoyed the book in and of itself. It was excellent! I was sure
I&amp;rsquo;ve read other &lt;a href=&#34;https://en.wikipedia.org/wiki/Patrick_Radden_Keefe&#34;&gt;Patrick Radden Keefe&lt;/a&gt; books before but Goodreads has no
memory of it, so neither do I.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 253: AI written CV</title>
      <link>https://elver.me/weeknotes/253-ai-written-cv/</link>
      <pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/253-ai-written-cv/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Saw my first obviously written by AI job posting this week. Also saw a
recruiter complaining about AI-written CVs being submitted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.tomshardware.com/tech-industry/artificial-intelligence/claude-powered-ai-coding-agent-deletes-entire-company-database-in-9-seconds-backups-zapped-after-cursor-tool-powered-by-anthropics-claude-goes-rogue&#34;&gt;Claude-powered AI coding agent deletes entire company database in 9 seconds —
backups zapped, after Cursor tool powered by Anthropic&amp;rsquo;s Claude goes rogue&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is easy to be judgemental about, but I can see how this might happen.
Don&amp;rsquo;t try and pretend you&amp;rsquo;ve never had production credentials set in ENV vars
on your computer 😉&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/ghostty-leaving-github&#34;&gt;Ghostty Is Leaving GitHub&lt;/a&gt; &amp;ndash; For a lot of the reasons many people are now
dissatisfied with GitHub.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://notepad-plus-plus-mac.org/&#34;&gt;Notepad++ for Mac&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Notepad++ is now natively available for macOS. No Wine, no emulation. A full
native port for Apple Silicon and Intel Macs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ok, but why? Cool for multiple operating system users I guess?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;ve been in &lt;a href=&#34;https://en.wikipedia.org/wiki/Oslo&#34;&gt;Oslo&lt;/a&gt; since Friday. We go home tomorrow. We left the airport on
a nice train and arrived in a very quiet city. Later on we realised it was a
public holiday here, so that made sense. Saying that, Oslo seems really quiet
for a capital.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;d heard about the high cost of living in Norway, of course but I was not
fully prepared to pay £85 for the train, or £38 for two waffles and two
coffees. We&amp;rsquo;d spent &amp;gt; £120 in under two hours since arriving! We took full
advantage of the hotel breakfast on offer after that, which we wouldn&amp;rsquo;t
usually do, to try and curb our spending.&lt;/p&gt;
&lt;p&gt;On the first day we went on a walking tour, and then took a boat trip up the
Oslo Fjords (you might have a different picture in your mind about what
&amp;ldquo;Fjords&amp;rdquo; means in this instance, &lt;a href=&#34;https://en.wikipedia.org/wiki/Oslofjord&#34;&gt;these&lt;/a&gt; are not those) which was great. Not
only was the boat nice and steady, but the views on offer were superb.&lt;/p&gt;
&lt;p&gt;Oslo is a nice enough city. It feels very safe. However, I can&amp;rsquo;t see me
returning for a regular holiday any time soon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At Manchester Airport we didn&amp;rsquo;t have to have to take our liquids out of our
bags, or put them in tiny plastic bags, or take our shoes off.  What a time to
be alive. However, their sign for &amp;ldquo;Departures&amp;rdquo; points the wrong way, and their
car park is awful. You take the rough with the smooth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fossforce.com/2026/05/is-it-panic-time-linuxs-big-bad-copy-fail-security-exploit/&#34;&gt;Is It Panic Time? Linux’s Big Bad ‘Copy Fail’ Security Exploit&lt;/a&gt; &amp;ndash; Seems bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I started reading Patrick Radden Keefe&amp;rsquo;s new book, &lt;a href=&#34;https://www.goodreads.com/book/show/238226991-london-falling&#34;&gt;London Falling: A
Mysterious Death in a Gilded City and a Family&amp;rsquo;s Search for Truth&lt;/a&gt;. It&amp;rsquo;s
really good so far.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m trying to use &lt;a href=&#34;https://koreader.rocks/&#34;&gt;KOReader&lt;/a&gt; again. The interface &lt;a href=&#34;/weeknotes/238-filament-backup/#:~:text=the%20menus%20and%20settings%20are%20indecipherable&#34;&gt;remains completely
baffling&lt;/a&gt;. I keep asking whether the constrained environment of running on a
Kindle is the cause or just a straight forward bad UI?&lt;/p&gt;
&lt;p&gt;It has me considering other E Ink devices too. My Kindle is getting old in the
tooth and something that I could more easily fit into my homelab setup might
be nice, but there are a lot of E Ink devices around now and I don&amp;rsquo;t think I
need a research project at the moment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been really enjoying &lt;a href=&#34;https://www.themoviedb.org/tv/289219-maul-shadow-lord&#34;&gt;Star Wars: Maul - Shadow Lord&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 252: Bend the laws of physics</title>
      <link>https://elver.me/weeknotes/252-bend-the-laws-of-physics/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/252-bend-the-laws-of-physics/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Busy week for me. I started it off with some actual real work. It felt good to
be engaging the brain in a slightly more intense way than usual. Turns out I
can still do this, sort of. Setting up a Rails app in 2026 can still be
somewhat tedious, somehow. But that might just be computers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Haggis Ruby went off without a hitch &amp;ndash; credit to the organisers. I think &lt;a href=&#34;/weeknotes/251-the-importance-of-farting-around/#:~:text=conference%20is%20two%20days%20this%20time&#34;&gt;two
days &lt;em&gt;was&lt;/em&gt; a bit much for me&lt;/a&gt;, but I enjoyed a lot of the talks, but they were
not the focus for me. It was great to catch up with everyone I hadn&amp;rsquo;t seen in
a while.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.hardscrabble.net/2026/dont-forget-to-add-an-rss-feed-to-your-blog/&#34;&gt;Don&amp;rsquo;t forget to add an RSS feed to your blog&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It keeps happening. I come across a blog which has written something
interesting enough and I try to subscribe to it in my RSS Reader app1 and
the app tells me there’s no feed to subscribe to.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/232-your-blog-is-dead-to-me/#:~:text=If%20your%20blog%20doesn%E2%80%99t%20have%20a%20feed%20it%20is%20dead%20to%20me&#34;&gt;Yep&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mickamy/sql-tap&#34;&gt;sql-tap&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;sql-tap sits between your application and your database (PostgreSQL, MySQL,
or TiDB), capturing every query and displaying it in an interactive terminal
UI. Inspect queries, view transactions, and run EXPLAIN — all without
changing your application code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, this seems extremely useful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://boringsql.com/posts/portable-stats/&#34;&gt;Production query plans without production data&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But that&amp;rsquo;s just the beginning. The same logic lets you export statistics
from production and inject them anywhere - test database, local debugging,
or as part of CI pipelines.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is very cool. Take statistics from your production data and use it
locally to test performance changes as if it were production, without the
actual data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://castro.fm/episode/6U7Ead&#34;&gt;Richard Osman: The addiction itself becomes the shame&lt;/a&gt; &amp;ndash; I could not have
resonated more with what Richard Osman says in this interview. I think it will
just be with me until the end. Maybe acceptance of that is ok?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://byroot.github.io/ruby/bundler/2026/04/20/bundle-features.html&#34;&gt;The Missing Bundler Features&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.blog/open-source/git/highlights-from-git-2-54/&#34;&gt;Highlights from Git 2.54&lt;/a&gt; &amp;ndash; a few nice improvements in here, &lt;code&gt;git history split&lt;/code&gt;, in particular, seems very useful. I always get confused when splitting
commits using &lt;code&gt;rebase -i&lt;/code&gt; and this seems like it will be easier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.revk.uk/2017/12/its-official-adsl-works-over-wet-string.html?m=1&#34;&gt;It&amp;rsquo;s official, ADSL works over wet string&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AI conversations were a large part of my time in Glasgow. I guess, as you
might expect, they ranged from &amp;ldquo;I use it a bit and it doesn&amp;rsquo;t really do what I
want&amp;rdquo; to &amp;ldquo;I don&amp;rsquo;t write any code by hand any more&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;It made me realise that I am not as far behind as the internet would have me
believe. The general consensus still seems to be &amp;ldquo;this is happening&amp;rdquo; but we
just don&amp;rsquo;t know when and where it will end up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The train home between Edinburgh and York was late. Funny how LNER are able to
bend the laws of physics to change time meaning that my train wasn&amp;rsquo;t actually
late according to them, when it was. Give me my money you bastards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;First &lt;a href=&#34;https://spinel.coop/&#34;&gt;spinel.coop&lt;/a&gt;, and now &lt;a href=&#34;https://github.com/matz/spinel&#34;&gt;matz/spinel&lt;/a&gt; 🤔&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 251: The importance of farting around</title>
      <link>https://elver.me/weeknotes/251-the-importance-of-farting-around/</link>
      <pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/251-the-importance-of-farting-around/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The daffodils are looking sad and are nearly over, but fear not, the cherry
blossom is out 🌸 and we&amp;rsquo;re blessed to have many cherry trees throughout the
city.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/250-wasp-nest-extractor-3000/#:~:text=removed%20the%20wasp%20nests&#34;&gt;The wasps&lt;/a&gt;&amp;hellip;are back. I went up into the loft to start prepping to install a
new loft hatch and found that a solitary wasp had started work re-building a
nest. I&amp;rsquo;ve returned the Wasp Nest Extractor 3000 ™ and I&amp;rsquo;m having a re-think.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rareese.com/posts/backblaze/&#34;&gt;Backblaze has quietly stopped backing up your data&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quite a busy week coming up. Most of the week will be taken up attending
Haggis Ruby in Glasgow. The conference is two days this time. I think I&amp;rsquo;d
prefer it to be a single day but let&amp;rsquo;s see how we go first! Glasgow is
surprisingly far compared in Edinburgh in terms of elapsed travel time. And
the train is the only sensible way to get there from here. Should be fun, and
I&amp;rsquo;ll get to see some pals.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/zizmorcore/zizmor&#34;&gt;zizmor&lt;/a&gt; &amp;ndash; &amp;ldquo;Static analysis for GitHub Actions&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pizza, of a kind, was made on Sunday evening in the &lt;a href=&#34;/weeknotes/249-preparing-for-pizza/#:~:text=use%20the%20pizza%20oven&#34;&gt;gifted pizza oven&lt;/a&gt;. It
was both good and disappointing. I was expecting the operation of the pizza
oven to be the issue, like when you spend ages trying to light a barbecue, but
that part was really easy. I had a hot oven in no time.&lt;/p&gt;
&lt;p&gt;It started falling apart when the first pizza needed to be turned in the oven
and it had stuck. Tomato and cheese all over the place! Still, each pizza got
a bit better than the last, so I&amp;rsquo;m not put off trying again, and the edible
parts were very nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://robbyonrails.com/articles/2026/04/14/your-codebase-doesnt-care-how-it-got-written/&#34;&gt;Your codebase doesn&amp;rsquo;t care how it got written&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We asked candidates for coding samples. We put them through live coding
exercises. We talked about coding standards. Style guides. Naming
conventions. We&amp;rsquo;ve all wished for… and sometimes had… the chance to reject
someone&amp;rsquo;s code because it didn&amp;rsquo;t meet our conventions. Didn&amp;rsquo;t match our
writing style.&lt;/p&gt;
&lt;p&gt;Writing style.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nytimes.com/2026/02/24/technology/taiwan-china-chips-silicon-valley-tsmc.html&#34;&gt;The Looming Taiwan Chip Disaster That Silicon Valley Has Long Ignored&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If China invades Taiwan and cuts off its chip exports to American companies,
the tech industry and the U.S. economy would be crippled.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://andre.arko.net/2026/04/13/software-developers-have-become-their-own-joke/&#34;&gt;Software developers have become their own joke&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unfortunately, seeing a prototype and becoming convinced it’s complete is
not a new problem. It’s been the bane of software development possibly since
the very beginning, when (apocryphally) a manager would review a mockup and
conclude the project was now complete and could be shipped to customers
immediately.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had our gutters cleaned of the foliage living in them and the next day
found a roof slate in our bin. The cleaners hadn&amp;rsquo;t mentioned a roof slate
coming lose at any point. Co-incidence? We can&amp;rsquo;t see any missing roof slates
but it is difficult to see on the roof.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theengineeringmanager.com/growth/slow-down-to-speed-up/&#34;&gt;Slow down to speed up&lt;/a&gt; &amp;ndash; I&amp;rsquo;ve been thinking about this a lot. When I start
shipping very quickly I also feel like I&amp;rsquo;m losing control of what&amp;rsquo;s happening,
but slowing down feels like getting in the way. Where to draw the line?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daringfireball.net/linked/2026/04/13/macos-zoom-gesture&#34;&gt;MACOS TIP: ENABLE THE ZOOM ‘PEEK’ GESTURE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is neat!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The dentist sorted &lt;a href=&#34;/weeknotes/250-wasp-nest-extractor-3000/#:~:text=broke%20another%20tooth&#34;&gt;my second broken tooth of the month&lt;/a&gt; and I am now twice as
poor. If this run of dental fuckery could stop for a bit now, that would be
good, thanks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hex.pm/blog/security-audit&#34;&gt;Hex.pm Security Audit: Results and Next Steps&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hex is critical infrastructure for the BEAM ecosystem. It underpins package
distribution for Erlang, Elixir, and Gleam, and is used in production
systems across thousands of organizations.  Until now, no comprehensive
external audit had been performed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/remoteoss/dexter&#34;&gt;dexter — &amp;ldquo;A fast, full-featured Elixir LSP optimized for large codebases&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another LSP for Elixir. Competition is good, but after &lt;a href=&#34;/weeknotes/218-botulism-opportunity/#:~:text=competing%20Elixir%20LSPs%20decided%20to%20come%20together&#34;&gt;the consolidation of
the last two competing LSPs for Elixir&lt;/a&gt; I can&amp;rsquo;t help but have mixed feelings
about this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=AUIRqXCozN8&#34;&gt;&amp;ldquo;We&amp;rsquo;ve had a win today&amp;rdquo;: Martin Lewis celebrates council tax reform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Did you know that if you don&amp;rsquo;t pay your council tax on time &lt;em&gt;once&lt;/em&gt;, within
three weeks the Council can insist you pay the FULL YEAR upfront, and three
weeks after that they can send the bailiffs in.&lt;/p&gt;
&lt;p&gt;Fucking disgraceful. No more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rubycentral.org/news/a-new-chapter-for-ruby-central/&#34;&gt;A New Chapter for Ruby Central&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We have parted ways with our Executive Director, our PR agency, our CFO, and
concluded several contractor engagements&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PR agency? There was an &lt;em&gt;actual real&lt;/em&gt; PR agency involved in this whole
debacle?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mariakonnikova.substack.com/p/the-importance-of-farting-around&#34;&gt;The importance of farting around&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Built into human beings is a need, which nobody bothers to even acknowledge,
to do something useful. But instead of worrying about what human beings
need, we worry about what machines need. There’s no talk at all about what
human beings are deprived of; all the talk is about what industries are
being deprived of.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 250: Wasp Nest Extractor 3000 ™</title>
      <link>https://elver.me/weeknotes/250-wasp-nest-extractor-3000/</link>
      <pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/250-wasp-nest-extractor-3000/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;TWO HUNDRED AND FIFTY. Somehow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;iMessage randomly signed me out so I was silently not receiving text messages.
No warning, nothing. Cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.joanwestenberg.com/the-passive-income-trap-ate-a-generation-of-entrepreneurs/&#34;&gt;The &amp;ldquo;Passive Income&amp;rdquo; Trap Ate A Generation Of Entrepreneurs&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What actually makes money hasn&amp;rsquo;t changed. You find something people need.
You get good at providing it. You charge a fair price and you keep showing
up even when it&amp;rsquo;s tedious and even when you don&amp;rsquo;t want to.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I removed the &lt;a href=&#34;/weeknotes/248-two-wasp-nests/#:~:text=wasp%20nests&#34;&gt;wasp nests&lt;/a&gt;. They were thankfully empty. I knocked them off the
rafters with the Wasp Nest Extractor 3000 ™ (a broom handle with a scraper
gaffer taped to it).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://simonwillison.net/2026/Apr/3/supply-chain-social-engineering/&#34;&gt;The Axios supply chain attack used individually targeted social engineering&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That’s a very effective scam. I join a lot of meetings where I find myself
needing to install Webex or Microsoft Teams or similar at the last moment
and the time constraint means I always click &amp;ldquo;yes&amp;rdquo; to things as quickly as
possible to make sure I don&amp;rsquo;t join late.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve been in this situation too. Easy to fall for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hex.pm/blog/hex-v24-released&#34;&gt;Hex v2.4 released&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hex 2.4 replaces password based authentication with an OAuth device flow and
adds two-factor authentication support to the CLI. These changes
significantly improve the security of publishing packages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I broke another tooth. I am cursed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/ombulabs/claude-code_rails-upgrade-skill&#34;&gt;Rails Upgrade Assistant Skill&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Claude Code skill that helps you upgrade Ruby on Rails applications from
version 2.3 through 8.1.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://usefulfictions.substack.com/p/how-to-instantly-be-better-at-anything&#34;&gt;How to instantly be better at things&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Beginners are often neurotic, alternating between I better not fuck this
up and I&amp;rsquo;m going to fuck this up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Regrettably I am, apparently, still a beginner. At everything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I got around to installing &lt;a href=&#34;https://github.com/homeassistant-ai/ha-mcp&#34;&gt;ha-mcp&lt;/a&gt;, an MCP for Home Assistant, this week and
it seems promising. My whole setup is a bit of a mess, so this is hopefully
going to help me sort things out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went to see &lt;a href=&#34;https://www.themoviedb.org/movie/687163-project-hail-mary&#34;&gt;Project Hail Mary&lt;/a&gt;. We really enjoyed it. More so than
&lt;a href=&#34;https://www.themoviedb.org/movie/286217-the-martian&#34;&gt;The Martian&lt;/a&gt; even. And I gave up on the book.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://marmelab.com/blog/2026/02/23/do-you-know-psql.html&#34;&gt;9 Advanced PostgreSQL Features I Wish I Knew Sooner&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;EXCLUDE constraints allow us to specify that certain combinations of values
must be unique across rows, based on a specified condition.&lt;/p&gt;
&lt;p&gt;Remember my booking system problem? I needed to ensure that no two bookings
overlapped in time for the same room.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;EXCLUDE&lt;/code&gt;, in particular, looks useful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nasa.gov/artemis-ii-mobile-wallpapers/&#34;&gt;Artemis II Wallpapers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/249-preparing-for-pizza/#:~:text=I%20have%20chased&#34;&gt;EICR was eventually supplied&lt;/a&gt; and there were no massive problems
reported.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 249: Preparing for pizza</title>
      <link>https://elver.me/weeknotes/249-preparing-for-pizza/</link>
      <pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/249-preparing-for-pizza/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;April? Unacceptable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Such lateness? We went away to Norfolk for a little break over the bank
holiday. The location was my idea because I&amp;rsquo;ve never been over to that side of
the country before. It reminded me of Somerset in a lot of ways. We stayed in
an Airbnb with a very poor shower, and non-functional radiators. I used a log
burner for the first time to varying degrees of success.&lt;/p&gt;
&lt;p&gt;We visited a series of seaside towns in various levels of deterioration. And
some cities too. I think the &lt;a href=&#34;https://www.youtube.com/watch?v=LP3x-cp4VHo&#34;&gt;pedestrianisation&lt;/a&gt; has been a success. The
highlight was a boat trip to see &lt;a href=&#34;https://www.nationaltrust.org.uk/visit/norfolk/blakeney-national-nature-reserve/seal-watching-at-blakeney-point&#34;&gt;grey seals off Blakeney point&lt;/a&gt;. That was
cool.&lt;/p&gt;
&lt;p&gt;As always, the main reason for holidays is to make you happier with what you
have at home. Such as a working shower.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I got &lt;a href=&#34;/weeknotes/248-two-wasp-nests/#:~:text=Broke%20another%20tooth%20eating%20sweets%20I%20don%E2%80%99t%20even%20like&#34;&gt;my tooth fixed&lt;/a&gt; in time for the holiday 💸💸💸&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Castro, my current podcast app of choice, committed one of the cardinal sins
of interface design with the most recent update. They moved existing buttons
that have been in-place for years. New buttons have been added which shifts up
the delete podcast episode button. So now I&amp;rsquo;m consistently pressing the wrong
button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Still &lt;a href=&#34;/weeknotes/248-two-wasp-nests/#:~:text=are%20in.%20I%E2%80%99ve-,yet%20to%20receive%20it,-.%20They%20were%20very&#34;&gt;no EICR&lt;/a&gt; &amp;ndash; I have chased, repeatedly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m preparing to use the pizza oven I received as a gift at &lt;em&gt;least&lt;/em&gt; a year
ago. You cannot rush these things. The weather is now getting good enough to
risk trying it out. The practice I had creating fire on holiday will no doubt
become useful. This foray into home pizza making will either be a one time
thing as I discover how much hassle it is, or a regular pizza eating problem.
I&amp;rsquo;ll keep you updated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In order to aid in my insulation-related goals, I got a thermal camera &amp;ndash;
&lt;a href=&#34;https://thermalmaster.com/en-gb/products/thermal-master-p1&#34;&gt;Thermal Master P1&lt;/a&gt; &amp;ndash; so I can spot cold spots more easily. Also because it&amp;rsquo;s
cool and I wanted one. Thank you Christmas and Birthday Amazon credit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 248: Two wasp nests</title>
      <link>https://elver.me/weeknotes/248-two-wasp-nests/</link>
      <pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/248-two-wasp-nests/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Broke another tooth eating sweets I don&amp;rsquo;t even like. Cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I discovered why I struggle so much to connect to WiFi in my local coffee shop
&amp;ndash; NextDNS. &lt;a href=&#34;/weeknotes/241-my-dns-problem/#:~:text=That%20fix%20is%20NextDNS&#34;&gt;Shot myself in the foot&lt;/a&gt;, it seems. Captive portal&amp;rsquo;s are
essentially man-in-the-middle attacks, so they fail to appear when using
NextDNS as it is encrypting DNS requests. Stupid security.&lt;/p&gt;
&lt;p&gt;This is the problem with fancy networking. You forget and then basic Internet
needs are not met. It won&amp;rsquo;t do. The solution, for now, is low tech. Turn if
off, connect to WiFi, trigger the captive portal, turn it back on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://musicfetch.io/&#34;&gt;Musicfetch&lt;/a&gt; &amp;ndash; this is cool.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fetch song, album &amp;amp; artist data from 30+ platforms in one request&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ubiquiti released their long awaited, insanely large, expensive, new doorbell,
the &lt;a href=&#34;https://techspecs.ui.com/unifi/door-access/uvc-g6-pro-entry&#34;&gt;G6 Pro Entry&lt;/a&gt;. This thing is £360+! To be fair to the price it isn&amp;rsquo;t your
common or garden doorbell, it does much more. I am uninterested in most of the
fancy features though. I don&amp;rsquo;t want it to recognise my face, or unlock the
door using NFC. I want it to tell me when people are at the door.&lt;/p&gt;
&lt;p&gt;I think I&amp;rsquo;m going to get a &lt;a href=&#34;https://techspecs.ui.com/unifi/cameras-nvrs/uvc-doorbell-lite&#34;&gt;Doorbell Lite&lt;/a&gt; instead, much more reasonably
priced, and fits into the UniFi ecosystem still (I printed &lt;a href=&#34;https://makerworld.com/en/models/1763076-ubiquiti-unifi-doorbell-lite&#34;&gt;a model&lt;/a&gt; to see
how it might fit, I&amp;rsquo;m cool). I need to figure out how to get a cable to it
though, and I&amp;rsquo;m scared to drill the panelling around our front door.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/Ubiquiti/comments/1s3fira/elgato_stream_deck_plugin_for_unifi_unifi_monitor/&#34;&gt;Elgato Stream Deck Plugin for Unifi - Unifi Monitor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Toys for those of you with both Elgato and UniFi gear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had an &lt;a href=&#34;https://niceic.com/householders/electrical-services/electrical-installation-condition-reports/&#34;&gt;EICR&lt;/a&gt; carried out to see what sort of state the house electrics are
in. I&amp;rsquo;ve yet to receive it. They were very quick to send the invoice through
though. Hopefully the place isn&amp;rsquo;t condemned.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The bills in this house have been pretty astronomical since we moved in. I
initially put it down to having lived in a much smaller place before, so of
course the bills would be more. Still, I think we should attempt to do what we
can, and the &amp;ldquo;easy pickings&amp;rdquo; for that is various insulating.&lt;/p&gt;
&lt;p&gt;I decided to go into the loft for the first time to investigate and was
rewarded by finding not one, but two, wasp nests. I am lucky. It might seem
strange to have not gone in the loft in the last two years, but it&amp;rsquo;s a weird
setup where the hatch is very small and screwed shut like it&amp;rsquo;s warning you to
not enter. I should&amp;rsquo;ve listened.&lt;/p&gt;
&lt;p&gt;The ol&amp;rsquo; brain is kicking up a load of new loft related projects now. YouTube
makes it looks so damned easy. I&amp;rsquo;ve been doing a load of research into
insulation materials and as a result I&amp;rsquo;m now anxious about the fire and
toxicity risk of said materials.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://strongboxsafe.com/&#34;&gt;Strongbox&lt;/a&gt; &amp;ndash; Another 1Password alternative?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://letsencrypt.org/2026/02/18/dns-persist-01.html&#34;&gt;DNS-PERSIST-01: A New Model for DNS-based Challenge Validation&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DNS-PERSIST-01 approaches validation differently. Instead of publishing a
new challenge record for each issuance, you publish a standing authorization
in the form of a TXT record that identifies both the CA and the specific
ACME account you authorize to issue for this domain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Another way to get your DNS certs is coming!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some slight lurgy again this week caught from the holiday I didn&amp;rsquo;t even go on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 247: ZigBee woes</title>
      <link>https://elver.me/weeknotes/247-zigbee-woes/</link>
      <pubDate>Sun, 22 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/247-zigbee-woes/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;As you might remember I&amp;rsquo;ve been &lt;a href=&#34;/weeknotes/236-acme-challenge/#:~:text=Things%20did%20not%20get%20better&#34;&gt;having several ZigBee related woes&lt;/a&gt; for a
while, and this week was no different. This time the investigation was
prompted by Zigbee2MQTT spontaneously restarting, or trying to. The container
seemed to die and then try and restart by couldn&amp;rsquo;t, and that would continue
for a bit.&lt;/p&gt;
&lt;p&gt;I suspect this has been happening for a while, but I never noticed because I
didn&amp;rsquo;t have any sort of alerting setup. Now, through &lt;a href=&#34;/weeknotes/245-stranded/#:~:text=can%20notify%20you%20of%20various%20events&#34;&gt;Dockhand&lt;/a&gt;, I get
notifications when Docker container events happen. (In fact, I get too many
notifications, my watch goes berserk during these outages!).&lt;/p&gt;
&lt;p&gt;From the logs it seemed the Zigbee2MQTT container dying was due to it not
being able to reach the ZLSB-06M over the network. (I&amp;rsquo;m not sure why it has to
crash when this happens?). But this was sporadic, it would be fine for a long
time, and then suddenly start misbehaving.&lt;/p&gt;
&lt;p&gt;Eventually, I noticed the container would die during large file downloads. I
could reliably reproduce the problems by triggering a large download and after
a couple of minutes it would consistently cause the container to die. And when
the download stopped, the container would recover. So large amounts of network
traffic were causing some sort of instability or congestion to the point that
the Zigbee2MQTT and SLZB-06M could not reach each other over the network.&lt;/p&gt;
&lt;p&gt;I immediately had suspicions &amp;ndash; the Virgin Media Hub. I&amp;rsquo;ve been using this as
a temporary stop gap for two years. Let&amp;rsquo;s just say that I doubt these devices
are made to be the most reliable. Now that I had a reliable reproduction, I
decided to start swapping out hardware. My network plans are still undecided,
so as another temporary stop gap, and to eliminate network hardware as the
source of the problem, I purchased a &lt;a href=&#34;https://uk.store.ui.com/uk/en/category/switching-utility/products/usw-flex-mini&#34;&gt;Ubiquiti USW-Flex-Mini switch&lt;/a&gt; to plug
all my devices into, leaving the Virgin Hub to broadband routing duties only.&lt;/p&gt;
&lt;p&gt;And this fixed the problem. It was hardware.&lt;/p&gt;
&lt;p&gt;I think I naively thought that one Ethernet stack was much the same as others
these days, but it seems I was wrong because once I replaced the switching
hardware with something quality the problems went away.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/git-pkgs/brief&#34;&gt;brief&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A single-binary CLI tool that detects a software project&amp;rsquo;s toolchain,
configuration, and conventions, then outputs a structured report.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=PbPCGqoBB4Y&#34;&gt;MacBook Neo Teardown: Apple&amp;rsquo;s Most Repairable Laptop?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is very promising. I&amp;rsquo;m hopeful for newer, more pro, machines in the
future. I found the modular jacks and ports surprising in this teardown. I
didn&amp;rsquo;t know that was a thing, I&amp;rsquo;ve only ever seen them soldered directly to
the board. That makes one of the most common repairs &amp;ndash; broken ports &amp;ndash; far
simpler it seems.&lt;/p&gt;
&lt;p&gt;And they seem to &lt;a href=&#34;https://support.apple.com/en-us/126520&#34;&gt;provide manuals&lt;/a&gt;, which shocked me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.mikeperham.com/2026/03/10/sidekiq-in-the-terminal/?_bhlid=02f87e4ca21a0d22b7e5850226eeabc11c6e82dc&#34;&gt;Sidekiq in the terminal&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;…for the last few months I&amp;rsquo;ve been iterating on kiq, a new administration
interface for Sidekiq, a speedy terminal application based on Kerrick Long&amp;rsquo;s
ratatui_ruby gem&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://igorstechnoclub.com/sandbox-exec/&#34;&gt;sandbox-exec: macOS&amp;rsquo;s Little-Known Command-Line Sandboxing Tool&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I wonder how many tiny tools are lurking in macOS somewhere waiting to be
found.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As I&amp;rsquo;ve noted before, why do events all need to happen in the same week? There
must be a German word for this 🤔&lt;/p&gt;
&lt;p&gt;This week I was out in the evening for &lt;em&gt;three&lt;/em&gt; nights in a row &lt;code&gt;#madlad&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Tuesday was the regular monthly &lt;a href=&#34;https://yorkruby.org&#34;&gt;York Ruby&lt;/a&gt; and it was nice to catch up with
people as usual. Wednesday was comedian &lt;a href=&#34;https://en.wikipedia.org/wiki/Rob_Auton&#34;&gt;Rob Auton&lt;/a&gt;. And Thursday was &lt;a href=&#34;https://en.wikipedia.org/wiki/John_Bramwell&#34;&gt;John
Bramwell&lt;/a&gt; of &lt;a href=&#34;https://en.wikipedia.org/wiki/I_Am_Kloot&#34;&gt;I Am Kloot&lt;/a&gt; fame.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t sure what sort of show John Bramwell would put on having never seen
him or I Am Kloot live before, but it was fantastic mixture of storytelling
and fabulous musical performances.&lt;/p&gt;
&lt;p&gt;But there&amp;rsquo;s more. Due to &amp;ldquo;unforeseen circumstances&amp;rdquo;, and following the Queen&amp;rsquo;s
lead, my official birthday was moved to Saturday and we went out for a nice
dinner too.&lt;/p&gt;
&lt;p&gt;Normal service is now resumed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://shkspr.mobi/blog/2026/03/how-can-governments-pay-open-source-maintainers/&#34;&gt;How Can Governments Pay Open Source Maintainers?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spurred on by the ZigBee issues, I moved a project I&amp;rsquo;d been thinking about for
a while forward &amp;ndash; log aggregation in the ol&amp;rsquo; Home Lab. Searching across
individual log files to try and find out what is wrong with something is not
fun, so having a system that ingests all the logs and makes them searchable
would make things much easier.&lt;/p&gt;
&lt;p&gt;Grafana is often cited in situations such as these. In the past my experiences
with Grafana have not been great. But these were also situations in which I
did not set anything up myself, and my understanding of how things were
working was very limited. I think this reduced the usefulness of it for me.&lt;/p&gt;
&lt;p&gt;However, I have no real experience with these sort of platforms (I&amp;rsquo;ve used
DataDog, but that is out of scope, and budget), so just went with Grafana.
With LLM help it was actually fairly easy to get going. I&amp;rsquo;ve been finding the
combination of Docker and AI to be super-effective at getting these kind of
software stacks setup.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t actually use Grafana to diagnose anything in the end, but it will be
useful in the future for answering the question &amp;ldquo;What happened at 3:07am?&amp;rdquo; by
searching across all the log files at once. I will learn more about how to
&lt;em&gt;operate&lt;/em&gt; Grafana as time goes on and problems that need diagnosing appear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.jackpearce.co.uk/posts/starlink-failover/&#34;&gt;Starlink Mini as a failover&lt;/a&gt; (Via &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This is very cool. And cheap. Shame about &lt;em&gt;him&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://terriblesoftware.org/2026/03/03/nobody-gets-promoted-for-simplicity/&#34;&gt;Nobody Gets Promoted for Simplicity&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve seen engineers (and have been one myself) create abstractions to avoid
duplicating a few lines of code, only to end up with something far harder to
understand and maintain than the duplication ever was.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;God forbid you should ever have to change something in two places. Oh the
horror!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The actual path to seniority isn&amp;rsquo;t learning more tools and patterns, but
learning when not to use them. Anyone can add complexity. It takes
experience and confidence to leave it out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And permission from others.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://optician-sans.com/&#34;&gt;OPTICIAN SANS&lt;/a&gt; &amp;ndash; &amp;ldquo;A free font based on the historical eye charts and
optotypes used by opticians world wide.&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 246: See some Pandas</title>
      <link>https://elver.me/weeknotes/246-see-some-pandas/</link>
      <pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/246-see-some-pandas/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A is back! I drove down to Heathrow on Saturday to collect her and her friend.
Thank god that is over. Travelling via Bangladesh (&lt;a href=&#34;https://en.wikipedia.org/wiki/Dhaka&#34;&gt;Dhaka&lt;/a&gt;) and then China
(&lt;a href=&#34;https://en.wikipedia.org/wiki/Kunming&#34;&gt;Kunming&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Chengdu&#34;&gt;Chengdu&lt;/a&gt;) is not the traditional way to get back to the UK
from Sri Lanka, but getting home safely whilst avoiding the Middle East, and
seeing some Pandas as part of the process made the journey worthwhile I&amp;rsquo;m
told.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://arcade.pirillo.com/fontcrafter.html&#34;&gt;FontCrafter&lt;/a&gt; &amp;ndash; Make a font from your handwriting. Now the text on my
computer is unreadable too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I spent a little time this week looking at &amp;ldquo;map stuff&amp;rdquo; which mostly comprised
&lt;a href=&#34;https://leafletjs.com/&#34;&gt;Leaflet.js&lt;/a&gt; and &lt;a href=&#34;https://www.openstreetmap.org/&#34;&gt;OpenStreetMap&lt;/a&gt;. Both impressive feats of time and energy.
OpenStreetMap in particular astonished me with all the available features, and
completely free.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.natemeyvis.com/on-cognitive-debt/&#34;&gt;On cognitive debt&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In order to keep busy whilst waiting for &lt;a href=&#34;/weeknotes/245-stranded/#:~:text=on%20Wednesday%2C%20became-,stranded%20instead,-.%20This%20was%20very&#34;&gt;A&amp;rsquo;s unintentional extended holiday&lt;/a&gt;
to end, I decided to renovate the wooden worktops in our kitchen. They were in
quite a beat up condition when we moved in, but we always intended to replace
the kitchen so it wasn&amp;rsquo;t a big deal. However, those plans are dragging on, and
with the available time it seemed like a good idea.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m very happy with the results considering I&amp;rsquo;ve not done this before and it
came in around £70 for the job. And that includes spray paint to touch up the
fridge when I accidentally sanded it a bit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.keithcirkel.co.uk/whats-my-jnd/&#34;&gt;What&amp;rsquo;s My AEok JND?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You see two colours. Click on the line between them. That&amp;rsquo;s it. It starts
easy. It does not stay easy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.anildash.com/2026/03/13/coders-after-ai/&#34;&gt;What do coders do after AI?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To be somewhat reductive about it, there are two main cohorts of coders. A
larger, less vocal, group who see coding as a stable, well-paying career
that they got into in order to support themselves and their families, and to
partake in the upward economic mobility that the tech sector has represented
for the last few decades. Then there is the smaller, more visible, group who
have seen coding as an avocation, which they were drawn to as a form of
creative expression and problem-solving just as much as a career
opportunity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And into which cohort do I fall?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve come to the personal conclusion that the only way forward is for more
of the hackers with soul to seize this moment of flux and use these tools to
build.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;👀&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=73iTHJQaxcY&#34;&gt;Airwolf for 8 Cellos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Via Dan Cederholm at &lt;a href=&#34;https://simplebits.com/n/studio-notes-75/&#34;&gt;Simple Bits&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.nataliethenerd.com/dont-buy-from-modretro/&#34;&gt;Don&amp;rsquo;t Buy from ModRetro&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 245: Stranded</title>
      <link>https://elver.me/weeknotes/245-stranded/</link>
      <pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/245-stranded/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You&amp;rsquo;ll be glad to know I&amp;rsquo;ve had neither the time nor headspace to worry about
AI this week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week has been another shit one. After all hell broke lose in the Middle
East last Saturday, A, who was meant to get home from her holiday on
Wednesday, became stranded instead. This was very stressful as flights became
few and expensive due to the closed air space in the region.&lt;/p&gt;
&lt;p&gt;The worst part is the not knowing.&lt;/p&gt;
&lt;p&gt;Oh, and don&amp;rsquo;t rely rely on anyone you&amp;rsquo;ve paid to help or even give the
slightest shit either. &lt;a href=&#34;https://www.atol.org/about-atol/what-does-atol-protection-mean/&#34;&gt;ATOL protection&lt;/a&gt; will be getting tested when she
eventually gets back.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Happy Birthday to me 🥳&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I installed &lt;a href=&#34;https://dockhand.pro/&#34;&gt;Dockhand&lt;/a&gt; this week to give me a better overview of my Docker
containers. It&amp;rsquo;s really nice so far. Easy to setup and get going. It can
notify you of various events like containers being started, stopped, etc, and
can also check for updates &amp;ndash; I set these up via &lt;a href=&#34;https://ntfy.sh/&#34;&gt;ntfy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are several other contenders in this space including &lt;a href=&#34;https://www.portainer.io/&#34;&gt;Portainer&lt;/a&gt;,
&lt;a href=&#34;https://getarcane.app/&#34;&gt;Arcane&lt;/a&gt;, and &lt;a href=&#34;https://komo.do/&#34;&gt;Komodo&lt;/a&gt;, so I might not be settled on this one forever.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://andreasfragner.com/writing/three-ways-to-solve-problems&#34;&gt;Three ways to solve problems&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;reaching the desired state (perfect product) is neither possible nor
sensible&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ivanturkovic.com/2026/01/22/history-software-simplification-cobol-ai-hype/&#34;&gt;The Eternal Promise: A History of Attempts to Eliminate Programmers&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But the fundamental challenge remains unchanged: translating human intent
into correct, efficient, maintainable, secure software is hard. Not because
the tools are inadequate, but because the problem is inherently complex.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Perhaps&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;History suggests that reports of programming&amp;rsquo;s death have been greatly
exaggerated, repeatedly, for over sixty years. There is no reason to believe
this time is fundamentally different. There is every reason to believe that
those who invest in deep understanding will continue to be valuable,
regardless of what tools emerge.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip;some hope?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mrpopov.com/posts/elixir-phoenix-optimisations-iphone-safari/&#34;&gt;Elixir Phoenix Optimisations iPhone Safari&lt;/a&gt; &amp;ndash; gotta be careful with that
CSS!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.eod.com/blog/2026/02/lose-myself/&#34;&gt;Lose Myself&lt;/a&gt; by Greg Knauss&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Is the code any good? I don&amp;rsquo;t know. Who cares? Nobody looks at it anyway. AI
produces a result, and results are what matter, and if you&amp;rsquo;re waiting for
quality to factor significantly into that equation, I&amp;rsquo;ve got some bad news
about the last 40 years of professional software development for you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://shapeof.com/archives/2026/2/greg_knauss_is_losing_himself.html&#34;&gt;Greg Knauss Is Losing Himself&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And I have discipline and I know how to ship. And in my experience, that&amp;rsquo;s
what has always mattered.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Two qualities I do not have. That&amp;rsquo;s a shame for me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.pgedge.com/blog/postgresql-18-returning-enhancements-a-game-changer-for-modern-applications&#34;&gt;PostgreSQL 18 RETURNING Enhancements: A Game Changer for Modern Applications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Today I am learning about the &lt;code&gt;MERGE&lt;/code&gt; statement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://simonwillison.net/2026/Mar/5/chardet/&#34;&gt;Can coding agents relicense open source through a &amp;ldquo;clean room&amp;rdquo; implementation
of code?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As discussed in this issue from 2014 (where Dan first openly contemplated a
license change) Mark Pilgrim’s original code was a manual port from C to
Python of Mozilla’s MPL-licensed character detection library.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is fascinating. Python library chardet was rewritten using Claude.
Original author objects, but the original library, before rewrite, was itself
a port from C to Python.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://uplock.app/&#34;&gt;Uplock&lt;/a&gt; &amp;ndash; If I move to Apple Passwords from 1Password I will need somewhere
to put all those non-password secrets that I use 1Password for. This might be
that place.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://siddhantkhare.com/writing/ai-fatigue-is-real&#34;&gt;AI fatigue is real and nobody talks about it&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I had to learn to let go. Not of quality - I still care about quality. But
of the expectation that AI would produce quality. I now treat every AI
output as a rough draft. A starting point. Raw material. I mentally label it
&amp;ldquo;draft&amp;rdquo; the moment it appears, and that framing change alone reduced my
frustration by half.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post is chock-full of plugs for the author’s various products but a lot
of it really resonated with me. I have felt &lt;em&gt;so&lt;/em&gt; tired when using AI. At first
I thought it was not having coded much recently. Getting back into programming
after some time off often makes me really tired as I re-engage my brain in a
different way.&lt;/p&gt;
&lt;p&gt;But this time I think AI is the main cause. Reading the reams of text it
produces, which is something I struggle with generally, and the guilt from
skipping over it all. The code reviews. The understanding hundreds of lines of
text from nothing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mariakonnikova.substack.com/p/the-fight-for-our-attention&#34;&gt;The fight for our attention&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve beaten this drum many times, but I&amp;rsquo;m going to keep at it. Multitasking
is a myth. You cannot split your attention. It is neurologically impossible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mastodon.social/@siracusa/116171778118888641&#34;&gt;John Siracusa on the new MacBook Neo&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The A18 Pro in the MacBook Neo is 19% faster than the M2 Ultra in the Mac
Pro in single-core performance (Geekbench 6). The MacBook Neo starts at
$599. The Mac Pro, which is still for sale, starts at $6,99.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Crazy that this is the case. The MacBook Neo should be the average user&amp;rsquo;s
computer, no doubt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about &lt;a href=&#34;https://www.ferretdb.com/&#34;&gt;FerretDB&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A truly Open Source MongoDB alternative, built on Postgres&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It there anything Postgres can&amp;rsquo;t do?!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At least the daffodils are starting to bloom.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 244: Context bloat</title>
      <link>https://elver.me/weeknotes/244-context-bloat/</link>
      <pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/244-context-bloat/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I discovered that not only is &lt;a href=&#34;https://github.com/oban-bg/oban_web&#34;&gt;Oban Web&lt;/a&gt; now free but it also works with the
fairly recent SQLite support. This is cool because for small side projects
I&amp;rsquo;ve been increasingly interested in using SQLite. And having a web interface
to jobs is a massive help.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of SQLite. I am increasingly of the opinion that almost all
&amp;ldquo;self-hosted&amp;rdquo; software should start with SQLite and offer other databases as
an alternative. It makes deployment easier. Backups are easier. Who wants to
run a single instance of MySQL just for that one thing?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://expert-lsp.org/the-first-release-candidate/&#34;&gt;The First Release Candidate&lt;/a&gt; of Expert, the Elixir LSP.&lt;/p&gt;
&lt;p&gt;Excited to try this out!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/zihao-liu-qs/treekei&#34;&gt;treekei&lt;/a&gt; &amp;ndash; &amp;ldquo;A file tree with line counts&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/243-pretty-big-re-organisation/#:~:text=A-,tree%20alternative,-that%20doesn%E2%80%99t%20list&#34;&gt;Another tree alternative&lt;/a&gt;. Better name.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another trip south this week. There were a lot of small issues that I needed
to address whilst there, and I managed to complete them all which was a
relief, and it lets me relax after a very anxious week.&lt;/p&gt;
&lt;p&gt;The smart lock was the main focus of my attention. It&amp;rsquo;s a constant problem.
Well, it&amp;rsquo;s not constant. It works fine for 6 months and then doesn&amp;rsquo;t. I
recently had newly added PIN codes not work, and notifications completely
stopped&amp;hellip;notifying. Oh, and the batteries we low too. I&amp;rsquo;ve now replaced the
batteries, and relocated the &amp;ldquo;WiFi bridge&amp;rdquo; to plug socket to see that fixes
the intermittent connectivity problems.&lt;/p&gt;
&lt;p&gt;It was nice to see friends too, of course.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m now &lt;a href=&#34;https://plezy.app/&#34;&gt;using Plezy&lt;/a&gt; full time for consuming content from my Plex server.
There are less worries about what formats the video might be, and I can avoid
transcoding - Direct Play only - by just using Plezy as the client. I bought
the iOS version too, for my iPad, to support development. £4.99 well spent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://variantsystems.io/blog/building-production-calendar-phoenix-liveview&#34;&gt;Building a Calendar in Phoenix LiveView&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How we built a full-featured calendar in LiveView&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s become clear to me that despite all the opportunity afforded to me by
LLMs, still it is &lt;em&gt;I&lt;/em&gt; who is in the way of creating things. Same as it ever
was.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://simonwillison.net/2026/Feb/15/deep-blue/&#34;&gt;Deep Blue&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Something I see a lot of is people out there who are having existential
crises and are very, very unhappy because they’re like, &amp;ldquo;I dedicated my
career to learning this thing and now it just does it. What am I even for?&amp;rdquo;.
I will very happily try and convince those people that they are for a whole
bunch of things and that none of that experience they&amp;rsquo;ve accumulated has
gone to waste, but psychologically it’s a difficult time for software
engineers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I did not, in 2026, think I&amp;rsquo;d be reading the words “context bloat” quite as
much as I am.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I enabled a couple of ad blocking lists in NextDNS and now I can visit local
news websites without catching anything. I don&amp;rsquo;t know why I didn&amp;rsquo;t do this
sooner. Reasons. I started paying for NextDNS, it&amp;rsquo;s only £1.79/month which in
terms of a quality of life improvement seems pretty cheap. However&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://controld.com/&#34;&gt;Control D&lt;/a&gt;, a NextDNS competitor looks interesting. And is cheaper.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I kept seeing things about &lt;a href=&#34;https://github.com/microsoft/playwright-cli&#34;&gt;&lt;code&gt;playwright-cli&lt;/code&gt;&lt;/a&gt; this week and decided to give it
a go. It is what is sounds like, a command line interface to &lt;a href=&#34;https://en.wikipedia.org/wiki/Playwright_%28software%29&#34;&gt;Playwright&lt;/a&gt;, the
browser automation tool. An MCP already exists for Playwright, but this cli
version is more &amp;ldquo;token efficient&amp;rdquo; so is apparently preferred.&lt;/p&gt;
&lt;p&gt;I was able to describe to the LLM what to tests to write, and then have those
tests converted into actual runnable specs. It was very easy. I&amp;rsquo;m not saying
this is the best way to write tests, but if you need to add some confidence
before making changes, and you don&amp;rsquo;t have tests already, this might be best
bang for your buck.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I spent some time sharpening our kitchen knives this week which is how I
managed to slice the end off my left thumb. Naturally.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 243: Pretty big re-organisation</title>
      <link>https://elver.me/weeknotes/243-pretty-big-re-organisation/</link>
      <pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/243-pretty-big-re-organisation/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You may or may not have noticed that I shipped a pretty big re-organisation of
my &amp;ldquo;web presence&amp;rdquo; this week.&lt;/p&gt;
&lt;p&gt;The separate &lt;a href=&#34;https://weeknotes.elver.me&#34;&gt;weeknotes&lt;/a&gt; website where you would&amp;rsquo;ve been reading this before
is no more. That is now a section on here at &lt;a href=&#34;https://elver.me/weeknotes/&#34;&gt;elver.me/weeknotes/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The blog from &lt;a href=&#34;https://jordanelver.co.uk&#34;&gt;jordanelver.co.uk&lt;/a&gt; has also been consolidated here. Leaving
that website as more of a work/calling card kind of thing.&lt;/p&gt;
&lt;p&gt;I intend to use &lt;a href=&#34;https://elver.me&#34;&gt;https://elver.me&lt;/a&gt; for the majority of the stuff I publish
online.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve added redirects for everything I could think of, but it is of course
possible I missed one (thank you &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt; for pointing one out already!). If
you are subscribed to any feeds and you got duplicates or unreads I&amp;rsquo;m sorry
but how exactly feed readers manage this is unknown to me and it was too much
work for two of you.&lt;/p&gt;
&lt;p&gt;Speaking of which there are now a lot more feeds at &lt;a href=&#34;https://elver.me/feeds/&#34;&gt;/feeds&lt;/a&gt; too so that you
can subscribe to only the parts you are interested in or, more likely, all the
exciting content on this website.&lt;/p&gt;
&lt;p&gt;Of course, I got OpenAI GPT-5.3 Codex using &lt;a href=&#34;https://opencode.ai/&#34;&gt;opencode&lt;/a&gt; to do a lot of the
heavy lifting which was mainly migrating content in Markdown files from one
place to another and munging it about a bit.&lt;/p&gt;
&lt;p&gt;Even updating the old and crufty jordanelver.co.uk which was running Ruby 2.7
and other ancient gems was easy thanks to me asking Codex to generate me a
&lt;code&gt;Dockerfile&lt;/code&gt; I could use to get it going and edit from there. This will be
re-designed at &lt;em&gt;some point&lt;/em&gt;. I knew I could use Docker to solve this problem,
but having it done and working in 30 seconds does change things,
significantly.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m pretty happy this is all done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://aaronrussell.dev/posts/agentic-engineering&#34;&gt;Agentic engineering&lt;/a&gt; &amp;ndash; A lot of insightful points here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/waynehoover/pbrich&#34;&gt;pbrich&lt;/a&gt; &amp;ndash; &amp;ldquo;Like pbcopy, but with support for arbitrary pasteboard types&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Something that I&amp;rsquo;ve avoided for years, talking into my phone/computer/device,
needs addressing. AI use has made it clear, I need to start talking and
transcribing more. Typing is a barrier to use.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve avoided it for so long because it&amp;rsquo;s been very bad in the past. That, and
I feel like a pillock talking into my phone. But I remember feeling that way
about using my iPhone and laptop in public too. Need to get over that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/caffienerd/struct-cli&#34;&gt;struct&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Struct: tree with a developer brain. Stop drowning in site-packages — struct
shows you the code you care about.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A &lt;code&gt;tree&lt;/code&gt; alternative that doesn&amp;rsquo;t list &lt;code&gt;node_modules/&lt;/code&gt;, nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://openepaperlink.de/&#34;&gt;OpenEPaperLink&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OpenEPaperLink is an alternative protocol and firmware implementation for
electronic shelf labels. Multiple Displays are supported with ESP32-based
access points and 802.15.4 radio communication.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An excuse to get some colour &lt;a href=&#34;https://en.wikipedia.org/wiki/E_Ink&#34;&gt;E Ink&lt;/a&gt; displays?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.zachdaniel.dev/p/software-conjuring&#34;&gt;Software Conjuring&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The thing is that it really doesn&amp;rsquo;t feel like engineering any more. I feel
instead that I&amp;rsquo;ve gotten really good at my spellwork.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://til.hashrocket.com/posts/pfjzwvr00o-visualize-a-git-branchs-history&#34;&gt;Visualize a Git Branch&amp;rsquo;s History&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git log --oneline --graph --decorate --all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Keeping this one handy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It dawned on me this week that although &amp;ldquo;public&amp;rdquo; access (not really public as
everything is still behind Tailscale) to all my services was now secured over
HTTPS, inter-service communication &amp;ndash; when one container talks to another &amp;ndash;
was not. That communication was happening without using TLS direct to the
container and port. Now, this is a homelab environment, but we should still do
our best to tidy this up &amp;ndash; I guarantee this homelab has better security than
99% of businesses!&lt;/p&gt;
&lt;p&gt;My aim was to replace addresses configured inside running containers that look
like &lt;code&gt;http://&amp;lt;service&amp;gt;:&amp;lt;port&amp;gt;&lt;/code&gt; with their secure counterpart
&lt;code&gt;https://&amp;lt;service&amp;gt;.custom.domain&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I was planning on using that &lt;a href=&#34;/weeknotes/242-happening-regardless/#:~:text=could%20use%20the-,extra_hosts,-directive%20in%20a&#34;&gt;&lt;code&gt;extra_hosts&lt;/code&gt; trick I discovered and utilised
last week&lt;/a&gt;, but happened across a slightly less hacky solution, network
aliases.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  caddy:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    container_name: caddy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ports:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - 443:443
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - ./caddy/Caddyfile:/etc/caddy/Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - /opt/appdata/caddy/data:/data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - /opt/appdata/caddy/config:/config
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+   networks:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+     default:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+       aliases:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+         - &amp;lt;service1&amp;gt;.custom.domain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+         - &amp;lt;service2&amp;gt;.custom.domain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+         - &amp;lt;service3&amp;gt;.custom.domain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;&lt;/span&gt;    restart: unless-stopped
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Instead of needing to add an &lt;code&gt;extra_host&lt;/code&gt; config change for each container, I
could instead add network aliases for the services that need to talk &amp;ndash; these
are essentially just DNS entries that work only in Docker, but that’s fine &amp;ndash;
and then they can reach each other. I made this change and configured the URLs
in the respective softwares and it all works.&lt;/p&gt;
&lt;p&gt;I also removed the previous &lt;code&gt;extra_host&lt;/code&gt; configuration I added last week and
replaced it with another network alias.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dev.37signals.com/introducing-upright/&#34;&gt;Introducing Upright: An Open Source Synthetic Monitoring System&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lots of great ideas in here. Playwright Probes, in particular, are cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://johan.hal.se/wrote/2026/02/03/the-sideprocalypse/&#34;&gt;The Sideprocalypse&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Listen: every idea you&amp;rsquo;ve ever had, every single one, some cocaine-addled
sales critter has had too. And they&amp;rsquo;re better than you at SEO.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is &lt;em&gt;somewhat&lt;/em&gt; what I was saying (in &lt;em&gt;slightly&lt;/em&gt; different terms) to a
friend last week but I hope Johan and I are wrong. I fear we are not 😢&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vibe of the week: &lt;a href=&#34;https://open.spotify.com/track/1CsMuJeMzRqNgS7G0fo1Gv&#34;&gt;How to Fight Loneliness&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(Not a call for help, I&amp;rsquo;m fine!)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 242: Happening regardless</title>
      <link>https://elver.me/weeknotes/242-happening-regardless/</link>
      <pubDate>Sun, 15 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/242-happening-regardless/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This week is very AI/LLM heavy for which I apologise. It feels as if it is
dominating my life. That&amp;rsquo;s not even hyperbole. Every conversation I have seems
to end up talking about it some how, even with &amp;ldquo;normal&amp;rdquo; people who don&amp;rsquo;t have
skin in the game.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s amazing. It&amp;rsquo;s awful. It&amp;rsquo;s happening regardless.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week&amp;rsquo;s project was to setup SSO (Single Sign-on) for my services at home.
I have ignored Single Sign-on for years, not having really had to deal or come
into contact with it at all. The name seems fairly self-describing, but it is
also quite a nebulous term for software that allows you to authenticate a user
and have them &amp;ldquo;logged in&amp;rdquo; to some other software, without the need to login to
each service separately.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/OpenID#OpenID_Connect_(OIDC)&#34;&gt;OIDC&lt;/a&gt;, based on OAuth 2.0, seems to be the modern protocol for achieving
this.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been lurking on Reddit for a while and subconsciously keeping note of the
solutions proffered to this problem. I decided upon the combination of &lt;a href=&#34;https://pocket-id.org/&#34;&gt;Pocket
ID&lt;/a&gt; and &lt;a href=&#34;https://tinyauth.app/&#34;&gt;Tinyauth&lt;/a&gt; along with Caddy (which I&amp;rsquo;m already using as reverse
proxy).&lt;/p&gt;
&lt;p&gt;It is seemingly working. Maybe there&amp;rsquo;ll be a blog post on how I set it up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See what the environment variables are from a running Docker Container.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-docker&#34; data-lang=&#34;docker&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker inspect &amp;lt;container&amp;gt; --format &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;{{range .Config.Env}}{{println .}}{{end}}&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you were to, for example, completely hypothetically, accidentally, maybe,
delete your &lt;code&gt;*.env&lt;/code&gt; files containing all your secrets, you could recover them
using this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.neatnik.net/setting-up-an-irc-server/&#34;&gt;Setting up an IRC server&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Setting up an IRC server for use amongst friends is very tempting. But does it
solve anything for me really? People I know are already scattered over
different Slacks, Signals, WhatsApps, and others. And if I setup an IRC server
then I&amp;rsquo;m asking them to add IRC to their own list communication channels.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.peonping.com/&#34;&gt;peon-ping - &amp;ldquo;Stop babysitting your terminal&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Warcraft III Peon voice notifications (+ more!) for Claude Code, Codex, and
other IDEs. Stop babysitting your terminal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;This&lt;/em&gt; is what software is about.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL that you can specify hostname mappings at build time with Docker Compose.
My use case for this was, once again (I am sorry) DNS. It is&amp;hellip;&lt;em&gt;always&lt;/em&gt; DNS.&lt;/p&gt;
&lt;p&gt;Since I don&amp;rsquo;t have a DNS server on my network I have been relying on &lt;a href=&#34;/weeknotes/241-my-dns-problem/#:~:text=fix%E2%80%9D%20is%20that-,NextDNS,-has%20a%20feature&#34;&gt;NextDNS
Rewrites and /etc/hosts&lt;/a&gt;. This works for &lt;em&gt;my client devices&lt;/em&gt;. However the
server I am running at home does not use NextDNS, so it cannot resolve the
same hostnames that I can on my clients (my laptop).&lt;/p&gt;
&lt;p&gt;Until now that hasn&amp;rsquo;t been a problem because when Docker containers need to
talk to one another, I can use &lt;a href=&#34;https://docs.docker.com/reference/compose-file/networks/&#34;&gt;Docker networking&lt;/a&gt;. Docker networking is a
magical feature where running containers appear on the internal Docker network
using their container name as hostname. For example, if I have two containers
running, &lt;code&gt;foo&lt;/code&gt; and &lt;code&gt;bar&lt;/code&gt;. If &lt;code&gt;bar&lt;/code&gt; has a web server running on port 3000, I
can reach it from &lt;code&gt;foo&lt;/code&gt; with &lt;code&gt;http://bar:3000&lt;/code&gt; without having to do anything
else.&lt;/p&gt;
&lt;p&gt;This is great for a lot of use cases, but not for the OIDC flow I was setting
up this week. To simplify a lot (because I don&amp;rsquo;t fully grasp it like all OAuth
related topics) the flow starts in the web browser and you are redirected to
the OIDC provider. This works because we&amp;rsquo;re on the client, so we have properly
resolving DNS. The OIDC provider then &lt;code&gt;POST&lt;/code&gt;s the initiator &amp;ndash; server to
server. This is the part that fails, we don&amp;rsquo;t have working DNS on the server,
just client.&lt;/p&gt;
&lt;p&gt;To fix this I need the server to be able to resolve initiating service. I
could setup hardcoded DNS entries on my home server, but it seems like my
&lt;code&gt;/etc/hosts&lt;/code&gt; habit is already getting out of hand, so instead I found I could
use the &lt;a href=&#34;https://docs.docker.com/reference/compose-file/build/#extra_hosts&#34;&gt;&lt;code&gt;extra_hosts&lt;/code&gt; directive&lt;/a&gt; in a &lt;code&gt;docker-compose.yml&lt;/code&gt; to specify the
mapping.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-docker&#34; data-lang=&#34;docker&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;extra_hosts:&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;&lt;/span&gt;  - &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;service.custom.domain:192.168.0.1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This feels like a slight hack, we&amp;rsquo;re putting DNS stuff where you might not
expect to find it, but I think it&amp;rsquo;s reasonable for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mitchellh/vouch&#34;&gt;Vouch — A community trust management system&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Historically, the effort required to understand a codebase, implement a
change, and submit that change for review was high enough that it naturally
filtered out many low quality contributions from unqualified people. For
over 20 years of my life, this was enough for my projects as well as enough
for most others.  Unfortunately, the landscape has changed particularly with
the advent of AI tools that allow people to trivially create
plausible-looking but extremely low-quality contributions with little to no
true understanding. Contributors can no longer be trusted based on the
minimal barrier to entry to simply submit a change.  But, open source still
works on trust! And every project has a definite group of trusted
individuals (maintainers) and a larger group of probably trusted individuals
(active members of the community in any form). So, let&amp;rsquo;s move to an explicit
trust model where trusted individuals can vouch for others, and those
vouched individuals can then contribute.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://exe.dev/&#34;&gt;exe.dev&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;exe.dev is a subscription service that gives you virtual machines, with
persistent disks, quickly and without fuss. These machines are immediately
accessible over HTTPS, with sensible and secure defaults. You can share your
web server as easily as you can share a Google Doc. With built-in optional
authentication, so you can focus on your thing.&lt;/p&gt;
&lt;p&gt;Your VMs share CPU/RAM—you pay for underlying resources, not per VM. Make a
bunch!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think this service looks really interesting, I&amp;rsquo;m just not sure what my
workflow would look like using it. On the one hand I like that it keeps
everything isolated, but to make it useful I&amp;rsquo;m going to need to give it access
to things, so I don&amp;rsquo;t know. &lt;code&gt;scp&lt;/code&gt;-ing files around doesn&amp;rsquo;t seem like fun. FUSE
SSH filesystem? Something else?&lt;/p&gt;
&lt;p&gt;Undeniably great domain name though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/XENONCYBER/envy&#34;&gt;envy&lt;/a&gt; — &amp;ldquo;A terminal based tool for managing secrets with both tui and cli
support&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A secure encrypted vault for managing API keys, secrets, and environment
variables. Built for developers who live in the terminal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I do have the problem of .env files being scattered around 🤔&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://crawshaw.io/blog/programming-with-llms&#34;&gt;How I program with LLMs&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sometimes the LLM is wrong. So are people.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Exactly. You don&amp;rsquo;t believe anything you read or are told by other people
either do you?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://disco.cloud/&#34;&gt;disco&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Disco is the self-hosted Open Source Heroku alternative: git push deploys,
zero-downtime releases, automatic SSL, on your own servers at hardware
cost.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This sounds somewhat like Hatchbox.io? Opaque pricing means a no from me
though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://localghost.dev/blog/stop-generating-start-thinking/&#34;&gt;Stop generating, start thinking&lt;/a&gt; &amp;ndash; Thoughtful takes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://zed.dev/blog/on-programming-with-agents&#34;&gt;On Programming with Agents&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Focus on the thinking and let agents do the typing. Use the three rules to
guide your workflow: plan first so you know what you&amp;rsquo;re building, stay
engaged so you never lose the thread, and review the output so you can stand
behind what ships.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.zolkos.com/2025/12/03/vanilla-css-is-all-you-need&#34;&gt;Vanilla CSS is all you need&lt;/a&gt; &amp;ndash; This was quite an education for me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://nolanlawson.com/2026/02/07/we-mourn-our-craft/&#34;&gt;We mourn our craft&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ultimately if you have a mortgage and a car payment and a family you love,
you&amp;rsquo;re going to make your decision. It’s maybe not the decision that your
younger, more idealistic self would want you to make, but it does keep your
car and your house and your family safe inside it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dashbit.co/blog/why-elixir-best-language-for-ai&#34;&gt;Why Elixir is the best language for AI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I keep seeing various posts from people about how their particular tools are
&amp;ldquo;the best&amp;rdquo; for use with LLMs. And here I am doing the same, but I&amp;rsquo;m also
&lt;a href=&#34;https://autocodebench.github.io/&#34;&gt;linking to a study&lt;/a&gt; that I looked at for up to 1 minute.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://thebitshift.com/blog/the-greenfield/&#34;&gt;The Greenfield&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is the single most expensive delusion in engineering.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://amit.prasad.me/blog/rip-good-code&#34;&gt;The silent death of Good Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 241: My DNS problem</title>
      <link>https://elver.me/weeknotes/241-my-dns-problem/</link>
      <pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/241-my-dns-problem/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/232-your-blog-is-dead-to-me/#:~:text=route%2C%20for%20now%20%E2%80%93-,/etc/hosts,-.&#34;&gt;DNS problem&lt;/a&gt; took a step forward when I realised that I might be able to
solve it, again perhaps temporarily, without having to actually setup a proper
DNS server &amp;ndash; which I seem to be constantly putting off. That fix is
&lt;a href=&#34;https://nextdns.io/&#34;&gt;NextDNS&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NextDNS protects you from all kinds of security threats, blocks ads and
trackers on websites and in apps and provides a safe and supervised Internet
for kids — on all devices and on all networks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve been a NextDNS user on and off for a few years. I never really fully
committed to it though despite being impressed by the whole idea and
implementation.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;fix&amp;rdquo; is that NextDNS has a feature called &lt;a href=&#34;https://nextdns.io/#:~:text=Rewrites,for%20any%20domain.&#34;&gt;Rewrites&lt;/a&gt; which are basically
DNS mappings from hostname to IPs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Set or override the DNS response for any domain. Rewrites apply to
subdomains as well, and local IP addresses are supported as answers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This sounds like what a DNS server does. As &lt;a href=&#34;/weeknotes/231-on-a-roll/#:~:text=Subnet%20Router&#34;&gt;previously covered, because of
subnet routing&lt;/a&gt;, I can use local IPs when connected to my tailnet. So if I&amp;rsquo;m
connected to Tailscale and using NextDNS, my services are resolving to their
proper DNS names.&lt;/p&gt;
&lt;p&gt;I added a rewrite like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  *.custom.domain → 192.168.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is working for &lt;em&gt;me&lt;/em&gt; but it does raise the question of how to get everyone
in the house using NextDNS and if that even matters? Getting the Virgin Media
router to dish out NextDNS via DHCP seems like a non-starter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://inessential.com/2004/12/01/black_box_parsing.html&#34;&gt;Black Box Parsing&lt;/a&gt; &amp;ndash; Encapsulation is good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gem.coop/updates/4/&#34;&gt;gem.coop update #4: cooldowns beta&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This seems like an interesting technique. I&amp;rsquo;ve always been a reluctant updater
of libraries/gems, not for fear of introducing security vulnerabilities, but
that everything else might break. I think we forget that people write code
(lol — not anymore) and we blindly accept their changes into our codebases
like they are free of cost. They are not.&lt;/p&gt;
&lt;p&gt;There has to be a compromise between updating all the time, and never updating
though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mariakonnikova.substack.com/p/the-power-of-the-literally-written&#34;&gt;The power of the (literally) written word&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What&amp;rsquo;s more, you can&amp;rsquo;t write as quickly as you type, so your brain has to
actually comprehend what it&amp;rsquo;s hearing and process it, so that you can write
down the essentials. In a sense, then, you&amp;rsquo;re encoding twice, first, in the
effort it takes to internalize what you&amp;rsquo;re hearing and sum it up in a way
that enables you to write it down quickly enough, and second, in the
physical process of writing itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.mikeswanson.com/backseat-software/&#34;&gt;Backseat Software&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;the slow shift from software as a tool you operate to software as a
channel that operates on you. Once a product learns it can talk back, it&amp;rsquo;s
remarkably hard to keep it quiet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://support.dnsimple.com/articles/sshfp-records/&#34;&gt;What are SSHFP Records?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An SSHFP (SSH FingerPrint, record type 44) record is a type of DNS resource
record that is used to securely publish SSH host key fingerprints in
the Domain Name System (DNS). The primary purpose of an SSHFP record is to
provide a way for SSH clients to automatically and securely verify the
authenticity of an SSH server&amp;rsquo;s public key, helping to protect against
man-in-the-middle (MITM) attacks during SSH connections.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The algorithm knows me. Everything is DNS records at the moment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://nitter.net/akshay_pachaar/status/2014314783391298019&#34;&gt;&lt;code&gt;pg_textsearch&lt;/code&gt; seems like it&amp;rsquo;s going to be a great addition to Postgres!&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://byroot.github.io/ruby/performance/2025/10/28/string-literals.html&#34;&gt;Frozen String Literals: Past, Present, Future?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This has been sat in my “to read” pile since it was published, but I&amp;rsquo;m glad to
have finally read it because now I have a much better idea of why we&amp;rsquo;ve been
writing &lt;code&gt;# frozen_string_literal: true&lt;/code&gt; at the top of our Ruby files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.heroku.com/blog/an-update-on-heroku/&#34;&gt;An Update on Heroku&lt;/a&gt; &amp;ndash; What a sad state of affairs this is. Such a game
changer with a massive lead squandered.&lt;/p&gt;
&lt;p&gt;People have totally forgotten what a game-changer Heroku was and just how easy
it made deploying Ruby on Rails applications. It had a big impact on the
popularity of Rails itself. I still think the ease of deployment is unmatched.&lt;/p&gt;
&lt;p&gt;(I really like &lt;a href=&#34;https://fly.io/&#34;&gt;Fly.io&lt;/a&gt; &amp;ndash; despite having nothing deployed in production there
&amp;ndash; but I don&amp;rsquo;t think the experience is as good, nor is it ever likely to be as
they position themselves differently to Heroku.)&lt;/p&gt;
&lt;p&gt;And no, &amp;ldquo;Kamal and Hetzner&amp;rdquo; is not the same thing &amp;ndash; although they are a good
thing apparently. I ask you once again, who is looking after that VPS of
yours?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/my-ai-adoption-journey&#34;&gt;My AI Adoption Journey&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Immediately cease trying to perform meaningful work via a chatbot&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This cemented for me something I hadn&amp;rsquo;t fully understood. All the copying and
pasting destroys any productivity. For anything that will code or does
anything on the filesystem it&amp;rsquo;s best to just go straight to the terminal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/chrishutchinson/claude-receipts&#34;&gt;&lt;code&gt;claude-receipts&lt;/code&gt;&lt;/a&gt; — &amp;ldquo;Bring receipts from your Claude Code sessions&amp;rdquo;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re all probably gonna need this when we&amp;rsquo;re fully dependant on them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I made &lt;a href=&#34;https://github.com/jordelver/gridfinity-canon-lp-e5-battery-holder/&#34;&gt;my first &lt;em&gt;from scratch&lt;/em&gt; 3D model&lt;/a&gt;!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Gridfinity compatible battery holder for Canon LP-E5 batteries created
using OpenSCAD.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s a battery holder for Canon camera batteries. I wrote it in OpenSCAD&amp;hellip;&lt;/p&gt;
&lt;model-viewer
    src=&#34;/models/gridfinity-canon-lp-e5-battery-holder.glb&#34;
    alt=&#34;Canon LP-E5 battery 3 slot holder for Gridfinity&#34;
    camera-controls
    auto-rotate
    
    camera-orbit=&#34;35deg 68deg 140%&#34;
    
    
    
    style=&#34;width:100%;height:520px;&#34;&gt;
  &lt;/model-viewer&gt;

&lt;p&gt;I was &lt;a href=&#34;/weeknotes/235-magnets/#:~:text=mathsy&#34;&gt;right about OpenSCAD getting very mathsy&lt;/a&gt;. It quickly gets too
complicated for me to understand, thankfully LLMs are very helpful with this
task too.&lt;/p&gt;
&lt;p&gt;(Aside: I had ChatGPT walk me through &lt;a href=&#34;https://www.blender.org/&#34;&gt;Blender&lt;/a&gt; to create a render of the STL,
upon which the interactive version above is based, and despite it taking ages
and being painful, we did get there. I would&amp;rsquo;ve just noped out of Blender in
the past. Have you seen the Blender interface?! 🤯)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As LLM&amp;rsquo;s become &amp;ldquo;just another tool in the toolbox&amp;rdquo;, which at the moment I
believe they will. And if it is just matter of learning how to fit them into
your workflow and operate them effectively, then why are we committing the
changes they helped &lt;em&gt;us&lt;/em&gt; make &lt;em&gt;as them&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Are we showing our workings for fear of being found out?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.arkency.com/the-timezone-bug-that-hid-in-plain-sight-for-months/&#34;&gt;The timezone bug that hid in plain sight for months&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yet again time and date maths is hard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Both OpenAI&amp;rsquo;s Codex 5.3 and Anthropic&amp;rsquo;s Opus 4.3 were released this week, so I
felt I should try them out despite not feeling like I have enough usage of
either to really judge whether they are &amp;ldquo;better&amp;rdquo;. I am very much working on
vibes with this stuff.&lt;/p&gt;
&lt;p&gt;Claude has felt like it was way ahead and as such I mostly concentrated on it.
Codex impressed me though. I spent some time with Codex 5.3 though on various
projects and it felt less needy and needed less hand holding. I think.&lt;/p&gt;
&lt;p&gt;It is still funny when I ask it to do something quite straightforward and it
does it in the most convoluted way possible. For example, I asked it to format
a document by word wrapping to 80 characters and it instantly starts writing a
Python script to do so, instead of, you know, many of the sensible ways to
achieve that task.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 240: Always use hot glue</title>
      <link>https://elver.me/weeknotes/240-always-use-hot-glue/</link>
      <pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/240-always-use-hot-glue/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://mecha.so/comet&#34;&gt;Mecha Comet&lt;/a&gt; looks like a cool little handheld computer which I would
never use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/6aae2381440bc06bf20e87c4905fd5602cd632f4&#34;&gt;Make Ghostty look as much like iTerm as possible&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks to help from my mate Claude, I now have &lt;a href=&#34;https://ghostty.org/&#34;&gt;Ghostty&lt;/a&gt; configured to match
iTerm with only a tiny difference (that I&amp;rsquo;ve noticed so far) so I&amp;rsquo;m moving
over to give it a proper try.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/nvzone/typr&#34;&gt;typr&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Most Beautiful Typing practice plugin for Neovim with dashboard&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This does look very nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An unfortunate event: bleach on my new black hoodie 🙀 First I attempted to
colour it in using black sharpie. That resulted in the coloured in bit being
&lt;em&gt;too&lt;/em&gt; black. So I resorted to dyeing it. No cigar. It is now a gym hoodie.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I &amp;ldquo;fixed&amp;rdquo; my &lt;a href=&#34;/weeknotes/190-no-worky/#:~:text=Finally%2C-,something%20I%20fixed,-.%20We%20use%20an&#34;&gt;Soundcore speaker again&lt;/a&gt;. You could say there is no &amp;ldquo;again&amp;rdquo;
because I&amp;rsquo;m here fixing it a second time. I am of course blaming the speaker.
The &lt;a href=&#34;/weeknotes/231-on-a-roll/#:~:text=it%2C%20but%20I%E2%80%99ve-,preemptively%20bought,-some%20right%2Dangled&#34;&gt;switches I bought&lt;/a&gt; were wrong. I used hot glue to fix it this time.
Always use hot glue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/netmute/dol&#34;&gt;dol&lt;/a&gt; &amp;ndash; &amp;ldquo;Detect dark/light mode on the CLI&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The definition of Unix &amp;ndash; one thing well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://european-alternatives.eu/&#34;&gt;European alternatives for digital products&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We help you find European alternatives for digital service and products,
like cloud services and SaaS products.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://arrowsmithlabs.com/blog/secure-by-default-how-phoenix-keeps-you-safe-for-free&#34;&gt;&amp;ldquo;Secure by default&amp;rdquo; - how Phoenix keeps you safe for free&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A lot of &amp;ldquo;indie hackers&amp;rdquo; apparently think that security isn&amp;rsquo;t important.
Sure, it&amp;rsquo;s better to be secure than insecure, but you have a business to
launch - security is a cost you can live without, so get your MVP out the
door asap then you can worry about security later.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This has always been a problem with cowboy coders and I&amp;rsquo;m afraid that it&amp;rsquo;s
only going to get worse with all the vibe coders out there. People who didn&amp;rsquo;t
care before are even less likely to care now when they&amp;rsquo;re not even writing the
code. AI is only going to exacerbate the problem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://zarar.dev/regex-serialization-has-changes-in-elixir-119-otp-28/&#34;&gt;Why Regex Serialization Changed in Elixir 1.19/OTP 28&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://eieio.games/blog/ssh-sends-100-packets-per-keystroke/&#34;&gt;WHY DOES SSH SEND 100 PACKETS PER KEYSTROKE?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a really interesting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In 2023, ssh added keystroke timing obfuscation. The idea is that the speed
at which you type different letters betrays some information about which
letters you&amp;rsquo;re typing. So ssh sends lots of &amp;ldquo;chaff&amp;rdquo; packets along with your
keystrokes to make it hard for an attacker to determine when you&amp;rsquo;re actually
entering keys.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is why I&amp;rsquo;m very suspicious of people who think they can roll their own
security. Not quite a fair example here as obviously SSH is having to do
things that most of us writing web applications are not, but still you need to
be aware of things like timing attacks which are a lot more difficult to
handle than a simple username and password.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think they&amp;rsquo;re sometimes right! Interacting with LLMs is a new skill, and
it feels pretty weird if you&amp;rsquo;re used to writing software like it&amp;rsquo;s 2020.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Very true. This new LLM stuff is learning how to use them effectively.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.todoist.com/ramble&#34;&gt;Todoist Ramble&lt;/a&gt; looks like a nice implementation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.dnsimple.com/2026/01/tlsa-record-support/&#34;&gt;Announcing TLSA Record Support&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TLSA records bind TLS certificates to DNS names using DNSSEC. Instead of
relying solely on Certificate Authorities (CAs) to validate certificates,
TLSA records let you publish certificate information directly in your DNS
zone. When a client connects to your server, it can verify that the
certificate presented matches what&amp;rsquo;s published in DNS.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jvns.ca/blog/2026/01/27/some-notes-on-starting-to-use-django/&#34;&gt;Some notes on starting to use Django&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Around the same time as I was getting into Ruby I was also playing around with
Python and I always liked it. I never got around to learning more though
because it sort of felt like I had my &amp;ldquo;scripting language&amp;rdquo; bases covered with
Ruby. Maybe that was silly.&lt;/p&gt;
&lt;p&gt;Reading this kinda made me wonder what would&amp;rsquo;ve happened if I&amp;rsquo;d chosen Python
and Django back then.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://sindresorhus.com/ds-store-inspector&#34;&gt;DS_Store Inspector&lt;/a&gt; — &amp;ldquo;Inspect .DS_Store files&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Might be useful to the right audience?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://little-book-of.github.io/c/&#34;&gt;The Little Book of C&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This looks like a nice introduction for the C curious amongst us.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hopefully some advice to future me one day. People who are offering a software
product, &lt;em&gt;please&lt;/em&gt; tell me what it does and what problems it solves! It&amp;rsquo;s
scalable? Oh, cool. It can streamline my blah? Sweet. What does your thing do?
And include screenshots, for god sake.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/dimonomid/nerdlog&#34;&gt;nerdlog&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nerdlog: fast, remote-first, multi-host TUI log viewer with timeline
histogram and no central server&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This looks useful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I noticed some burn-in on my Apple Studio Display this week. Not good. I do
not want. I suspect this is my problem for not starting the screensaver
enough.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you decide which JavaScript date picker to use? The paralysis by
analysis is now affecting 3D printing activities. There is just so much
&lt;em&gt;stuff&lt;/em&gt; out there, which is wonderful, but deciding between this or that is
very difficult. And given what I was &lt;a href=&#34;/weeknotes/239-inevitable-to-some-degree/#:~:text=necessitates%20some%20waste&#34;&gt;saying last week about waste&lt;/a&gt; I&amp;rsquo;m doubly
keen to not make mistakes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 239: Inevitable to some degree</title>
      <link>https://elver.me/weeknotes/239-inevitable-to-some-degree/</link>
      <pubDate>Sun, 25 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/239-inevitable-to-some-degree/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Remember I was going to try a &lt;a href=&#34;/weeknotes/232-your-blog-is-dead-to-me/#:~:text=very%20lowest%20of%20lo%2Dfi%20route&#34;&gt;try a lo-fi approach to using a proper domain&lt;/a&gt;
on my home network? Well I have now got that working, and with a &lt;a href=&#34;/weeknotes/236-acme-challenge/#:~:text=I%20discovered%20the-,DNS%2D01%20challenge&#34;&gt;little
sprinkle of DNS-01 ACME challenge&lt;/a&gt; I&amp;rsquo;ve also got legit Let&amp;rsquo;s Encrypt
certificates for all my services, which will just work everywhere (but, at the
moment, you know, just on this computer).&lt;/p&gt;
&lt;p&gt;I chose the simplest option for moving forward with this which was to get
myself a brand spanking new domain name. After many fraught hours trying to
find &lt;a href=&#34;/weeknotes/236-acme-challenge/#:~:text=trying%20to%20buy%20any%20sort%20of%20decent%20domain%20name%20is%20so%20depressing&#34;&gt;something not shit&lt;/a&gt; I bit the bullet and registered a new domain with
our friends Porkbun.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t intending to set everything up straight away but I suddenly realised
out of nowhere that Porkbun actually provided a lot of the things I wanted in
order reduce the impact of any potential API secret leaks, my main concern
with the whole endeavor.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now, the risk of token leak is small, but if it did happen, the consequences
are potentially massive. If some nefarious actor got access to my DNS
records very bad things could happen. [&amp;hellip;] they could do something like
change my MX records and take over my email. Once someone has your email
it&amp;rsquo;s game over, man. Keys to the kingdom.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Isolating any impact was my goal. We practice good security over here in these
here parts. As long as it fits into budget and is convenient.&lt;/p&gt;
&lt;p&gt;I was looking for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DNS-01 ACME challenge support &amp;ndash; So that we can use Let&amp;rsquo;s Encrypt for TLS
certificates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scoped access tokens &amp;ndash; Tokens that only allow access to certain domains
and/or certain types of records (&lt;code&gt;TXT&lt;/code&gt; only).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To not to pay any money, if possible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Firstly&lt;/strong&gt;, Porkbun &lt;em&gt;does&lt;/em&gt; have a compatible API we can use for DNS-01
challenges (and &lt;a href=&#34;https://github.com/caddy-dns/porkbun&#34;&gt;support for Caddy available&lt;/a&gt;) ✅&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Secondly&lt;/strong&gt;, Porkbun doesn&amp;rsquo;t actually provide scoped access tokens. But, but,
but, they do require you to turn on the API for each domain which you intend
to use the API with ✅&lt;/p&gt;
&lt;p&gt;If we turn on API access for just that single &amp;ldquo;homelab&amp;rdquo; domain we get the
required isolation, and even if the Porkbun authorisation code were to fail
somehow, I&amp;rsquo;m only hosting the single DNS zone with them &amp;ndash; my other domains
have their nameservers pointed at DNSimple, whom I use to handle other DNS
needs.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ve gotta think about your failure modes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thirdly&lt;/strong&gt;, this is all included by default with Porkbun as your domain
registrar, so no extra money changes hands ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://meta.stackexchange.com/questions/224873/all-stack-exchange-data-dump-releases&#34;&gt;Stack Exchange data dump releases&lt;/a&gt; &amp;ndash; You know you can download all of Stack
Exchange? If you were considering it you might want to do it now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://nesbitt.io/2026/01/24/rewriting-git-pkgs-in-go.html&#34;&gt;Rewriting git-pkgs in Go&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Ruby version worked fine, but installing a Ruby gem as a git subcommand
has friction: you need Ruby installed, the right version, maybe a version
manager, and gem install puts binaries somewhere that might not be in your
PATH. Go compiles to a single binary with no runtime dependencies. It&amp;rsquo;s pure
Go, so there are no C extensions or platform-specific compilation issues to
deal with. You download it and it works.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is why, as a Ruby developer, I would be reluctant to write cli programs
that need to &lt;em&gt;distributed&lt;/em&gt; in Ruby. Too much friction. I&amp;rsquo;m also reluctant to
install those that others have written.&lt;/p&gt;
&lt;p&gt;And when I &lt;kbd&gt;CTRL&lt;/kbd&gt;-&lt;kbd&gt;c&lt;/kbd&gt; a Ruby cli program and see a Ruby
stacktrace, no thanks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://relinq.app/?ueid=b4f3a6152578f90ffbdaa44714d0648d&#34;&gt;Relinq&lt;/a&gt; &amp;ndash; &amp;ldquo;A tiny Mac app that converts song links between Spotify, Apple
Music, YouTube Music, and more.&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was speaking to a friend who recently got a 3D printer and he was saying
that he didn&amp;rsquo;t want to just print things for the sake of it due to the
&amp;ldquo;landfill&amp;rdquo; involved. I&amp;rsquo;ve had others say similar things to me, and I
completely agree with that sentiment.&lt;/p&gt;
&lt;p&gt;The problem is that the hobby in general &lt;em&gt;necessitates some&lt;/em&gt; waste. When you
create a model, and print it, you are never going to end up with a perfect
result the first time. It &lt;em&gt;will&lt;/em&gt; need tweaking, revising, and printing again,
probably multiple times. I do my best to plan ahead to minimise waste (and
money!) and I&amp;rsquo;m often reluctant to print due to concerns over producing waste,
but it is inevitable to some degree.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/caronc/apprise&#34;&gt;&amp;ldquo;Apprise - Push Notifications that work with just about every platform!&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a very cool idea to stop reimplementing notifications for every app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I discovered from &lt;a href=&#34;https://jacobstuart.com/posts/2024/caddy-wildcard-tls/&#34;&gt;&amp;ldquo;Caddy Could Be Leaking Your Secret Domains&amp;rdquo;&lt;/a&gt; that TLS
certificates issued by certain Certificate Authorities (including Let&amp;rsquo;s
Encrypt) are &lt;a href=&#34;https://crt.sh/?q=elver.me&#34;&gt;a matter of public record&lt;/a&gt; due to &lt;a href=&#34;https://certificate.transparency.dev/&#34;&gt;Certificate Transparency&lt;/a&gt;.
This means that if you&amp;rsquo;re using Let&amp;rsquo;s Encrypt for your homelab, you could be
leaking your subdomain names into the public. This isn&amp;rsquo;t a massive deal, but
it&amp;rsquo;s worth knowing it&amp;rsquo;s happening.&lt;/p&gt;
&lt;p&gt;The solution is to use a wildcard certificate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://plezy.app/&#34;&gt;Plezy&lt;/a&gt; &amp;ndash; &amp;ldquo;A beautiful Plex client&amp;rdquo; &amp;ndash; Giving this a go.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PSA: Spotify has a Basic plan without all the audiobooks that you probably
didn&amp;rsquo;t want anyway. I was able to downgrade my plan, keep everything music
related, and save a couple of quid.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/238-filament-backup/#:~:text=Upgraded%20to%20iOS%2026%20this%20week&#34;&gt;upgrade to iOS 26&lt;/a&gt; doesn&amp;rsquo;t seem to have been good for my battery. I&amp;rsquo;m
having to charge half way through the day at the moment. I hope it gets
better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I plucked up the courage to take my A1 apart and replace the AC Board. The
&lt;a href=&#34;https://wiki.bambulab.com/en/a1/maintenance/ac-board-replacement&#34;&gt;instructions provided by Bambu on their wiki&lt;/a&gt; were good. The most difficult
part was disconnecting the existing wires to the board, but I eventually got
them. Seems fine so far. I guess it works or doesn&amp;rsquo;t work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daringfireball.net/linked/2026/01/19/creator-studio-icon-history&#34;&gt;BASIC APPLE GUY: CREATOR STUDIO ICON HISTORY&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Is there anyone who doesn&amp;rsquo;t find this sad?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This &lt;em&gt;is&lt;/em&gt; pretty sad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://cooklang.org/&#34;&gt;Cooklang&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cooklang is a simple, human-readable text format for writing recipes that
can be understood by both cooks and computers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finally managed to sack off my Twitter account. What a faff it was. They
really don&amp;rsquo;t want you to do it.&lt;/p&gt;
&lt;p&gt;I created a new account, then changed my username on the original account,
deactivated that account, then changed the username on the new account. A
process which spanned several days during which I could&amp;rsquo;ve lost control of the
account.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t want to just deactivate the original account because I wasn&amp;rsquo;t 100%
sure I hadn&amp;rsquo;t used this identity to sign up to some service from when Twitter
was a trusted identity provider, and didn&amp;rsquo;t want someone squatting it.&lt;/p&gt;
&lt;p&gt;The only fallout I&amp;rsquo;ve seen so far is some complaining from Keybase, which I
don&amp;rsquo;t use anyway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/blopker/codebook&#34;&gt;CODEBOOK - An unholy spell checker for code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://inessential.com/2026/01/21/email-from-minnesota-family.html&#34;&gt;Email from Family in Minnesota&lt;/a&gt; &amp;ndash; You know, I&amp;rsquo;d say his second term is
&lt;em&gt;much&lt;/em&gt; worse than the first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://yorkruby.org/&#34;&gt;York Ruby&lt;/a&gt; had a nice little resurgence this week, first after the Christmas
lull, with a brand new person attending their first, and another returning for
their second, meetup. Lots of good chats about how using &lt;code&gt;&amp;lt;font&amp;gt;&lt;/code&gt; tags was
cool back in the day.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://torrentfreak.com/nvidia-contacted-annas-archive-to-secure-access-to-millions-of-pirated-books/&#34;&gt;&amp;ldquo;NVIDIA Contacted Anna&amp;rsquo;s Archive to Secure Access to Millions of Pirated
Books&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Well, well, well, well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Small quality of life improvement this week: when I buy a coffee at my local
coffee shop they insist on sending me an email receipt (I use their loyalty
app). Because I am attention deficient this is annoying, unnecessary, and
distracting for me.&lt;/p&gt;
&lt;p&gt;I setup an email rule that filters those messages and just marks them as
&amp;ldquo;read&amp;rdquo;. It&amp;rsquo;s a small thing, but removes friction. I&amp;rsquo;ve started adding similar
rules for other regular emails I receive too such as &amp;ldquo;invoice&amp;rdquo; emails which I
need to deal with later.&lt;/p&gt;
&lt;p&gt;Let the computer work for you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Pile_(dataset)&#34;&gt;&amp;ldquo;The Pile&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Pile is an 886 GB diverse, open-source dataset of English text created
as a training dataset for large language models (LLMs).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://cagemaker.org/&#34;&gt;CageMaker PRCG - Parametric Rack Cage Generator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is very cool. Need to mount something in your rack? How about printing a
whole new rack?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 238: Filament backup</title>
      <link>https://elver.me/weeknotes/238-filament-backup/</link>
      <pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/238-filament-backup/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Although I now have a slight reluctance to print &lt;a href=&#34;/weeknotes/237-aka-paving-slab/#:~:text=s%20doing%20a-,tiny%20bit%20of%20melting,-%F0%9F%94%A5%20This%20is%20apparently&#34;&gt;for fear of something going
wrong&lt;/a&gt; I decided to go ahead and print a &lt;a href=&#34;https://makerworld.com/en/models/92486-ams-lite-top-mount-for-a1#profileId-100105&#34;&gt;AMS Lite top mount&lt;/a&gt;. This is so that
you can mount the AMS above the printer, to save space. This is a long print
with multiple plates, so I got to test out the &lt;a href=&#34;https://wiki.bambulab.com/en/ams-lite/manual/intro-ams-lite#filament-run-out-detection-and-filament-backup-function&#34;&gt;automatic filament switching&lt;/a&gt;
capabilities of the AMS Lite and A1 for the first time as the spool I was
using did not have enough filament on it to complete the job. How this is
supposed to work is that if you have another spool of the exact same material
and colour on the AMS Lite it will automatically switch once the current one
is used up.&lt;/p&gt;
&lt;p&gt;This required enabling &amp;ldquo;AMS filament backup&amp;rdquo; in the AMS settings.&lt;/p&gt;
&lt;p&gt;I watched eagerly as the current spool ran dry and then&amp;hellip;after a brief pause
to purge the existing filament, it automatically started using the full spool.
Magic 🪄 So that seems to work nicely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of devices which might spontaneously combust, Bambu, with me only
having to mention UK consumer law a couple of times, agreed to send me a new
version of the AC board for the A1.&lt;/p&gt;
&lt;p&gt;Credit to them, it has already arrived.&lt;/p&gt;
&lt;p&gt;Given I bought this printer two months ago I don&amp;rsquo;t think it&amp;rsquo;s unreasonable to
expect them to replace the AC Board as a precautionary measure. I &lt;em&gt;could&lt;/em&gt;
demand a replacement or refund.&lt;/p&gt;
&lt;p&gt;Coincidently, I&amp;rsquo;ve noticed on Reddit just how many people are willing to
accept that their printer might melt. I suspect, given the demographics of
Reddit, that most of them are likely American and used to non-existent
consumer protection laws.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Framed another picture this week. This time a small print of the &lt;a href=&#34;https://en.wikipedia.org/wiki/Tindersticks_(1993_album)&#34;&gt;first
Tindersticks album&lt;/a&gt; cover.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We locked ourselves out of the house for SECOND TIME at the end of last week.
Grown adults. Twice. 🤬 💸&lt;/p&gt;
&lt;p&gt;This stems from living in a flat for 10+ years where you had to leave &lt;em&gt;with
the keys&lt;/em&gt; in order to lock it. The new house just lets you pull the door shut
as you leave. God-damned convenient door.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For all the wonder of LLMs you&amp;rsquo;d think Claude would be able to work without
losing the text I just typed into the chat box. You&amp;rsquo;d be wrong. It&amp;rsquo;s
completely reproducible too: you don&amp;rsquo;t have Internet but Claude is running,
you type into the chat box, it reconnects to the Internet and loses what you
typed. Cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I moved my Plex library around this week and it went buttery smooth
thankfully. I&amp;rsquo;ve been putting it off, but I made a plan, ran it past Claude
for a critique, and followed it. Nothing abnormal going on so far. I plan on
writing a proper blog post about this, but I have said that before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I learnt that Framework, the upgradeable laptop people, make a
&lt;a href=&#34;https://frame.work/gb/en/products/desktop-diy-amd-aimax300/configuration/new&#34;&gt;Desktop PC&lt;/a&gt;. I was surprised. Building PC&amp;rsquo;s from upgradable parts has been a
thing for a long time already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.chrisgregori.dev/opinion/code-is-cheap-now-software-isnt&#34;&gt;Code Is Cheap Now. Software Isn&amp;rsquo;t.&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With twenty dollars, a few hours of spare time, and a bit of patience,
almost anyone can ship a functional application.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ldquo;almost anyone&amp;rdquo; — this post makes a lot of interesting points, but I think
they&amp;rsquo;re really overestimating the average person. That is not meant to be
disparaging, I just don&amp;rsquo;t think most people have an interest in making their
own software?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ma.ttias.be/web-development-is-fun-again/&#34;&gt;Web development is fun again&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That leaves room to experiment with UI and UX, to try ideas and throw them
away. To add small quality-of-life improvements I couldn&amp;rsquo;t justify before,
because there was always something more urgent.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I got around to using &lt;a href=&#34;https://koreader.rocks/&#34;&gt;KOReader&lt;/a&gt; on my jailbroken Kindle this week and oh my,
it&amp;rsquo;s been quite a journey. The software is clearly highly capable, but the
menus and settings are indecipherable to the degree that I had to Google basic
things. Still, I got there in the end. Maybe I&amp;rsquo;ll read a book.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.zsa.io/mouse-jiggler-and-double-click/&#34;&gt;Introducing Mouse Jiggler and Double Click&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built-in mouse jiggling is a novel, and potentially useful, feature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://helmarr.com/&#34;&gt;Helmarr&lt;/a&gt; is a lovely looking app which I installed this week to provide
better iOS-based management of my &amp;ldquo;homelab&amp;rdquo; (I have given up and started
calling the computer in the spare room that). It is very nice indeed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgraded to iOS 26 this week (mostly so that I could install Helmarr, and I
knew I couldn&amp;rsquo;t avoid upgrading forever) and I can&amp;rsquo;t say I like it, but it
does feel like &lt;a href=&#34;/weeknotes/237-aka-paving-slab/#:~:text=getting%20a%20new%20computer&#34;&gt;setting a new wallpaper&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finished printing a &lt;a href=&#34;https://makerworld.com/en/models/2190465-cathedral-complete-board-game-no-ams&#34;&gt;Cathedral board game&lt;/a&gt; that looked cool this week.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/cathedral.jpeg&#34; alt=&#34;3D printed &amp;ldquo;Cathedral&amp;rdquo; board game&#34;&gt;&lt;/p&gt;
&lt;p&gt;An opportunity to print something with more detail, and to try out some
different filaments. It was a bit tricky removing the supports, and some parts
we very fragile and broke off. Some fell off. But overall not bad.&lt;/p&gt;
&lt;p&gt;We haven&amp;rsquo;t played it yet!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.monarchlauncher.com/&#34;&gt;Monarch&lt;/a&gt; &amp;ndash; A potential &lt;a href=&#34;https://www.raycast.com/&#34;&gt;Raycast&lt;/a&gt; competitor I&amp;rsquo;ll keep an eye on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve learnt a surprising amount of things about Linux permissions this week.
It&amp;rsquo;s actually slightly embarrassing that it&amp;rsquo;s taken me this long, but it&amp;rsquo;s the
kind of thing that once you know the basics you can just get by (&lt;code&gt;chmod 777&lt;/code&gt;
anyone?). And I have been doing for many years.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve utilised the both the &lt;code&gt;setgid&lt;/code&gt; and &amp;ldquo;sticky&amp;rdquo; bits.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;setgid&lt;/code&gt; bit.&lt;/p&gt;
&lt;p&gt;When a user creates new files in a directory, they are owned by the user and
their primary group. I was not aware that a primary group was a thing, but if
you run &lt;code&gt;id &amp;lt;your-username&amp;gt;&lt;/code&gt; you will see that it outputs something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;uid=501(jord) gid=20(staff) groups=20(staff),12(everyone)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;gid&lt;/code&gt; is the primary group, and &lt;code&gt;groups&lt;/code&gt; is &lt;em&gt;all&lt;/em&gt; the groups the user is a
member of including the primary group.&lt;/p&gt;
&lt;p&gt;If you have different processes interacting with the same files this can cause
permission difficulties where one process creates the file and another can&amp;rsquo;t
read it etc.&lt;/p&gt;
&lt;p&gt;The solution is to set the &lt;code&gt;setgid&lt;/code&gt; on the parent directory which means newly
created files &lt;a href=&#34;https://en.wikipedia.org/wiki/Setuid#When_set_on_a_directory&#34;&gt;will inherit the group&lt;/a&gt; already set on the directory. As long as
the users are a part of this group, and the permissions allow, everything will
work.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;sticky&amp;rdquo; bit.&lt;/p&gt;
&lt;p&gt;Setting the &amp;ldquo;sticky&amp;rdquo; bit on a directory means that a user can &lt;a href=&#34;https://en.wikipedia.org/wiki/Setuid#Sticky_bit&#34;&gt;only delete
files in a directory which they own&lt;/a&gt;. I was moving some files around, and
giving access to those files to a new service user. I added the sticky bit so
that the new user can create files in the directory, but not delete &lt;em&gt;existing&lt;/em&gt;
files. As a precaution. Will it work? I&amp;rsquo;ll let you know.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://helium.computer/&#34;&gt;Helium&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Best privacy and unbiased ad-blocking by default. Handy features like native
!bangs and split view. No adware, no bloat, no noise. Made for people, by
people. Fully open source.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I gave this a very quick go and it didn&amp;rsquo;t strike me. Good to have competitors
in the browser market though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=MiUHjLxm3V0&#34;&gt;The World&amp;rsquo;s Most Important Machine&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I heard about about &lt;a href=&#34;https://en.wikipedia.org/wiki/Extreme_ultraviolet_lithography&#34;&gt;EUV Lithography&lt;/a&gt; on a podcast a whole ago and then &lt;a href=&#34;https://atp.fm/#:~:text=ASML%20%26%20TSMC,-Extreme%20ultraviolet%20lithography&#34;&gt;ATP&lt;/a&gt;
mentioned this video recently. It sounded fascinating. And, it &lt;em&gt;is&lt;/em&gt;. It&amp;rsquo;s
actually incredible that any of this works. This is an hour long, which in
2026 is a long time, but absolutely worth your while. I wish I understood more
of it!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/danburzo/yamatter&#34;&gt;Yamatter&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Inspect and transform YAML frontmatter data from the command line.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can see this being useful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about &lt;a href=&#34;https://en.wikipedia.org/wiki/Mutual_authentication#mTLS&#34;&gt;mTLS&lt;/a&gt; from &lt;a href=&#34;https://jacobstuart.com/posts/2024/caddy-mutual-tls/&#34;&gt;Securely Exposing Docker Services With Mutual TLS and
Caddy&lt;/a&gt;. I think I&amp;rsquo;ve seen this acronym flying around before but never knew
what it was. It seems like this is mostly used in Enterprise environments
which would normally make me allergic to it, but it seems pretty handy for a,
here it comes again, homelab environment too. Basically TLS where both sides
of the connection, client and server, are verified to have the private key. If
they don&amp;rsquo;t match no connection at all it made.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 237: aka paving slab</title>
      <link>https://elver.me/weeknotes/237-aka-paving-slab/</link>
      <pubDate>Sun, 11 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/237-aka-paving-slab/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Monday came, back to work for many. I too, was glad to be back into my normal
routine, for as long as that can last.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://basicappleguy.com/basicappleblog/hive&#34;&gt;Hive by Basic Apple Guy&lt;/a&gt; &amp;ndash; new year, new wallpaper. Not only does it make
your computer look nice but it also saves money as setting a new wallpaper
feels like getting a new computer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.tortoisemedia.com/listen/elons-spies&#34;&gt;Elon&amp;rsquo;s Spies by Tortoise Investigates&lt;/a&gt; &amp;ndash; You know, I think this Elon guy
might not be a good person. If the Nazi salute wasn&amp;rsquo;t enough for you, maybe
this will be.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There have been &lt;a href=&#34;https://www.reddit.com/r/BambulabsA1fires/comments/1q8e8f4/list_of_a1_ntc_failures_posted_to_rbambulab/&#34;&gt;many reports on Reddit&lt;/a&gt; of &lt;a href=&#34;https://bambulab.com/en/a1&#34;&gt;Bambu A1&lt;/a&gt;s doing a &lt;em&gt;tiny&lt;/em&gt; bit
of melting 🔥 This is apparently caused by a faulty &lt;a href=&#34;https://en.wikipedia.org/wiki/Thermistor#NTC&#34;&gt;NTC thermister&lt;/a&gt; component
which likes to get very hot and has, on occasion, melted through the plastic
casing of the printer. Bambu keep saying that this is &amp;ldquo;by design&amp;rdquo;, which I
find hard to believe. (I mean, I can believe that it is a safety feature in
terms of it burning out and stopping further serious fire, but having a
component regularly melting the case cannot be the preferred outcome.)&lt;/p&gt;
&lt;p&gt;It is not clear which models are affected, and Bambu are staying tight-lipped.&lt;/p&gt;
&lt;p&gt;In order to mitigate any potential fire I decided to install a fire prevention
device, aka &lt;a href=&#34;https://www.diy.com/departments/bradstone-arnhem-anthracite-reconstituted-stone-paving-slab-0-2m-l-450mm-w-450mm/802562_BQ.prd&#34;&gt;paving slab&lt;/a&gt;. It is a low cost way to stop any potential fire,
and I had already thought about getting one to help with stabilising the
printer anyway.&lt;/p&gt;
&lt;p&gt;Hopefully Bambu get their act together and do the right thing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://isbndb.com/&#34;&gt;ISBNDB&lt;/a&gt; &amp;ndash; do you &lt;a href=&#34;/weeknotes/222-humble-tumble/#:~:text=Book%20Data&#34;&gt;need book data&lt;/a&gt;? This seems cheap to me to save all the
trouble of curating your own? 🤔&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.glyph.im/2026/01/the-next-thing-will-not-be-big.html&#34;&gt;Next Thing Will Not Be Big&lt;/a&gt; &amp;ndash; this is worth your time.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There’s no need for another streaming service if 100% of your leisure time
is already committed to TikTok, YouTube and Netflix; famously, Netflix has
already considered sleep its primary competitor for close to a decade -
years before the pandemic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/schlae/VapeRE/&#34;&gt;Reverse Engineered Vape Circuit Boards&lt;/a&gt; &amp;ndash; nice use of e-waste.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://po-ru.com/2026/01/06/week-261-a-good-rest#:~:text=Reverse%20engineered%20disposable%20vape%20boards.%20They%E2%80%99re%20quite%20capable.&#34;&gt;Paul Battley&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://techcrunch.com/2026/01/05/hacktivist-deletes-white-supremacist-websites-live-on-stage-during-hacker-conference/&#34;&gt;Hacktivist deletes white supremacist websites live onstage during hacker
conference&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lsquo;Imagine calling yourselves the &amp;lsquo;master race&amp;rsquo; but forgetting to secure your
own website — maybe try mastering to host WordPress before world
domination,&amp;rsquo; Root wrote.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nice one, Martha 🤣&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you&amp;rsquo;re going to put BBC licence payer funded content exclusively behind BBC
Sounds the least you can do is make the BBC Sounds iOS app decent. The
UI&amp;hellip;needs work &lt;a href=&#34;/weeknotes/37-sticker-me/#:~:text=poorly%20implemented%20podcast%20app&#34;&gt;(still)&lt;/a&gt;. It&amp;rsquo;s hard to know what is available to listen to
and what I&amp;rsquo;ve previously listened to. Basics, basics, basics.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.eff.org/deeplinks/2018/02/technical-deep-dive-securing-automation-acme-dns-challenge-validation&#34;&gt;A Technical Deep Dive: Securing the Automation of ACME DNS Challenge
Validation&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When DNS is compromised, a malicious attacker can easily intercept all the
connections directed toward your email or other protected service, terminate
the TLS encryption (since they can now prove ownership over the domain and
get their own valid certificates for it), read the plaintext data, and then
re-encrypt the data and pass the connection along to your server. For most
people, this would be very hard to detect.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An in-depth article about &lt;a href=&#34;/weeknotes/236-acme-challenge/#:~:text=ACME%20challenge&#34;&gt;ACME DNS challenges I was talking about last week&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A local news website stopped publishing it&amp;rsquo;s feed from some reason this week
so I restored it, to a certain extent, via &lt;a href=&#34;https://fetchrss.com/&#34;&gt;FetchRSS&lt;/a&gt;. Not sure how it will
work out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s been bloody cold (&amp;ldquo;feels like&amp;rdquo; -9 as I write this) so I treated myself to
some new &lt;a href=&#34;https://www.marksandspencer.com/knitted-gloves/p/clp60705830?color=CHARCOAL#intid=pid_pg1pip4g4r1c4&#34;&gt;gloves with &amp;ldquo;innovative touchscreen pads&amp;rdquo;&lt;/a&gt;, which means I can stay
glued to my screen even in the cold. How I like it.&lt;/p&gt;
&lt;p&gt;And to top it off, I got a pair of &lt;a href=&#34;https://www.amazon.co.uk/dp/B0CC189314&#34;&gt;USB-C rechargeable hand warmers&lt;/a&gt; which are
surprisingly good at taking the edge off chilly hands despite using them
feeling like carrying a potential fire in your hands at all times.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://autoncorp.com/biodome/&#34;&gt;Claude is growing tomatoes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://dri.es/claude-is-growing-a-tomato-plant&#34;&gt;Dries Buytaert&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I was trying to organise my &amp;ldquo;projects&amp;rdquo; and my &amp;ldquo;learning&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Procrastinating by creating big lists of things is a good start. I use
&lt;a href=&#34;https://culturedcode.com/things/&#34;&gt;Things&lt;/a&gt; to organise my life. There are several YouTube playlists that I
wanted to watch, but in a Things Project I wanted a heading for each playlist
and then a TODO item for each video &amp;ndash; this is laborious to do manually; a
lot of cutting and pasting. We can thankfully do better.&lt;/p&gt;
&lt;p&gt;Get a list of all video titles in a playlist, in order:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp --flat-playlist --print title &amp;lt;playlist-url&amp;gt; | pbcopy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Go into Things, create heading in a project, paste. You should get an item for
each.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tailwindlabs/tailwindcss.com/pull/2388#issuecomment-3717222957&#34;&gt;&amp;quot;&amp;hellip;the reality is that 75% of the people on our engineering team lost their
jobs here yesterday because of the brutal impact AI has had on our business&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was always surprised, and impressed, at creating a business from a CSS
framework. Genuinely. This is a shame regardless of what you might think of
Tailwind.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://rknight.me/notes/202601080857/&#34;&gt;Robb Knight&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tonsky.me/blog/tahoe-icons/&#34;&gt;It&amp;rsquo;s hard to justify Tahoe icons&lt;/a&gt; &amp;ndash; Alan strikes again.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On the upside: it&amp;rsquo;s not that hard anymore to design better than Apple! Let&amp;rsquo;s
drink to that. Happy New year!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Scathing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.crowdsupply.com/open-tools/open-printer&#34;&gt;Open Printer&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Finally, an open hardware printer you can actually understand, repair, and upgrade&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ruby 4 has a lot of cool new stuff. My favourite is probably the &lt;a href=&#34;https://rubyreferences.github.io/rubychanges/4.0.html#new-default-gems&#34;&gt;newest
default gem: &lt;code&gt;win32-registry&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 236: ACME challenge</title>
      <link>https://elver.me/weeknotes/236-acme-challenge/</link>
      <pubDate>Sun, 04 Jan 2026 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/236-acme-challenge/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A thousand apologies to those whose Monday back at work was unbearable without
these weeknotes. I am but human.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/235-magnets/#:~:text=to%20compare.%20A-,converter,-is%20winging%20it%E2%80%99s&#34;&gt;converter for my Kaweco Brass Sport&lt;/a&gt; arrived as did a &lt;a href=&#34;https://www.theonlinepencompany.com/kaweco-060-nib-gold-plated&#34;&gt;broader nib&lt;/a&gt; and
I&amp;rsquo;m now much happier writing with this pen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ispreview.co.uk/index.php/2026/01/starlink-to-shift-leo-ultrafast-broadband-satellites-into-a-lower-orbit.html&#34;&gt;Starlink to Shift LEO Ultrafast Broadband Satellites into a Lower Orbit&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By the end of July 2025 Starlink&amp;rsquo;s global network had 6 million customers
and 110,000 of those were in the UK (up from 87,000 in 2024) – mostly in
rural areas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was surprised at how many customers Starlink has in the UK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://carto-art.vercel.app/&#34;&gt;CartoArt&lt;/a&gt; &amp;ndash; this is cool to create high-quality map posters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://yearcompass.com/&#34;&gt;Year Compass&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;New year&amp;rsquo;s resolutions don&amp;rsquo;t work. YearCompass does - for more than a
million people around the world since 2012.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I downloaded this and then failed to complete it. Happy New Year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After feeling like I was getting somewhere with my Home Automation setup I
regret to inform you that things broke in bigly ways.&lt;/p&gt;
&lt;p&gt;In an attempt to fix all the things I went on upgrade spree.&lt;/p&gt;
&lt;p&gt;First, I bumped up &lt;a href=&#34;https://www.zigbee2mqtt.io/&#34;&gt;Zigbee2MQTT&lt;/a&gt; to the latest version, and then turned my
attention to the firmware(s) running on the &lt;a href=&#34;https://smlight.tech/global/slzb06m&#34;&gt;SLZB-06M&lt;/a&gt;. The SLZB-06M has two
different firmwares which I found a bit confusing initially. It has Core/OS
and Over-the-air (OTA). Core/OS, as you might have guessed, handles the actual
OS running on the device and affects the web UI etc. The other is for the
Zigbee networking stuff.&lt;/p&gt;
&lt;p&gt;Updating the Zigbee firmware through the web UI worked first time. The Core/OS
firmware however kept failing with checksum errors. In the end I downloaded
&lt;a href=&#34;https://smlight.tech/flasher/#SLZB-06%E2%80%A8https://updates.smlight.tech/firmware/slzb06x/core/slzb-os-v3.1.3-ota.bin&#34;&gt;v3.1.3&lt;/a&gt; and flashed it manually.&lt;/p&gt;
&lt;p&gt;Things did not get better. I&amp;rsquo;m not sure what&amp;rsquo;s going on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://shkspr.mobi/blog/2026/01/where-is-bitcoin/&#34;&gt;Where is Bitcoin?&lt;/a&gt; &amp;ndash; where indeed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://nationalparktypeface.com/&#34;&gt;National Park Typeface&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Capturing the charm of the router-carved type ubiquitous in America&amp;rsquo;s
national parks, without sacrificing legibility or versatility.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Via &lt;a href=&#34;https://rknight.me/blog/weeknote-1981/#:~:text=Turns%20out%20there%27s%20another%20similar%20one&#34;&gt;Robb Knight&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/232-your-blog-is-dead-to-me/#:~:text=which%20I%E2%80%99ve%20yet%20to%20setup&#34;&gt;I am no closer&lt;/a&gt; to having a proper &lt;a href=&#34;https://en.wikipedia.org/wiki/Fully_qualified_domain_name&#34;&gt;FQDN&lt;/a&gt;s for my local services, but I have
been thinking about how I can secure them using SSL/TLS.&lt;/p&gt;
&lt;p&gt;I could create my own self-signed certificates and distribute them to the few
devices that I would be using to access the services but that does seem like a
hassle. I mean, this whole thing is a hassle, but a different kind of hassle.&lt;/p&gt;
&lt;p&gt;Instead of self-signed I have been trying to absorb how &lt;a href=&#34;https://en.wikipedia.org/wiki/Certificate_authority&#34;&gt;Certificate
Authorities&lt;/a&gt; like &lt;a href=&#34;https://en.wikipedia.org/wiki/Let%27s_Encrypt&#34;&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt; work. I remember when Let&amp;rsquo;s Encrypt was
launched and how much of a big deal it apparently was, but similar to how I
only start liking a band 20 years after they were cool only now am I cottoning
on. I&amp;rsquo;ve been using Let&amp;rsquo;s Encrypt indirectly for some time. This website uses
Let&amp;rsquo;s Encrypt certificates but Netlify take care of everything and I have/had
no idea how it worked.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s Encrypt only issue certificates to domains you control, and you prove
you control the domain via an &lt;a href=&#34;https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment&#34;&gt;ACME challenge&lt;/a&gt;. The most common challenge is
&lt;a href=&#34;https://letsencrypt.org/docs/challenge-types/#http-01-challenge&#34;&gt;HTTP-01&lt;/a&gt; where they look for a token you host on your website. Once they find
and validate the token they will issue you a certificate. Because my services
are not publicly available (they are only accessible via Tailscale) I was
under the impression I couldn&amp;rsquo;t use something like Let&amp;rsquo;s Encrypt to issue
certificates because they would be unable to perform this automated check.&lt;/p&gt;
&lt;p&gt;Then I discovered the &lt;a href=&#34;https://letsencrypt.org/docs/challenge-types/#dns-01-challenge&#34;&gt;DNS-01 challenge&lt;/a&gt;. This works in a similar way but
instead of checking for a file with a token, they will look for the token in
your DNS records for the domain. So if you have an automated way to create
&lt;code&gt;TXT&lt;/code&gt; DNS records you can prove you control the domain. Perfect for my
scenario.&lt;/p&gt;
&lt;p&gt;One of the ways ACME challenges are automated is through your web server or
reverse proxy software. For example, &lt;a href=&#34;https://caddyserver.com/&#34;&gt;Caddy&lt;/a&gt; will act as an &amp;ldquo;ACME client&amp;rdquo; and
perform all these steps for you automatically. You give Caddy a file to create
&lt;code&gt;TXT&lt;/code&gt; DNS records on your behalf and it will do so. This is usually
facilitated by giving Caddy an access token to use with your DNS provider&amp;rsquo;s
HTTP API.&lt;/p&gt;
&lt;p&gt;I have not set &lt;em&gt;any&lt;/em&gt; of this up yet, but it does sound pretty good so far,
right? Create an access token for your DNS provider&amp;rsquo;s API, give the token to
Caddy, Caddy does the ACME dance, certificate is issued, profit.&lt;/p&gt;
&lt;p&gt;However, most providers &lt;em&gt;do not&lt;/em&gt; provide scoped access tokens. So when you
create an access token you&amp;rsquo;re often giving that token full power to &lt;a href=&#34;https://en.wikipedia.org/wiki/Create%2C_read%2C_update_and_delete&#34;&gt;CRUD&lt;/a&gt; the
shit out of all the DNS records for ALL THE DOMAINS that you host with that
provider!&lt;/p&gt;
&lt;p&gt;Now, the risk of token leak is small, but if it did happen, the consequences
are potentially massive. If some nefarious actor got access to my DNS records
very bad things could happen. They could start writing more interesting
weeknotes for one, but worse still, they could do something like change my MX
records and take over my email. Once someone has your email it&amp;rsquo;s game over,
man. Keys to the kingdom.&lt;/p&gt;
&lt;p&gt;So this poses a problem. If I don&amp;rsquo;t want to have an access token that gives
full access to my DNS records lying about on my web server, what to do? Well
some providers provide so called scoped access tokens of various granularity.
It would be better if you could say &amp;ldquo;this token can only create x record for
y domain&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I use DNSimple and scoped access tokens are unfortunately &lt;a href=&#34;https://blog.dnsimple.com/2023/11/scoped-access-tokens/&#34;&gt;only available on
the Teams plan and above&lt;/a&gt;. I&amp;rsquo;ve only got a handful of domains, so paying $29
USD/month is not feasible for me. (I get it, gotta make money, but it&amp;rsquo;s
frustrating when trying to do Good Security ™ and the features to help you do
so are shuttered away behind more expensive plans.)&lt;/p&gt;
&lt;p&gt;It seems to me there are three ways forward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Use a completely different domain name with a different DNS provider.
This completely isolates the domain, and as such access token so none of
the important domains are reachable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Move &lt;em&gt;all&lt;/em&gt; my domains to a different DNS provider such as Cloudflare who
&lt;em&gt;do&lt;/em&gt; support scoped access tokens on all plans (although I&amp;rsquo;ve been unable
to independently verify that &amp;ndash; if you know, please tell me).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use a completely different domain name with a different DNS provider and
setup a CNAME to &lt;a href=&#34;https://letsencrypt.org/docs/challenge-types/#dns-01-challenge:~:text=Since%20Let%E2%80%99s%20Encrypt,quicker%2Dupdating%20server.&#34;&gt;delegate to it for ACME challenges&lt;/a&gt;. This says &amp;ldquo;ask
foo.com if I own bar.com&amp;rdquo;. This has the same practical effect as the
other options to various degrees though.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;m leaning towards getting a new domain. Simplest solution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Related: trying to buy any sort of decent domain name is so depressing.
Anything short is just gone, even random characters at obscure TLDs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 235: Magnets</title>
      <link>https://elver.me/weeknotes/235-magnets/</link>
      <pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/235-magnets/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Christmas again. It was fine. Glad it&amp;rsquo;s over. So is my credit card.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://issinrealtime.org/&#34;&gt;ISS IN REAL TIME&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A real-time journey onboard the International Space Station&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is crazily detailed. Very cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CAD is not something I&amp;rsquo;ve ever done with the possible exception of 1 module at
College when I was 18 or 19 (although the memory is so vague that I question
if it actually happened or not!). However, it has become clear that I will
need to learn some sort of CAD software if I want to take this 3D printing
malarkey somewhere other than download and print. There are many, many,
options. I seem to have started with the most difficult option.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://openscad.org/&#34;&gt;OpenSCAD&lt;/a&gt; is &amp;ldquo;The Programmers Solid 3D CAD Modeller&amp;rdquo;, so in some ways it is
more familiar to me than the way a lot of other CAD software works. I&amp;rsquo;ve spent
my life working with text, not pointing and clicking in an UI. Instead of a
GUI you use it&amp;rsquo;s programming language to describe the shapes you want. Which
is of course very familiar to me as a programmer.&lt;/p&gt;
&lt;p&gt;It is very early days but I can already see it getting &lt;em&gt;very&lt;/em&gt; complicated and
&amp;ldquo;mathsy&amp;rdquo;. I did manage to alter a bracket for an Apple TV though. It turns out
that the bracket doesn&amp;rsquo;t work for my use-case, but still, I did a CAD.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Incidentally, the current stable release of OpenSCAD is 2021-01, released
in&amp;hellip;2021. They have nightly builds though, so on the recommendation of a
tutorial I downloaded that instead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In order to get the &lt;a href=&#34;https://www.raycast.com/khasbilegt/1password&#34;&gt;Raycast 1Password extension&lt;/a&gt; working I took the plunge
and upgraded to 1Password 8 after avoiding it for a long time. It was fine.
And now the extension works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=J0IqVC8mTwk&#34;&gt;YEAH BITCH! MAGNETS!&lt;/a&gt; &amp;ndash; Ahem. I&amp;rsquo;ve been buying magnets in various sizes in
order to extend the range of a contact sensor for my gate. I think I found the
right combination of size and number in order to make it work. Next is to
design/alter a case for them to go in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I don&amp;rsquo;t wanna be right, but I was. After fixing my home automations I was
feeling pretty good about how reliable it all was until I got home after being
away for the weekend, and none of them were working.&lt;/p&gt;
&lt;p&gt;In the end I had to restart some software piece of the puzzle and then
everything started working again, but this has somewhat shaken my faith in the
whole system. I do not want to be restarting things to have my house work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://steveklabnik.com/writing/thirteen-years-of-rust-and-the-birth-of-rue/&#34;&gt;Thirteen years of Rust and the birth of Rue&lt;/a&gt; &amp;ndash; Steve writes I take note.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Father Christmas was particularly kind this year and got me a &lt;a href=&#34;https://www.kaweco-pen.com/schreibgeraete/fuellhalter/423/kaweco-brass-sport-fuellhalter&#34;&gt;Kaweco Brass
Sport&lt;/a&gt; fountain pen. I&amp;rsquo;m still getting used to it, with it being both heavier
and slightly shorter than the &lt;a href=&#34;https://www.lamy.com/en-gb/p/lamy-safari-fountain-pen/54912096502104&#34;&gt;Lamy Safari&lt;/a&gt;. I think the nib is probably a bit
thin for my liking too, but giving it a try for a while to compare. A
converter is winging it&amp;rsquo;s way to me now so I can fill it up with different
inks.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m looking forward to the patina kicking in after my filthy mitts have been
on it a while.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I like the &lt;a href=&#34;https://www.ruby-lang.org/&#34;&gt;new Ruby Language website&lt;/a&gt;. It looks fresh and modern. And the
update to &lt;a href=&#34;https://www.ruby-lang.org/en/news/2025/12/23/new-look-for-ruby-documentation/&#34;&gt;the docs&lt;/a&gt; is also very welcome. I haven&amp;rsquo;t used them yet though, so
it&amp;rsquo;s hard to judge how useful they are other than that they look nicer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I bought some new drill bits and finally put up a blind in my office that I
purchased in September 2024. Impressive even by my standards.&lt;/p&gt;
&lt;p&gt;The worst part? It was &lt;em&gt;really&lt;/em&gt; straightforward and took about 15 minutes.
Maybe it was the magical new drill bits. Maybe something else. Imagine what I
would be capable of if not cursed with this brain.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 234: Background sounds</title>
      <link>https://elver.me/weeknotes/234-background-sounds/</link>
      <pubDate>Sun, 21 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/234-background-sounds/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Another brief sojourn to Sheffield this week. Good times ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When setting up Home Assistant there are two integration choices when it comes
to Zigbee connectivity: &lt;a href=&#34;https://www.home-assistant.io/integrations/zha/&#34;&gt;Zigbee Home Automation&lt;/a&gt; (ZHA), which is the
&amp;ldquo;official&amp;rdquo; integration from the Home Assistant people, or &lt;a href=&#34;https://www.zigbee2mqtt.io/&#34;&gt;Zigbee2MQTT&lt;/a&gt; (Z2M)
(with the &lt;a href=&#34;https://www.home-assistant.io/integrations/mqtt/&#34;&gt;MQTT integration&lt;/a&gt;), which is a third party integration but has
supposedly better device support, and more flexibility.&lt;/p&gt;
&lt;p&gt;I decided upon Z2M. Zigbee2MQTT requires more setup but I&amp;rsquo;m happy to tinker to
get things working. Z2M requires a separate &lt;a href=&#34;https://en.wikipedia.org/wiki/MQTT&#34;&gt;MQTT&lt;/a&gt; broker &amp;ndash; &lt;a href=&#34;https://mosquitto.org/&#34;&gt;Mosquitto&lt;/a&gt; is
the oft recommended choice, which I went with.&lt;/p&gt;
&lt;p&gt;But I did not setup authentication, because authentication is how you make
things not work. This is a home network and if someone gains access to my
network bad things have already happened, but still, we should do what we can
so I decided to set it up finally.&lt;/p&gt;
&lt;p&gt;Like &lt;a href=&#34;/weeknotes/203-bug-ridden-forms/#:~:text=fuss%20and%20it-,worked%20first%20time,-.&#34;&gt;the time I didn&amp;rsquo;t Dockerize Plex&lt;/a&gt; for ages and then it just worked, this
was a very similar experience. It did take a bit of planning, but not much.&lt;/p&gt;
&lt;p&gt;Anyway, during the setup I discovered a neat feature. You can store your
credentials in a different file from the main mosquitto config.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000080&#34;&gt;mqtt&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000080&#34;&gt;user&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;!secrets.yaml mqtt_user&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000080&#34;&gt;password&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;!secrets.yaml mqtt_password&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then you can put your secrets in &lt;code&gt;secrets.yaml&lt;/code&gt; like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000080&#34;&gt;mqtt_user&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;user&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000080&#34;&gt;mqtt_password&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;mqtt_password&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This means I can version control the config without committing credentials to
git.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Christmas trip down south is now done and dusted. We were blessed with an
easy journey both times, which takes a lot of the stress out of things. It was
nice to see everyone, but I&amp;rsquo;m glad to be home. I guess this is home now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/KrishKrosh/TrackWeight&#34;&gt;TrackWeight&lt;/a&gt; &amp;ndash; Turn your MacBook&amp;rsquo;s trackpad into a precise digital weighing
scale.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I went to check the &lt;a href=&#34;/weeknotes/231-on-a-roll/#:~:text=time%20is%20also-,now%20complete,-.%20Blimey%2C%20I%E2%80%99m%20on&#34;&gt;Game Boy I completed&lt;/a&gt; a few weeks ago, ready to be
wrapped up for Christmas, and it no longer plays games. For reasons. This is
annoying. I have had to fall back to a backup gift and will need to
troubleshoot this one now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some brief experiments with different 3D printer build plates this week
yielded mixed results. There is much to play with and tweak.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hey.paris/posts/appleid/&#34;&gt;20 Years of Digital Life, Gone in an Instant, thanks to Apple&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A major brick-and-mortar store sold an Apple Gift Card that Apple seemingly
took offence to, and locked out my entire Apple ID, effectively bricking my
devices and my iCloud Account, Apple Developer ID, and everything associated
with it, and I have no recourse.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the sort of thing that keeps me up at night.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://howtodothings.co/626/how-to-stop-avoiding-big-tasks-using-an-easy-20-second-trick/&#34;&gt;How to Stop Avoiding Big Tasks, Using an Easy 20-Second Trick&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This has been hanging out in my web browser for weeks&amp;hellip;&lt;/p&gt;
&lt;p&gt;Saying that the advice is good I think. I&amp;rsquo;ve done something similar to this,
but not quite the same when coding. I&amp;rsquo;ll leave what I was doing in the
comments of the code, and what I should do or try next. Using the word “NEXT”
is surprisingly powerful. I am going to try and implement this across tasks
which are not programming based.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nicchan.me/blog/the-f-off-contact-page/&#34;&gt;The f*** off contact page&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In order to combat my inability to concentrate on anything much at all, I am
constantly using the &lt;a href=&#34;https://support.apple.com/en-gb/guide/iphone/iphb2cfa052c/ios&#34;&gt;Background Sounds&lt;/a&gt; feature of iOS. I find the noise
helps. (It&amp;rsquo;s hidden away under Settings -&amp;gt; Accessibility -&amp;gt; Audio &amp;amp; Visual -&amp;gt;
Background Sounds, but I&amp;rsquo;ve got a &lt;a href=&#34;https://support.apple.com/en-us/109346&#34;&gt;button for it in Control Center&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&#34;https://noizioapp.com/&#34;&gt;Noizio&lt;/a&gt; for this on my Mac, but there is something particular about the
Apple supplied sounds that I like so I went looking for Background Sounds on
macOS. I it &lt;em&gt;is&lt;/em&gt; a thing on macOS, but again, it&amp;rsquo;s hidden away in Settings. I
now have &lt;a href=&#34;https://github.com/raycast/extensions/blob/b8c8fcd7ebd441a5452b396923f2a40e879565ba/extensions/background-sounds/README.md&#34;&gt;this Raycast extension&lt;/a&gt; to easily toggle it on and off.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 233: Joe Pesci</title>
      <link>https://elver.me/weeknotes/233-joe-pesci/</link>
      <pubDate>Sun, 14 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/233-joe-pesci/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.brickborrow.com/&#34;&gt;Brick Borrow&lt;/a&gt; &amp;ndash; This seems like a really good idea? I&amp;rsquo;ve often thought that
I&amp;rsquo;d like to build some Lego sets, but I don&amp;rsquo;t know what I&amp;rsquo;d do with them
afterwards. I don&amp;rsquo;t particularly want a house full of Lego.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Because I&amp;rsquo;m such selfless nice guy I volunteered to take a look at someone&amp;rsquo;s
&amp;ldquo;slow&amp;rdquo; laptop running Windows 10. It became clear fairly quickly that wiping
this thing and reinstalling Windows could only take it so far.&lt;/p&gt;
&lt;p&gt;I decided the best thing for it was an upgrade from 1TB spinning disk to 120GB
SSD (only ~60GB was being used anyway). I bought a &lt;a href=&#34;https://www.amazon.co.uk/dp/B08LKMQ9T4&#34;&gt;SSD for £15.49!&lt;/a&gt; I was
thinking about buying second-hand from eBay or Vinted where they can be had
for slightly less at ~£8-12, but the extra few quid is worth it for the
ability to return it if things don&amp;rsquo;t work out.&lt;/p&gt;
&lt;p&gt;Is it now super fast? No. Not really. But it has turned it from &amp;ldquo;Oh my god
please end this torment&amp;rdquo; to &amp;ldquo;This is a bit slow but usable&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installing Windows 10. What can I possibly to have done in a previous life to
deserve this fate? Every time I encounter Windows, it&amp;rsquo;s worse than the last
time. Awful. Just awful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I received an email from someone thanking me for my &lt;a href=&#34;/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/&#34;&gt;how to replace a disk in
a ZFS mirror&lt;/a&gt; article. I&amp;rsquo;ve benefited greatly from the personal websites of
many people over the years, so giving back even a &lt;em&gt;tiny bit&lt;/em&gt; is heartening.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I &lt;a href=&#34;https://elver.me/projects/touchid-trackpad/&#34;&gt;wrote up&lt;/a&gt; the process I followed to build the &lt;a href=&#34;https://www.thingiverse.com/thing:6955798&#34;&gt;TrackID Touchpad&lt;/a&gt; I
completed &lt;a href=&#34;/weeknotes/231-on-a-roll/#:~:text=I%20built%20one%20of%20those%20TouchID%20Trackpads&#34;&gt;the other week&lt;/a&gt;. This took way longer than I expected.&lt;/p&gt;
&lt;p&gt;I get &lt;em&gt;extremely&lt;/em&gt; distracted by what the thing looks like &amp;ndash; you might be
thinking, if you&amp;rsquo;ve clicked that link, &amp;ldquo;it doesn&amp;rsquo;t look like you do&amp;rdquo;. I kept
it very lo-fi intentionally in an attempt to tame the distraction of yet
another static site generator black hole.&lt;/p&gt;
&lt;p&gt;If you get URLs right you can change it later.&lt;/p&gt;
&lt;p&gt;And I got the URLs right 😉&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look at these &lt;a href=&#34;https://chubbycable.com/products/new-fashion-240w-anodizing-new-color-fast-charging-cable-for-new-iphone-17?variant=45077311783098&#34;&gt;lovely USB-C cables&lt;/a&gt; with a truly terrible logo. I bought a
couple to try (there are a few models which don&amp;rsquo;t have the logo).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Did you know you can put images on web pages now?&lt;/p&gt;
&lt;p&gt;To me, &lt;a href=&#34;https://en.wikipedia.org/wiki/WebP&#34;&gt;WebP&lt;/a&gt; is the cool, but unsupported, new kid on the block. &lt;a href=&#34;https://caniuse.com/webp&#34;&gt;WebP has been
mainstream since 2020&lt;/a&gt;. In fact WebP is being slowly superseded by even newer
formats like &lt;a href=&#34;https://en.wikipedia.org/wiki/AVIF&#34;&gt;AVIF&lt;/a&gt;, and perhaps eventually &lt;a href=&#34;https://en.wikipedia.org/wiki/JPEG_XL&#34;&gt;JPEG XL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I did some experimentation with WebP and AVIF formats using &lt;a href=&#34;https://en.wikipedia.org/wiki/ImageMagick&#34;&gt;&lt;code&gt;magick&lt;/code&gt;&lt;/a&gt;,
&lt;a href=&#34;https://github.com/AOMediaCodec/libavif&#34;&gt;avifenc&lt;/a&gt;, and &lt;a href=&#34;https://developers.google.com/speed/webp/docs/cwebp&#34;&gt;cwebp&lt;/a&gt;. &lt;code&gt;avifenc&lt;/code&gt; and &lt;code&gt;cwebp&lt;/code&gt; are the reference
implementations for those formats respectively. &lt;code&gt;magick&lt;/code&gt; is&amp;hellip;ImageMagick.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;avifenc&lt;/code&gt; and &lt;code&gt;cwebp&lt;/code&gt; cannot convert straight from a &lt;a href=&#34;https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format&#34;&gt;HEIC&lt;/a&gt;, so an
intermediate, lossless, PNG is required.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sips -s format png original.heic --out original.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These are the results.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ls -1lSh | awk &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;{print $5, $9}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  9.4M original.png
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  1.0M original.heic
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  421K original-magick.webp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  415K original-cwebp.webp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  392K original-avifenc.avif
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  230K original-magick.avif
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For the record, JPEG XL is definitely &lt;a href=&#34;https://caniuse.com/jpegxl&#34;&gt;not ready yet&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My printer &lt;a href=&#34;/weeknotes/224-one-for-my-therapist/#:~:text=You%E2%80%99ve%20guessed%20it%2C-,it%20would%20not%20print,-.&#34;&gt;fell off the network again&lt;/a&gt; due to the previous 2.4GHz WiFi
issues. Never trust WiFi, it will always let you down. New network equipment
is getting closer and closer to purchase time. I just wanna print, man.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://makerworld.com/en/crowdfunding/110-snapframes-custom-frame-generator&#34;&gt;SnapFrames: Custom Frame Generator&lt;/a&gt; &amp;ndash; this is cool and relevant to my recent
interest in framing various things. I will follow with interest.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.freecycle.org/&#34;&gt;FreeCycle&lt;/a&gt; has been very handy this week. First I picked up a nice large
picture frame for free on Wednesday evening, and then got rid of an old wall
unit that was surplus to requirements on Friday morning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I fitted a &lt;a href=&#34;https://biqu.equipment/products/biqu-panda-lux-led-upgrade-kit-bambu-lab-a1&#34;&gt;LED light upgrade kit&lt;/a&gt; to my Bambu A1. The double-sided tape that
this came with was truly awful for what is an otherwise quite clever upgrade.&lt;/p&gt;
&lt;p&gt;The kit uses a light sensor that fits over the existing (pants) LED light
built-in to the printer. That means that you retain control over the lighting
via the normal controls on the printer touchscreen, and via the app. Nice.&lt;/p&gt;
&lt;p&gt;I added my own 3M double-sided tape in the end and that seems to have secured
it pretty well. I&amp;rsquo;m not sure if this upgrade is really worth doing to be
honest, it doesn&amp;rsquo;t give you a much better view of what you&amp;rsquo;re printing, which
seems like it would be the point. Still, it was cheap, and fun.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I built a &lt;a href=&#34;https://makerworld.com/en/models/233902-dowel-filament-racks?from=search#profileId-1299804&#34;&gt;Filament spool rack&lt;/a&gt; for my filament stash. It was getting a bit
unruly. It came out quite nicely I think. I found a nice design for the end
pieces and connected them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/filament-rack-empty.jpeg&#34; alt=&#34;Empty Filament spool rack&#34;&gt;
&lt;img src=&#34;/images/filament-rack-full.jpeg&#34; alt=&#34;Filament spool rack full of filament&#34;&gt;&lt;/p&gt;
&lt;p&gt;The design recommended PVC pipe, which I bought from &lt;a href=&#34;https://www.toolstation.com/20mm-heavy-duty-round-pvc-conduit/p47063&#34;&gt;Toolstation for £1.51&lt;/a&gt;,
but I decided, after picking it up, that it looked a bit naff. Instead I ended
up opting for some nice &lt;a href=&#34;https://www.wickes.co.uk/Rothley-White-Interior-Multi-Rail-Tube---19-x-1820mm/p/530316&#34;&gt;white steel wardrobe tubing from Wickes at £4&lt;/a&gt;, which
I cut down to size with a pipe cutter.&lt;/p&gt;
&lt;p&gt;Does anyone need 2 metres of black PVC conduit?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some &lt;a href=&#34;https://en.wikipedia.org/wiki/Common_cold&#34;&gt;sniffles&lt;/a&gt; this week. Shout out to &lt;a href=&#34;https://en.wikipedia.org/wiki/Xylometazoline&#34;&gt;Xylometazoline&lt;/a&gt; (aka &lt;a href=&#34;https://www.otrivine.co.uk/&#34;&gt;Otrivine&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I performed my first modifications to an existing 3D model this week. My aim
was to add some text onto the face of a case. &lt;a href=&#34;https://bambulab.com/en/download/studio&#34;&gt;Bambu Studio&lt;/a&gt; makes this fairly
easy once you&amp;rsquo;ve watched a video on how to do it. However, I suspect that soon
I will be reaching for more powerful CAD software and all that that entails.&lt;/p&gt;
&lt;p&gt;In order to save print time and filament, I also managed to cut the existing
model down into a smaller piece whilst testing the print settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The world of Game Boy modding is full of confusion. Products are mainly
manufactured by two or three big players, but often use the same (often
recycled) components. For example, both &lt;a href=&#34;https://hispeedidostore.com/&#34;&gt;Hispeedido&lt;/a&gt; and &lt;a href=&#34;https://funnyplaying.com/&#34;&gt;Funnyplaying&lt;/a&gt; use
the same screen for their DMG &amp;ldquo;laminated&amp;rdquo; kits but it&amp;rsquo;s hard to be sure of
that up front.&lt;/p&gt;
&lt;p&gt;I only know because I bought a &lt;a href=&#34;https://hispeedidostore.com/products/newest-laminated-q5-3-1-inches-larger-display-hd-ips-rips-screen-osd-frm-for-gbo-dmg-lcd-kits-housing-shell-case&#34;&gt;Hispeedido screen kit for a DMG&lt;/a&gt; I&amp;rsquo;m working
on and tested it with a &lt;a href=&#34;https://funnyplaying.com/products/dmg-gbp-after-sales-ips-lcd&#34;&gt;Funnyplaying laminated screen&lt;/a&gt; and it works. The
reality is that, especially as a relative newcomer, you often don&amp;rsquo;t really
know what you&amp;rsquo;re buying without experimentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I loves me some &lt;a href=&#34;https://en.wikipedia.org/wiki/Quick_Look&#34;&gt;Quick Look&lt;/a&gt;, so I setup &lt;a href=&#34;https://github.com/DavidPhillipOster/ThumbHost3mf&#34;&gt;ThumbHost3mf&lt;/a&gt; this week for
previewing &lt;a href=&#34;https://en.wikipedia.org/wiki/3D_Manufacturing_Format&#34;&gt;&lt;code&gt;*.3mf&lt;/code&gt;&lt;/a&gt; files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I setup my first Home Assistant automations, and of course one
instantly stopped working. This is what I envisage a &amp;ldquo;smart home&amp;rdquo; is &amp;ndash; things
just not working sometimes.&lt;/p&gt;
&lt;p&gt;The troublesome one was a contact sensor to tell me when the front door is
open. It seemed to fall off the Zigbee network as soon as I moved it to the
door. Re-pairing it whilst &lt;em&gt;at&lt;/em&gt; the front door seems to have fixed it and it
has been working since so far.&lt;/p&gt;
&lt;p&gt;The other was a hardware switch to turn my office lighting on/off. It is fine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dri.es/source-available-is-not-open-source-and-that-is-okay&#34;&gt;&amp;ldquo;Source available&amp;rdquo; is not open source (and that&amp;rsquo;s okay)&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A more accurate framing would be that Fizzy is source available. You can
read it, run it, and modify it. But DHH&amp;rsquo;s company is keeping the SaaS rights
because they want to be able to build a sustainable business. That is
defensible and generous, but it is  not  open source.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I realised that &lt;a href=&#34;https://www.themoviedb.org/person/4517-joe-pesci&#34;&gt;Joe Pesci&lt;/a&gt; starred in &lt;a href=&#34;https://www.themoviedb.org/movie/771-home-alone&#34;&gt;Home Alone&lt;/a&gt; and &lt;a href=&#34;https://www.themoviedb.org/movie/769-goodfellas&#34;&gt;GoodFellas&lt;/a&gt;
in the same year, 1990! The roles could not be more different.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 232: Your blog is dead to me</title>
      <link>https://elver.me/weeknotes/232-your-blog-is-dead-to-me/</link>
      <pubDate>Sun, 07 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/232-your-blog-is-dead-to-me/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If your blog doesn&amp;rsquo;t have a feed it is dead to me. That&amp;rsquo;s a shame because I
would like to read your blog.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We picked our Christmas tree on Wednesday afternoon and it was delivered
Friday evening ready to be decorated, which I cannot be arsed to do. Ho, ho,
ho.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I added a handy dandy &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/2041c165ee91351ed9563a2490a80de70ff7a920&#34;&gt;Raycast script command to start 3D cameras&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/raycast-3d-cameras.png&#34; alt=&#34;Raycast &amp;ldquo;3D cameras&amp;rdquo; command shown on macOS&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once I plucked up the courage (pathetic!) to figure out how to change out
half-used filament spools, for example to change to a different colour, it
became clear that this was going to be a constant pain. You have to carefully
tape up the filament so it doesn&amp;rsquo;t unravel into a big disastrous mess when
removing it from a spool, which is time consuming.&lt;/p&gt;
&lt;p&gt;As a result I&amp;rsquo;ve been printing lots of &lt;a href=&#34;https://makerworld.com/en/models/73599-v4-bambu-spool-honeycomb-edition#profileId-105962&#34;&gt;filament spools&lt;/a&gt; (&lt;a href=&#34;/weeknotes/231-on-a-roll/#:~:text=Most%203D%20printing%20is%20about%20pimping%20out%20the%203D%20printer&#34;&gt;told you&lt;/a&gt;) that I
can more easily swap on and off the printer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/197-i-m-a-youtuber-now/#:~:text=My%20desk%20has%20finally%20been%20upgraded&#34;&gt;MegaDesk controller for my desk&lt;/a&gt; became unresponsive and it wouldn&amp;rsquo;t move
up or down. I had to reboot it (turn it off and on again). Nothing is immune
from breaking!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had my first failed 3D print this week. The print just stopped after it was
about 35% done and reported being &amp;ldquo;successful&amp;rdquo;, which it very much was not.
The print head didn&amp;rsquo;t move back to its home position like it usually does
either, which resulted in the print sticking to the nozzle as it cooled 😢&lt;/p&gt;
&lt;p&gt;After some research it seemed like the &lt;a href=&#34;https://en.wikipedia.org/wiki/G-code&#34;&gt;G-code&lt;/a&gt; was probably corrupted.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;G-code instructions are provided to a machine controller (industrial
computer) that tells the motors where to move, how fast to move, and what
path to follow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It seems like it just followed the G-code as far as it could and then stopped
when it found no more instructions. SD card corruption was popping up a lot in
my research, which I found strange. I was under the impression that the SD
card was just used to manually add prints to the printer, but it turns out
that even when you initiate a print over the network it is still written to
the SD card, so the card is always involved in any print job.&lt;/p&gt;
&lt;p&gt;I formatted the SD card, and I&amp;rsquo;ve had many successful print jobs since, but I
ordered a new SD card anyway in case it happens again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Given the amount of fake flash memory devices floating about on popular
marketplaces I decided I should test the new SD memory card somehow. I came
across &lt;a href=&#34;https://github.com/AltraMayor/f3&#34;&gt;f3&lt;/a&gt; and gave that a go. It seemed to &amp;ldquo;work&amp;rdquo; I suppose 🤷‍♀️&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/ghostty-non-profit&#34;&gt;Ghostty Is Now Non-Profit&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In addition to the 7% fees, my family is personally donating $150,000
directly to the Hack Club project&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mitchell Hashimoto seems to be one of the good guys who made good and is now
giving back in big, sustainable, ways. Not just technically, but financially.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.nataliethenerd.com/build-a-boy-update-1-wip-and-tech-specs/&#34;&gt;Build A Boy update #1: WIP and tech specs&lt;/a&gt; - Natalie the Nerd is making good
progress on her Lego Game Boy kit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://angelika.me/2025/12/04/buying-kinesis-advantage-was-a-mistake/&#34;&gt;Buying the Kinesis Advantage 360 keyboard was a mistake&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I had to consider all the keyboard shortcuts that I normally use. Every
attempt at changing the layout would be costly. It takes weeks to develop
new muscle memory, so it felt very important to get it right on the first
try.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is exactly how I&amp;rsquo;ve felt about customising keyboards. I just don&amp;rsquo;t have a
particularly strong opinion on what is the best placement for a key, and the
cost of experimentation just seems too high. (No, I am still not using the new
keyboard.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.kickstarter.com/projects/makera-inc/makera-z1-entry-level-cnc-pro-level-power&#34;&gt;Makera Z1 Desktop CNC: Entry-level CNC, Pro-level Power&lt;/a&gt; &amp;ndash; another week,
another home CNC machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.jasonscheirer.com/weblog/vignettes/&#34;&gt;A Series of Vignettes From My Childhood and Early Career&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is indeed a set of passive-aggressive jabs on the continuing assault on
our senses by the LLM hype lobby.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you need to check what your public IP is when connected to some remote
machine you can do this and you&amp;rsquo;ll get a nice JSON response.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl http://ipinfo.io
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is useful for checking if the request is, say, connecting through a proxy
too.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -x http://ip:8888 http://ipinfo.io
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You know when RSS feeds don&amp;rsquo;t have the full content? Annoying, right. I was
aware that proxy services and software were a thing, so went investigating for
a solution (I&amp;rsquo;m not busy actually, no) and I found that the service I already
use, &lt;a href=&#34;https://feedbin.com/&#34;&gt;Feedbin&lt;/a&gt;, has this built-in &amp;ndash; sort of. There is a &amp;ldquo;Reader&amp;rdquo; button you
can press which shows you the full article content.&lt;/p&gt;
&lt;p&gt;At first it looked like it was only going to work in the Feedbin iOS app, and
I use &lt;a href=&#34;https://netnewswire.com/&#34;&gt;NetNewsWire&lt;/a&gt; like any self-respecting feed user. I was sure it wouldn&amp;rsquo;t
work there, but it does!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not perfect, loading each article manually by pressing the button seems
like unnecessary friction. Better than nowt though as I can avoid &amp;ldquo;local news
website ads&amp;rdquo;, the worst kind of ads.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now is &lt;a href=&#34;https://gizmodo.com/do-not-build-a-pc-right-now-prices-out-of-control-2000694774&#34;&gt;&lt;em&gt;not&lt;/em&gt; a good time to build a PC&lt;/a&gt;. Look at the &lt;a href=&#34;https://pcpartpicker.com/trends/price/memory/&#34;&gt;price of memory&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;(Hat tip to &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt; for the graph link.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DNS is really hard, man - for me at least. Sure, the basics make sense, but it
can get complicated fast. I&amp;rsquo;ve been adding a fair few new Docker services to
my home network recently and I&amp;rsquo;m sick of typing URLs with port numbers, so I
wanted to be able to refer to services by a custom domain.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve decided to go the very lowest of lo-fi route, for now &amp;ndash; &lt;code&gt;/etc/hosts&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Because I only connect to these services on my local network, or via
Tailscale, and I have &lt;a href=&#34;/weeknotes/231-on-a-roll/#:~:text=I%20setup%20my%20main%20file%20server%20machine%20at%20home%20as%20a%20Subnet%20Router&#34;&gt;Tailscale Subnet Routing turned on&lt;/a&gt; I can always
resolve the local IP, so I can just add entries to &lt;code&gt;/etc/hosts&lt;/code&gt; like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;192.168.0.1  service.custom.domain
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Coupled with a reverse proxy (which I&amp;rsquo;ve yet to setup) and it should work. It
will only work on this one computer, but it will work.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s all I need right now. I will revisit running proper DNS later when then
network evolves into something proper.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://sixcolors.com/post/2025/12/in-a-major-coup-for-someone-alan-dye-leaves-apple/&#34;&gt;In a major coup for someone, Alan Dye leaves Apple&lt;/a&gt; &amp;ndash; this guy couldn&amp;rsquo;t
design his way out of a paper bag. Design isn&amp;rsquo;t making things transparent, Al.&lt;/p&gt;
&lt;p&gt;People, stop making things pretty, start &lt;em&gt;designing&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 231: On a roll</title>
      <link>https://elver.me/weeknotes/231-on-a-roll/</link>
      <pubDate>Sun, 30 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/231-on-a-roll/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The replacement screen for which I raised a &lt;a href=&#34;/weeknotes/230-broken-web/#:~:text=my%20best%20friend&#34;&gt;PayPal dispute&lt;/a&gt; was received and
works, that&amp;rsquo;s the end of that particular saga.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now that the coin batteries in my home automation devices are starting to run
out, and after reading about &lt;a href=&#34;/weeknotes/230-broken-web/#:~:text=impressive%20project&#34;&gt;that impressive project to build a sensor from
scratch&lt;/a&gt; (which uses a AAA battery) I&amp;rsquo;m starting to realise that rechargeable
AAA batteries may be the way forward, if possible. Coin batteries seem
cheaper, but if you buy decent ones it adds up, and marketplaces seem full of
junk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.lego.com/en-gb/product/star-trek-u-s-s-enterprise-ncc-1701-d-10356&#34;&gt;Star Trek: U.S.S. Enterprise NCC-1701-D™&lt;/a&gt; - Christmas is coming, and if you
need some ideas, I&amp;rsquo;m just saying.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/190-no-worky/#:~:text=something%20I%20fixed&#34;&gt;button on the speaker I fixed&lt;/a&gt; seems to be playing up again. I&amp;rsquo;ve yet to
open it, but I&amp;rsquo;ve preemptively bought &lt;a href=&#34;https://www.switchelectronics.co.uk/products/6x6mm-right-angle-momentary-pcb-tactile-switch-7-0mm&#34;&gt;some right-angled switches&lt;/a&gt; (by
eyeballing the photos, no science involved) because they were cheap and I&amp;rsquo;m
already &lt;a href=&#34;/weeknotes/190-no-worky/#:~:text=I%20swapped%20out%20one%20of%20the%20other%20buttons%20into%20the%20power%20button%20position&#34;&gt;one switch down since the last repair&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My Kindle now has &lt;a href=&#34;https://en.wikipedia.org/wiki/Secure_Shell&#34;&gt;sshd&lt;/a&gt;. How else would you get epubs onto a Kindle? AMA 😁&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fungus gnats! I am so sick of these fuckers. My tunnel vision thought that
they were coming from the plant pots themselves. As &lt;a href=&#34;/weeknotes/218-botulism-opportunity/#:~:text=I%20was%20wrong&#34;&gt;previously documented&lt;/a&gt; I
sent in a nemotode army and installed sticky traps. Still they persisted. So I
topped the soil with an anti-fungus gnat gravel. Still they came. Then I
remembered that I had bags of compost in the understairs cupboard&amp;hellip;&lt;/p&gt;
&lt;p&gt;It was extremely obvious that this was the main source of the gnats once I
went looking. There was a fungus gnat graveyard next to the bags, bodies
everywhere. I&amp;rsquo;ve taped up the bags now. Every crevice they could get out of
now covered in parcel tape. Now we wait 🤞&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is a cool concept. Turn your &lt;a href=&#34;https://makerworld.com/en/models/2029113-modular-system-for-x1-p1-p2-series#profileId-2188110&#34;&gt;3D printer into other kinds of machine&lt;/a&gt;
like a plotter, laser cutter, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/228-all-my-friends/#:~:text=manually%20uploading%20torrent%20files&#34;&gt;Shortcut&lt;/a&gt; how have I lived without you 😍 I added the ability for files to be
deleted after upload. Such technology.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My car went back into the garage this week. A new battery, which isn&amp;rsquo;t bad as
it&amp;rsquo;s pretty old now, and a unblocking of the rear washer jets was in order.
The issue I&amp;rsquo;ve been having with the revs dropping whilst idling in traffic
remains unsolved, but there is some suspicion that the timing chain is
stretching and needs replacement. An expensive job, but not Audi dealer
expensive, so there&amp;rsquo;s that. The mechanic didn&amp;rsquo;t seem too worried. Famous last
words 😬&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;re an Air Fryer family now. Black Friday was the time to pounce on a deal,
and pounce I did. I did my research, setup a Camel Camel Camel alert, and then
I waited. I went against the grain and bought a &lt;a href=&#34;https://www.amazon.co.uk/dp/B0CHFMK8S5&#34;&gt;Cosori model&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was a skeptic, isn&amp;rsquo;t an air fryer just a small convection oven? Yes, yes it
is, but I&amp;rsquo;m won over. The speed and easy clean up is a game changer. It&amp;rsquo;s
undeniably too big for our worktop, so that might get boring fast.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I built one of those &lt;a href=&#34;https://www.thingiverse.com/thing:6955798/&#34;&gt;TouchID Trackpads&lt;/a&gt; I &lt;a href=&#34;/weeknotes/223-now-there-are-graphs/#:~:text=very%20nice%20idea&#34;&gt;mentioned before&lt;/a&gt;. Early days but
I&amp;rsquo;m pretty happy with it so far, although it&amp;rsquo;s too early to tell whether I
will actually use it. I enjoyed the process though.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/touchid-trackpad.jpeg&#34; alt=&#34;Completed TouchID Trackpad project&#34;&gt;&lt;/p&gt;
&lt;p&gt;I expect to write up the build of this with photos (!) in a longer blog post
so be sure to like and subscribe for that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What you can get delivered to your door next day should constantly surprise
us. We&amp;rsquo;re completely spoilt in a lot of ways. Conversely sometimes I&amp;rsquo;m shocked
at how difficult it is to acquire certain things.&lt;/p&gt;
&lt;p&gt;Now, this &amp;ldquo;thing&amp;rdquo; is a very particular headphone socket (&lt;a href=&#34;https://www.digikey.co.uk/en/products/detail/same-sky-formerly-cui-devices/SJ2-35954A-SMT-TR/6619576?s=N4IgTCBcDaIMoCkwFoDMBWAnOgLAQWTgFkAVZEgJRAF0BfIA&#34;&gt;SJ2-35954A-SMT-TR&lt;/a&gt;),
sure, but it seems the only way to get this part at a &lt;em&gt;reasonable price&lt;/em&gt; is to
buy £50 pounds quid worth of them. I just want &lt;em&gt;one&lt;/em&gt;. I&amp;rsquo;ve &lt;a href=&#34;/weeknotes/185-fabric-shaving/#:~:text=Anyway%2C%20that%E2%80%99s%20the%20story%20of%20how%20a%20man%20ordered%20%C2%A360%20worth%20of%20the%20same%20part%20out%20of%20sheer%20stubbornness&#34;&gt;been here before&lt;/a&gt;
and not sure I want re-visit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What are you using &lt;a href=&#34;/weeknotes/230-broken-web/#:~:text=I%20purchased%20a%20Tapo%20C110%20camera%20this%20week&#34;&gt;those cameras&lt;/a&gt; for Jordan? To monitor my 3D printer of
course, silly! When a long print is doing its thing I don&amp;rsquo;t want to confined
to the house watching over it, checking for fires etc, so it&amp;rsquo;s nice to be able
to take a quick look now and then.&lt;/p&gt;
&lt;p&gt;So now I have both trained on the printer from different vantage points. I
started off with a wider view of the whole setup. It seems nice to be able to
see everything in case there&amp;rsquo;s some problems outside of the printer itself.
The other, cheaper, camera is aimed firmly at the print bed itself using a &lt;a href=&#34;https://makerworld.com/en/models/104825-bambulab-a1-tapo-c110-camera-holder#profileId-147746&#34;&gt;3D
printed bracket&lt;/a&gt; (duh!).&lt;/p&gt;
&lt;p&gt;Most 3D printing is about pimping out the 3D printer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, I wanted to access those cameras on my Mac. The iOS app is
very nice, but it&amp;rsquo;s more useful to have the camera streams running in the
corner of my desktop instead whilst doing something else.&lt;/p&gt;
&lt;p&gt;As I said before, the cameras can be &lt;a href=&#34;https://www.tapo.com/us/faq/724/&#34;&gt;accessed over RTSP&lt;/a&gt;, so it is just a
matter of pulling those streams and arranging them into some sort of window. I
didn&amp;rsquo;t want to expose these RTSP streams to the Internet particularly, but I
do have Tailscale.&lt;/p&gt;
&lt;p&gt;If you setup &lt;a href=&#34;https://tailscale.com/kb/1019/subnets&#34;&gt;Subnet Routing in Tailscale&lt;/a&gt; you can access local devices which
have an IP, but onto which you cannot install the Tailscale client. Once this
is configured and you&amp;rsquo;re connected to your tailnet, you can access the device
by it&amp;rsquo;s IP address as you would locally.&lt;/p&gt;
&lt;p&gt;I setup my main file server machine at home as a Subnet Router as per the
docs.&lt;/p&gt;
&lt;p&gt;First I had to enable &lt;a href=&#34;https://tailscale.com/kb/1019/subnets#enable-ip-forwarding&#34;&gt;IP Forwarding&lt;/a&gt; in Linux like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;net.ipv4.ip_forward = 1&amp;#39;&lt;/span&gt; | sudo tee -a /etc/sysctl.d/99-tailscale.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;net.ipv6.conf.all.forwarding = 1&amp;#39;&lt;/span&gt; | sudo tee -a /etc/sysctl.d/99-tailscale.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then alter my Docker Compose config to &amp;ldquo;advertise&amp;rdquo; the routes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   tailscale:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     image: tailscale/tailscale:stable
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     container_name: tailscale
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     environment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       - TS_STATE_DIR=/var/lib/tailscale
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;-      - TS_EXTRA_ARGS=--advertise-exit-node
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - TS_ROUTES=192.168.0.0/24
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - TS_EXTRA_ARGS=--advertise-exit-node --accept-routes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;&lt;/span&gt;     volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       - /opt/appdata/tailscale:/var/lib/tailscale
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       - /dev/net/tun:/dev/net/tun
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And re-create the container.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose up -d --force-recreate tailscale
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once I&amp;rsquo;d done that I accepted the change in the web interface, and I could
access the devices ✅&lt;/p&gt;
&lt;p&gt;Then there was the issue of actually displaying the streams. Claude, my man,
helped me out with this. I was sure there was some command line media player
that could do this, but I was unsure of the options. I ended up using &lt;a href=&#34;https://mpv.io/&#34;&gt;mpv&lt;/a&gt;
which seems to be a modern replacement for &lt;a href=&#34;https://mplayerhq.hu/&#34;&gt;mplayer&lt;/a&gt; which I used to use back
in the day.&lt;/p&gt;
&lt;p&gt;With a lot of back and forth I ended up with a &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/25544ef4e745181671cb6a59b0631afdce5eaa79&#34;&gt;nifty shell function&lt;/a&gt; which
fires up the streams stacked vertically on top of each other, and that stays
on top of other windows.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fish&#34; data-lang=&#34;fish&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;3dcams&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;-d&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Show my 3D printer cameras in a vertically stacked window&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;mpv&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#008080&#34;&gt;--lavfi-complex&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;[vid1][vid2]vstack[vo]&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#008080&#34;&gt;--geometry&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;1280x0-&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;+&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#008080&#34;&gt;--no-audio&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#008080&#34;&gt;--msg-level&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;all&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;error &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#008080&#34;&gt;--ontop&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#008080&#34;&gt;$3D_PRINTER_CAM1_URL&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#008080&#34;&gt;--external-file&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;$3D_PRINTER_CAM2_URL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This isn&amp;rsquo;t yet battle-tested, but it works fairly well from what I can tell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.boxypixel.com/products/metal-unhinged-game-boy-advance-sp-screen-base-kit&#34;&gt;Boxy Pixel GBA-SP Unhinged&lt;/a&gt; project I&amp;rsquo;ve been planning for a long time is
also now complete. Blimey, I&amp;rsquo;m on a roll.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/boxy-pixel-unhinged.jpeg&#34; alt=&#34;Boxy Pixel GBA SP Unhinged in silver&#34;&gt;&lt;/p&gt;
&lt;p&gt;Isn&amp;rsquo;t she a beaut?! 😍&lt;/p&gt;
&lt;p&gt;Again, expect more excruciating detail about this process at a later date.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I am looking forward to starting my Coffee Advent calendar tomorrow. I&amp;rsquo;m fun.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 230: Broken web</title>
      <link>https://elver.me/weeknotes/230-broken-web/</link>
      <pubDate>Sun, 23 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/230-broken-web/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My advice, &lt;a href=&#34;/weeknotes/229-wildly-inefficient/#:~:text=use%20the%20NHS%20this%20week&#34;&gt;never get sick&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another example of a broken web. Why do you go to IKEA&amp;rsquo;s website? Is it to
read the latest news on the world famous IKEA meatball (that is a real
example!)? No, it’s to browse and purchase the products IKEA sell. Which part
of the home page loads last on ikea.com? You guessed it, the link to
their online store. Absolute madness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once again, &lt;a href=&#34;https://github.com/gohugoio/hugo/pull/14091&#34;&gt;you are welcome&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I purchased a &lt;a href=&#34;https://www.tapo.com/uk/product/smart-camera/tapo-c110/&#34;&gt;Tapo C110 camera&lt;/a&gt; this week for £16.99. I was astonished at how
cheap it was. I wasn&amp;rsquo;t expecting much, but it&amp;rsquo;s genuinely fantastic for the
money. It was easy to set-up, streams great via their app, has night vision,
and you can access the camera streams via &lt;a href=&#34;https://en.wikipedia.org/wiki/Real-Time_Streaming_Protocol&#34;&gt;RTSP&lt;/a&gt; should be so inclined (which
I am).&lt;/p&gt;
&lt;p&gt;I was tempted to buy another, but the price shot back up to ~£23 until it then
plummeted back down to £15.99. Yes, please! Snapped up another.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hackaday.io/project/204509-zicada-diy-zigbee-multisensor&#34;&gt;Zicada - DIY Zigbee Multisensor&lt;/a&gt; &amp;ndash; this is a very impressive project.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Zicada is a DIY Zigbee sensor based on Nordic’s nRF52840 SoC. It combines a
temperature and humidity sensor with a hall effect switch, making it
suitable for both climate and door/window monitoring. Zicada is optimized
for ultra-low power consumption, running at just 6µW in standby. This allows
it to operate on a rechargeable AAA battery for 2 years or longer. It is
fully compatible with Home Assistant (ZHA) and Zigbee2MQTT.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Designed an electronic circuit. Designed a PCB and had it manufactured. Hand
soldered. Built, designed and 3D-printed an enclosure. Wrote the software from
scratch. Impressive stuff ✅&lt;/p&gt;
&lt;p&gt;I might try and build one of these one day. It might be a fun addition to my
Home Assistant shenanigans.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Would you believe it, the people who were ignoring my emails are now trying to
be my best friend with multiple emails from them in quick succession. &lt;a href=&#34;/weeknotes/229-wildly-inefficient/#:~:text=PayPal%20dispute&#34;&gt;The
system works&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;PayPal with credit card hooked up is my new jam for certain purchases.
According to Monzo you get 120 days to claim a chargeback from a company,
something I&amp;rsquo;ve never done, but it&amp;rsquo;s nice to know you might able to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Complaining is easy and I do it often. Here is an example of good service:
Fastmail support. They got back to me quickly and were helpful. Even if the
solution to my problem was &amp;ldquo;turn if off and on again&amp;rdquo; aka uninstall/reinstall
the app. It is possible.&lt;/p&gt;
&lt;p&gt;(Still managed a small complaint 😉)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was bloomin&amp;rsquo; snow this week. It was a shock to go from unseasonably (is
that even a thing any more?) warm weather for this time of year to &amp;ldquo;feels
like&amp;rdquo; temperatures of -7. I even wore my thermals!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.home-assistant.io/blog/2025/11/19/home-assistant-connect-zbt-2/&#34;&gt;The best gets better - Home Assistant Connect ZBT-2&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The easiest way to start with Zigbee or Thread just got even better, with
Home Assistant Connect ZBT-2. This USB adapter plugs into your Home
Assistant system and opens up a world of smart device options.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have no use for this at the moment but it looks like an low effort way to
get into Home Automation with Home Assistant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theverge.com/news/823788/europe-cookie-prompt-browser-changes-proposal&#34;&gt;Europe’s cookie nightmare is crumbling&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The sheer amount of cookie pop-ups across Europe means people often just
click any button to get access to a website, simply because of the annoyance
instead of worrying about their privacy. &amp;ldquo;This is not a real choice made by
citizens to protect their phones or computers and to choose what happens to
their data,” says the European Commission.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://knowyourmeme.com/memes/you-dont-say--3&#34;&gt;nick-cage-you-dont-say.gif&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please make the popups stop. Anything to make them stop.&lt;/p&gt;
&lt;p&gt;(And before you say, use this browser extension or that - when a website
doesn&amp;rsquo;t work for no apparent reason in six months time, do you remember that
it might be your popup killer? I don&amp;rsquo;t)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.cloudflare.com/18-november-2025-outage/&#34;&gt;Cloudflare outage on November 18, 2025&lt;/a&gt; &amp;ndash; Don&amp;rsquo;t &lt;a href=&#34;https://blog.cloudflare.com/18-november-2025-outage/#:~:text=unwrap()&#34;&gt;&lt;code&gt;unwrap&lt;/code&gt;&lt;/a&gt; your production
code, kids (&lt;a href=&#34;https://www.youtube.com/watch?v=sJBaMJfxzYk&#34;&gt;nice explanation from ThePrimegean&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The combination of Black Friday, Amazon, and the discovery that you get a 2%
discount for &amp;ldquo;no rush delivery&amp;rdquo; might not have been good for my wallet, but it
is good for my inner prepper. Let&amp;rsquo;s just say we&amp;rsquo;ll be happily washing our
dishes and clothes into April 2026. And the cost per wash is a regular
calculation I am now very familiar with.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It happened. I bought a &lt;a href=&#34;https://bambulab.com/en-gb/a1&#34;&gt;3D printer&lt;/a&gt;. Fuck.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 229: Wildly inefficient</title>
      <link>https://elver.me/weeknotes/229-wildly-inefficient/</link>
      <pubDate>Sun, 16 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/229-wildly-inefficient/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;No Game Boy news this week. Waiting on parts. You&amp;rsquo;re welcome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.juliensauctions.com/en/auctions/the-jim-henson-company-70th-anniversary-auction&#34;&gt;Would you like to own a muppet?&lt;/a&gt; (via &lt;a href=&#34;https://simplebits.com/notebook/studio-notes-57/&#34;&gt;Simple Bits&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had cause to use the NHS this week. The first doctor we saw was fantastic.
She was empathetic, and seemed to really care. The system seems wildly
inefficient though. The doctor navigated the bureaucracy in order to arrange
an ultrasound, which necessitated moving departments, which meant giving all
the &lt;em&gt;same&lt;/em&gt; information a second time, and performing all the &lt;em&gt;same&lt;/em&gt; tests
again. And then no scan. We will have to wait and see what happens 😬&lt;/p&gt;
&lt;p&gt;As a nation, we accept wild inefficiency readily. Like a national past time.
The NHS is something to be very proud of, but you can love something whilst
pointing out it&amp;rsquo;s failings (thanks Mum 👋). How else can we make it better?&lt;/p&gt;
&lt;p&gt;I really hope I never get something that needs serious medical attention.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rachelkickdesign.com/products/national-forest-font-duo-1&#34;&gt;National Forest Font Duo&lt;/a&gt; &amp;ndash; Look at this beaut 😍&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I bought and wrote all my Christmas cards this week. What an arsehole. Peak
procrastination.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you &lt;a href=&#34;/weeknotes/195-funky-town/#:~:text=Say%20that%20you%20were%20becoming%20border%2Dline%20obsessed%20with%20sourcing%20a%20Zigbee%2Dcapable%20smart%20power%20socket&#34;&gt;remember when I was obsessed&lt;/a&gt; with procuring the &lt;a href=&#34;https://www.ikea.com/gb/en/p/inspelning-plug-smart-energy-monitor-80569842/&#34;&gt;IKEA INSPELNING&lt;/a&gt; for
its energy tracking capabilities at a very affordable price? I was browsing
unrelated items on IKEA&amp;rsquo;s website and it popped up. Curiosity got the best of
me and can you believe it, IN STOCK. I may have bought too many, but soon I
will know when I will be financially ruined by &lt;a href=&#34;/weeknotes/222-humble-tumble/#:~:text=We%20bought%20a%20tumble%20dryer%20and%20it%E2%80%99s%20changing%20our%20lives&#34;&gt;the tumble dryer&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A sticker shop wanted to charge me £17 to send a sticker to the UK.&lt;/p&gt;
&lt;p&gt;A sticker. SEVENTEEN POUNDS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about &lt;a href=&#34;https://en.wikipedia.org/wiki/3DBenchy&#34;&gt;3DBenchy&lt;/a&gt;. 3DBenchy is a 3D model designed to test the capabilities
of 3D printers. It nearly disappeared in 2024 due to a company acquisition
(&lt;a href=&#34;https://www.thingiverse.com/thing:6907169&#34;&gt;3D Boaty&lt;/a&gt; was created in response &amp;ndash; it&amp;rsquo;s not a boat) but was &lt;a href=&#34;https://www.nti-group.com/home/news/3dbenchy/&#34;&gt;subsequently
relicensed into the public domain&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=mDNM5X7__l4&#34;&gt;&amp;ldquo;I haven&amp;rsquo;t been this excited in YEARS&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;No way around it, this is cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.zsa.io/diy-silicone-wrist-rest/&#34;&gt;DIY Moonlander Wrist Rest Pad&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve never worked with silicone before, and I definitely don&amp;rsquo;t have all the
equipment needed to get the best results possible - but even with the basics
I&amp;rsquo;m quite happy with how these turned out.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/alexpasmantier/television&#34;&gt;Television&lt;/a&gt; &amp;ndash; &amp;ldquo;A fast and hackable fuzzy finder for the terminal.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t need a new fuzzy finder. I don&amp;rsquo;t need a new fuzzy finder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I raised my first ever PayPal dispute this week &amp;ndash; fun times.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 228: All my friends</title>
      <link>https://elver.me/weeknotes/228-all-my-friends/</link>
      <pubDate>Sun, 09 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/228-all-my-friends/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My latest trip down South was successful and restorative &amp;ndash; &lt;a href=&#34;https://genius.com/Lcd-soundsystem-all-my-friends-lyrics#:~:text=You%20spent%20the%20first%20five%20years%20trying%20to%20get%20with%20the%20plan%0AAnd%20the%20next%20five%20years%20trying%20to%20be%20with%20your%20friends%20again&#34;&gt;LCD Soundsystem
were right&lt;/a&gt;. My usual anxiety about the journey to and fro once again proved
to be incorrect &amp;ndash; it was fine, with the exception of the upper back soreness
I got from all the driving. I&amp;rsquo;m looking forward to visiting for the final time
this year around Christmas time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.joshwcomeau.com/animation/linear-timing-function/&#34;&gt;Springs and Bounces in Native CSS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The magic of the &lt;code&gt;linear()&lt;/code&gt; timing function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been manually uploading torrent files to my web client, one at a time,
for far too long. So this week I decided I&amp;rsquo;d had enough and wanted an easy way
to perform this task. Ideally I wanted something at the macOS system level
where you could right click on the files and choose to Upload.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://support.apple.com/en-gb/guide/shortcuts-mac/apdf22b0444c/mac&#34;&gt;Shortcuts&lt;/a&gt; app was what I required. Like Automator before it, creating a
Shortcut, as a programmer, is a frustrating experience where the easiest of
things seem very hard, still I got something working as a &amp;ldquo;Quick Action&amp;rdquo; so it
appears in the right click menu. It runs a &lt;em&gt;very small&lt;/em&gt; shell script to upload
the selected files using &lt;a href=&#34;https://en.wikipedia.org/wiki/Secure_copy_protocol&#34;&gt;&lt;code&gt;scp&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Already paying dividends. Chalk it up as one of those things I should&amp;rsquo;ve done
ages ago.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I added a further two working Game Boys to my collection this week, and
started a third, but that is still work in progress.&lt;/p&gt;
&lt;h4 id=&#34;game-boy-advance&#34;&gt;Game Boy Advance&lt;/h4&gt;
&lt;p&gt;This is the first finished Game Boy Advance I&amp;rsquo;ve completed. It has a new shell
and IPS screen. It was straight forward, the only hiccup being closing it
whilst getting all the pieces lined up.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/gba-black.jpeg&#34; alt=&#34;Refurbished Game Boy Advance in black with colour screen&#34;&gt;&lt;/p&gt;
&lt;p&gt;The shell is &lt;em&gt;fine&lt;/em&gt; (a bit on the cheaper end) but the screen is very nice.&lt;/p&gt;
&lt;h4 id=&#34;game-boy-dmg&#34;&gt;Game Boy DMG&lt;/h4&gt;
&lt;p&gt;There was more wrong with this one. The sound was dodgy, and would crackle,
especially when the volume wheel was used. I was surprised to find that
cleaning the headphone jack with contact cleaner sorted it.&lt;/p&gt;
&lt;p&gt;However, getting the screen in this one lined up was a nightmare. It&amp;rsquo;s made
difficult by not being able to tell if it&amp;rsquo;s in the correct position unless
it&amp;rsquo;s turned on. And you can&amp;rsquo;t really power it on until you put it together.
After several adjustments I eventually got it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/dmg-white.jpeg&#34; alt=&#34;Refurbished Game Boy DMG in white with yellow screen&#34;&gt;&lt;/p&gt;
&lt;p&gt;This wasn&amp;rsquo;t actually the DMG I intended to work on. I was planning on building
one with a laminated screen to start because it &lt;em&gt;should&lt;/em&gt; be easier.
Unfortunately, the screen arrived damaged and I am now being ignored by the
manufacturer support, neat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More &lt;a href=&#34;https://github.com/zinefer/zinefer.github.com/pull/571#:~:text=github%3A%20Fix%20typo%20in%20stale%20PR%20message%2008a0679a8%20%40jordelver&#34;&gt;incalculable contributions&lt;/a&gt; to Open Source.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When I &lt;a href=&#34;/weeknotes/219-differentiators/#:~:text=New%20keyboard%20time&#34;&gt;bought the Voyager I&amp;rsquo;m failing to use&lt;/a&gt; of course I decided I should
immediately pimp it out with a &lt;a href=&#34;https://3dkeycap.com/products/keycap-tilting-kit&#34;&gt;keycap tilting kit&lt;/a&gt; so that I could angle the
keycaps in a more comfortable way so when I&amp;rsquo;m not using it I don&amp;rsquo;t get RSI.&lt;/p&gt;
&lt;p&gt;The kit took over &lt;em&gt;6 weeks&lt;/em&gt; to arrive for reasons. The primary one being that
the shipping tracking was non-existent which meant it sat at the Post Office
for weeks before being returned to sender &amp;ndash; but at least not &lt;a href=&#34;/weeknotes/227-game-boy-week/#:~:text=Evri%2C%20that%E2%80%99s%20how&#34;&gt;Evri&amp;rsquo;s fault&lt;/a&gt;
this time.&lt;/p&gt;
&lt;p&gt;I fitted the kit and it looks pretty swish. I couldn&amp;rsquo;t tell you how they are
at making me a better typist though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Robby Russell:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://x.com/robbyrussell/status/1984303948103323685?_bhlid=450ad5c1b07af69e5c5ba0108c0433f824a4e82f&#34;&gt;And caring is still the rarest skill in tech.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ain&amp;rsquo;t that the truth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://danwebb.net/posts/safety-first/&#34;&gt;Safety First&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It&amp;rsquo;s simpler than that - nine times out of ten, your engineers are scared to
change things.&lt;/p&gt;
&lt;p&gt;Every deploy gets batched up with loads of changes because deploys are
painful. Which makes them scarier.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I remember working somewhere where the deploys were done quarterly. The whole
process was framed around reducing risk, when in fact it did the opposite.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://bsky.app/profile/fpsvogel.bsky.social/post/3m4dubxwgmk24?_bhlid=814110c0a6d3a739df41c225f6261254a31201c4&#34;&gt;Here&amp;rsquo;s a fun bit of Ruby metaprogramming: get the name of the method that
called the current method.&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;caller_locations(&lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;first&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;label&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;last
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Handy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 227: Game Boy week</title>
      <link>https://elver.me/weeknotes/227-game-boy-week/</link>
      <pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/227-game-boy-week/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.techspot.com/news/110075-google-pulls-plug-first-second-gen-nest-thermostats.html&#34;&gt;Google pulls the plug on first and second gen Nest Thermostats&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Affected devices have been unpaired and removed from the Nest app&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have a 3rd Generation model so I guess I&amp;rsquo;m next.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From Helen Lewis: &lt;a href=&#34;https://www.theatlantic.com/ideas/archive/2025/10/fear-laughing-riyadh-comedy-louis-ck/684527/&#34;&gt;I Watched Stand-Up in Saudi Arabia&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Burr’s words reflect the bland incuriosity that accrues with wealth. As I
ate dinner one night at the Ritz-Carlton, in a Chinese restaurant
overlooking the indoor swimming pool, I reflected that the promise of a
five-star hotel is insulation, a cocoon against the outside world. A rich
person—a successful comedian, say—could glide from the business-class lounge
to the front of the aircraft to an air-conditioned limo to a luxury hotel
where your dinner is interrupted by five different people asking if
everything is okay. Live enough days like this, and the whole world becomes
your bellhop. No wonder these guys like Saudi Arabia. The way that daily
life bends around rich people is that little bit more obvious here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Paradox_of_tolerance&#34;&gt;Paradox of tolerance&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The paradox of tolerance is a philosophical concept suggesting that if
a society extends tolerance to those who are intolerant, it risks enabling
the eventual dominance of intolerance, thereby undermining the very
principle of tolerance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had never heard of this before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://afomera.dev/posts/2025-10-25-stop-giving-harm-a-microphone&#34;&gt;Stop Giving Harm a Microphone&lt;/a&gt; &amp;ndash; I thought this was a very reasonable and
fair take.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rant about notification/message read/unread state forthcoming (skip if I were
you).&lt;/p&gt;
&lt;p&gt;Nearly every mobile app I use which has some sort of notification or message
read state cannot get it right in various ways.&lt;/p&gt;
&lt;p&gt;You get a message from Vinted. You click on it, you read it. The read state
does not change. It goes away at some point in the future. Maybe. Hopefully.&lt;/p&gt;
&lt;p&gt;My banking app prompts to authorize a transaction (good), I click the
notification and authorize, it completes. It shows a notification for the
thing I &lt;em&gt;just&lt;/em&gt; did as unread. I must go to the &amp;ldquo;notifications&amp;rdquo; icon and
manually clear it. Every time.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Aside:&lt;/em&gt; I think this likely regulatory ass-covering, so they can say that
they notified you despite, in modern iOS, having scanned your face!&lt;/p&gt;
&lt;p&gt;In other apps there will be notification badge but absolutely no sign of
anything to &amp;ldquo;read&amp;rdquo; in the app. You have to stab around amongst the screens in
an attempt to clear it. Is this some sort of &amp;ldquo;engagement&amp;rdquo; dark pattern or just
regular incompetence?&lt;/p&gt;
&lt;p&gt;Continue&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.mcsweeneys.net/articles/hi-its-me-wikipedia-and-i-am-ready-for-your-apology&#34;&gt;Hi, It’s Me, Wikipedia, and I Am Ready for Your Apology&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In a few years, you&amp;rsquo;ll say, &amp;ldquo;Wow, look, a human being who can read.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/224-one-for-my-therapist/#:~:text=I%20am%20making%20a%20comeback&#34;&gt;I told you I was going to get back to my Game Boy hobby&lt;/a&gt; didn&amp;rsquo;t I.&lt;/p&gt;
&lt;h4 id=&#34;a-dead-dmg&#34;&gt;A dead DMG&lt;/h4&gt;
&lt;p&gt;First up, I brought a Game Boy DMG back to life. It was not turning on at all.
This was easily rectified with new battery terminals, the originals were
corroded. I will decide what to do with it later, but I suspect it will get
the full replace-all-the-things treatment.&lt;/p&gt;
&lt;h4 id=&#34;game-boy-pocket-1&#34;&gt;Game Boy Pocket 1&lt;/h4&gt;
&lt;p&gt;This bolstered my confidence, and due to having the most success with the DMGs
and Game Boy Pockets (they&amp;rsquo;re basically the same console), I turned my
attention to a GBP next. I re-shelled it and gave it a new IPS screen. It came
out well I think.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/gbp-dmg.jpeg&#34; alt=&#34;Refurbished Game Boy Pocket in original DMG style&#34;&gt;&lt;/p&gt;
&lt;p&gt;There is one small imperfection which you can&amp;rsquo;t really see unless you go
looking for it. In the top right corner of the new screen there is a slight
bleed, but it is obscured by the lens, so not a massive deal. I&amp;rsquo;m not sure if
it came this way or due to my installation.&lt;/p&gt;
&lt;h4 id=&#34;game-boy-pocket-2&#34;&gt;Game Boy Pocket 2&lt;/h4&gt;
&lt;p&gt;The next one was trickier.&lt;/p&gt;
&lt;p&gt;It was D.O.A. and showed no sign of life. However, upon opening it up it
seemed fairly obvious what the problem might be. One of the battery terminals,
and the capacitor next to it, were corroded. Replacing both was in order.&lt;/p&gt;
&lt;p&gt;Removing the corroded battery terminal was straight forward. Sadly when I
removed the capacitor one of the pads came with it &amp;ndash; this was now an
opportunity for some trace repair. I&amp;rsquo;ve done this before, but unsuccessfully.&lt;/p&gt;
&lt;p&gt;By happenstance I had watched a YouTube video on this recently, and the
techniques shown seemed like they might fix the issue I had last time I tried
this.&lt;/p&gt;
&lt;p&gt;There are various ways to fix pads/traces, but what I tried last time was to
use adhesive copper tape stuck to the board to replace the missing pad. You
can then solder to the new copper tape. This part went well but as soon as I
tried soldering to it the adhesive melted and it started moving around 😭 The
video showed a very similar approach but they covered the copper tape with
&lt;a href=&#34;https://en.wikipedia.org/wiki/Solder_mask&#34;&gt;solder mask&lt;/a&gt; and, once cured, ground it back with a grinding pen to reveal
&lt;em&gt;some&lt;/em&gt; of the copper. The solder mask helps to keep the copper tape in-place.
I&amp;rsquo;m learning (Ralf Wiggum gif).&lt;/p&gt;
&lt;p&gt;I could then solder a new capacitor into place, and it sprung back to life ✅&lt;/p&gt;
&lt;p&gt;I re-shelled it and installed an IPS screen, and closed it all up. Done.&lt;/p&gt;
&lt;p&gt;Then I realised I had forgotten to hook up the touch sensor for the screen
before closing it up. I would need to open it back up and stick it on.&lt;/p&gt;
&lt;p&gt;All the screws but one came out, but the final one wouldn&amp;rsquo;t budge, and I
stripped it fairly quickly. I Googled for solutions and tried suggestions of
using a rubber band, latex glove, and super glue to increase purchase on it.
Eventually I managed to remove it using a shitty free screwdriver that came
free with something or other. Thanks shitty old screwdriver. I don&amp;rsquo;t think the
free screws you get with kits can be trusted.&lt;/p&gt;
&lt;p&gt;And here is the finished product.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/gbp-white.jpeg&#34; alt=&#34;Refurbished Game Boy Pocket in white&#34;&gt;&lt;/p&gt;
&lt;p&gt;The screen on this one is 100% perfecto.&lt;/p&gt;
&lt;h4 id=&#34;gba-motherboard-replacement&#34;&gt;GBA motherboard replacement&lt;/h4&gt;
&lt;p&gt;Full of optimism I moved onto a project that&amp;rsquo;s been sitting on the back burner
for a while &amp;ndash; a complete &lt;a href=&#34;https://funnyplaying.com/products/gba-custom-upgraded-motherboard-replacement&#34;&gt;3rd party replacement motherboard&lt;/a&gt;. This board is
more or less completely new hardware, with almost everything upgraded from the
original console. You just need to supply original CPU and RAM chips.&lt;/p&gt;
&lt;p&gt;I needed to de-solder the CPU and RAM from a non-working GBA, and transplant
them onto the new board. This was an opportunity to use the new &amp;ldquo;low-melt&amp;rdquo;
solder I recently purchased (which I talk about more in &lt;em&gt;fascinating&lt;/em&gt; detail
below).&lt;/p&gt;
&lt;p&gt;I felt ready to attempt this. Well, it went a bit wrong and I was left with
console which booted but only showed vertical lines on the screen 😬 I
verified that the screen worked with another console to rule it out.&lt;/p&gt;
&lt;p&gt;✅ The good parts&lt;/p&gt;
&lt;p&gt;I used hot air and my new found love of &amp;ldquo;low-melt&amp;rdquo; solder to very easily
remove the CPU and RAM from the donor board. I was not expecting this part to
be easy as I have tried similar before and it was frustratingly tricky.&lt;/p&gt;
&lt;p&gt;Soldering the RAM to the new board was seemingly straightforward too and I was
pleased with the job I did on this.&lt;/p&gt;
&lt;p&gt;❌ The less good parts&lt;/p&gt;
&lt;p&gt;The legs on the CPU are very delicate and easily bent. This makes lining them
up on the board to re-solder fairly intricate. And this is where it went
wrong. On three sides it went well, but on the fourth lining up and soldering
the legs became a bit of a mess and I ended up lifting one of the pads onto
which I needed to solder a leg (you may have noticed a pattern here). This
necessitated more trace repair, which I completed but wasn&amp;rsquo;t happy about given
that this was a brand new board.&lt;/p&gt;
&lt;p&gt;At the moment I am unsure what is wrong with it. One of the main issues is
that I don&amp;rsquo;t actually &lt;em&gt;know&lt;/em&gt; that the CPU and RAM chips work as I&amp;rsquo;ve never
seen them working &amp;ndash; they came from a non-working console.&lt;/p&gt;
&lt;p&gt;For now this project is on hiatus. I will revisit.&lt;/p&gt;
&lt;h4 id=&#34;in-conclusion&#34;&gt;In conclusion&lt;/h4&gt;
&lt;p&gt;A pretty successful week on the whole. Can&amp;rsquo;t complain too much.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Gaurav-Gosain/tuios&#34;&gt;TUIOS - Terminal UI Operating System&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TUIOS is a terminal-based window manager that provides a modern, efficient
interface for managing multiple terminal sessions&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been meaning to buy some “low-melt&amp;quot; solder for a while. It has it&amp;rsquo;s
critics, but I am a complete convert for the task which it is intended for.&lt;/p&gt;
&lt;p&gt;The idea behind &amp;ldquo;low-melt&amp;rdquo; solder is that it melts easily. You apply it to
existing, usually unleaded, solder in order to alter the chemistry and bring
down the overall melting point of the existing solder joint. Once you&amp;rsquo;ve done
that you can heat the whole thing far more easily, at lower temperatures,
which allows safe removal of components. Especially useful for those with
multiple points of connection to the board.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;low melt&amp;rdquo; is not intended for making new solder joints, only removal. After
you&amp;rsquo;ve used it to remove components you should completely clear it up, and use
regular solder of your choice for making new joints.&lt;/p&gt;
&lt;p&gt;I used &amp;ldquo;low melt&amp;rdquo; to remove the CPU and RAM chips from a GBA using hot air and
it made the process way easier than I was anticipating. First I applied flux
to the existing chips legs, then low melt &amp;ndash; it&amp;rsquo;s quite finicky and difficult
to apply &amp;ndash; and then came back with hot air to re-melt and remove.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With Game Boy action comes complaining about delivery services. How can I get
something delivered, for free (I know it&amp;rsquo;s built-in, but humour me), from
China quicker than something from eBay in the UK?&lt;/p&gt;
&lt;p&gt;Evri, that&amp;rsquo;s how 🤡&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://basicappleguy.com/basicappleblog/the-airpods-pro-3-flight-problem&#34;&gt;The AirPods Pro 3 Flight Problem&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Testing Apple’s latest noise-cancelling earbuds at 39,000 feet reveals a
potential flaw most users won&amp;rsquo;t notice, until they fly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I hope this issue is not universal. It might be prudent to take my AirPod Pro
2s on my next flight.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 226: Am I a real boy?</title>
      <link>https://elver.me/weeknotes/226-am-i-a-real-boy/</link>
      <pubDate>Sun, 26 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/226-am-i-a-real-boy/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We went to see &lt;a href=&#34;https://www.setlist.fm/setlist/the-divine-comedy/2025/york-barbican-york-england-7b59dac4.html&#34;&gt;The Divine Comedy&lt;/a&gt; as planned. They were fantastic and played
&lt;em&gt;most&lt;/em&gt; of the hits I wanted to hear 👏&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our &lt;a href=&#34;/weeknotes/225-vat-of-bolognaise/#:~:text=then%20have%20friends%20visiting%20at%20the%20weekend&#34;&gt;friends visited as planned&lt;/a&gt; and we took the opportunity to take them to
Whitby for the day. We hadn&amp;rsquo;t been there before either. It was &lt;em&gt;very&lt;/em&gt; windy
and &lt;em&gt;very&lt;/em&gt; cold, which did somewhat dampen our experience. Still, it was nice
enough and we had fish and chips which is the law when you visit Whitby.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.yellowduck.be/posts/comparing-gps-coordinates-in-elixir&#34;&gt;Comparing GPS coordinates in Elixir&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When working with GPS data, comparing two coordinates directly is
unreliable. Due to natural precision loss and device variations, even two
readings from the same spot can differ slightly in latitude and longitude.
Instead of checking for equality, you should compare their distance — for
example, ensuring they’re within a few meters of each other.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/barodeur/llm_rescuer&#34;&gt;llm_rescuer&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In 1965, Tony Hoare invented the null reference and later called it his
&amp;ldquo;billion-dollar mistake&amp;rdquo;. Well, we&amp;rsquo;re here to fix it by potentially spending
a billion dollars in OpenAI API tokens! 💸&lt;/p&gt;
&lt;p&gt;Because clearly, the best way to solve a problem caused by the absence of a
value is to throw artificial intelligence at it until it hallucinates a
reasonable response. What could possibly go wrong?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://overtype.dev/&#34;&gt;OverType&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OverType is a transparent textarea over rendered markdown. Plain text
simplicity, WYSIWYG beauty, zero complexity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A way in which I used AI this week.&lt;/p&gt;
&lt;p&gt;I was shopping &lt;em&gt;on-liiine&lt;/em&gt; and there were many variations of the same product.
Some were larger, some smaller. Some came with an extra battery. Etc etc. The
thing is each variation was on a separate web page, and I was dealing with
some of the most inconsistent &amp;ldquo;web design&amp;rdquo; possible. Very bad websites. The
sort of website where you would ordinarily just go somewhere else to buy it.
Unfortunately these products are only sold in a few places and this was the
least worst option.&lt;/p&gt;
&lt;p&gt;I could not make head nor tail of what I was looking at.&lt;/p&gt;
&lt;p&gt;So, I asked Claude.&lt;/p&gt;
&lt;p&gt;I gave it the URLs to compare and it downloaded them and summarised the
differences. It wasn&amp;rsquo;t perfect by any means but it dragged me out of the
analysis paralysis I was stuck in, and my credit card is thankful for the
opportunity to spend once more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the last week I have been working on my note-taking approach for Neovim
some more and even had moments of enjoyment writing Lua. I may not be
completely lost.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.gyford.com/phil/writing/2025/10/15/1995-internet/&#34;&gt;My first months in cyberspace&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It was a miracle and it changed my life. All of our lives. Not always for
the better: even those of us who were, at times, slightly cynical early on
were naive about how ruthlessly and literally carelessly businesses would
turn the technologies to their own narrow ends.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oh, the nostalgia! I missed out on quite a lot of this &amp;ndash; I never Gophered, or
used Finger, and only became aware of Usenet in terms of warez much later, but
the World Wide Web hit me in a similar fashion in circa 1997/98.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ruby-lang.org/en/news/2025/10/17/rubygems-repository-transition/&#34;&gt;The Transition of RubyGems Repository Ownership&lt;/a&gt; &amp;ndash; Definitely seems like the
right home for Rubygems, despite the obvious damage control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I tried out &lt;a href=&#34;/weeknotes/224-one-for-my-therapist/#:~:text=the%20next%20level%20%E2%80%93-,bottled%20inks,-.%20Why%20am%20I&#34;&gt;the bottled ink for my fountain pen&lt;/a&gt; this week. I was expecting
to make a right ol&amp;rsquo; mess during the filling process, but it was surprisingly
disaster-free. I filled the &lt;a href=&#34;https://www.lamy.com/en-gb/p/lamy-z-28-converter&#34;&gt;Z28 Converter&lt;/a&gt; for &lt;a href=&#34;https://www.lamy.com/en-gb/p/lamy-safari-fountain-pen/54912095256920&#34;&gt;Lamy Safari&lt;/a&gt; with &lt;a href=&#34;https://www.diamineinks.co.uk/products/diamine-80ml-fountain-pen-ink-imperial-purple&#34;&gt;Imperial
Purple from Diamine&lt;/a&gt; &amp;ndash; lovely colour.&lt;/p&gt;
&lt;p&gt;The ink seems to flow very well, perhaps &lt;em&gt;too&lt;/em&gt; well. I might have to change
back to a finer nib to see what the difference is.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not sure what the correct term is, but I&amp;rsquo;m still finding that occasionally
I miss parts of the stroke when writing certain letters. I had considered that
maybe this was an ink flow problem, but it could also be the pen, or, heaven
forbid, me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://allaboutcoding.ghinda.com/how-to-use-pattern-matching-to-locate-elements-in-a-hash-array&#34;&gt;How to Use Pattern Matching to Locate Elements in a Hash Array&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I still can&amp;rsquo;t get used to the pattern matching syntax in Ruby.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://island94.org/2025/10/rails-103-early-hints-could-be-better-maybe-doesn-t-matter&#34;&gt;Rails 103 Early Hints could be better, maybe doesn&amp;rsquo;t matter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d never heard of the 103 HTTP status code.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I can&amp;rsquo;t actually get 103 Early Hints to be returned all the way to me in any
of my production environments. Likely because there is a network device,
reverse proxy, load balancer, CDN, or something that’s blocking them.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Never mind 😆 Doesn&amp;rsquo;t matter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://pawelgrzybek.com/the-css-reset-again/&#34;&gt;The CSS Reset, again&lt;/a&gt; &amp;ndash; I learnt a lot of CSS properties from this article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://sindresorhus.com/menu-drop&#34;&gt;Menu Drop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Another cool little Menu Bar app. I&amp;rsquo;m not sure I AirDrop &lt;em&gt;from&lt;/em&gt; my Mac enough
to warrant taking up menu bar space, but it might be worth it to you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://intertwingly.net/blog/2025/10/12/Capacity-Planning.html&#34;&gt;Capacity Planning for Multi-Tenant SQLite Applications&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What do you do when you need to paste some text somewhere before pasting
somewhere else? You can open an Apple Note note, or TextEdit document, or
something else?&lt;/p&gt;
&lt;p&gt;I was thinking about using &lt;a href=&#34;https://tot.rocks/&#34;&gt;Tot&lt;/a&gt; for this as I find myself doing this more
often than I thought (perhaps because of LLM usage?), but then I remembered
that I am already entrenched in the Raycast ecosystem, and they have a &lt;a href=&#34;https://www.raycast.com/core-features/notes&#34;&gt;Notes
facility&lt;/a&gt; built in.&lt;/p&gt;
&lt;p&gt;My needs as limited at the moment so I will try it out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/JJXEmkTtuUU?si=iCzEBif_-Uu6fdPA&#34;&gt;How the UK is fixing its parking app nightmare&lt;/a&gt; &amp;ndash; is this&amp;hellip;&lt;a href=&#34;https://en.wikipedia.org/wiki/National_Parking_Platform&#34;&gt;progress&lt;/a&gt;?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://steveklabnik.com/writing/i-see-a-future-in-jj/&#34;&gt;I see a future in jj&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;jj is being used in projects as small as individual developers and as large
as one of the largest monorepos in the world. That’s a big deal. It can show
the social proof needed for others to give jj a chance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve been aware of &lt;a href=&#34;https://jj-vcs.github.io/jj/latest/&#34;&gt;Jujutsu&lt;/a&gt; for a while, but always thought it would be too
difficult to adopt even if it was considerably better than &lt;code&gt;git&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;(Software doesn&amp;rsquo;t just &amp;ldquo;win&amp;rdquo; by being better. A &lt;em&gt;lot&lt;/em&gt; of people thought
&lt;a href=&#34;https://www.mercurial-scm.org/&#34;&gt;Mercurial&lt;/a&gt; was nicer to use (still do!), but it did not win.)&lt;/p&gt;
&lt;p&gt;I really like &lt;code&gt;git&lt;/code&gt;. When you&amp;rsquo;ve used &lt;a href=&#34;https://en.wikipedia.org/wiki/Microsoft_Visual_SourceSafe&#34;&gt;Visual SourceSafe&lt;/a&gt; you &lt;em&gt;will&lt;/em&gt; like
&lt;code&gt;git&lt;/code&gt; &amp;ndash; trust me. It&amp;rsquo;s one of those programs that really changed my developer
life. And despite it&amp;rsquo;s clearly poor cli UI.&lt;/p&gt;
&lt;p&gt;The fact that &lt;code&gt;jj&lt;/code&gt; can use git as the &amp;ldquo;backend&amp;rdquo; really does change things.
Without that, I would not be even thinking about trying it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I went to see &lt;a href=&#34;https://www.themoviedb.org/movie/533533-tron-ares&#34;&gt;Tron: Ares&lt;/a&gt; this week on a whim (don&amp;rsquo;t bother, probably). I
always get a kick out of seeing real-life commands in films regardless of
their use. This time I spotted &lt;code&gt;sudo systemctl&lt;/code&gt; and &lt;code&gt;sudo killall&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.johnhawthorn.com/2025/searching-ruby-docs/&#34;&gt;Searching Ruby&amp;rsquo;s documentation&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This documentation (and any documentation built with rdoc 6.15.0 or greater)
now can be searched using a query parameter. Check it out!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am very pleased to see these documentation improvements.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I appreciate that Kagi&amp;rsquo;s &amp;ldquo;bangs&amp;rdquo; are open source and accept contributions&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is also neat, I didn&amp;rsquo;t know &lt;a href=&#34;https://github.com/kagisearch/bangs/tree/main&#34;&gt;these are open&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This has happened quickly! Not &lt;a href=&#34;https://nataliethenerd.com/products/brick-boy-in-stock-notification&#34;&gt;one&lt;/a&gt;, but &lt;a href=&#34;https://www.kickstarter.com/projects/brickboy/brickboy-the-kit-that-makes-the-lego-game-boy-come-alive&#34;&gt;two&lt;/a&gt; options to turn the &lt;a href=&#34;https://www.lego.com/en-gb/product/game-boy-72046&#34;&gt;Lego Game
Boy&lt;/a&gt; into a real Boy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 225: Vat of Bolognaise</title>
      <link>https://elver.me/weeknotes/225-vat-of-bolognaise/</link>
      <pubDate>Sun, 19 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/225-vat-of-bolognaise/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/224-one-for-my-therapist/#:~:text=My%20car%20goes%20into%20the%20garage%20next%20week&#34;&gt;The car&lt;/a&gt; seems to have developed &amp;ldquo;a noise&amp;rdquo; since going to garage. Good times.
Never try.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/building-large-technical-projects&#34;&gt;My Approach to Building Large Technical Projects&lt;/a&gt; &amp;ndash; Writing a terminal
emulator from scratch has got to be up there in terms of both large and
complex. Impressive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Such is the progress of the LLM landscape, that as soon as I&amp;rsquo;d finished
reading &lt;a href=&#34;https://blog.fsck.com/2025/10/05/how-im-using-coding-agents-in-september-2025/&#34;&gt;How I&amp;rsquo;m using coding agents in September, 2025&lt;/a&gt; I moved straight onto
&lt;a href=&#34;https://blog.fsck.com/2025/10/09/superpowers/&#34;&gt;Superpowers: How I&amp;rsquo;m using coding agents in October 2025&lt;/a&gt; and it had
progressed even more.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I find that AI models are especially prone to handing me walls of text when
they think they&amp;rsquo;re &amp;ldquo;done&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Me too. I really need to work on prompting Claude to behave as I want. I find
the walls of text pretty overwhelming a lot of the time.&lt;/p&gt;
&lt;p&gt;Some interesting tips in these two articles. I feel that I am at the &amp;ldquo;ask
questions and hope&amp;rdquo; stage of using LLMs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://simonwillison.net/2025/Oct/16/claude-skills/&#34;&gt;Claude Skills are awesome, maybe a bigger deal than MCP&lt;/a&gt; 😩&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some Christmas activity this week. Trips planned. Lists made.&lt;/p&gt;
&lt;p&gt;I am part of the problem.&lt;/p&gt;
&lt;p&gt;Here follows some old codger statements: 1) Blimey, Christmas stuff in the
shops already, it should be banned! 2) Seems like we only just had Christmas,
doesn&amp;rsquo;t it come around quickly?!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;Codger&amp;rdquo; &amp;ndash; great word. Pleased with that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ewaldbenes.com/en/blog/reveal-software-complexity&#34;&gt;Understanding why people underestimate software complexity&lt;/a&gt; &amp;ndash; Some good
examples of complexity in software.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hexos.com/blog/introducing-zfs-anyraid-sponsored-by-eshtek&#34;&gt;Introducing ZFS AnyRaid&lt;/a&gt; &amp;ndash; this sounds awesome if it comes to fruition. File
system advancements don&amp;rsquo;t feel like the sort of thing you &lt;em&gt;can&lt;/em&gt; rush, nor
should you. The TLDR is that you will be able to mix and match different sized
disks when this is implemented.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.uk/dp/B07ZH5V89T&#34;&gt;DSLRKIT DC 5V 2.4A Active PoE Splitter Power Over Ethernet 802.3af 5.5x2.1mm&lt;/a&gt;
&amp;ndash; I saw this mentioned on Reddit and I can see myself using one of these
soon-ish. It allows you to make devices that require a 5V DC plug PoE-capable.
The use-case for me being a &lt;a href=&#34;https://www.philips-hue.com/en-gb/p/hue-bridge/8719514342583&#34;&gt;Philips Hue Bridge&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In order to try and stay on the straight and narrow weight-wise, and to make
dinner times easier during Winter, I made an unholy amount of Bolognaise on
Saturday. So much Bolognaise in fact that we had issues fitting it in the
freezer 🥶 &amp;ndash; bye, bye, sausages from 2023 👋&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/bolognaise.jpg&#34; alt=&#34;A massive vat of Bolognaise sauce&#34;&gt;&lt;/p&gt;
&lt;p&gt;This is me adding a &lt;em&gt;little bit&lt;/em&gt; of cheese. Just a smidge.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/CrankBoyHQ/crankboy-app&#34;&gt;CrankBoy&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A full-speed Game Boy emulator for Playdate&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What some people come up with. Superb.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An unusually full weekend, sometimes it goes like that. On Friday night we
travelled over to Hull to see &lt;a href=&#34;https://en.wikipedia.org/wiki/Nick_Helm&#34;&gt;Nick Helm&lt;/a&gt;; always worth it. Then on Saturday,
over to Sheffield to see a concert of the music of the Lord of the Rings, Game
of Thrones etc. We were sandwiched in between two groups of cretins in
Sheffield, such is life.&lt;/p&gt;
&lt;p&gt;Next week we are seeing &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Divine_Comedy_(band)&#34;&gt;The Divine Comedy&lt;/a&gt;, and then have friends visiting at
the weekend. Busy!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 224: One for my therapist</title>
      <link>https://elver.me/weeknotes/224-one-for-my-therapist/</link>
      <pubDate>Sun, 12 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/224-one-for-my-therapist/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This is probably one for my therapist, but I genuinely screamed at my printer
this week. A proper, guttural, scream. You&amp;rsquo;ve guessed it, it would not print.&lt;/p&gt;
&lt;p&gt;It wouldn&amp;rsquo;t print because it was not connected to the network. I couldn&amp;rsquo;t work
out why until the next day when I noticed that my Kindle was also offline. The
printer and Kindle would not connect to the network but all the other devices
in the house seemed to be fine &amp;ndash; strange. Then I realised that those two
devices only work on 2.4GHz WiFi, whilst the everything else can work on both
2.4GHz &lt;em&gt;and&lt;/em&gt; 5GHz.&lt;/p&gt;
&lt;p&gt;2.4GHz WiFi was not working for some reason. A reboot of the router fixed the
issue. Computers, man.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/non-trivial-vibing#user-content-fn-7&#34;&gt;Vibing a Non-Trivial Ghostty Feature&lt;/a&gt; by Mitchell Hashimoto.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;m regularly asked to share non-trivial examples of how I use AI and
agentic coding tools and this felt like a golden opportunity to walk through
my process with a well-scoped, non-trivial, real-world, shipping feature&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.themoviedb.org/movie/1317149-i-swear&#34;&gt;I Swear&lt;/a&gt; is worth seeing. I really enjoyed it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s hard to believe but there was even more Ruby drama this week to the point
where I have now lost track. However, I do think Robby Russell is probably
correct when &lt;a href=&#34;https://robbyonrails.com/articles/2025/10/09/organizations-like-code-deserve-refactoring/#:~:text=No%20one%E2%80%99s%20operating%20with%20the%20full%20picture.%20Not%20the%20board.%20Not%20the%20staff.%20Not%20the%20donors.%20Not%20the%20community.%20Everyone%E2%80%99s%20got%20fragments%20and%20they%E2%80%99re%20trying%20to%20construct%20meaning%20from%20partial%20data.&#34;&gt;he says that no one has the full story&lt;/a&gt;. There is some very
strange behaviour on all sides it seems to me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not content with using my off-the-shelf cartridge inks with my fountain pen,
I&amp;rsquo;m now taking the hobby to the next level &amp;ndash; bottled inks. Why am I doing
this? Mainly boredom and the excitement of packages arriving. But also a
greater range of colours and inks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After taking a break from the Game Boy scene, I am making a comeback in time
for Christmas (I am sorry 🤮). Prepare for further disappointment, I know I
am. Money has been spent, orders have been made.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I filled up a whole notebook &lt;a href=&#34;/weeknotes/219-differentiators/#:~:text=Mine%20has%20turned%20into%20a%20traditional%20journal%20already&#34;&gt;with my new journalling habit&lt;/a&gt; this week &amp;ndash; 123
pages of hand-written words. I wouldn&amp;rsquo;t say this is a concrete habit, but I
have managed it without a break for over a month. Why is that? Why has this
stuck relatively easily whilst other habits fall to the wayside?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/223-now-there-are-graphs/#:~:text=Edinburgh%2Dbound%20next%20week&#34;&gt;trip to Edinburgh&lt;/a&gt; happened and I&amp;rsquo;m glad I made the effort. It was nice
to catch up with a few friendly faces, and spending a bit of time walking
around Edinburgh is always worth it. The main attraction, the Scottish Ruby
meetup, had two interesting talks on LLMs, and I did learn quite a lot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My phone has been doing this weird thing recently. When charging, but not
particularly low on battery, it will become somewhat unresponsive and begin to
stutter and lag. The actual UI lags and doesn&amp;rsquo;t seem to receive input.
Unplugging the charging cable seems to fix things.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think I&amp;rsquo;ve ever had an iPhone do this in all the years I&amp;rsquo;ve been using
them, so it&amp;rsquo;s very strange. I suppose I&amp;rsquo;ll keep an eye on it and make sure I&amp;rsquo;m
backed up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My car goes into the garage next week. Wish me luck.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 223: Now there are graphs</title>
      <link>https://elver.me/weeknotes/223-now-there-are-graphs/</link>
      <pubDate>Sun, 05 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/223-now-there-are-graphs/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I had to &lt;a href=&#34;/weeknotes/104-reboot-my-remote/#:~:text=I%20had%20to%20reboot%20it%20to%20fix%20the%20issue&#34;&gt;reboot my Apple TV remote again&lt;/a&gt;, same issue as last time, the
volume buttons stopped working. It had a good 832 days to be fair.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.jetbrains.com/datagrip/2025/10/01/datagrip-is-now-free-for-non-commercial-use/&#34;&gt;DataGrip Is Now Free for Non-Commercial Use&lt;/a&gt; &amp;ndash; I remember liking DataGrip
when I used a trial a few years ago. Might be worth a look.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/danmayer/coverband&#34;&gt;Coverband&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A gem to measure production code usage, showing a counter for the number of
times each line of code is executed. Coverband allows easy configuration to
collect and report on production code usage. It reports in the background
via a thread, can be used as Rack middleware, or can be manually configured
to meet any need.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I always forget this tool exists, so noting it here to remember.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.gingerbill.org/article/2025/09/08/package-managers-are-evil/#fn:5&#34;&gt;Package Managers are Evil&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I found this article via &lt;a href=&#34;https://www.youtube.com/watch?v=Rv9q6kW1vOg&#34;&gt;the Primeagen video on the most recent npm supply
chain attack&lt;/a&gt;. It&amp;rsquo;s a very interesting take on package managers that is at
odds with my own views and I expect the views of most people I know. It has
been thought provoking.&lt;/p&gt;
&lt;p&gt;When I first started getting interested in Elixir I noticed that there was
much more of &amp;ldquo;write it yourself&amp;rdquo; attitude to dependencies. Instead of
authentication libraries, they supplied a generator that you could maintain
yourself (this is different to scaffolding). Coming from Ruby, that was
surprising.&lt;/p&gt;
&lt;p&gt;Maybe we&amp;rsquo;ve gotten this wrong for a long time.&lt;/p&gt;
&lt;p&gt;(Do you remember when we used to routinely package things such as CSS
frameworks into gems? &amp;ndash; madness.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.clever-cloud.com/blog/engineering/2015/05/20/why-auto-increment-is-a-terrible-idea/&#34;&gt;Why Auto Increment Is A Terrible Idea&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Use UUIDs as primary keys. They can be freely exposed without disclosing
sensitive information, they are not predictable and they are performant.&lt;/p&gt;
&lt;p&gt;Also, UUIDs being random, you lose locality, and your index ends up
scattered. This causes a definite performance hit when confronted to high
insert rates. Also, this creates extra disk use.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, &lt;a href=&#34;https://www.thenile.dev/blog/uuidv7&#34;&gt;UUIDv7 Comes to PostgreSQL 18&lt;/a&gt; &amp;ndash; version 7 UUIDs seem
like a big improvement for performance as they are now more sortable to help
index performance.&lt;/p&gt;
&lt;p&gt;However, if I&amp;rsquo;m reading this correctly you now lose one of the previous
benefits as UUIDv7 will expose when the UUID was created as it now contains a
timestamp component. May or may not be a problem for you?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wanted to try out the Postgres 18 UUIDv7 support. I got build failures at
first until I did this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fish&#34; data-lang=&#34;fish&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;$ &lt;/span&gt;brew info icu4c
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;$ &lt;/span&gt;env &lt;span style=&#34;color:#008080&#34;&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;$(&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;brew --prefix)/opt/icu4c/lib/pkgconfig&amp;#34;&lt;/span&gt; asdf install postgres &lt;span style=&#34;color:#099&#34;&gt;18&lt;/span&gt;.&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you&amp;rsquo;ve used Rails you will no doubt have had issues with inconsistent
database state when switching branches.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/widefix/actual_db_schema&#34;&gt;actual_db_schema&lt;/a&gt; sounds like it can help.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wipe out inconsistent DB and schema.rb when switching branches. To do that,
install this gem and use the standard rake db:migrate command.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.404media.co/how-ruby-went-off-the-rails/&#34;&gt;How Ruby Went Off the Rails&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I set up a &lt;a href=&#34;https://www.raycast.com/pindab0ter/hue&#34;&gt;Raycast extension&lt;/a&gt; to control my monitor backlight (&lt;a href=&#34;https://www.philips-hue.com/en-gb/p/lightstrips-play-gradient-lightstrip-for-pc/8719514434639&#34;&gt;Hue Play
Gradient Lightstrip for PC&lt;/a&gt;). It&amp;rsquo;s not &lt;em&gt;exactly&lt;/em&gt; what I&amp;rsquo;d like as it still
requires too many steps, but it&amp;rsquo;s a start.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://articles.pragdave.me/p/the-kindness-of-strangers&#34;&gt;The Kindness of Strangers&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sometimes the thing your are adding is so trivial, you might as well just
implement it yourself. The left_pad fiasco of 2016 is a great example. It
was literally a dozen or so lines of code that left-padded a string, and yet
thousands of projects decided to add it as a dependency rather than write it
themselves.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The reasons are many.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I am in no way &amp;ldquo;good&amp;rdquo; at Lua, but the main issue I&amp;rsquo;ve always faced with it was
not the language but the context of hacking on it in Neovim. Lua modules are
cached when run so changes would not be reflected as I edited source files.
The only way it seemed to work was to restart &lt;code&gt;nvim&lt;/code&gt; each time I made a change
which I&amp;rsquo;m sure you can appreciate really slows down progress.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve looked into this &amp;ldquo;problem&amp;rdquo; before but could never settle on an answer. My
old mate Claude stepped in and suggested several options, and I went with this
&lt;a href=&#34;https://github.com/nvim-lua/plenary.nvim&#34;&gt;plenary&lt;/a&gt;-based (originally written by &lt;a href=&#34;https://github.com/tjdevries&#34;&gt;TJ DeVries&lt;/a&gt;) solution.&lt;/p&gt;
&lt;p&gt;I added a temporary keybinding like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&amp;lt;F5&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  require(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;plenary.reload&amp;#39;&lt;/span&gt;).reload_module(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;notes&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  require(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;notes&amp;#34;&lt;/span&gt;).notes()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;, { desc &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Reload and test&amp;#34;&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now I can hit &lt;code&gt;F5&lt;/code&gt; and the modules are reloaded and the code run.&lt;/p&gt;
&lt;p&gt;My module setup looks like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-terminal&#34; data-lang=&#34;terminal&#34;&gt;  .
  ├── lua
  │   └── notes
  │       ├── init.lua
  │       └── picker.lua
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And all modules under &lt;code&gt;notes/&lt;/code&gt; seem to be properly reloaded, which is exactly
what I wanted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you have some Lua table you want to inspect, you can do this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.notify(vim.inspect(picker))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But if your table is big it will be unwieldy and difficult to read. Instead
you can write the result to a register&amp;hellip;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.fn.setreg(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;+&amp;#34;&lt;/span&gt;, vim.inspect(picker))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip;and it becomes available on your clipboard for pasting somewhere else.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gradient.style/&#34;&gt;HDR gradients&lt;/a&gt; &amp;ndash; a tool to create CSS HDR gradients.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I noticed somewhere that &lt;a href=&#34;https://blog.phusion.nl/2025/09/26/passenger-6-1-0/&#34;&gt;Passenger 6.1.0 was released recently&lt;/a&gt; and I
realised I had completely lost track of Passenger. I&amp;rsquo;ve not used it in years
but I remember the early days where it saved us from having to restart our app
servers every hour 😆 Apparently it now supports a variety of languages, not
just Ruby.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.thingiverse.com/thing:6955798/&#34;&gt;Hidden Touch ID for Apple Magic Trackpad&lt;/a&gt; &amp;ndash; very nice idea. I love Touch ID,
but I don&amp;rsquo;t love having to reach for my laptop when I&amp;rsquo;m at home and it&amp;rsquo;s
elevated up on an arm. I&amp;rsquo;ve heard people mentioning the &amp;ldquo;tape a Magic
Keyboard&amp;rdquo; under the desk trick, but I&amp;rsquo;m not sure I can cope with that!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/106-why-we-all-need-subtitles-now/#:~:text=there%20will%20be%20self%2Dcongratulatory%20graphs&#34;&gt;Now there are graphs&lt;/a&gt;.&lt;/p&gt;
&lt;svg width=&#34;300&#34; height=&#34;200&#34; viewBox=&#34;0 0 300 200&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;
  &lt;path d=&#34;M4.00,4.00 L33.20,9.03 L62.40,44.23 L91.60,74.40 L120.80,109.60 L150.00,124.69 L179.20,139.77 L208.40,154.86 L237.60,159.89 L266.80,169.94 L296.00,180.00 L296.00,180.00 L4.00,180.00 Z&#34; fill=&#34;#667eea40&#34;/&gt;
  &lt;path d=&#34;M4.00,4.00 L33.20,9.03 L62.40,44.23 L91.60,74.40 L120.80,109.60 L150.00,124.69 L179.20,139.77 L208.40,154.86 L237.60,159.89 L266.80,169.94 L296.00,180.00&#34; fill=&#34;none&#34; stroke=&#34;#667eea&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34; stroke-linejoin=&#34;round&#34;/&gt;
  &lt;text x=&#34;4&#34; y=&#34;196&#34; font-family=&#34;Arial, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;#666&#34; text-anchor=&#34;start&#34;&gt;Nov 24&lt;/text&gt;
  &lt;text x=&#34;296&#34; y=&#34;196&#34; font-family=&#34;Arial, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;#666&#34; text-anchor=&#34;end&#34;&gt;Sep 25&lt;/text&gt;
&lt;/svg&gt;
&lt;p&gt;Better late, than never.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Incidentally, I asked Claude for suggestions on where I could generate a
&lt;a href=&#34;https://en.wikipedia.org/wiki/Sparkline&#34;&gt;sparkline&lt;/a&gt; graph and export it as an SVG to include here. Instead of
suggesting links it just built one for me then and there that I could
interactively enter my values into! 😮&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On Sunday we headed up to &lt;a href=&#34;/weeknotes/221-firm-grip/#:~:text=I%20managed%20to%20snag%20some%20not%20so%20great%20tickets%20to%20see%20them%20in%20Newcastle%20in%20a%20couple%20of%20weeks&#34;&gt;Newcastle to see the Beans&lt;/a&gt;. It was great fun, and
the seats were absolutely fine considering the theatre seat map made them look
a lot further away than they were.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edinburgh-bound next week. Since I live closer now, it is somewhat more
accessible than it once was, so I decided I could handle the train journey to
attend the Scottish Ruby meetup.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 222: Humble tumble</title>
      <link>https://elver.me/weeknotes/222-humble-tumble/</link>
      <pubDate>Sun, 28 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/222-humble-tumble/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hardcover.app/pages/book-data&#34;&gt;&amp;ldquo;Where Does Book Data Come from?&amp;rdquo;&lt;/a&gt; &amp;ndash; I expected that this question would be
fairly involved, and it is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My Virgin Media broadband contract came up for renewal 🙀 I&amp;rsquo;ve been
anticipating this moment since we signed our first contract. Unfortunately, we
had little choice. They are the only viable choice choice on our street.
Openreach and City Fibre are constantly &amp;ldquo;planning&amp;rdquo; but have failed to &amp;ldquo;build&amp;rdquo;
so far.&lt;/p&gt;
&lt;p&gt;Surprisingly, Virgin were not &lt;em&gt;quite&lt;/em&gt; as bad I had anticipated, still the cost
to carry on without entering a new contract would have gone up to £83.84 per
month from £48.37 😢&lt;/p&gt;
&lt;p&gt;The renewal offered for a new contract was ~£47 a month. I managed to get them
to drop it to £42. So it could&amp;rsquo;ve been much worse. We are now contracted for
another 24 MONTHS though, so I expect Openreach and/or City Fibre to suddenly
get their act together starting Monday.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/libghostty-is-coming&#34;&gt;Libghostty Is Coming&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Terminal emulation is a classic problem that appears simple on the surface
but is riddled with unexpected complexities and edge cases.3 As a result,
most of these implementations are incomplete, buggy, and slow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I bet!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://paulbjensen.co.uk/2025/09/17/on-dhhs-as-i-remember-london.html&#34;&gt;On DHH&amp;rsquo;s &amp;ldquo;As I Remember London&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Well I&amp;rsquo;m born in the UK (London of all places), and I&amp;rsquo;m white. Does that
make me a &amp;rsquo;native Brit&#39;?&lt;/p&gt;
&lt;p&gt;Not really. You see, my parents are Danish.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A well thought-out and reasonable analysis.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I don&amp;rsquo;t think an &lt;a href=&#34;https://github.com/Plan-Vert/open-letter&#34;&gt;open letter&lt;/a&gt; will achieve any real change, but I think it is
valid as a form of protest. If you are unhappy with leadership, what else can
you do? Forking something like Rails is not viable without the required
resources. The amount of defacement happening in the repo is pretty pathetic.
I imagine these are the same sort of people who would vehemently defend &amp;ldquo;free
speech&amp;rdquo; as long as you&amp;rsquo;re saying things they like.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apropos of nothing 👀 the &lt;a href=&#34;https://github.com/dessant/repo-lockdown&#34;&gt;repo-lockdown&lt;/a&gt; and &lt;a href=&#34;https://github.com/vloddi/changed-lines-count-labeler&#34;&gt;changed-lines-count-labeler&lt;/a&gt;
GitHub Actions look useful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This whole debacle has also reminded me that it is difficult to agree with
disagreeable people.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let&amp;rsquo;s reset ✨ The former Nintendo of America president and COO, who has just
stepped down, is called Doug Bowser ✨&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More good news. We bought a tumble dryer and it&amp;rsquo;s changing our lives. How did
I make it this far into my life without experiencing the humble tumble?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ievgenpyrogov.com/cleaning-up-code-using-ast-grep/&#34;&gt;Cleaning up code using ast-grep&lt;/a&gt; &amp;ndash; &lt;code&gt;ast-grep&lt;/code&gt; seems cool, but I&amp;rsquo;m not sure
this process is as easy as the author implies. I can see many find and
replaces happening instead 😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/neondatabase-labs/elephantshark&#34;&gt;elephantshark&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Postgres network traffic monitor&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Seems like this would be very useful if you needed it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I can really recommend &lt;a href=&#34;https://www.themoviedb.org/tv/81358-mr-inbetween&#34;&gt;Mr Inbetween&lt;/a&gt; &amp;ndash; it is excellent. On paper there is
nothing particularly interesting about this programme, but the script and
great acting elevate it to something very worthwhile.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.themoviedb.org/tv/157239-alien-earth&#34;&gt;Alien Earth&lt;/a&gt; is also over, and all I can say without spoiling anything is
that I wanted more. And I still want more. And when will Season 2 be released
please.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://andre.arko.net/2025/09/11/rails-on-sqlite-exciting-new-ways-to-cause-outages/&#34;&gt;Rails on SQLite: exciting new ways to cause outages&lt;/a&gt; &amp;ndash; Good balanced take on
running SQLite in production&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://minds.md/zakirullin/cognitive&#34;&gt;Cognitive load is what matters&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I really enjoyed this, but the problem is getting other people to agree on
what is or isn&amp;rsquo;t creating “cognitive load”. I have definitely worked with
people who would not agree that the various examples in this article are
difficult to understand. #empathy&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think we might have a new contender for most useless delivery company: APC.&lt;/p&gt;
&lt;p&gt;Long story short, I asked for them to deliver the parcel to a local shop,
which they eventually did. However, they failed to say &lt;em&gt;where&lt;/em&gt; they had
delivered it to. None of the numerous emails or texts they sent said &lt;em&gt;where&lt;/em&gt;
it had gone.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t you know where you parcel is going Jordan?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reader, when you are receiving the quantity of parcels I do sometimes you
forget where they are going.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://technicaldeft.com/posts/can-coding-agents-build-complex-systems&#34;&gt;&amp;ldquo;Can a coding agent build a database system?&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yes, but not one I trust or would want to maintain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/8fb0c6fc952cc0845a7c24067d93e15ff7f8d58a&#34;&gt;installed&lt;/a&gt; the &lt;a href=&#34;https://herb-tools.dev/overview&#34;&gt;Herb&lt;/a&gt; LSP after talking to &lt;a href=&#34;https://harry.dev/&#34;&gt;Harry&lt;/a&gt; about it. I&amp;rsquo;m not sure
how much this is going to help me, but I&amp;rsquo;m glad someone is working on HTML
tooling. I&amp;rsquo;ll see how I go!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 221: Firm grip</title>
      <link>https://elver.me/weeknotes/221-firm-grip/</link>
      <pubDate>Sun, 21 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/221-firm-grip/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tomstu.art/the-dhh-problem&#34;&gt;The DHH Problem&lt;/a&gt; — Remains as relevant today as when it was first given. More
so in fact. I don&amp;rsquo;t think I was ready to hear this back in 2014. Maybe I
wasn&amp;rsquo;t paying attention. Maybe I didn&amp;rsquo;t fully grasp the situation. I have a
firm grip now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://lore.kernel.org/git/20250904-b4-pks-rust-breaking-change-v1-0-3af1d25e0be9@pks.im/&#34;&gt;Rust is making baby steps into the git codebase&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/219-differentiators/#:~:text=One%20of%20my%20teeth%20broke%20late%20Sunday%20night&#34;&gt;broken tooth&lt;/a&gt; was finally fixed yesterday. I&amp;rsquo;m £240 down, but happy that
it seems to be sorted albeit with some lingering discomfort.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.cloudflare.com/deep-dive-into-cloudflares-sept-12-dashboard-and-api-outage/&#34;&gt;A deep dive into Cloudflare’s September 12, 2025 dashboard and API outage&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The API calls were managed by a React useEffect hook, but we mistakenly
included a problematic object in its dependency array. Because this object
was recreated on every state or prop change, React treated it as “always
new,” causing the useEffect to re-run each time. As a result, the API call
executed many times during a single dashboard render instead of just once.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;React DOS-ing yourself is very funny.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From a job posting I saw this week.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A formal qualification in Ruby-based digital development is advantageous,
but not essential.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Such as?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=EWizRYh7IKA&#34;&gt;The :heading pseudo-class is finally here!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank. God.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.blog/ai-and-ml/github-copilot/meet-the-github-mcp-registry-the-fastest-way-to-discover-mcp-servers/&#34;&gt;Meet the GitHub MCP Registry: The fastest way to discover MCP Servers&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is your new home base for discovering MCP servers. Learn how we’re
working with the broader community on MCP publication and discovery.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This whole &lt;a href=&#34;https://pup-e.com/goodbye-rubygems.pdf&#34;&gt;Ruby&lt;/a&gt; &lt;a href=&#34;https://andre.arko.net/2025/09/19/goodbye-rubygems/&#34;&gt;Central&lt;/a&gt; &lt;a href=&#34;https://rubycentral.org/news/strengthening-the-stewardship-of-rubygems-and-bundler/&#34;&gt;thing&lt;/a&gt; is disappointing. Hopefully we find out
what&amp;rsquo;s going on. One thing we do know, even with the most charitable
interpretation, Ruby Central are terrible at communication, and I don&amp;rsquo;t think
&lt;a href=&#34;https://apiguy.substack.com/p/a-board-members-perspective-of-the?r=43k3q&amp;amp;utm_medium=ios&amp;amp;triedRedirect=true#:~:text=We%20don%27t%20have%20some%20big%20PR%20machine%20or%20communications%20team&#34;&gt;&amp;ldquo;we don&amp;rsquo;t have a PR department&amp;rdquo;&lt;/a&gt; really cuts it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://underjord.io/elixir-is-not-owned-by-big-tech.html&#34;&gt;Elixir is not owned by Big Tech&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://letterclub.org/&#34;&gt;Letter Club&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Private group newsletters where the readers are the writers too.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is an interesting idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.blog/open-source/maintainers/building-personal-apps-with-open-source-and-ai/&#34;&gt;Building personal apps with open source and AI&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If open source is the foundation, AI has become the rocket fuel for personal
software. Building something just for yourself used to mean wrestling with
unfamiliar frameworks or spending hours debugging arcane errors. Now? AI can
help you scaffold a project, troubleshoot issues, or even just explain a
tricky codebase.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I managed to hold off buying a new phone, but I did splurge on some new
AirPods Pro 3. They arrived Saturday and so far I think they were worth the
upgrade. I&amp;rsquo;m still getting used to the fit, but I think it&amp;rsquo;s better. Some
people apparently don&amp;rsquo;t like the sound, but me for it&amp;rsquo;s an improvement so far.
And the most important feature, Active Noise Cancellation, is improved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A friend of mine was telling me about how he recently saw &lt;a href=&#34;https://en.wikipedia.org/wiki/Three_Bean_Salad_%28podcast%29&#34;&gt;Three Bean Salad&lt;/a&gt;
(the finest podcast available on the Internet) live in Bristol and envy got
the best of me. I managed to snag some not so great tickets to see them in
Newcastle in a couple of weeks. I haven&amp;rsquo;t been to Newcastle in years, and only
ever once before, so we’re going to make a weekend of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dansinker.com/posts/2025-05-23-who-cares/&#34;&gt;The Who Cares Era&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;I don&amp;rsquo;t need to rehash it all. But the thing that is most disheartening
to me is how at every step along the way, nobody cared.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://elixirdrops.net/d/6UJjiKBt&#34;&gt;Custom Phoenix generator templates&lt;/a&gt; &amp;ndash; I had no idea you can just add
templates into &lt;code&gt;priv/templates/&lt;/code&gt; and the Phoenix generators will use them.
Very nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be careful with this&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fish&#34; data-lang=&#34;fish&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;file&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;in&lt;/span&gt; ../**/*.mkv
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;mv&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;$file&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Don&amp;rsquo;t ask me how I know 😭&lt;/p&gt;
&lt;p&gt;(Ok, I&amp;rsquo;ll tell you since you insist. I ran this from the wrong directory and
moved all my files from nested directories into the current directory. I then
had to spent a lot of time manually moving all the files back to whence they
came. &lt;code&gt;**&lt;/code&gt; is dangerous, and apparently so am I.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.olleewatch.com/&#34;&gt;Ollee Watch&lt;/a&gt; is a very cool idea&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Turn your classic Casio watch into a smartwatch!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://borretti.me/article/notes-on-managing-adhd&#34;&gt;Notes on Managing ADHD&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When I wake up, I do my morning routine, get some quick wins, and then I try
to tackle the thing I dread the most, as early in the morning as possible,
because that&amp;rsquo;s the time of day when I have the most energy and self-control.
I get that done and I move on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is something I instinctively did this week. I needed to phone the garage
to ask about an oil service I need.&lt;/p&gt;
&lt;p&gt;(I &lt;em&gt;loathe&lt;/em&gt; phoning people. I will happily Zoom you, Google Meet you, or
FaceTime you &amp;ndash; not Teams, I&amp;rsquo;m not an animal &amp;ndash; I&amp;rsquo;ll chat in-person, no
problem. But I &lt;em&gt;hate&lt;/em&gt; the phone.)&lt;/p&gt;
&lt;p&gt;So I phoned very first thing in the morning. I still didn&amp;rsquo;t want to, it was
still hard and unpleasant, but, importantly, I did it. I mean, I didn&amp;rsquo;t get
the information I wanted, but it still counts as a win.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.boxypixel.com/products/ipod-classic-5th-7th-gen-metal-housing-kit&#34;&gt;ipod Classic (5th-7th Gen) Metal Housing + Buttons Kit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oh god, stop me buying this.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 220: Fountain pen guy</title>
      <link>https://elver.me/weeknotes/220-fountain-pen-guy/</link>
      <pubDate>Sun, 14 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/220-fountain-pen-guy/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Workflow, workflow, workflow &amp;ndash; I&amp;rsquo;ve now &lt;a href=&#34;https://github.com/jordelver/dotfiles/compare/8d4391a37d684f0b21f951a1427b5a793dfce6d7...d9ef4014d4eb51e847f2c3d6ef9f190b5c1752d3&#34;&gt;moved over to Snacks.picker from
Telescope&lt;/a&gt; and I&amp;rsquo;m already 110% more productive, and ready for AI to take my
job.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My flat went up for sale and not a single viewing so far. I wasn&amp;rsquo;t expecting
it to exactly fly off the shelf, but I was expecting at least one viewing by
now. I guess it&amp;rsquo;s always a waiting game with selling houses and/or it&amp;rsquo;s
overpriced. I will need to give it some time at least before making any
changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My visit to the West Country was a successful one. The drive both up and down
were uneventful, which is how drives should be. I did a surprising amount of
driving whilst there too, especially compared to the norm these days. It seems
like a weird thing to miss, driving, but I do miss it, despite all the obvious
benefits of &lt;em&gt;not&lt;/em&gt; having to drive literally anywhere I want to go as I once
did.&lt;/p&gt;
&lt;p&gt;Many people made time for me whilst I was there and good times were had. It
was really nice to catch up with everyone, and I felt tinges of sadness once I
got home on Saturday. Today (Sunday) it feels like weeks since I was there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saturday evening we were booked to see That Feels Significant Live! with Elis,
John, and Producer Dave. It was very fun show &amp;ndash; basically a live version of
the radio show but unshackled by their corporate overlords (the BBC). Dave was
a very good sport considering he&amp;rsquo;s not a performer like Elis and John.&lt;/p&gt;
&lt;p&gt;Top tip, don&amp;rsquo;t leave your pen knife attached to your key ring when trying to
enter a venue. They &lt;em&gt;will&lt;/em&gt; take this DANGEROUS WEAPON off you. (Although I did
manage to get it back when I left thankfully.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theatlantic.com/technology/archive/2025/06/good-taste-ai/683101/&#34;&gt;Good Taste Is More Important Than Ever&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Taste starts with noticing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m not sure I agree with the whole premise of the article, but I did agree
with this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://vale.sh/&#34;&gt;Vale CLI&lt;/a&gt; &amp;ndash; &amp;ldquo;Your style, our editor&amp;rdquo;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vale is an open-source, command-line tool that brings your editorial style
guide to life.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is an interesting tool. To date my &amp;ldquo;editorial style&amp;rdquo; only goes as far as
linting the Markdown I write with the &lt;a href=&#34;https://github.com/nosborn/github-action-markdown-cli&#34;&gt;github-action-markdown-cli&lt;/a&gt; GitHub
Action, but I could see myself using this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daringfireball.net/linked/2025/09/06/siegler-cynical-read&#34;&gt;A CYNICAL READ ON ANTHROPIC&amp;rsquo;S BOOK SETTLEMENT&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By settling for $1.5B, is Anthropic sort of pulling up a drawbridge, making
it so that other startups can&amp;rsquo;t possibly come into their castle? I mean, am
I crazy?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I mean, maybe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Plex suffered a &amp;ldquo;security incident&amp;rdquo; aka lost a database somehow, so I had to
reset my password. Well, I didn&amp;rsquo;t &lt;em&gt;have&lt;/em&gt; to, but it seemed prudent. However,
resetting one&amp;rsquo;s password apparently also means &amp;ldquo;losing access to the entire
server&amp;rdquo; which I was not expecting and nor were many people apparently judging
by the threads I&amp;rsquo;ve seen on Reddit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://shiftmag.dev/saying-no-is-not-a-free-action-in-the-world-of-software-engineering-5339/&#34;&gt;Saying NO is not a free action in the world of software engineering&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In order to aid my new journalling habit I&amp;rsquo;ve become Fountain Pen Guy.&lt;/p&gt;
&lt;p&gt;I have gone years without writing anything more than a birthday card but now
that I&amp;rsquo;ve consigned myself to write at least three (small) pages of waffle per
day, and given how unpleasant I&amp;rsquo;ve found it, it felt right to look into
writing implements. The only remedy is to spend money.&lt;/p&gt;
&lt;p&gt;Not since my Secondary School Parker pen have I regularly written using a
fountain pen. I did have a brief dalliance with a &lt;a href=&#34;https://www.lamy.com/en-gb/p/lamy-safari-fountain-pen/54912096567640&#34;&gt;Lamy Safari&lt;/a&gt; about 10 years
ago (according to my Amazon order history!), but it didn&amp;rsquo;t stick.&lt;/p&gt;
&lt;p&gt;It turns out that one of my York Ruby friends is a senior level fountain pen
guy already and he had a small collection of pens he was willing to let me
try, which was very helpful. Writing in front of someone else, unpleasant but
necessary.&lt;/p&gt;
&lt;p&gt;Despite liking a few of his more expensive pens, I decided, for now, to bring
my Lamy Safari back to life. I failed, but I did try. The ink simply will not
flow correctly out of the pen, even with a new nib and cleaning (as far as I
know how). So I spent a moderate amount of money instead and bought the same
pen again in a different colour (variety is the spice of life) and I&amp;rsquo;m now
happily using it and finding it easier than other pens. I may still splurge on
something better later, but for now I&amp;rsquo;m quite enjoying it.&lt;/p&gt;
&lt;p&gt;(Side note, I&amp;rsquo;m constantly amazed the breadth of content available on YouTube.
Because I&amp;rsquo;m mostly into computer related content, I think I assume that
YouTube will be full of computer stuff, which is is. But if you type in almost
any niche you&amp;rsquo;ll find someone producing content. I watched one guy reviewing
the different types of paper notebooks for use with fountain pens.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I did not get the emergency alert on my phone &amp;ndash; am I safe?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 219: Differentiators</title>
      <link>https://elver.me/weeknotes/219-differentiators/</link>
      <pubDate>Sun, 07 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/219-differentiators/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/218-botulism-opportunity/#:~:text=When%20the%20great%20re%2Dpotting%20took%20place%20I%20thought%20I%E2%80%99d%20avoided%20the%20usually%20inevitable%20fugus%20gnats.%20I%20was%20wrong.%20Very%20wrong.%20The%20little%20fuckers%20have%20arrived%20in%20full%20force%20and%20god%20they%E2%80%99re%20annoying.%20But%20I%E2%80%99m%20fighting%20back%20%F0%9F%A5%8A%20I%E2%80%99ve%20deployed%20a%20Nemotode%20army%20and%20sticky%20traps&#34;&gt;Nemotode army and sticky traps&lt;/a&gt; are having &lt;em&gt;some&lt;/em&gt; effect.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Things were said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;After my initial excitement over Alien: Earth I think I reluctantly need
to admit to myself that it isn&amp;rsquo;t holding together as I had hoped.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was wrong. Very wrong. Episode 5 is &lt;em&gt;excellent&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to take this opportunity to apologise to all involved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dev.37signals.com/announcing-lexxy-a-new-rich-text-editor-for-rails/&#34;&gt;Lexxy: A new rich text editor for Rails&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When I exit a &lt;code&gt;tmux&lt;/code&gt; session (usually by &lt;kbd&gt;CTRL&lt;/kbd&gt;-&lt;kbd&gt;d&lt;/kbd&gt;) &lt;code&gt;tmux&lt;/code&gt;
detaches from all sessions. I always have several sessions running at one time
so I then need to to run &lt;code&gt;tmux a&lt;/code&gt; to reattach &amp;ndash; it&amp;rsquo;s pretty annoying and has
been bugging me for &lt;em&gt;years&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Well, no more. This week, I made &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/6f00964928b847ac89a1bd61789789c2ee7af7d8&#34;&gt;this life changing commit&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set-option -g detach-on-destroy off
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;From the &lt;a href=&#34;https://man.openbsd.org/OpenBSD-current/man1/tmux.1#:~:text=detach%2Don%2Ddestroy%20%5B,session%20in%20alphabetical%20order.&#34;&gt;man page&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If off, the client is switched to the most recently active of the
remaining sessions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don&amp;rsquo;t know when this option was introduced (I have a feeling after I last
looked into the issue) but I&amp;rsquo;m glad I have it now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tom-select.js.org/&#34;&gt;Tom Select&lt;/a&gt; &amp;ndash; handy, dandy, fancy select library.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://devknife.app/&#34;&gt;DevKnife&lt;/a&gt; &amp;ndash; neat idea.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DevKnife replaces browser tabs, CLI scripts, and scattered tools with one
native Mac app.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are other ways to achieve the sort of things this app provides but it&amp;rsquo;s
nice that it&amp;rsquo;s all packaged up in one easy tool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More workflow improvements - I can now fuzzily change tmux sessions &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/c5d50a7f6bcc470f01f8f01ed509f3a4bc99de69&#34;&gt;using
&lt;code&gt;fzf&lt;/code&gt;&lt;/a&gt;. Hitting &lt;kbd&gt;CTRL&lt;/kbd&gt;-&lt;kbd&gt;b&lt;/kbd&gt;-&lt;kbd&gt;s&lt;/kbd&gt; now invokes &lt;code&gt;fzf&lt;/code&gt;
with a list of running sessions which I can filter and change to by pressing
&lt;kbd&gt;ENTER&lt;/kbd&gt;. Nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I started reading two books this week: 1) &lt;a href=&#34;https://www.goodreads.com/book/show/203778046-a-history-of-britain-in-ten-enemies&#34;&gt;A History of Britain in 10 Enemies&lt;/a&gt;
by Terry Deary; and 2) &lt;a href=&#34;https://www.goodreads.com/book/show/97942.The_Artist_s_Way&#34;&gt;The Artist&amp;rsquo;s Way&lt;/a&gt; by Julia Cameron. Both seem to get
polarizing reviews, which is an interesting coincidence.&lt;/p&gt;
&lt;p&gt;The Artist&amp;rsquo;s Way is based on a programme/workshop to get your creativity
going. An early part of the book introduces what Julia Cameron calls &amp;ldquo;Morning
Pages&amp;rdquo;. The idea is that forcing yourself to complete 3 pages of text every
morning gets the creative juices flowing in some way.&lt;/p&gt;
&lt;p&gt;It might be bs, but I&amp;rsquo;ve been trying it for a week so far. Mine has turned
into a traditional journal already, which I&amp;rsquo;m not sure is the point, but
still, the act of writing by hand (however tortuous, and I can assure you Day
1 was like torture) &lt;em&gt;feels&lt;/em&gt; like it connects something in the brain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One of my teeth broke late Sunday night. I knew this time was coming as I&amp;rsquo;ve
been fairly issue free for the last few years. Of course I haven&amp;rsquo;t sorted a
new dentist since moving so I now have a two week wait for an appointment
which will be ok as long as it remains pain free.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wanted to try out Neovim nightly so I decided to &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/7a84771be57f4819b755b2beed1b9f37396eda14&#34;&gt;put the control of which
Neovim is installed under &lt;code&gt;asdf&lt;/code&gt;&lt;/a&gt;. I&amp;rsquo;m not sure if it meets my needs or not
yet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over to Sheffield on Thursday to see JJ &amp;ndash; very much enjoyed chatting and
catching up 😊&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://railsblocks.com/&#34;&gt;Rails Blocks&lt;/a&gt; &amp;ndash; &amp;ldquo;UI components for your Rails app&amp;rdquo;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A ready-to-use collection of 230+ UI components with minimal dependencies
and a focus on simplicity&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dev.to/resource_bunk_1077cab07da/how-i-write-code-that-i-dont-hate-reading-a-week-later-303b&#34;&gt;How I Write Code That I Don&amp;rsquo;t Hate Reading a Week Later&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The mark of a good developer isn&amp;rsquo;t just building systems that work — it&amp;rsquo;s
writing code that remains kind, even after time passes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some good tips in here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://kraust.github.io/posts/neovim-is-a-multiplexer/&#34;&gt;Neovim is a Multiplexer&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In this post, I plan to talk about :terminal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have more or less ignored &lt;code&gt;:terminal&lt;/code&gt; as a feature since it was added to
Neovim, so this was interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As part of my &amp;ldquo;sort your shit out&amp;rdquo; enterprise I have started meditating again.
5 out of 7 days so far as I type this (there is still time to make it 6
today!).&lt;/p&gt;
&lt;p&gt;The difference between starting meditation &lt;em&gt;now&lt;/em&gt; and at other times in the
past is that I don&amp;rsquo;t feel I &lt;em&gt;need&lt;/em&gt; it right now. There is no current crisis.
But I feel that sitting and reflecting in whatever way is a good practice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, I needed to load my guided meditation audio back onto my
iPhone (I don&amp;rsquo;t remember removing the files, but they were nowhere to be
found).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve moaned about this before, but the process is absolutely baffling when you
don&amp;rsquo;t do it very often. Do I need to use the macOS Music app or Finder or
both? I have to search how to do this every time. Terrible experience from
Apple.&lt;/p&gt;
&lt;p&gt;I guess they are not incentivised to make this better when they want you to be
streaming instead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New keyboard time! Somewhat on a whim I decided to buy yet another new
keyboard. This time the &lt;a href=&#34;https://www.zsa.io/voyager&#34;&gt;ZSA Voyager&lt;/a&gt;. A split keyboard again, but this one is
smaller than the &lt;a href=&#34;https://ergodox-ez.com/&#34;&gt;ErgoDox EZ&lt;/a&gt; I already own and don&amp;rsquo;t use. I hoping this is
one of the differentiators to actually using it.&lt;/p&gt;
&lt;p&gt;The other differentiator being a plan towards learning. This keyboard is not
going to get used simply by hope. The ZSA team seem very aware that there is a
barrier to entry with their products (I&amp;rsquo;d imagine a lot of people give up) and
as a result they seem to have put a lot of effort into their support systems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.mcsweeneys.net/articles/the-em-dash-responds-to-the-ai-allegations&#34;&gt;The Em Dash Responds to the AI Allegations&lt;/a&gt; &amp;ndash; very good 👏&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 218: Botulism opportunity</title>
      <link>https://elver.me/weeknotes/218-botulism-opportunity/</link>
      <pubDate>Sun, 31 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/218-botulism-opportunity/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Giving away a mattress for free is harder than you&amp;rsquo;d think.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is a page with 218 links on it too many links? Part of me thinks I should
start paginating the home page of this here website, and the other part simply
cannot be arsed. The page is 5.4kB, loads fast, and renders fast &amp;ndash; who cares?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://menial.co.uk/base/&#34;&gt;Base&lt;/a&gt; &amp;ndash; &amp;ldquo;The best SQLite database editor for macOS&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been looking for a decent GUI SQLite tool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.haxx.se/blog/2025/08/08/http-is-not-simple/&#34;&gt;HTTP is not simple&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I often hear or see people claim that HTTP is a simple protocol. Primarily
of course from people without much experience or familiarity with actual
implementations. I think I personally also had thoughts in that style back
when I started working with the protocol.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The primary author of &lt;code&gt;curl&lt;/code&gt; knows a lot about HTTP.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://evilmartians.com/chronicles/the-long-game-why-rails-survived-the-hype-cycle-and-what-it-means-for-your-startup&#34;&gt;The Long Game: why Rails survived the hype cycle and what it means for your
startup&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://selkie.design/substage/&#34;&gt;Substage&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Convert, organize and more: control your Mac and its files with natural
language.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is cool/terrifying/inadvisable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m planning a trip south in a couple of weeks to see a friend. It is
surprising how overwhelming I found organising everything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fly.io/blog/build-better-agents-with-morphllm/&#34;&gt;Build Better Agents With MorphLLM&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;m an audiophile, which is a nice way to describe someone who spends their
children’s college fund on equipment that yields no audible improvement in
sound quality.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.makingsoftware.com/chapters/color-spaces-models-and-gamuts&#34;&gt;What is a color space?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Color is an unreasonably complex topic. Just when you think you&amp;rsquo;ve got it
figured out, it reveals a whole new layer of complexity that you didn&amp;rsquo;t know
existed.&lt;/p&gt;
&lt;p&gt;This is partly because it doesn&amp;rsquo;t really exist.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Look, I&amp;rsquo;m not going to read this website, you’re not going to read this
website, but my god what a lovely piece of work. In a world of mediocrity what
a breath of fresh air it is &amp;ndash; beautiful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ftes.de/articles/2025-03-31-beyond-data-confirm&#34;&gt;Beyond data-confirm&lt;/a&gt; &amp;ndash; Nice tutorial on replacing those fugly browser
dialogs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Due to a supermarket chilli plant surviving more than a week I found myself
with an abundance of red chillies. There was nothing else to do but attempt
chilli jam. Never ignore the opportunity for botulism to thrive.&lt;/p&gt;
&lt;p&gt;I ended up with something more akin to a thick syrup which was hot &lt;em&gt;AF&lt;/em&gt; 🥵 so
I re-boiled it the next day and now it &lt;em&gt;has&lt;/em&gt; set to something more resembling
jam.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mashable.com/article/google-android-sideloading-apps-security&#34;&gt;Google is shutting down Android sideloading in the name of security&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Android zealots assemble!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rubyelders.com/writings/2025-08-wubular-1.html&#34;&gt;Introducing Wubular: Rubular Reimagined in Ruby+WASM&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Since Ruby 3.2, MRI itself can be compiled — thanks to  Yuta Saito
(@kateinoigakukun) — to run in WASM environments. WASM is essentially
assembly for the web: safe, fast, portable bytecode that browsers (and other
runtimes) can execute. Combine it with WASI (WebAssembly System Interface)
and you get access to basic system features like files, time, and randomness
— enough to run full Ruby apps.&lt;/p&gt;
&lt;p&gt;That flips the old Rubular model upside down: regex evaluation (and any Ruby
code) can now run entirely client-side.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Maybe I&amp;rsquo;ve not been paying enough attention but this is the first time I&amp;rsquo;ve
really felt like WebAssembly is the perfect solution for something.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://andre.arko.net/2025/08/25/rv-a-new-kind-of-ruby-management-tool/&#34;&gt;rv, a new kind of Ruby management tool&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was skeptical going into read this, but then I see &amp;ldquo;Sam Stephenson&amp;rdquo; and I
take notice. I am usually in favour of more generic tools for managing
versions of things, that&amp;rsquo;s why I currently use &lt;code&gt;asdf&lt;/code&gt; as it can handle Ruby,
but also Redis or Postgres etc.&lt;/p&gt;
&lt;p&gt;From &lt;a href=&#34;https://github.com/spinel-coop/rv/blob/main/docs/PLANS.md#:~:text=Get%20rid%20of%20rvm%2C%20rbenv%2C%20chruby%2C%20asdf%2C%20mise%2C%20ruby%2Dbuild%2C%20ruby%2Dinstall%2C%20bundler%2C%20and%20rubygems%2C%20all%20at%20once.&#34;&gt;rv plans&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Get rid of rvm, rbenv, chruby, asdf, mise, ruby-build, ruby-install,
bundler, and rubygems, all at once.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This has more ambitious plans though so I will watch with interest.&lt;/p&gt;
&lt;p&gt;And if it stops people using &lt;code&gt;rvm&lt;/code&gt; even better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://beta.ideas.lego.com/product-ideas/de0eda3f-84aa-4cfa-9fab-c9eb155ada80&#34;&gt;Lego Bondi Blue iMac G3&lt;/a&gt;? Yes, please!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;About a year ago the &lt;a href=&#34;https://elixir-lang.org/blog/2024/08/15/welcome-elixir-language-server-team/&#34;&gt;competing Elixir LSPs decided to come together&lt;/a&gt; and
create the defacto LSP for Elixir. Now the &lt;a href=&#34;https://github.com/elixir-lang/expert&#34;&gt;first release is available&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/57c160ff7f48da11a7221ec10ca3e1b90e4c8a10&#34;&gt;set it up regardless&lt;/a&gt;, and it seems to do things.&lt;/p&gt;
&lt;p&gt;Embarrassing to admit perhaps but I still don&amp;rsquo;t really use LSPs in any big
way. I&amp;rsquo;m not even sure what to expect from them with Neovim. I&amp;rsquo;m hoping
someone is going to create something on YouTube to school me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The speed with which &lt;a href=&#34;https://nicsfix.com/&#34;&gt;Nic&amp;rsquo;s Fix&lt;/a&gt; fixes &lt;a href=&#34;https://www.youtube.com/live/l6p4bWw_oEk?t=1h54m11s&#34;&gt;Siracusa&amp;rsquo;s HomePod&lt;/a&gt; is very impressive
even if the soldering did raise some eyebrows 🤨😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We watched &lt;a href=&#34;https://www.themoviedb.org/movie/744653-the-thursday-murder-club&#34;&gt;The Thursday Murder Club&lt;/a&gt;. I like Pierce Brosnan but he should
just stop doing accents. Like in &lt;a href=&#34;https://www.paramountplus.com/gb/shows/mobland/&#34;&gt;MobLand&lt;/a&gt;, the man just can&amp;rsquo;t do them. We&amp;rsquo;re
not talking Ray Winston levels of bad, but bad. The film is fine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finished &lt;a href=&#34;https://www.themoviedb.org/tv/106161-alma-s-not-normal&#34;&gt;Alma&amp;rsquo;s Not Normal&lt;/a&gt; Season 2 and enjoyed it, but it didn&amp;rsquo;t hit me
like the first, perhaps because I left a long time between seasons. The cast
are unbelievably good though, and &lt;a href=&#34;https://en.wikipedia.org/wiki/Sophie_Willan&#34;&gt;Sophie Willan&lt;/a&gt; is a real talent (she&amp;rsquo;s
great on Taskmaster too).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After my &lt;a href=&#34;/weeknotes/216-legally-purchased-media/#:~:text=Alien%3A%20Earth%20is%20very%20good&#34;&gt;initial excitement over Alien: Earth&lt;/a&gt; I think I reluctantly need to
admit to myself that it isn&amp;rsquo;t holding together as I had hoped.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When &lt;a href=&#34;/weeknotes/210-sorry-i-m-sweaty-it-s-genetic/#:~:text=I%20re%2Dpotted%20a%20load%20of%20my%20indoor%20plants%20this%20week&#34;&gt;the great re-potting&lt;/a&gt; took place I thought I&amp;rsquo;d avoided the usually
inevitable &lt;a href=&#34;https://en.wikipedia.org/wiki/Fungus_gnat&#34;&gt;fungus gnats&lt;/a&gt;. I was wrong. Very wrong. The little fuckers have
arrived in full force and god they&amp;rsquo;re annoying. But I&amp;rsquo;m fighting back 🥊 I&amp;rsquo;ve
deployed a &lt;a href=&#34;https://en.wikipedia.org/wiki/Nematode&#34;&gt;Nemotode&lt;/a&gt; army and sticky traps 🤞&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 217: Half-assed idea</title>
      <link>https://elver.me/weeknotes/217-half-assed-idea/</link>
      <pubDate>Sun, 24 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/217-half-assed-idea/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://macrowave.co/&#34;&gt;Macrowave&lt;/a&gt; &amp;ndash; &amp;ldquo;Turn Your Mac Into a Private Radio Station&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I realised that all of my &amp;ldquo;ideas&amp;rdquo; for &amp;ldquo;apps&amp;rdquo; are actually just single feature
ideas that require me to build a whole other app in order to implement them.
Not very time efficient 😆&lt;/p&gt;
&lt;p&gt;For example, I use &lt;a href=&#34;https://callsheetapp.com/&#34;&gt;Callsheet&lt;/a&gt; to track what TV or Movies I want to watch, and
it works well for that, but it doesn&amp;rsquo;t let me view the movies on a calendar,
which is what I would also like.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So I did an &lt;a href=&#34;https://github.com/jordelver/tmdb_cal&#34;&gt;internet code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I decided that instead of using Callsheet I would use the &lt;a href=&#34;https://www.themoviedb.org/&#34;&gt;TMDB&lt;/a&gt; watchlist
feature and then use their API to pull the watchlist items and output an ical
which I could subscribe to.&lt;/p&gt;
&lt;p&gt;This was quite a half-assed idea from the very start, which both didn&amp;rsquo;t solve
the problem and not in the right way. I find it difficult to figure out
whether some of these thoughts are self-sabotage or genuine concerns so I
decided to carry on anyway, and at least get it deployed and &amp;ldquo;working&amp;rdquo; so it
didn&amp;rsquo;t end up on the unfinished pile.&lt;/p&gt;
&lt;p&gt;Well I don&amp;rsquo;t actually consider this &amp;ldquo;done&amp;rdquo; yet but I did write and deploy some
code for the first time in ages, so that is good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL how to &lt;a href=&#34;https://support.plex.tv/articles/200381043-multi-version-movies/#:~:text=Can%20I%20use%20Editions%20and%20Versions%20at%20the%20same%20time%3F&#34;&gt;name files with different editions and versions for Plex&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://didoesdigital.com/blog/stress-test-data-for-web-projects/&#34;&gt;Stress Test Data for Web Projects&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When making websites I have some go-to test data to push designs to the
limits. I use this test data for creating test accounts, submitting forms,
as mock data in designs, and all sorts of random things.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Refer to the bottom for CSS solutions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/pwntester/octo.nvim&#34;&gt;&lt;code&gt;octo.nvim&lt;/code&gt;&lt;/a&gt; &amp;ndash; I don&amp;rsquo;t have much use for this right now, but I think I might
in the future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://svenning.io/build-for-joy-not-work&#34;&gt;Build for Joy, Not Work&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve been lucky enough to experience building great UIs for amazing
products, but when I look around me, I see a world of &amp;ldquo;good enough&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://elixircasts.io/liveview-colocated-hooks&#34;&gt;#197: LiveView Colocated Hooks&lt;/a&gt; seem like a nice idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.itpro.com/software/development/aws-ceo-matt-garman-just-said-what-everyone-is-thinking-about-ai-replacing-software-developers&#34;&gt;AWS CEO Matt Garman just said what everyone is thinking about AI replacing
software developers&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The real tragedy? An entire generation of Web Designers and Software
Engineers may never know the joy of making something truly meaningful —
something that solves an actual problem instead of bumping a conversion rate
by 0.25%.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Is this real? A CEO not talking complete bollocks 🙀&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://katafrakt.me/2025/07/03/ecto-on-replace-deferred-check/&#34;&gt;Ecto, &lt;code&gt;on_replace&lt;/code&gt; and deferred checks&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Deferrable constraint waits until the end of the transaction with checking
if its condition is met. This was exactly what I was looking for!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve not heard of deferrable constraints before. Now I have.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theregister.com/2025/08/20/mcdonalds_terrible_security/&#34;&gt;McDonald&amp;rsquo;s not lovin&amp;rsquo; it when hacker exposes nuggets of rotten security&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A white-hat hacker has discovered a series of critical flaws in McDonald&amp;rsquo;s
staff and partner portals that allowed anyone to order free food online, get
admin rights to the burger slinger&amp;rsquo;s marketing materials, and could allow an
attacker to get a corporate email account with which to conduct a little
filet-o-phishing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Absolute clown shoes, this.&lt;/p&gt;
&lt;p&gt;(Excellent punning from the The Register as you&amp;rsquo;d expect).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://antonz.org/is-online/&#34;&gt;Am I online?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;After some research, I found this URL that Google itself seems to use in
Chrome to check for connectivity:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://google.com/generate_204&#34;&gt;http://google.com/generate_204&lt;/a&gt;
&lt;a href=&#34;https://google.com/generate_204&#34;&gt;https://google.com/generate_204&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The URL returns a 204 No Content HTTP status&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is handy to know about. As close to a canonical connectivity URL as
you&amp;rsquo;ll find I expect.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/216-legally-purchased-media/#:~:text=visit%20from%20a%20good%20friend%20next%20weekend&#34;&gt;My friend arrived&lt;/a&gt; on Friday night and left Sunday morning, so the weekend
was full and went quickly. Good times were made, chats were had. I was sad to
see him leave. I hate goodbyes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 216: Legally purchased media</title>
      <link>https://elver.me/weeknotes/216-legally-purchased-media/</link>
      <pubDate>Sun, 17 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/216-legally-purchased-media/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ChatGPT 5 was released last week so I gave it a try. It&amp;rsquo;s increasingly
difficult to keep up with the various different models, their versions, and
how good or bad they are at various tasks, but it seems &amp;ldquo;good&amp;rdquo; I suppose.&lt;/p&gt;
&lt;p&gt;I was downloading some legally purchased media and had a text file of URLs to
download (which I had to manually collate, will no one think of the
children!) but my new AI overlord did help me out somewhat even offering to
parallelize everything.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat vids.txt | parallel -j4 yt-dlp &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -f &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;bv[height=2160]+ba/best&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --merge-output-format mp4 &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --remux-video mp4 &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --no-fixup all &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -o &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;{#}-%\(title\).80s.%\(ext\)s&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve never used &lt;code&gt;parallel&lt;/code&gt; before, but it sure did max out my bandwidth or at
least make better use of it. After much back and forth, I had a working
command which did perform as advertised, and a directory full o&amp;rsquo; files.&lt;/p&gt;
&lt;p&gt;I wanted to check that each file, once downloaded, had an audio track/channel,
and GPT 5 came up with this for fish shell which did do what I
wanted:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;for&lt;/span&gt; f in *.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; ffprobe -loglevel error -select_streams a -show_entries &lt;span style=&#34;color:#008080&#34;&gt;stream&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;index -of &lt;span style=&#34;color:#008080&#34;&gt;csv&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;p&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;$f&lt;/span&gt; | grep -q .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#0086b3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;$f&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;: Yes&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#0086b3&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;$f&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;: No&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  end
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which output:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;01_Linux_ISOs_Made_Easy.mp4 : Yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;02_Linux_ISOs_Made_Easy.mp4 : Yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;03_Linux_ISOs_Made_Easy.mp4 : Yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;04_Linux_ISOs_Made_Easy.mp4 : Yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;05_Linux_ISOs_Made_Easy.mp4 : Yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Good enough for me.&lt;/p&gt;
&lt;p&gt;The power of the command line used to rely on one&amp;rsquo;s ability to remember all
the flags of some unix utility, which I don&amp;rsquo;t have. Maybe the power will be
more readily available to me now, or &lt;em&gt;maybe&lt;/em&gt; I&amp;rsquo;ll inadvertently wipe my
filesystem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.monicahq.com/&#34;&gt;Monica&lt;/a&gt; &amp;ndash; Open source personal CRM.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Monica helps you organize the social interactions with your loved ones.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a good idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://yoyo-code.com/why-is-github-ui-getting-so-much-slower/&#34;&gt;Why is GitHub UI getting so much slower?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you try this out at home and play around with it, you&amp;rsquo;ll find out
that opening the &amp;ldquo;Files changed&amp;rdquo; link in a new tab is actually 2x faster&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Blimey.&lt;/p&gt;
&lt;p&gt;I see this quite often with products I use. I start using them because they
work well and solve a problem for me. Fast forward a few years and they&amp;rsquo;ve
stopped thinking about the product itself. Instead it&amp;rsquo;s all &amp;ldquo;partnerships&amp;rdquo; and
trying to sell me products. No, I won&amp;rsquo;t be getting a loan from you at
astronomical rates. No, I&amp;rsquo;m not interested in insurance from your &amp;ldquo;partner&amp;rdquo;. I
don&amp;rsquo;t care if the product owner needs a raise.&lt;/p&gt;
&lt;p&gt;Maybe less chat about AI and more work making the product work well?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://getgriddle.app/&#34;&gt;Griddle&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A native macOS menu bar app that provides quick window tiling with keyboard
shortcuts and visual grid overlay. Just press QWE, ASD to tile your windows
instantly. DRM-free, one-time purchase for all your Macs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am a simple man. I see window tiling, I link.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://eahanson.com/articles/faster-tests&#34;&gt;Make Elixir Tests Faster&lt;/a&gt; &amp;ndash; some nice tips.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.dragcity.com/products/100-sound-effects&#34;&gt;Fred Armisen - 100 Sound Effects&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fred Armisen, long known as one of the most curious
actor/comedian/musician/producer/author/all-round good guys in the business,
likes unusual ways of entertaining people. Like this one: 100 Sound
Effects is an album that can be used as a library, an industrial tool for
your own entertainment projects, or simply for brain-stimulating deep
listening. From basic sounds to more abstract scenarios, 100 Sound
Effects is an album like no other!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A mad idea, which is why I like it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.themoviedb.org/tv/157239-alien-earth&#34;&gt;Alien: Earth&lt;/a&gt; is very good 🙌&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Neovim looks to be &lt;a href=&#34;https://github.com/neovim/neovim/pull/33440&#34;&gt;getting&lt;/a&gt; &lt;a href=&#34;https://github.com/neovim/neovim/pull/34823&#34;&gt;support&lt;/a&gt; for LSP’s &lt;a href=&#34;https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_documentColor&#34;&gt;&lt;code&gt;textDocument/documentColor&lt;/code&gt;&lt;/a&gt;
which allows the LSP to provide colours useful for CSS in particular, and
other use cases, I&amp;rsquo;m sure.&lt;/p&gt;
&lt;p&gt;Side note: The feedback from certain people on the PRs above are the reason I
get fed up with this industry. Using words like &amp;ldquo;readable&amp;rdquo; and &amp;ldquo;objective&amp;rdquo;
like they are. Learn how to talk to people, nerds.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://www.reddit.com/r/neovim/comments/1moxwv9/hexadecimal_colors_in_v012_ootb/&#34;&gt;Hexadecimal colors in v0.12 OOTB&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Never underestimate the speed with which banking organisations will drop the
interest rate on your accounts. The same people who will take your money
instantly, but insist that a refund takes 7-10 days. Bastards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When I asked how I should &lt;a href=&#34;/weeknotes/214-a-bit-of-care-a-bit-of-craft/#:~:text=How%20would%20you%20transfer%201.7GB%20of%20photos%20to%20your%20partners%20computer%3F&#34;&gt;share some files on my network&lt;/a&gt; a couple of weeks
ago I was inundated with suggestions (I wasn&amp;rsquo;t) but &lt;a href=&#34;https://simonstarr.com/&#34;&gt;Simon&lt;/a&gt; did suggest the
obvious route I should have taken, built-in &lt;a href=&#34;https://support.apple.com/en-gb/guide/mac-help/mh17131/mac&#34;&gt;Mac File Sharing&lt;/a&gt;. I will
remember to do that next time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://thecynical.dev/posts/ticket-driven-development/&#34;&gt;Ticket-Driven Development: The Fastest Way to Go Nowhere&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Eventually, even the good devs stop caring. They stop asking questions. They
stop solving problems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Been here. Often.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/215-slopsquatting/#:~:text=Going%20on%20holiday%20next%20week&#34;&gt;short holiday&lt;/a&gt; in &lt;a href=&#34;https://en.wikipedia.org/wiki/Gothenburg&#34;&gt;Gothenburg&lt;/a&gt; was fairly successful. It was nice enough,
particularly the people, but I wouldn&amp;rsquo;t &lt;em&gt;rush&lt;/em&gt; back. Sometimes it&amp;rsquo;s just nice
to get away.&lt;/p&gt;
&lt;p&gt;Some highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We partook in a walking tour as we usually do. My feet didn&amp;rsquo;t hurt at all
despite a lot of walking. Being lighter does have benefits.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We took a day trip to see the islands of &lt;a href=&#34;https://en.wikipedia.org/wiki/Styrs%C3%B6&#34;&gt;Styrsö&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Dons%C3%B6&#34;&gt;Donsö&lt;/a&gt; in the
&lt;a href=&#34;https://en.wikipedia.org/wiki/Gothenburg_archipelago&#34;&gt;Gothenburg archipelago&lt;/a&gt;. Very cheap and easy to catch the ferry over.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Styrs%C3%B6&#34;&gt;Styrsö&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Dons%C3%B6&#34;&gt;Donsö&lt;/a&gt; are &amp;ldquo;car less&amp;rdquo;. Sounds idyllic doesn&amp;rsquo;t it? What it
actually means in effect is that everyone drives a golf cart or a scooter in
the kind of manner you&amp;rsquo;d expect with no (little?) police presence.&lt;/p&gt;
&lt;p&gt;Still, very picturesque.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of course &lt;a href=&#34;https://www.salut-saluhallen.se/en&#34;&gt;we had Swedish meatballs&lt;/a&gt;. Superb.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://andymasley.substack.com/p/contra-the-uk-government-please-dont&#34;&gt;Contra the UK government, please don&amp;rsquo;t delete your old photos and emails to
save water&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The group failed to compare how much water each choice saves. Once you do
that, it becomes clear how ridiculous this advice is. I did the math.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am &lt;em&gt;shocked&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://slashdot.org/comments.pl?sid=23765914&amp;amp;cid=65583466&#34;&gt;&amp;ldquo;Sold his stock&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I earn money from my labor and pay something like 55% combined tax on it. I
am the happiest person ever. Life to me was never about accomplishment, but
about Happiness, which is Smiles minus Frowns. I developed these
philosophies when I was 18-20 years old and I never sold out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Woz seems to have it worked out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://maxrozen.com/onlineornot-diaries-25-you-can-just-build-things&#34;&gt;OnlineOrNot Diaries 25: you can just build things&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I know, it sounds cliché at this point, but you can just build things. What
do I mean by just build things? I mean, don&amp;rsquo;t obsess over the right
language, framework, tools, or approach to use. Just build something, and
ship it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s true.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the absolute worst case, you get it wrong. Guess what? you can just fix
it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I totally agree with this. The problem is that I don&amp;rsquo;t believe it applies to
&lt;em&gt;me&lt;/em&gt;. I&amp;rsquo;ve spent my whole life trying to not get it wrong so I don&amp;rsquo;t have to
fix it later. And I don&amp;rsquo;t trust that I can fix it. Rationally I know this
isn&amp;rsquo;t true, but I&amp;rsquo;m not always rational.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I am looking forward to a visit from a good friend next weekend ☺️&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 215: Slopsquatting</title>
      <link>https://elver.me/weeknotes/215-slopsquatting/</link>
      <pubDate>Sun, 10 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/215-slopsquatting/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I received a cheque (ask your parents) in the post this week. A cheque!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.m.wikipedia.org/wiki/Slopsquatting&#34;&gt;slopsquatting&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A new term called slopsquatting, a form of cybersquatting where users
register non-existent package names hallucinated by LLMs for unsuspecting
users to install&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s important to improve one&amp;rsquo;s vocabulary.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://selfh.st/weekly/2025-08-08/&#34;&gt;Self-Host Weekly (8 August 2025)&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://x.com/ThatArrowsmith/status/1948490317277143438&#34;&gt;George Arrowsmith&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;QA is about to become a huge bottleneck in software development. AI lets us
churn out HUGE amounts of code extremely fast, but you still need to make
sure it works. AI can help with testing too, but if you &lt;em&gt;really&lt;/em&gt; want to be
sure it works, you need the reassurance of human eyes on it. And human eyes
don&amp;rsquo;t scale.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ldquo;churn&amp;rdquo; being the operative word. So much churn.&lt;/p&gt;
&lt;p&gt;Code reviews are also going to be very hard work. They&amp;rsquo;re already awful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://eltonminetto.dev/en/post/2025-06-19-go-more-opinated/&#34;&gt;Go should be more opinionated&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do you structure a project that will be developed and evolved by a team?
At this point, the language step aside from strong opinions, and each team
or company needs to decide how to structure their projects.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ruby on Rails &lt;em&gt;did&lt;/em&gt; pioneer this. Before Rails everyone was slapping together
websites using their own homegrown &amp;ldquo;web frameworks&amp;rdquo; aka &lt;code&gt;functions.php&lt;/code&gt;. Like
it or loath it, Rails brought a structure to answer the question &amp;ldquo;where does
this file go?&amp;rdquo; &amp;ndash; it&amp;rsquo;s just a shame they haven&amp;rsquo;t taken it beyond models,
views, and controllers for the most part.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But it wasn&amp;rsquo;t always like this. For a long time, there was no official
package manager for the language; consequently, the community developed
several alternatives. They all worked, but fragmentation was getting out of
control, making it challenging to integrate packages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;See JavaScript. JavaScript, of course, takes it much further by having such a
dreadful standard library, for so long, that &lt;a href=&#34;https://en.wikipedia.org/wiki/Npm_left-pad_incident&#34;&gt;&lt;code&gt;leftpad&lt;/code&gt;&lt;/a&gt; becomes a thing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.ui.com/article/introducing-unifi-os-server&#34;&gt;Introducing UniFi OS Server for MSPs&lt;/a&gt; &amp;ndash; This is interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://bower.sh/you-might-not-need-tmux&#34;&gt;You might not need tmux&lt;/a&gt; (via &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Some good points in here which I&amp;rsquo;ve suffered too — namely the native scroll
back (and associated tmux-based scrolling which I always forget how to do!)
and the “weirdness” with things like &lt;code&gt;TERM&lt;/code&gt; but the solutions posited don&amp;rsquo;t
seem any less buggy or difficult to setup to be honest. I won&amp;rsquo;t change for
now, but it did make me think that perhaps I might in the future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fileutils.com/&#34;&gt;FileUtils&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Advanced file operations and utilities integrated into macOS Finder&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some nice power user utilities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.jonoalderson.com/conjecture/javascript-broke-the-web-and-called-it-progress/&#34;&gt;JavaScript broke the web (and called it progress)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clearly written from the frustrated view of someone trying to get content
changes made (presumably for SEO reasons) but I agree with almost everything
written here.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This isn&amp;rsquo;t just a technical issue. It’s an organisational one. We&amp;rsquo;ve handed
control of the web to the only people who understand the machinery. And
they’re too busy fixing the machine to stop and ask whether we needed it in
the first place.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A lot of this goes on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.zachdaniel.dev/p/elixir-misconceptions-1&#34;&gt;Don&amp;rsquo;t &amp;ldquo;let it crash&amp;rdquo;. Let it heal.&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A note to the Elixir programmers who commonly say &amp;ldquo;let it crash&amp;rdquo;: This
phrase gives outsiders and newcomers the wrong idea, and encourages bad
habits for those who misinterpret it. If I had my way, we would stop saying
it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Are you looking for self-hosted software alternatives to popular commercial
products? &lt;a href=&#34;https://selfh.st/&#34;&gt;https://selfh.st/&lt;/a&gt; is your friend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fly.io/docs/machines/guides-examples/multi-container-machines/&#34;&gt;Multi-container Machines&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fly Machines support running multiple containers per virtual machine using
the containers array.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can now deploy multiple containers to a single VM on Fly — very nice
feature improvement. I can see this being very useful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://elixirschool.com/en/lessons/misc/lua&#34;&gt;Elixir School on Lua&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Lua library for Elixir is an ergonomic wrapper around Luerl, Robert
Virding’s pure Erlang implementation of Lua 5.3. Unlike other approaches
that rely on NIFs or other mechanisms, this implementation runs entirely on
the BEAM VM while providing excellent sandboxing and integration
capabilities.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://aresluna.org/frame-of-preference/&#34;&gt;Frame of preference — A history of Mac settings, 1984–2004&lt;/a&gt; — very cool. The
&lt;a href=&#34;https://infinitemac.org/&#34;&gt;interactive Macs from Infinite Mac&lt;/a&gt; used in the article are very impressive —
I&amp;rsquo;ve not seen these before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://timeflies.buzz/&#34;&gt;Time Flies&lt;/a&gt; &amp;ndash; I was not at all impressed by this until I &lt;a href=&#34;https://www.youtube.com/watch?v=ljYUvrr-PvE&#34;&gt;watched the
video&lt;/a&gt;. Watch the video.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Going on holiday next week &amp;ndash; whoo!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 214: A bit of care. A bit of craft.</title>
      <link>https://elver.me/weeknotes/214-a-bit-of-care-a-bit-of-craft/</link>
      <pubDate>Sun, 03 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/214-a-bit-of-care-a-bit-of-craft/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;August? Unacceptable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had the misfortune of catching some of &lt;a href=&#34;https://www.themoviedb.org/movie/755898-war-of-the-worlds&#34;&gt;War of the Worlds&lt;/a&gt; with Ice Cube
this week. The part where he uses &amp;ldquo;View Source&amp;rdquo; was my personal highlight
before we turned it off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How would you transfer 1.7GB of photos to your partners computer? We&amp;rsquo;re both
on the same WiFi network, and there&amp;rsquo;s no central shared file storage
available. AirDrop is a reasonable approach isn&amp;rsquo;t it? Peer-to-peer transfer,
job done.&lt;/p&gt;
&lt;p&gt;Nope. AirDrop would consistently work until &lt;em&gt;about&lt;/em&gt; halfway, and then just
stall forever.&lt;/p&gt;
&lt;p&gt;This sort of thing makes me feel completely incompetent as both a computer
person and human. In the end we used &lt;a href=&#34;https://wetransfer.com/&#34;&gt;WeTransfer&lt;/a&gt;. That&amp;rsquo;s right, we pushed
1.7GB of data up and then pulled 1.7GB of data back down. What a time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.yellowduck.be/posts/make-io-inspect-colorful-and-readable-in-elixir&#34;&gt;Make IO.inspect colorful and readable in Elixir&lt;/a&gt; 🌈&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My office has slowly been accumulating more and more stuff, so a tidy up was
due. I&amp;rsquo;ve pretty much only succeeded in making a big ol&amp;rsquo; mess though 🤦‍♂️&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As part of my office tidy, I found some ticket stubs for various gigs I&amp;rsquo;d
attended. Let me tell you, late 2015 to late 2017 was the glory years for live
music and comedy. I&amp;rsquo;d completely forgotten that I&amp;rsquo;d even seen some of these
artists.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Musicians:&lt;/strong&gt; &lt;a href=&#34;https://en.wikipedia.org/wiki/Queens_of_the_Stone_Age&#34;&gt;Queens of the Stone Age&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Eagles_of_Death_Metal&#34;&gt;Eagles of Death Metal&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Father_John_Misty&#34;&gt;Father
John Misty&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Hotelier&#34;&gt;The Hotelier&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Touch%C3%A9_Amor%C3%A9&#34;&gt;Touché Amoré&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Jimmy_Eat_World&#34;&gt;Jimmy Eat World&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Silversun_Pickups&#34;&gt;Silversun
Pickups&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Turin_Brakes&#34;&gt;Turin Brakes&lt;/a&gt;, and &lt;a href=&#34;https://en.wikipedia.org/wiki/Regina_Spektor&#34;&gt;Regina Spektor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comedians:&lt;/strong&gt; &lt;a href=&#34;https://en.wikipedia.org/wiki/John_Robins_(comedian)&#34;&gt;John Robins&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Elis_James_and_John_Robins&#34;&gt;Elis James and John Robins&lt;/a&gt; twice, &lt;a href=&#34;https://en.wikipedia.org/wiki/Daniel_Kitson&#34;&gt;Daniel
Kitson&lt;/a&gt;, and &lt;a href=&#34;https://en.wikipedia.org/wiki/Romesh_Ranganathan&#34;&gt;Romesh Ranganathan&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;(Please visit one of these links, it took ages to link &amp;rsquo;em up 🙏)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://vereis.com/posts/my_programming_journey&#34;&gt;My Programming Journey&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I feel like I &amp;ldquo;lost myself&amp;rdquo; over the years. I got too focused on backend
systems and business problems, too far from the creative drive that
originally motivated me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I feel ya.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/playlist?list=PLHFP2OPUpCeZcPutT9yn4-e0bMmrn5Gd1&#34;&gt;Rails New, a beginner&amp;rsquo;s Ruby on Rails tutorial&lt;/a&gt; &amp;ndash; Glad to see that the Rails
Foundation have produced this beginners series for getting into Rails.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.joshwcomeau.com/svg/friendly-introduction-to-svg/&#34;&gt;A Friendly Introduction to SVG&lt;/a&gt; &amp;ndash; I haven&amp;rsquo;t been through all of this because
concentration, but it&amp;rsquo;s extremely well done. This is the sort of web craft
that is often missing these days 👴&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;👆 is where I found out about the &lt;a href=&#34;https://www.atipofoundry.com/fonts/wotfard&#34;&gt;Wotfard&lt;/a&gt; typeface — very nice. In fact, the
&lt;a href=&#34;https://www.atipofoundry.com&#34;&gt;atipo foundry&lt;/a&gt; has a ton of really nice fonts — I really like &lt;a href=&#34;https://www.atipofoundry.com/fonts/bariol-serif&#34;&gt;Bariol Serif&lt;/a&gt;
and &lt;a href=&#34;https://www.atipofoundry.com/fonts/noway-round&#34;&gt;Noway Round&lt;/a&gt; in particular. Linking here for when I need a new font.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/212-bungie-cords/#:~:text=We%20finally%20gave%20in%20and%20bought%20a%20new%20mattress%20after%20unhappily%20living%20with%20the%20one%20we%20bought%20just%20over%20a%20year%20ago&#34;&gt;The new mattress was delivered&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In an act of hubris I turned down the offer from the delivery men to take it
upstairs for me thinking &amp;ldquo;how heavy can a box be?&amp;rdquo; — turns out extremely
fucking heavy. I could not lift the box. Instead I had to push it up, on its
side, step by step, until I got to the top.&lt;/p&gt;
&lt;p&gt;Despite transportation issues, so far we&amp;rsquo;re deeming it a success. Insofar as
it&amp;rsquo;s comfortable, and we don&amp;rsquo;t have a mound in the middle of the bed anymore.
Now to get rid of the old one&amp;hellip;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.jonoalderson.com/conjecture/its-time-for-modern-css-to-kill-the-spa/&#34;&gt;It&amp;rsquo;s time for modern CSS to kill the SPA&lt;/a&gt; &amp;ndash; I&amp;rsquo;ve been waiting for the &lt;a href=&#34;https://developer.chrome.com/docs/web-platform/view-transitions/&#34;&gt;View
Transitions API&lt;/a&gt; to become supported enough that we can stop the blight of
SPAs we&amp;rsquo;ve all been enduring the last tens years or so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My Plex server went haywire this week. We rely heavily on Plex in our house so
when it goes wrong it can be very annoying.&lt;/p&gt;
&lt;p&gt;It started when I visited the Plex dashboard to find all the media I&amp;rsquo;d added
in approximately the last month missing 🙀 My &amp;ldquo;Continue Watching&amp;rdquo; was also not
showing anything and some new playlists I pinned were also gone.&lt;/p&gt;
&lt;p&gt;Panic immediately sets in as I imagine major disk corruption as the cause. But
I run ZFS, and it has been super solid for me for years, so that seems
unlikely. I find that the files are present on the filesystem.&lt;/p&gt;
&lt;p&gt;I had rebooted the server the day before as a last ditch attempt at fixing
some other unrelated errors, so it seemed likely that this might have
triggered something.&lt;/p&gt;
&lt;p&gt;I did a rescan and nothing seemed to happen at first but after a few minutes
some files did appear, good, but they&amp;rsquo;re are all out of order from when I
added them, bad/annoying.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s then that I start thinking perhaps the Plex SQLite database had become
corrupted instead. I have automatic database backups turned on, so I went
looking for them but found they didn&amp;rsquo;t seem to have run in the last month or
so &amp;ndash; weird. Why would the backups be so old?&lt;/p&gt;
&lt;p&gt;Everything just seemed a bit &lt;em&gt;out of date&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Then it dawned on me that I was looking at a different Plex server. I was
looking at the system installed version. The version installed via &lt;code&gt;apt&lt;/code&gt; years
ago before &lt;a href=&#34;/weeknotes/203-bug-ridden-forms/#:~:text=Moving%20my%20Plex%20installation%20to%20run%20under%20Docker&#34;&gt;migrating to Docker&lt;/a&gt;. It seems that I had left the old package
installed and when I rebooted it started up the &amp;ldquo;old&amp;rdquo; Plex server via
&lt;code&gt;systemd&lt;/code&gt; and (presumably because of the way Docker networking works?) that
server was taking priority over the Docker-installed version as they&amp;rsquo;re both
bound to the same port.&lt;/p&gt;
&lt;p&gt;I stopped the server with &lt;code&gt;sudo systemctl stop plexmediaserver&lt;/code&gt; and &lt;em&gt;my&lt;/em&gt;
Plex sprung back into action! Everything present and correct &amp;ndash; &lt;em&gt;phew&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo apt remove plexmediaserver&lt;/code&gt; ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ispreview.co.uk/index.php/2025/07/uk-government-warns-promoting-the-use-of-vpns-could-attract-fines.html&#34;&gt;UK Government Warns Promoting the Use of VPNs Could Attract Fines&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Our poorly thought out law isn&amp;rsquo;t quite having the effect we wanted it to so
we’re going to use threats instead.&lt;/p&gt;
&lt;p&gt;Well done guys.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://panamaplaylists.com/&#34;&gt;Panama Playlists&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I found the real Spotify accounts of celebrities, politicians, and
journalists. Many use their real names. With a little sleuthing, I could say
with near-certainty: yep, this is them. Heard of the Panama Papers? That
exposed offshore bank accounts. This is about onshore vibes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even if this is fake, still funny.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.yellowduck.be/posts/elixir-usagerules-development-tool&#34;&gt;Elixir UsageRules development tool&lt;/a&gt; &amp;ndash; This is an interesting tool to help
with LLM usage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Have you ever used a food/diet tracking app and hated every moment of it? Me
too. They&amp;rsquo;re all generally terrible in some way. Some have good enough
usability but terrible food databases. Some are awful to enter numbers into &amp;ndash;
essentially their primary goal.&lt;/p&gt;
&lt;p&gt;I accidentally came across &lt;a href=&#34;https://macrofactorapp.com/&#34;&gt;MacroFactor&lt;/a&gt; and it might actually be good 🤔
(gonna cost you though).&lt;/p&gt;
&lt;p&gt;This app does crazy things like focus the text field that you need to type
into automatically speeding up data entry dramatically 😮&lt;/p&gt;
&lt;p&gt;A bit of care. A bit of craft.&lt;/p&gt;
&lt;p&gt;It also apparently does some algorithmic gubbins to suggest what your macros
should be. I&amp;rsquo;m less interested in that, but we&amp;rsquo;ll see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.datacenterdynamics.com/en/news/design-platform-figma-spends-300000-on-aws-daily/&#34;&gt;Design platform Figma spends $300,000 on AWS daily&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Daily. $300,000 per &lt;em&gt;day&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In addition to the high hosting cost, Figma notes that its platform is
entirely dependent on AWS&amp;rsquo; performance and can be affected by outages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Muppets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://proton.me/blog/authenticator-app&#34;&gt;Introducing Proton Authenticator – secure 2FA, your way&lt;/a&gt; &amp;ndash; I am tempted to
try this as I&amp;rsquo;m currently relying on Google Authenticator and we all know how
relying on Google usually ends.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think I&amp;rsquo;m listening to too many podcasts, especially at the gym. Being at
the gym seems to be a podcast listening hour and less &lt;em&gt;working out&lt;/em&gt;. I should
be concentrating on getting &lt;a href=&#34;https://www.urbandictionary.com/define.php?term=swol&#34;&gt;swol&lt;/a&gt;. I also realised that I&amp;rsquo;ve been missing
listening to music as much as I used to. Time for a change.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 213: Here we go again</title>
      <link>https://elver.me/weeknotes/213-here-we-go-again/</link>
      <pubDate>Sun, 27 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/213-here-we-go-again/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After moaning about &lt;a href=&#34;https://castro.fm/&#34;&gt;Castro&lt;/a&gt; (to myself, then to friends, and &lt;a href=&#34;/weeknotes/200-reciprocating-saw/#:~:text=Playing%20audio%20via,with%20the%20car!&#34;&gt;here&lt;/a&gt;) I
decided to contact their support over a weird issue I&amp;rsquo;ve been having when
using it via CarPlay. They said they were going to revisit. We&amp;rsquo;ll see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://antirez.com/news/154&#34;&gt;Coding with LLMs in the summer of 2025 (an update)&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The fundamental requirement for the LLM to be used is: don&amp;rsquo;t use agents or
things like editor with integrated coding agents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is interesting as it goes directly against how most people are
recommending getting the most out of AI, but I find myself also leaning
towards this way of working.&lt;/p&gt;
&lt;p&gt;Maybe I&amp;rsquo;m a control freak, but unscrambling and trying to understand why the
agent has done can take me longer than stepping through manually without an
agent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://git-quick-stats.sh/&#34;&gt;git-quick-stats.sh&lt;/a&gt; &amp;ndash; This might be handy for those of you still counting
lines as the greatest contribution to a project. You know who you are ;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We visited Blackpool on Monday (it was near where we were &lt;a href=&#34;/weeknotes/212-bungie-cords/#:~:text=I%20bought%20a%20second%2Dhand%20armchair%20for%20my%20office%20on%20eBay&#34;&gt;picking the chair
up from&lt;/a&gt;). If you have nothing good to say don&amp;rsquo;t say anything at all, however,
highlights were the very fancy car park in the centre, and the massive Tesco
Extra - really, it has to be seen to be believed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/212-bungie-cords/#:~:text=it%20borderline%20won%E2%80%99t%20fit%20in%20my%20car&#34;&gt;The chair, unbelievably, did fit inside my car&lt;/a&gt; although it was touch and go
for a few minutes &amp;ndash; it was looking unlikely until we flipped it over.&lt;/p&gt;
&lt;p&gt;Getting it inside the house when we got home was a different matter. I was
clearly focussing on the wrong aperture. Thankfully we managed to get it
through the front bay window which is much wider than our front door. Then we
needed to get it up two more floors - we left that ’til the next day. It was a
struggle, but we eventually managed it.&lt;/p&gt;
&lt;p&gt;I have to keep it now.&lt;/p&gt;
&lt;p&gt;It was slightly grubby in places, but overall condition is good, and I&amp;rsquo;ve now
cleaned it up using a foam based cleaner which is fun if nothing else.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://defraenvironment.blog.gov.uk/2025/01/31/introducing-the-deposit-return-scheme-for-drinks-containers/&#34;&gt;Introducing the deposit return scheme for drinks containers&lt;/a&gt; &amp;ndash; this seems
like a good sensible thing which is why it&amp;rsquo;s even more surprising that it&amp;rsquo;s
happening. The devil will be in the detail though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://zeropath.com/blog/idor-crisis-2025&#34;&gt;Authorization Bugs Are Having Their SQL Injection Moment&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why? Because every authorization check is unique to your business logic&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This does not surprise me. We still ignore the basics. No one gets praise for
getting the basics right.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rubytalk.org/t/ann-rails-0-5-0-the-end-of-vaporware/12744&#34;&gt;[ANN] Rails 0.5.0: The end of vaporware!&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve been talking (and hyping) Rails for so long that it’s all wierd to
finally have it out in the open. Mind you, we’re still not talking about a
1.0 release, but the package currently on offer is still something I’m very
comfortable to share with the world. Undoubtedly, there could be more
documentation and more examples, but Real Artists Ship and this piece will
grow in public. Enjoy Rails!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Time really does fly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theverge.com/news/713653/judge-withdraws-cormedix-case-ai-citation-errors&#34;&gt;&amp;ldquo;Errors found in US judge’s withdrawn decision stink of AI&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The opinion cited made-up quotes and misstated case outcomes, errors that AI
tools are known to hallucinate.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here we fucking go. Jesus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Completing the &lt;a href=&#34;https://survey.devographics.com/en-US/survey/state-of-html/2025&#34;&gt;State of HTML 2025 survey&lt;/a&gt; was a sobering activity for someone
who is supposedly a web developer. I don&amp;rsquo;t even HTML anymore.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve started counselling again. Hopefully I can sort myself out before
financial and mental ruin sets in.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 212: Bungie cords</title>
      <link>https://elver.me/weeknotes/212-bungie-cords/</link>
      <pubDate>Sun, 20 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/212-bungie-cords/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jordivillar.com/blog/becoming-irrelevant&#34;&gt;Am I Becoming Irrelevant?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I bought a second-hand armchair for my office on eBay. We pick it up tomorrow,
and it borderline won&amp;rsquo;t fit in my car, so that should be fun. I&amp;rsquo;ve acquired
some bungie cords which will hopefully help me bend the laws of physics.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.mux.com/blog/tailwind-is-the-worst-form-of-css-except-for-all-the-others&#34;&gt;Tailwind is the worst form of CSS, except for all the others&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m happy to report that &lt;a href=&#34;/weeknotes/210-sorry-i-m-sweaty-it-s-genetic/#:~:text=I%20have%20attempted%20to%20split%20up%20my%20Monstera%20into%20several%20plants&#34;&gt;my Monstera cuttings&lt;/a&gt; are doing unexpectedly well
having all started to grow very nice roots.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://justin.searls.co/mails/2025-06&#34;&gt;Searls of Wisdom for June 2025&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We all live in prisons of our own design, and it&amp;rsquo;s worth pondering whether
being liberated from all constraints would result in true freedom or in the
installation of new constraints.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/81-1fQaRMWo?si=1Xn_iByMM_WA-I8G&#34;&gt;Christopher MacArthur Boyd | Scary Times&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been enjoying &lt;a href=&#34;https://www.globalplayer.com/podcasts/42KwqS/&#34;&gt;Here Comes The Guillotine podcast&lt;/a&gt; for some time, and one
of it’s hosts, Christopher MacArthur Boyd (whom I&amp;rsquo;d never heard of before the
podcast) released his standup special on YouTube recently. I enjoyed it very
much.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Did you know that you can &lt;em&gt;gasp&lt;/em&gt; use Linux as your OS if like it better than
macOS. You don&amp;rsquo;t even need to have any ulterior motives.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.arkency.com/stop-concatenating-urls-with-strings/&#34;&gt;Stop concatenating URLs with strings — Use proper tools instead&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your code will be more reliable, easier to maintain and less prone to URL
formatting errors.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some good advice and tips here. People love concatenating strings though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/bitcrowd/tickety-tick/&#34;&gt;tickety-tick&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A browser extension that helps you name branches and write better commit
messages&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An interesting idea, but I think I&amp;rsquo;d prefer to do this from the command line
rather than the browser. You might not.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mensfeld.pl/2025/07/solving-ruby-rdkafka-installation-problem/&#34;&gt;The 60-Second Wait: How I Spent Months Solving the Ruby’s Most Annoying Gem
Installation Problem&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sounds simple, right? It wasn&amp;rsquo;t.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve wondered why more people don&amp;rsquo;t ship statically compiled binaries and now
I know why - bit of a nightmare.&lt;/p&gt;
&lt;p&gt;A lot of work has gone into this ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We finally gave in and bought a new mattress after unhappily living with the
one we bought just over a year ago. If we&amp;rsquo;d been more organised we could&amp;rsquo;ve
returned the current mattress within 100 days, but we were not, so we didn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;Hopefully the new one will be better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://lewiscampbell.tech/blog/250718.html&#34;&gt;NIH Is Far Cheaper Than The Wrong Dependency&lt;/a&gt; &amp;ndash; this is something that I&amp;rsquo;ve
noticed in the Elixir community &amp;ndash; far more willingness to write things from
scratch which someone in the Ruby community would definitely rely on a gem
for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://terriblesoftware.org/2025/07/18/why-most-feedback-shouldnt-exist/&#34;&gt;Why Most Feedback Shouldn&amp;rsquo;t Exist&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you can&amp;rsquo;t point to a specific, concrete impact, then what you have isn&amp;rsquo;t
feedback — it&amp;rsquo;s a preference. And preferences aren&amp;rsquo;t performance issues.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the case with a lot of technical feedback too. &amp;ldquo;Best Practices&amp;rdquo; are
just &amp;ldquo;the way I want to do it&amp;rdquo; under a different name to make it sound
legitimate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I tried &lt;a href=&#34;https://en.wikipedia.org/wiki/Tim_Tam&#34;&gt;Tim Tams&lt;/a&gt; this week. They&amp;rsquo;re absolutely fine, but would recommend you
&lt;a href=&#34;https://en.wikipedia.org/wiki/Penguin_%28biscuit%29&#34;&gt;p-p-p-Pickup a Penguin&lt;/a&gt; instead.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 211: 10 litres of shower gel</title>
      <link>https://elver.me/weeknotes/211-10-litres-of-shower-gel/</link>
      <pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/211-10-litres-of-shower-gel/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We travelled back from dahn sahf on Tuesday. The journey back was far less
pleasant and included a surprise appearance from the low oil level warning
light on my car, and a fair bit of traffic, which meant it took 6 hours
instead 4.&lt;/p&gt;
&lt;p&gt;Still, the trip was a successful one having completed all the tasks we needed
to do, including 8 different appointments. Some decisions to be made now.&lt;/p&gt;
&lt;p&gt;I even managed a trip to the gym one day, and to balance everything, a meal at
our favourite restaurant.&lt;/p&gt;
&lt;p&gt;The trip was all much worse in my head than in reality. As usual. Have you
even been anywhere if you don&amp;rsquo;t stress about it for a couple of weeks
beforehand?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The recent Amazon Prime Day sale got me but I might&amp;rsquo;ve bought stuff I actually
need instead of random guff. What I&amp;rsquo;m saying is I bought 10.8 litres of shower
gel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I also bought an electric blanket 🥶&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.prateekcodes.dev/rails-adds-association-deprecation/&#34;&gt;Rails 8.1 adds association deprecation to safely remove unused relationships&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is welcome and interesting feature 👏 It does feels like a plaster
though. As I&amp;rsquo;ve said before, so much refactoring is difficult/dangerous in
Ruby because we can&amp;rsquo;t be sure we&amp;rsquo;ve caught all call sites when making changes,
and associations are only a small part of the problem. Still, very welcome I&amp;rsquo;d
say.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jacob.gold/posts/serving-200-million-requests-with-cgi-bin/&#34;&gt;Serving 200 million requests per day with a cgi-bin&lt;/a&gt; &amp;ndash; Do you all know what
a &lt;code&gt;cgi-bin&lt;/code&gt; is?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Three more builders this week. The first was in the house maybe 6 minutes, and
was quickly onto payment terms. The second was very nice, but seemed like a
construction version of George Burns. And the third seemed &amp;ldquo;OK&amp;rdquo; but confirmed
the appointment an hour before, on a Sunday.&lt;/p&gt;
&lt;p&gt;It is becoming increasingly clear that there might not be a best option, only
least worst. Everything is pros and cons. Our current favourite remains.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A fair bit of socialising this week compared to most. Friday night dinner with
friends at a new restaurant we hadn&amp;rsquo;t tried before, and a lunch time catch-up
with Discoliam in Sheffield on Saturday. Sheffield is further than I
remembered.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 210: Sorry I&#39;m sweaty, it&#39;s genetic!</title>
      <link>https://elver.me/weeknotes/210-sorry-i-m-sweaty-it-s-genetic/</link>
      <pubDate>Sun, 06 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/210-sorry-i-m-sweaty-it-s-genetic/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Three more meetings with builders this week&amp;hellip;it&amp;rsquo;s a surprising amount of work
meeting with builders and discussing extensions you can&amp;rsquo;t really afford.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Started off the week with yet another escape into the cinema, this time &lt;a href=&#34;https://www.themoviedb.org/movie/1122099-the-ballad-of-wallis-island&#34;&gt;The
Ballad of Wallis Island&lt;/a&gt;. I cannot say enough good things about this film. It
simply doesn&amp;rsquo;t put a foot wrong. I&amp;rsquo;ve been a fan of &lt;a href=&#34;https://en.wikipedia.org/wiki/Tim_Key&#34;&gt;Tim Key&lt;/a&gt; for quite a
while but &lt;a href=&#34;https://en.wikipedia.org/wiki/Tom_Basden&#34;&gt;Tom Basden&lt;/a&gt; was fairly unknown to me &amp;ndash; what a talented pair they
are. Tom Basden wrote a whole album of songs for the film as well as
co-writing and starring. &lt;a href=&#34;https://en.wikipedia.org/wiki/Sian_Clifford&#34;&gt;Sian Clifford&lt;/a&gt; delivers as she usually does too.
Loved it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On Thursday we both went to see Jurassic Park Rebirth. You know what it is,
but at least it doesn&amp;rsquo;t have Chris Pratt in it. Fairly enjoyable nonsense.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Four films in two weeks &amp;ndash; procrastination mode enabled ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Whilst in Brighton I discovered &lt;a href=&#34;https://dalstons.com/&#34;&gt;Dalston&amp;rsquo;s Soda&lt;/a&gt; &amp;ndash; they&amp;rsquo;re fantastic so I
bought a mixed box to try. Impressively low calorie too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=bBU7gVNqVFw&#34;&gt;Registers Explained - Vim Tips &amp;amp; Tricks - Stop Losing Text in Vim&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve never understood/never taken the time to understand Vim registers. Now I
have. As you&amp;rsquo;d expect they&amp;rsquo;re extremely full featured and overwhelming, but at
their core fairly easy to grok.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, &lt;a href=&#34;https://www.reddit.com/r/neovim/comments/1lp9skj/paste_without_copying_into_register_when/&#34;&gt;I found out&lt;/a&gt; that if you paste using &lt;code&gt;P&lt;/code&gt; instead of &lt;code&gt;p&lt;/code&gt;
the default register doesn&amp;rsquo;t get overwritten by the text onto which you&amp;rsquo;re
pasting. I&amp;rsquo;ve had this problem for years and I&amp;rsquo;ve just lived with.&lt;/p&gt;
&lt;p&gt;This is what makes Reddit hard to give up; it is actually useful occasionally.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/jordelver/e890777d40bf443d20ae93cf58fe310c&#34;&gt;kelvinauta/remove_comments.lua&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This function removes all comments from your code using treesitter in nvim.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nice example of Neovim Lua APIs.&lt;/p&gt;
&lt;p&gt;(It actually doesn&amp;rsquo;t work as I would expect, leaving behind whitespace etc,
but it&amp;rsquo;s I still think it a valuable demonstration.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I caught up with some of the Glastonbury coverage over last week. I found most
of it a bit lack lustre to be honest.&lt;/p&gt;
&lt;p&gt;However, &lt;a href=&#34;https://www.youtube.com/watch?v=3rykqo4uc3o&#34;&gt;Dog Dribble by Getdown Services&lt;/a&gt; is brilliant. I&amp;rsquo;m obsessed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I re-potted a load of my indoor plants this week. I have attempted to split up
my &lt;a href=&#34;https://en.wikipedia.org/wiki/Monstera&#34;&gt;Monstera&lt;/a&gt; into several plants (thanks YouTube!). One of the cuttings has
already started sprouting roots so it&amp;rsquo;s looking good so far. It will take a
while to see what else has survived and what I&amp;rsquo;ve killed off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://infosecwriteups.com/burn-it-with-fire-how-to-eliminate-an-industry-wide-supply-chain-vulnerability-12515516fb56?gi=e6037f4e9be1&#34;&gt;Burn It With Fire: How to Eliminate an Industry-Wide Supply Chain
Vulnerability&lt;/a&gt; &amp;ndash; this sounds like a lot of work, respect.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In an attempt to take my exercise regime more seriously I decided that I need
to work on being able to get into a full squat unaided and without weight.
This is often referred to as the resting squat.&lt;/p&gt;
&lt;p&gt;Long story short I started some stretches and now have strained muscles in my
feet. &lt;a href=&#34;https://www.youtube.com/watch?v=qtjqh6IpIbU&#34;&gt;The lesson is never try&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://andre.arko.net/2025/06/30/you-should-delete-tests/&#34;&gt;You should delete tests&lt;/a&gt; &amp;ndash; I could not agree more. Good luck convincing your
colleagues though!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We drove down to Somerset on Sunday for a visit to the old country. I spent
most of the week feeling a low-level anxiety as a result. Not sure why. I was
dreading the drive but that turned out to be easy enough. I&amp;rsquo;ve got a few
appointments to deal with whilst I&amp;rsquo;m here, which I am also not looking forward
to, and I don&amp;rsquo;t know what will come of those. It should at the very least
provide an opportunity to catch-up with a few people.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://write.as/conjure-utopia/lets-say-youre-working-in-tech-and-you-have-a-technical-role-youre-a&#34;&gt;I want to leave tech: what do I do?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imagination alone is never sufficient to create change, but it&amp;rsquo;s always
necessary. Ultimately though, finding your space of agency is your own
responsibility: nobody can do it for you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Shame.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 209: Twenty minute episode</title>
      <link>https://elver.me/weeknotes/209-twenty-minute-episode/</link>
      <pubDate>Sun, 29 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/209-twenty-minute-episode/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gitignore.0x00.cl/&#34;&gt;GUItignore&lt;/a&gt; &amp;ndash; handy for creating your &lt;code&gt;.gitignore&lt;/code&gt; file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://basicappleguy.com/basicappleblog/macos-icon-history&#34;&gt;MACOS ICON HISTORY&lt;/a&gt; &amp;ndash; I&amp;rsquo;ll leave it you to decide whether things have gotten
better or worse.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Two films at the cinema this week, very unusual. These days I&amp;rsquo;m often
reluctant to go to the cinema due to people. Leaving the house is apparently
good for you though, alas.&lt;/p&gt;
&lt;p&gt;First up was &lt;a href=&#34;https://www.themoviedb.org/movie/1100988-28-years-later&#34;&gt;28 Years Later&lt;/a&gt; — I&amp;rsquo;ve been waiting for this to come out for
some time being a big fan of &lt;a href=&#34;https://www.themoviedb.org/movie/170-28-days-later&#34;&gt;28 Days Later&lt;/a&gt;. There are so many wangs in this
film. No spoilers, but the ending was unexpected to say the least. Shout out
to &lt;a href=&#34;https://www.movie-locations.com/movies/0/28-Years-Later.php#:~:text=The%20road%20twisting%20between%20sheer%20cliffs%2C%20is%20the%20B3135%20winding%20its%20way%20through%20famous%20Cheddar%20Gorge%20in%20the%20Mendip%20Hills%2C%20near%20the%20village%20of%20Cheddar&#34;&gt;Cheddar Gorge&lt;/a&gt; (if you&amp;rsquo;ve never been it&amp;rsquo;s absolutely fantastic).&lt;/p&gt;
&lt;p&gt;Second was &lt;a href=&#34;https://www.themoviedb.org/movie/575265-mission-impossible-the-final-reckoning&#34;&gt;Mission: Impossible - The Final Reckoning&lt;/a&gt;. I could barely
remember what The Entity was supposed to be. Needless to say, a small sleep
was had. The whole film revolves around the stunts that Tom fancied doing that
day.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.yellowduck.be/posts/understanding-and-using-stacktrace-0-in-elixir&#34;&gt;TIL about Elixir&amp;rsquo;s &lt;code&gt;__STACKTRACE__/0&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://kobrakai.de/kolumne/entity-status-history&#34;&gt;Entity status history using Ecto&lt;/a&gt; &amp;ndash; Check out the complete lack of explicit
conditionals in this code. Lovely stuff.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve read all but one of the &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Murderbot_Diaries&#34;&gt;The Murderbot Diaries&lt;/a&gt; books because I saw buzz
about them online a few years ago and they&amp;rsquo;re an easy read and short
(especially good when you&amp;rsquo;re trying to meet your yearly book goal!).&lt;/p&gt;
&lt;p&gt;Saying that, I&amp;rsquo;m not sure they&amp;rsquo;re &lt;em&gt;that&lt;/em&gt; good. But they certainly are ripe for
TV adaptation, so I&amp;rsquo;ve been watching &lt;a href=&#34;https://www.themoviedb.org/tv/241554-murderbot&#34;&gt;Murderbot&lt;/a&gt;, and &lt;em&gt;it is&lt;/em&gt; fun in places.&lt;/p&gt;
&lt;p&gt;20 minute episodes though &amp;ndash; Come. On.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://nmn.gl/blog/ai-and-programmers&#34;&gt;Why Good Programmers Use Bad AI&lt;/a&gt; &amp;ndash; sad but true. The craft is gone. Only
results matter, and probably always did.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/finnvoor/yap&#34;&gt;yap&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A CLI for on-device speech transcription using Speech.framework on macOS 26&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;macOS Tahoe will be including new speech transcription APIs, and &lt;code&gt;yap&lt;/code&gt;
(excellent name) will help you use them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had no idea that Apple Notes could have extensions, but apparently it can
&amp;ndash; &lt;a href=&#34;https://www.pronotes.app&#34;&gt;ProNotes&lt;/a&gt;. Giving it a whirl.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.carlolobrano.com/posts/2025-06-13-neovim-trick-contextual-code-snippets-for-better-code-notes/&#34;&gt;Neovim custom function: Contextual Code Snippets for Better Code Notes&lt;/a&gt; &amp;ndash;
This is a nice example of customising Neovim to your exact workflow and what&amp;rsquo;s
possible with the Neovim Lua API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When I compose these weeknotes I need to create a lot of links. I &lt;a href=&#34;/weeknotes/57-crimping-automatically/#:~:text=The%20posts%20on%20this%20website%20are%20written%20in%20Markdown%2C%20using%20reference%2Dstyle%20links%20which%20means%20I%20can%20wrap%20the%20link%20text%20in%20square%20brackets%20and%20then%20list%20the%20URLs%20at%20the%20bottom%20of%20the%20page.%20I%20really%20like%20this%20as%20it%20stops%20the%20main%20text%20getting%20cluttered%20up%20with%20URLs.&#34;&gt;prefer the
reference-style Markdown links&lt;/a&gt; because they don&amp;rsquo;t mess up the flow of text,
but, they are cumbersome to write.&lt;/p&gt;
&lt;p&gt;Inspired by &lt;a href=&#34;/weeknotes/209-twenty-minute-episode/#:~:text=Neovim%20custom%20function%3A%20Contextual%20Code%20Snippets%20for%20Better%20Code%20Notes%20%E2%80%93%20This%20is%20a%20nice%20example%20of%20customising%20Neovim%20to%20your%20exact%20workflow%20and%20what%E2%80%99s%20possible%20with%20the%20Neovim%20Lua%20API.&#34;&gt;the article above&lt;/a&gt; I decided to see if &lt;a href=&#34;https://docs.anthropic.com/en/docs/claude-code/overview&#34;&gt;Claude Code&lt;/a&gt; could create
a Neovim reference link helper function that I&amp;rsquo;ve been thinking about for a
while, but that I never got around to.&lt;/p&gt;
&lt;p&gt;(I&amp;rsquo;m sure that fuller-featured solutions exist for this problem but I haven&amp;rsquo;t
explored them yet, that&amp;rsquo;s a bigger project for how to handle Markdown more
effectively generally.)&lt;/p&gt;
&lt;p&gt;So I wrote a prompt for the problem and my proposed solution for how it should
work and it got something working with some back and forth. The whole thing
probably took half and hour.&lt;/p&gt;
&lt;p&gt;Then came the inevitable bugs and edge cases: it doesn&amp;rsquo;t work if the text to
be linked spans multiple lines, and sometimes it adds a random newline in the
output and I don&amp;rsquo;t know why.&lt;/p&gt;
&lt;p&gt;Still, I&amp;rsquo;ve been reading a few articles about &amp;ldquo;how to use AI&amp;rdquo; and this is the
one of the things many articles mentioned — using AI to write code you would
never write yourself.&lt;/p&gt;
&lt;p&gt;Even if you think we shouldn&amp;rsquo;t be writing &amp;ldquo;production&amp;rdquo; code with AI, it&amp;rsquo;s hard
to argue against using it for tasks such as this. It gets you &lt;em&gt;most&lt;/em&gt; of the
way and that is valuable even though I think I&amp;rsquo;ve spent more time debugging
than it took to create the first version of the code!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://simonwillison.net/2025/Jun/23/phoenix-new/&#34;&gt;Phoenix.new is Fly’s entry into the prompt-driven app development space&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://code.dblock.org/2025/06/21/using-claude-swarm-to-upgrade-ruby-projects.html&#34;&gt;Using Claude-Swarm to Upgrade Ruby Projects&lt;/a&gt; &amp;ndash; this is interesting even
though I don&amp;rsquo;t really understand it! Why do you need multiple agents, can&amp;rsquo;t
you give a single agent all the context and instruction they need?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://metaredux.com/posts/2025/06/02/weird-ruby-anonymous-heredocs.html&#34;&gt;Weird Ruby: Anonymous Heredocs&lt;/a&gt; &amp;ndash; Ruby is indeed weird.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 208: Hangxiety</title>
      <link>https://elver.me/weeknotes/208-hangxiety/</link>
      <pubDate>Sun, 22 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/208-hangxiety/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I finished &lt;a href=&#34;https://www.themoviedb.org/tv/90972-station-eleven&#34;&gt;Station Eleven&lt;/a&gt; &amp;ndash; very good indeed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A week dominated by Brighton Ruby as you&amp;rsquo;d expect. Despite my
haven&amp;rsquo;t-been-on-a-train-in-ages anxiety the journey to and from Brighton
passed without incident. Brighton remains the same; once a year is plenty.&lt;/p&gt;
&lt;p&gt;There weren&amp;rsquo;t any &amp;ldquo;bad talks&amp;rdquo; from my point of view this year, but conversely
nothing surprised or interested me very much either. I&amp;rsquo;m sure that says more
about me than the conference.&lt;/p&gt;
&lt;p&gt;It was great to meetup with various folk and chat about the &lt;del&gt;despise&lt;/del&gt; demise
of our profession. I was very glad that most managed to make it.&lt;/p&gt;
&lt;p&gt;As usual I came away with a feeling similar to that of &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Hangxiety&#34;&gt;hangxiety&lt;/a&gt;&amp;rdquo; despite
tea-totalling the whole thing. Did I say something inappropriate? Did I not
make enough effort? The ego is powerful.&lt;/p&gt;
&lt;p&gt;Still, there is next year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://en.wikipedia.org/wiki/Three_UK&#34;&gt;Three&lt;/a&gt; (who &lt;a href=&#34;https://en.wikipedia.org/wiki/SMARTY&#34;&gt;SMARTY&lt;/a&gt; use) signal around these parts seem to be &lt;a href=&#34;/weeknotes/206-powerful-and-overwhelming/#:~:text=I%20decided%20to%20order%20a%20Smarty%20SIM%20card%20to%20evaluate&#34;&gt;worse
than I&amp;rsquo;d expected&lt;/a&gt;. I guess I’ll just have to wait until Trump Mobile is
launched in the UK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://arrowsmithlabs.com/blog/did-contexts-kill-phoenix&#34;&gt;Did contexts kill Phoenix?&lt;/a&gt; &amp;ndash; This is a tricky one because Phoenix certainly
contains a lot less magic than Rails, and Elixir less than Ruby. The problem
is that the magic did initially pull me towards Ruby and Rails, but later
pushed me away.&lt;/p&gt;
&lt;p&gt;This seems to argue that it&amp;rsquo;s harder to get started with Phoenix than Rails
which I think is broadly true, but with the advent of A.I. is getting started
the difficult part any more? Will A.I. be maintaining the code or will humans?&lt;/p&gt;
&lt;p&gt;On Phoenix&amp;rsquo;s popularity.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But we Phoenicians must admit that the framework, now in its twelfth year,
never really took off like, say, Rails before it. It remains a niche
technology with a small but loyal following, and it will probably stay that
way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I agree with this statement, but I also don&amp;rsquo;t think the success of Rails can
be replicated. It was of it&amp;rsquo;s time, in the right place, at the right time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href=&#34;https://marlacummins.com/adhd-burnout-part-one/&#34;&gt;definition of ADHD burnout&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;a response to chronic workplace stressors that has not been successfully
managed, marked by emotional exhaustion, cynicism, and a reduced sense of
accomplishment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Exhaustion, cynicism, and a reduced sense of accomplishment eh, sounds
familiar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amy Hupe&amp;rsquo;s talk &amp;ldquo;Systems of Harm&amp;rdquo; at Brighton Ruby reminded me of Patrick
McKenzie’s &lt;a href=&#34;https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/&#34;&gt;&amp;ldquo;Falsehoods Programmers Believe About Names&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 207: Pilgrimage</title>
      <link>https://elver.me/weeknotes/207-pilgrimage/</link>
      <pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/207-pilgrimage/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The yearly pilgrimage to Brighton for &lt;a href=&#34;https://brightonruby.com/&#34;&gt;Brighton Ruby&lt;/a&gt; is happening next week.
I&amp;rsquo;m not particularly interested in the content (despite knowing how much works
goes into organising an event like this, for which I&amp;rsquo;m grateful). As usual
it&amp;rsquo;s an excuse to spend time with Ruby friends instead.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m glad that many of the usual gang are making it this year, but I need to
set my expectations to avoid disappointment. People move on, jobs change,
groups shift. Everything changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been watching &lt;a href=&#34;https://www.themoviedb.org/tv/88052-black-summer&#34;&gt;Black Summer&lt;/a&gt; this week. If you like zombies and shooting
with very little in the way of discernible story, you’ll love this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A couple of weeks ago, after talking about my side project with Harry, I set
myself an arbitrary deadline in the hope of spurring on development. The
deadline was Brighton Ruby. Two weeks is enough time to get something done,
but not so much that it feels never ending.&lt;/p&gt;
&lt;p&gt;If anything, this arbitrary deadline had the complete opposite effect; I&amp;rsquo;ve
done nothing. I need pills or something. It&amp;rsquo;s very frustrating.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/206-powerful-and-overwhelming/#:~:text=More%20meetings%20planned%20for%20next%20week&#34;&gt;other builder&lt;/a&gt; didn&amp;rsquo;t turn up. The first one sent through a specification
missing most of the work we&amp;rsquo;d discussed. A third seemed completely overwhelmed
by a basic extension and later said he didn&amp;rsquo;t have time. Good start.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went to see &lt;a href=&#34;https://en.wikipedia.org/wiki/Matt_Forde&#34;&gt;Matt Forde&lt;/a&gt; on tour this week. I was very much &lt;em&gt;not&lt;/em&gt; up for it
but I thoroughly enjoyed the show.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was reading &lt;a href=&#34;https://crawshaw.io/blog/programming-with-agents&#34;&gt;How I program with Agents&lt;/a&gt; and this tangential point stood out.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Very few programs ever reach the point that they are heavily used and
long-lived. Almost everything has few users, or is short-lived, or both.
Let’s not extrapolate from the experiences of engineers who only take jobs
maintaining large existing products to the entire industry.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And yet we spend a lot of our time copying the tools, frameworks, and &amp;ldquo;best
practices&amp;rdquo; of massive tech companies. &amp;ldquo;Just don&amp;rsquo;t use it if you don&amp;rsquo;t like it&amp;rdquo;
&amp;ndash; unfortunately few have the option, if you want to work you need to have the
buzzword on your CV.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I installed the &lt;a href=&#34;https://chromewebstore.google.com/detail/livedebugger-devtools/gmdfnfcigbfkmghbjeelmbkbiglbmbpe&#34;&gt;LiveDebugger Chrome extension&lt;/a&gt; which adds the LiveDebugger UI
into Chrome&amp;rsquo;s Developer Tools panel. It makes it far more convenient to use.
Alas I haven&amp;rsquo;t use the debugger much due to my lack of programming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://sky.app/&#34;&gt;Introducing Sky, natural computing for the Macintosh.&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Computers are incredible. But to make them do exactly what you want, you
have to think like a computer. And that&amp;rsquo;s hard.&lt;/p&gt;
&lt;p&gt;Now, with AI, you can chat with computers the same way you talk to people:
natural language. We&amp;rsquo;re on a journey to bring that capability to everything
you can do on your computer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/MacOS_Tahoe&#34;&gt;macOS Tahoe&lt;/a&gt; &amp;ndash; oh my. Hopefully they switch to being &lt;em&gt;actual&lt;/em&gt; designers
instead of just making things pretty by the time it gets released.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://arrowsmithlabs.com/blog/phoenix-contexts-are-simpler-than-you-think&#34;&gt;&amp;ldquo;Phoenix contexts are simpler than you think&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I think this is true, contexts are weirdly misunderstood or and thought
complicated when they’re anything but. I wondered it&amp;rsquo;s likely because they
provoke you into thinking about design, and design is hard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=5dIWtFJYjUE&#34;&gt;I&amp;rsquo;ve decided to allow all cookies&lt;/a&gt; &amp;ndash; I have a lot of sympathy for this.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 206: Powerful and overwhelming</title>
      <link>https://elver.me/weeknotes/206-powerful-and-overwhelming/</link>
      <pubDate>Sun, 08 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/206-powerful-and-overwhelming/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We met the first of our short-listed builders this week, and also visited our
neighbours up the road who have had similar work done by the same company, and
graciously let us have a look around. Now we nervously wait to see what the
quote looks like.&lt;/p&gt;
&lt;p&gt;More meetings planned for next week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://elixir-lang.org/blog/2025/06/02/elixir-outreach-stipend-for-speakers/&#34;&gt;Elixir Outreach stipend for speakers and trainers&lt;/a&gt; &amp;ndash; great idea!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our diet has been fairly boring for a while, necessarily so in some ways, but
I decided to cook something new this week &amp;ndash; Baked Butter Paneer (from &lt;a href=&#34;https://www.amazon.co.uk/gp/product/0241488001/&#34;&gt;Meera
Sodha&amp;rsquo;s Dinner&lt;/a&gt;). I&amp;rsquo;m still not enamoured with Paneer (it&amp;rsquo;s absolutely
&lt;em&gt;fine&lt;/em&gt;), but overall the dish came out well and I will likely make it again,
maybe with some variation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Markdown support in Apple Notes?!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.macrumors.com/2025/06/04/apple-notes-rumored-markdown-support-ios-26/&#34;&gt;Apple Notes Expected to Gain Support for Exporting in Markdown in iOS 26&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Such excitement, much wow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/ruby/comments/1kyqhg5/comment/mv206bx/&#34;&gt;&amp;ldquo;What features would you like to see in Ruby that aren&amp;rsquo;t there currently?&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A complete revamp of pattern matching. More Scala-like. The syntax we have
now is godawful. So bad that people just don&amp;rsquo;t use it and brush pattern
matching off as useless when it’s actually quite awesome.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some interesting answers to this question on &lt;code&gt;/r/ruby&lt;/code&gt;. This one stood out to
me as it mirrors my experience. I love pattern matching in Elixir, but never
use it in Ruby. I think a lot of that is the awful syntax. Ironic from Ruby, a
language admired (and admonished) for it&amp;rsquo;s beauty.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://f2.freshman.tech/guide/what-is-f2.html&#34;&gt;F2&lt;/a&gt; looks very powerful&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;F2 is a cross-platform tool for bulk renaming files and directories on
Linux, macOS, and Windows. It simplifies the renaming process by offering
powerful workflows while prioritizing safety to prevent data loss (such as
overwriting files by accident).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It also looks fairly overwhelming. Noted for posterity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I decided to order a &lt;a href=&#34;https://smarty.co.uk/&#34;&gt;Smarty&lt;/a&gt; SIM card to evaluate. I&amp;rsquo;m not sure EE is worth
it now I&amp;rsquo;ve moved. And I do kinda miss free roaming abroad even though the
sums don&amp;rsquo;t add up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Still &amp;ldquo;working&amp;rdquo; on a side project.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 205: Mostly what I&#39;m watching</title>
      <link>https://elver.me/weeknotes/205-mostly-what-i-m-watching/</link>
      <pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/205-mostly-what-i-m-watching/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tenderlove is at it again: &lt;a href=&#34;https://railsatscale.com/2025-05-21-fast-allocations-in-ruby-3-5/&#34;&gt;Fast Allocations in Ruby 3.5&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://substack.com/home/post/p-164126379&#34;&gt;Letter to Arc members 2025&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the meantime, please know this: we’re not trying to shut Arc down. We
know you use it and rely on it. Many of our family and friends do, too.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This &lt;a href=&#34;/weeknotes/196-expandable-file-folder/#:~:text=which%20I%E2%80%99m%20pretty%20sure%20The%20Browser%20Company%20are%20getting%20bored%20of&#34;&gt;doesn&amp;rsquo;t surprise me&lt;/a&gt; but at least Arc will be receiving regular updates,
for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We finally made a shortlist of builders, and contacted a number of them this
week. Months and months of procrastination solved in a few hours.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Love, Death &amp;amp; Robots Season 4 got better thankfully, but still underwhelming
compared to previous seasons. Recommended episodes: &lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_Love,_Death_%26_Robots_episodes#Volume_IV_(2025):~:text=%22How%20Zeke%20Got%20Religion%22&#34;&gt;Zeke Found Religion&lt;/a&gt;,
&lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_Love,_Death_%26_Robots_episodes#Volume_IV_(2025):~:text=%22The%20Other%20Large%20Thing%22&#34;&gt;The Other Large Thing&lt;/a&gt;, and &lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_Love,_Death_%26_Robots_episodes#Volume_IV_(2025):~:text=10-,%22For%20He%20Can%20Creep%22,-Emily%20Dean&#34;&gt;For He Can Creep&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.themoviedb.org/tv/100088-the-last-of-us/season/2&#34;&gt;The Last of Us Season 2&lt;/a&gt; ended on a cliffhanger after just 7 episodes!&lt;/p&gt;
&lt;p&gt;This is unacceptable!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Last year I became aware of &lt;a href=&#34;https://www.themoviedb.org/tv/90972-station-eleven&#34;&gt;Station Eleven&lt;/a&gt; and I watched the first two
episodes but somewhere along the way I stopped for reasons I can&amp;rsquo;t remember.
So when I saw it mentioned online recently I decided to pick it up again, but
from the start. It&amp;rsquo;s really good. It’s quite slow in a deliberate way. The
acting is great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://artifacts.app/&#34;&gt;Artifacts&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Artifacts is an image + link organizer app for macOS and iOS. A completely
native, local first way to save all that stuff you find across the web.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve been wanting some way to collect inspiration from around the web so I&amp;rsquo;ll
be keeping an eye on this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.swmansion.com/elixir-contributor-summit-2025-shaping-the-future-together-at-software-mansion-cc3271a188eb&#34;&gt;Elixir Contributor Summit 2025: Shaping the Future Together at Software
Mansion&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On May 17th 2025, something special happened for the Elixir community. Right
after ElixirConf EU, we opened the doors of our Kraków office to host the
very first Elixir Contributor Summit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Neovim content is back.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;x&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;lt;C-&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;gt;&amp;lt;C-n&amp;gt;`&amp;lt;/&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;%V&amp;#39;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  desc &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;Search forward within visual selection&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;x&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;?&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;lt;C-&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;gt;&amp;lt;C-n&amp;gt;`&amp;gt;?&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;%V&amp;#39;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  desc &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;Search backward within visual selection&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/628090e9b55f4840a7d875fd8289dbaafca5d45a#diff-d4a1bff0f475826a45916509018f107cd68759c815391939c98a3e9e37173b40&#34;&gt;Easily search within visual selections&lt;/a&gt; using &lt;a href=&#34;https://www.reddit.com/r/neovim/comments/1kv7som/search_within_selection_in_neovim/&#34;&gt;this tip I saw on Reddit&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 204: Randomly joined</title>
      <link>https://elver.me/weeknotes/204-randomly-joined/</link>
      <pubDate>Sun, 25 May 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/204-randomly-joined/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Still waiting on parcels. I live for parcels.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was bored and retail therapy was the solution. Instead of doing something
productive I spent the time trawling eBay and Vinted for the perfect Game Boy
games. They will arrive, I&amp;rsquo;ll test them, and then never pick them up again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL I learnt that you easily define a custom exception and have Phoenix
automatically return a 404 for it.&lt;/p&gt;
&lt;p&gt;Define the exception module.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defmodule&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Foo&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defmodule&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;BarError&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defexception&lt;/span&gt; [&lt;span style=&#34;color:#990073&#34;&gt;:message&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then implement &lt;code&gt;Plug.Exception&lt;/code&gt; for it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defimpl&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Plug.Exception&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;for&lt;/span&gt;: &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Foo.BarError&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; status(_exception), &lt;span style=&#34;color:#990073&#34;&gt;do&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;404&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; actions(_exception), &lt;span style=&#34;color:#990073&#34;&gt;do&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now when &lt;code&gt;Foo.BarError&lt;/code&gt; is raised it will result in a 404 page being shown.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hypercritical.co/2025/05/20/apple-turnaround&#34;&gt;Apple Turnaround&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If we want a different result, it seems like we need different leaders.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Siracusa on Apple.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/fxn/86ad8584d7813caf03dac9222f8dcf41&#34;&gt;fxn/namespaces.md&lt;/a&gt;, a nice write-up of the upcoming Ruby 3.5 feature,
Namespaces. This sounds useful for Ruby.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/Tailscale/comments/1ksy3xy/someone_just_randomly_joined_my_tailnet/&#34;&gt;Someone just randomly joined my Tailnet&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think I became an owner of an organisation I don&amp;rsquo;t own the domain of.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tailscale is still awesome, but this is fairly worrying. Still the open and
responsive comments from the Tailscale team are reassuring, and the defaults
have been changed to stop this happening so easily.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Someone at the local Ruby meetup mentioned both &lt;a href=&#34;https://lmstudio.ai/&#34;&gt;LM Studio&lt;/a&gt; and &lt;a href=&#34;https://ollama.com/&#34;&gt;Ollama&lt;/a&gt; this
week, so I thought I would give them a go. This makes running large language
models locally easy. &lt;em&gt;Which&lt;/em&gt; models to run is another question.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Raycast added experimental support for interacting with local models via
Ollama in their most recent update.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Local models allow you to run nearly any open source LLM locally, on your
machine. Through our new integration with Ollama, you’ll now have access to
more than 100 AI models from various providers ranging from small 135M to
massive 671B parameter models.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m surprised they added support to run local models, but very please. Good
timing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m sad to report that &lt;a href=&#34;/weeknotes/199-tv-heavy/#:~:text=Season%204%20is%20released%2015th%20May&#34;&gt;despite my excitement for Season 4 of Love, Death &amp;amp;
Robots&lt;/a&gt; so far it is quite disappointing compared to what came before 😢&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 203: Bug-ridden forms</title>
      <link>https://elver.me/weeknotes/203-bug-ridden-forms/</link>
      <pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/203-bug-ridden-forms/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Still no closer to &lt;a href=&#34;/weeknotes/202-vibe-despondent/#:~:text=To%20avoid%20the%20parcel%20being%20stolen%20again&#34;&gt;getting my parcel&lt;/a&gt;. Can you believe I&amp;rsquo;ve placed a third
order because I&amp;rsquo;m just sick of waiting and there&amp;rsquo;s no way to retrieve my
parcel. I&amp;rsquo;m aware it will now almost certainly be delivered.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=TbIoE8kp7Cc&#34;&gt;A quick look at LiveView&amp;rsquo;s LiveDebugger!&lt;/a&gt; &amp;ndash; cool project.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quite unbelievably I&amp;rsquo;m still &lt;a href=&#34;/weeknotes/199-tv-heavy/#:~:text=so%20I%20can%20start%20updating%20my%20address%20all%20over%20the%20place&#34;&gt;working on updating my addresses&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;so I can start updating my address all over the place&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On Companies House this is easier said than done. I think it&amp;rsquo;s universally
understood that GDS have done an incredible job on gov.uk. It&amp;rsquo;s fast. It&amp;rsquo;s
easy to use. Something to be proud of even. However, there are lots of
government departments who are still clinging onto the past and you know
you&amp;rsquo;re in trouble when you click a link and end up looking at a completely
different website with an early 2000&amp;rsquo;s vibe.&lt;/p&gt;
&lt;p&gt;Companies House has some of the most confusing, bug-ridden, forms I&amp;rsquo;ve ever
had the misfortune to use. World-class bad forms. They&amp;rsquo;re not even
complicated, we&amp;rsquo;re talking address fields with a few buttons. How are they
messing this up?&lt;/p&gt;
&lt;p&gt;Eventually I pressed the buttons in the correct order by some miracle and it
&lt;em&gt;seems&lt;/em&gt; to have worked now. I hope this will be the end of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another long awaited mini-project got done this week. Moving my Plex
installation to run under Docker. Docker is my preferred way to run software
on my home server these days, especially as I gradually move my config into
git piece by piece.&lt;/p&gt;
&lt;p&gt;We heavily rely on Plex in our house, so I &lt;em&gt;did not&lt;/em&gt; want to break this. These
are the steps I took.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a directory to store Plex config files.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir /opt/appdata/plex
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disabled the &amp;ldquo;Empty trash automatically after every scan&amp;rdquo; in the Plex
settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Turned off the existing Plex server&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl stop plexmediaserver
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Backed up my Plex installation directory just in case&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tar -czvf ~/plex_backup.tar.gz /var/lib/plexmediaserver/Library/
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Found out what the &lt;code&gt;plex&lt;/code&gt; user and group IDs where from the &lt;strong&gt;host&lt;/strong&gt; system.
These need to match what we&amp;rsquo;re going to put in the &lt;code&gt;docker-compose.yml&lt;/code&gt;
config file to stave off any potential permissions issues.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ id plex
uid=113(plex) gid=118(plex) groups=118(plex),44(video)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Created this Docker Compose config&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; version: &amp;#34;3&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; services:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+  plex:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    container_name: plex
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    image: plexinc/pms-docker:latest
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    restart: unless-stopped
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    network_mode: host
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    environment:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - TZ=Etc/UTC
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - PLEX_UID=1000  # `plex` user on the host
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - PLEX_GID=1000  # `plex` group on the host
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - PLEX_CLAIM=&amp;lt;yout-token&amp;gt; # Claim token from https://www.plex.tv/claim/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    volumes:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      # Config
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - /opt/appdata/plex:/config
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+     # Media directories
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - /movies:/movies¬
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - /music:/music¬
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - /tv:/tv¬
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    devices:¬
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+      - /dev/dri:/dev/dri # Intel QuickSync support
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I copied over my existing Plex Library directory to &lt;code&gt;/opt/appdata/&lt;/code&gt; which is
where I&amp;rsquo;ve chosen to store Docker container state.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cp -r /var/lib/plexmediaserver/Library/ /opt/appdata/plex/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I knew I&amp;rsquo;d need to move some files to be accessible to the new Docker
container, but it wasn&amp;rsquo;t clear to me which parts needed to go where. This
worked for me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get Plex claim token from &lt;a href=&#34;https://www.plex.tv/claim/&#34;&gt;https://www.plex.tv/claim/&lt;/a&gt; and add it to the
&lt;code&gt;docker-compose.yml&lt;/code&gt; config. This automatically connects the new Plex server
to your logged in user account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the new container&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up -d plex
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Profit!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All this procrastination and fuss and it worked first time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Late posting this week because we went to the Scottish Highlands for a long
weekend. I&amp;rsquo;ve only been to Edinburgh and Glasgow before now, so this was a
different side of Scotland I hadn&amp;rsquo;t seen before (with the exception of a 9
hour bus tour starting and ending in Glasgow during which I saw a lot of the
inside of a minibus).&lt;/p&gt;
&lt;p&gt;Living further north certainly affords us the opportunity to drive to Scotland
now whereas I would never have considered before. And drive we did, through
some of the most beautiful countryside in this country. We passed through or
near the Yorkshire Dales, Pennines, Lake District, and Highlands. And some
cracking services too 😉&lt;/p&gt;
&lt;p&gt;We stayed in a lovely Airbnb outside of &lt;a href=&#34;https://en.wikipedia.org/wiki/Inverness&#34;&gt;Inverness&lt;/a&gt; and visited several local
tourist attractions, of which there are many, including &lt;a href=&#34;https://en.wikipedia.org/wiki/Loch_Ness&#34;&gt;Loch Ness&lt;/a&gt; (a
little-known small lake), &lt;a href=&#34;https://en.wikipedia.org/wiki/Urquhart_Castle&#34;&gt;Urquhart Castle&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Clava_cairn&#34;&gt;Clava Cairns&lt;/a&gt; (a load of rocks),
&lt;a href=&#34;https://en.wikipedia.org/wiki/Culloden_Viaduct&#34;&gt;Culloden Viaduct&lt;/a&gt; (a load of better organised rocks), and &lt;a href=&#34;https://en.wikipedia.org/wiki/Fort_George,_Highland&#34;&gt;Fort George&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On the way we split up the journey by staying in &lt;a href=&#34;https://en.wikipedia.org/wiki/Perth,_Scotland&#34;&gt;Perth&lt;/a&gt; overnight, but we did
the whole trek in my go on the way back, which is a long way, but not nearly
as bad as I&amp;rsquo;d feared.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Completely unrelated but remember that if you run out of pants whilst on
holiday you can get them sent to an Amazon Locker somewhere along your journey
route 👌&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Back to it. Whatever &amp;ldquo;it&amp;rdquo; is.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 202: Vibe despondent</title>
      <link>https://elver.me/weeknotes/202-vibe-despondent/</link>
      <pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/202-vibe-despondent/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Vibe: Despondent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Someone fly-tipped their &lt;em&gt;Christmas Tree&lt;/em&gt; (a fucking CHRISTMAS TREE in May!)
in our front garden during the night of Saturday to Sunday. It&amp;rsquo;s bad enough
getting rid of your own, nevermind someone elses. Fuckers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I briefly tried out &lt;a href=&#34;https://tidewave.ai/&#34;&gt;Tidewave&lt;/a&gt; this week on an Elixir Phoenix codebase. It was
easy to get going with &lt;a href=&#34;https://claude.ai/download&#34;&gt;Claude Desktop&lt;/a&gt; but works with various editors. I was
impressed until it stopped responding leaving me in limbo, but it was magical
for a while.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remember &lt;a href=&#34;/weeknotes/200-reciprocating-saw/#:~:text=Someone%20stole%20a%20parcel%20from%20my%20doorstep%20on%20Thursday&#34;&gt;my Game Boy parts were stolen from my doorstep&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Well, after some brooding, I decided to re-order the same items again. And so
AliExpress got even more of my money. To avoid the parcel being stolen again,
I decided to ask Evri to deliver the order to a local Post Office for me to
collect instead. I eventually received a notification that it was ready, so
along I pop only to discover that the Post Office is now apparently &amp;ldquo;closed
until further notice&amp;rdquo;. It appears they may have ceased trading. And they have
my parcel. Inside.&lt;/p&gt;
&lt;p&gt;What happens now is anyone&amp;rsquo;s guess, but this is the second parcel with the
same contents that has failed to reach me. Is this a sign?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The idea of not using Google for web search was once inconceivable. Google
completely dominated. I realised that I&amp;rsquo;ve been using Kagi full-time since
July 2023 and I don&amp;rsquo;t miss Google at all. Kagi is not as good as the glory
days of Google, but with A.I. arriving the glory days feel long gone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My advice to you: keep your computers up-to-date. Of course, the problem with
keeping computers current is just how easily software breaks. I suspect I&amp;rsquo;ve
swapped a lot of fixed bugs for a lot of new bugs. So it goes. A double-edged
sword.&lt;/p&gt;
&lt;p&gt;I used &lt;a href=&#34;https://en.wikipedia.org/wiki/Ubuntu_version_history#1804&#34;&gt;Ubuntu 18.04 (Bionic Beaver)&lt;/a&gt; when I set up my home server back in
2018 not for any particular penchant for Ubuntu, but because it seemed easiest
and well-supported as a major player distro, and now it needs to be upgraded
because it is &lt;em&gt;no longer supported&lt;/em&gt;. And hasn&amp;rsquo;t been for a while; don&amp;rsquo;t judge.&lt;/p&gt;
&lt;p&gt;In order to get to where I wanted to be, the latest LTS release of Ubuntu, I
had to upgrade several times from version to version.&lt;/p&gt;
&lt;p&gt;There was a slightly scary moment when going from 18.04 to &lt;a href=&#34;https://en.wikipedia.org/wiki/Ubuntu_version_history#2404&#34;&gt;20.04&lt;/a&gt; where my
&lt;a href=&#34;https://en.wikipedia.org/wiki/ZFS&#34;&gt;ZFS&lt;/a&gt; pool briefly disappeared. The data stored on the pool never seemed at
risk - I have a lot of faith in ZFS to do the right thing - however, I don&amp;rsquo;t
have a lot of faith in myself to not take an interesting situation and turn it
into a disaster. I took my time.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;zpool status&lt;/code&gt; showed the pool was missing:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo zpool status
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;no pools available
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But &lt;code&gt;zpool import&lt;/code&gt; thought the pool was online:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo zpool import
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   pool: storage
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     id: &lt;span style=&#34;color:#099&#34;&gt;13125165091315077677&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  state: ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; status: Some supported features are not enabled on the pool.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; action: The pool can be imported using its name or numeric identifier, though
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        some features will not be available without an explicit &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;zpool upgrade&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; config:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        storage     ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-0  ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sda     ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sdd     ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-1  ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sde     ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sdf     ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          mirror-2  ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sdc     ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            sdb     ONLINE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After some research (typing &amp;ldquo;send help&amp;rdquo; into Claude &lt;em&gt;is&lt;/em&gt; research), a simple
&lt;code&gt;sudo zpool import storage -f&lt;/code&gt; fixed my issues, and the pool was back.
Subsequent upgrades avoided breaking ZFS further thankfully.&lt;/p&gt;
&lt;p&gt;Fair play to &lt;a href=&#34;https://en.wikipedia.org/wiki/Canonical_%28company%29&#34;&gt;Canonical&lt;/a&gt; though, baring that ZFS hiccup the upgrades went
fairly well with no major breakages as I&amp;rsquo;m currently aware. There were a few
things to tidy-up but almost everything is working as before.&lt;/p&gt;
&lt;p&gt;Anyway, I&amp;rsquo;m now running a distro with support until at least 2029.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;During my one of my Ubuntu upgrade cycles I was amused by this message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You have to download a total of 797 M. This download will take about 1 hour
41 minutes with a 1Mbit DSL connection and about 1 day 6 hours with a &lt;strong&gt;56k
modem&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;56k!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/201-game-boy-rollercoaster/#:~:text=The%20Eternaut%20is%20very%20good%20so%20far&#34;&gt;Finished The Eternaut&lt;/a&gt;. It got a bit weird, and a bit less good, but I did
enjoy it overall and will watch Season 2 when it is released.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In other ZFS news, a &lt;a href=&#34;https://github.com/openzfs/zfs/pull/17246&#34;&gt;new &lt;code&gt;zfs rewrite&lt;/code&gt; command was implemented&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For years users were asking for an ability to re-balance pool after vdev
addition, de-fragment randomly written files, change some properties for
already written files, etc. The closest option would be to either copy and
rename a file or send/receive/rename the dataset. Unfortunately all of those
options have some downsides.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I understand it, this should help in particular with RAIDZ vdevs as you can
now just add another disk, and rebalance your data across them, which was a
big limitation of RAIDZ setups, and the reason I went for mirrored vdevs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sickness this week with a 3 day cold. May I be so bold as to say &lt;a href=&#34;https://www.jakemans.com/peppermint/p39006&#34;&gt;Jakeman&amp;rsquo;s
Peppermint&lt;/a&gt; are &lt;em&gt;the best&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had the misfortune to need to create an Amazon AWS IAM user this week. You
know those &amp;ldquo;data breaches&amp;rdquo; we hear about fairly often? I guarantee most of
those are directly related to poor Amazon S3 bucket policies, and Amazon must
share the blame for creating an absolute mess of a system.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 201: Game Boy rollercoaster</title>
      <link>https://elver.me/weeknotes/201-game-boy-rollercoaster/</link>
      <pubDate>Sun, 04 May 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/201-game-boy-rollercoaster/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I finished reading &lt;a href=&#34;https://www.goodreads.com/book/show/223436601-careless-people&#34;&gt;Careless People&lt;/a&gt; by Sarah Wynn-Williams this week about
her time at FaceBook. I&amp;rsquo;ll save you the time &amp;ndash; it&amp;rsquo;s as bad as you think.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://openinframap.org/&#34;&gt;Open Infrastructure Map&lt;/a&gt; &amp;ndash; this is cool.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Open Infrastructure Map is a view of the world&amp;rsquo;s infrastructure mapped in
the OpenStreetMap database.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://claude.ai/&#34;&gt;Claude&lt;/a&gt; is not very good at HTML and CSS. I asked it to create a very
straightforward prototype page and it just couldn&amp;rsquo;t do it. It constantly
flip-flopped back and forth between the various versions it had produced.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know if this is an indictment of HTML and CSS or Claude. Why not both?&lt;/p&gt;
&lt;p&gt;I was getting frustrated by it when it dawned on me how ridiculous that was
given how impossible this was &lt;em&gt;at all&lt;/em&gt; until the last year or so. And fair
dos, it did point me in the right direction.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Game Boy rollercoaster 🎢 this week. I only went and fixed &lt;a href=&#34;/weeknotes/200-reciprocating-saw/#:~:text=discovered%20that%20those%20buttons%20didn%E2%80%99t%20work&#34;&gt;the button issue&lt;/a&gt;!
This is the first time I&amp;rsquo;ve diagnosed and fixed a proper electrical issue, so
I consider it somewhat of a milestone.&lt;/p&gt;
&lt;p&gt;(I&amp;rsquo;ll try to explain what I did, but I&amp;rsquo;m missing a lot real know-how here, so
please bear with).&lt;/p&gt;
&lt;p&gt;When you press a button, the membrane underneath completes a circuit between
two pads on the board, which sends a signal to the CPU. It seemed reasonable
that since &lt;kbd&gt;Select&lt;/kbd&gt;, &lt;kbd&gt;Start&lt;/kbd&gt;, &lt;kbd&gt;A&lt;/kbd&gt;, and &lt;kbd&gt;B&lt;/kbd&gt;
were not working, there was some problem with that signal. The D-pad was
unaffected. So I needed to follow where the signal travelled to see if there
was some break causing button presses to fail.&lt;/p&gt;
&lt;p&gt;On the PCB there are various &lt;a href=&#34;https://en.wikipedia.org/wiki/Via_(electronics)&#34;&gt;&amp;ldquo;vias&amp;rdquo;&lt;/a&gt; (a via is where the circuit travels to
the other side of the board via a small hole) and &lt;a href=&#34;https://en.wikipedia.org/wiki/Test_point&#34;&gt;test points&lt;/a&gt; (used
for&amp;hellip;testing) to allow following the traces around the board. I used a
multimeter in continuity mode to follow the traces from the button pads up to
the CPU.&lt;/p&gt;
&lt;p&gt;Doing this revealed that we had continuity for traces going via a diode
labelled &lt;code&gt;DA1&lt;/code&gt;, but not &lt;code&gt;DA2&lt;/code&gt;. &lt;kbd&gt;Start&lt;/kbd&gt;, &lt;kbd&gt;Select&lt;/kbd&gt;,
&lt;kbd&gt;A&lt;/kbd&gt;, and &lt;kbd&gt;B&lt;/kbd&gt; all went via DA2, so this proved we had a
broken trace somewhere between &lt;code&gt;DA2&lt;/code&gt; and the CPU. Eventually I narrowed it
down between two points which ran under the cartridge slot. I had previously
found some corrosion under the cartridge slot so my theory is that the
corrosion goes further than you can see and that had disrupted the trace.&lt;/p&gt;
&lt;p&gt;I bypassed the broken trace by soldering a small wire between two points on
the board. This restored the buttons!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/trace-bypass.jpg&#34; alt=&#34;Wire running to bypass broken trace&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The only remaining issue then was the power switch. I had to replace the power
switch to get this GBP to turn on. The power switch is a common power failure
issue. I bought replacement switches which are easily soldered to the board,
but the actual plastic tab that you move to turn the console on don&amp;rsquo;t fit
inside the case button as well I would like creating an unreliable contact
between the switch and the button. I decided to try adding a small bit of hot
glue to fill the gap. This went looked to be a good solution at first, but
when attempting to remove the switch from the shell it snapped off 😭&lt;/p&gt;
&lt;p&gt;The only thing to do was replace the whole switch (again), which luckily I had
to hand. However, I did a &lt;em&gt;very bad&lt;/em&gt; job removing the old one, and ripped some
pads from the board in the process. I did fix the pads with some copper tape
and patience though, and soldered a new switch in-place.&lt;/p&gt;
&lt;p&gt;Some more hot glue, and this is the result.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/gbp-rose-red.jpg&#34; alt=&#34;Refurbished Game Boy Pocket in transparent Rose Red&#34;&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not 100% happy with the switch, but I&amp;rsquo;m resisting the urge to mess with it
again right now. Overall, this is a win ✅ My second completed Game Boy has
been a long time coming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.fastcompany.com/91324550/kerning-on-pope-francis-tomb-is-a-travesty&#34;&gt;The kerning on the pope’s tomb is a travesty&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cheryl Jacobsen, a calligrapher and adjunct assistant professor at the
Center for the Book at the University of Iowa, calls the engraving
&amp;ldquo;horrifically bad,&amp;rdquo; noting that “there is no historical reason for spacing
that bad.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tis bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You may have heard of Power over Ethernet (certainly if you&amp;rsquo;ve been following
along here). PoE can supply 15.4 watts of power. Did you know PoE+ is a thing?
It can supply up to 25.5 watts. This is where it starts getting silly. PoE++
increases to 60 watts, but there&amp;rsquo;s more, PoE+++ can do 90 watts!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PoE = 802.3bt Type 1 (15.4 watts max)
PoE+ = 802.3bt Type 2 (25.5 watts max)
PoE++ = 802.3bt Type 3 (60 watts max)
PoE+++ = 802.3bt Type 4 (90 watts max)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We may run out of pluses in a few years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.themoviedb.org/tv/226362-el-eternauta&#34;&gt;The Eternaut&lt;/a&gt; is very good so far. I&amp;rsquo;m on episode 4. Check it out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Because I was supposed to be doing something else, I started looking at
setting up &lt;a href=&#34;https://github.com/qdm12/gluetun&#34;&gt;gluetun&lt;/a&gt; this week.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VPN client in a thin Docker container for multiple VPN providers, written in
Go, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers
built-in.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This allows you to route traffic for your other Docker containers via your VPN
provider of choice. It took a bit of faffing but it seems to be working ok as
far as I can tell. I want to play around with it some more, in particular
testing how the kill switch functionality works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I pulled a muscle in my back this week whilst standing completely still, head
down looking at my phone, at the gym, before I&amp;rsquo;d started my workout.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 200: Reciprocating saw</title>
      <link>https://elver.me/weeknotes/200-reciprocating-saw/</link>
      <pubDate>Sun, 27 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/200-reciprocating-saw/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;TWO HUNDRED posts! 🤩&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://thewirednomad.com/vpn&#34;&gt;How to Use a Tailscale VPN for Remote Work and Travel&lt;/a&gt; &amp;ndash; I haven&amp;rsquo;t read
this, and I probably never will, but it looks interesting for the digital
nomad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A couple of DIY sessions this week albeit at someone else&amp;rsquo;s house. First time
using a reciprocating saw &amp;ndash; quite fun. All fingers accounted for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some Game Boy action this week. I actually brought a Game Boy Pocket back to
life from not turning on at all. Replacing the capacitors and power switch did
the job. Once it had power I re-shelled it, hooked up a new IPS screen, and
gave it new buttons and rubber membranes. Very happy with it. That was until I
tried pressing &lt;kbd&gt;Select&lt;/kbd&gt;, &lt;kbd&gt;Start&lt;/kbd&gt;, &lt;kbd&gt;A&lt;/kbd&gt; or
&lt;kbd&gt;B&lt;/kbd&gt;, and discovered that those buttons didn&amp;rsquo;t work, sadness (the
D-pad was fine). So now I have to figure out what to do.&lt;/p&gt;
&lt;p&gt;The perfectionist in me wants to pursue getting this one working even though I
have many other boards I could substitute in to get this project done. I set a
lot of arbitrary rules for myself which are often self-defeating. More
pragmatism or grit required.&lt;/p&gt;
&lt;p&gt;It is a win that I brought a Game Boy back to life, despite not being fully
functional, but I don&amp;rsquo;t feel it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/196-expandable-file-folder/#:~:text=trying%20out%20Quiche%20Browser&#34;&gt;experiment with Quiche Browser&lt;/a&gt; on iOS is over. Back to Arc for now. I&amp;rsquo;m
already glad I went back.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Someone stole a parcel from my doorstep on Thursday. Obviously the monetary
loss is annoying (although it was low) but it was more annoying/disappointing
knowing that thieves are apparently walking past my door on a regular basis.
Maybe I&amp;rsquo;m annoyed with myself for being naive.&lt;/p&gt;
&lt;p&gt;I hope they enjoy their new Game Boy Pocket shells, I&amp;rsquo;m sure they’ll get good
use out of them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Still, the doorbell camera installation has moved up the priority list.&lt;/p&gt;
&lt;p&gt;Ideally I would like a hardwired PoE doorbell. Sure WiFi is cool, and people
will swear there&amp;rsquo;s no problem with it, but network cables reduce so much
friction. After they are installed of course, because the quicker and easier
thing to do &lt;em&gt;right now&lt;/em&gt; would be to get a WiFi doorbell.&lt;/p&gt;
&lt;p&gt;The thing is, a PoE doorbell is going to need a PoE switch, and I&amp;rsquo;m all out of
them right now considering that entire &amp;ldquo;network&amp;rdquo; currently still comprises of
the Virgin Media Hub supplied to us when we moved in, and it certainly doesn&amp;rsquo;t
have PoE capabilities.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been waiting on doing any proper networking since we moved in for a few
reasons: 1) concern over spending money on networking gear; 2) not wanting to
&amp;ldquo;get it wrong&amp;rdquo; because the network is bigger and more complicated in scope for
this house than the small flat we were living in before; 3) all the decisions
which will need to be made.&lt;/p&gt;
&lt;p&gt;Maybe I should get on with it anyway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.tomshardware.com/peripherals/usb/usb-2-0-is-25-years-old-today-the-interface-standard-that-changed-the-world&#34;&gt;&amp;ldquo;USB 2.0 is 25 years old today — the interface standard that changed the
world&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not old, you&amp;rsquo;re old.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.charpeni.com/blog/how-to-easily-reproduce-a-flaky-test-in-playwright&#34;&gt;How to Easily Reproduce a Flaky Test in Playwright&lt;/a&gt; &amp;ndash; I&amp;rsquo;m still yet to use
Playwright in anger, but these tips sound useful for when I do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It would be great if Apple could make the audio routing(?!) on iOS &amp;ndash; it&amp;rsquo;s a
mess.&lt;/p&gt;
&lt;p&gt;Some examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Taking AirPods out of your ears should stop the music or whatever. Which it
mostly does. But sometimes it doesn&amp;rsquo;t; it just continues playing. Sometimes
I don&amp;rsquo;t notice straight away that sound is emanating from my pocket.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But it gets worse. The app you’re using (&lt;a href=&#34;https://castro.fm/&#34;&gt;Castro&lt;/a&gt; usually in my case)
&lt;em&gt;thinks&lt;/em&gt; the audio is still playing because the play/stop button state is
still set to &amp;ldquo;playing&amp;rdquo;. To stop the audio you have to press play and then
stop again. Terrible UX.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Playing audio via CarPlay is as bad. When I connect my phone to the car what
happens next seems completely random. Sometimes the last thing that was
playing just starts playing, completely unrequested. Sometimes nothing
happens. Sometimes I audio starts playing and I turn it off and IT TURNS
ITSELF BACK ON and I end up in a back and forth fight with the car!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m listening to a podcast. Opening Spotify stops the podcast. Why? I
haven&amp;rsquo;t pressed play in Spotify. Why would the audio stop?&lt;/p&gt;
&lt;p&gt;I open Reddit whilst listening to Spotify. The music stops, presumably
Reddit stole focus from Spotify somehow.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sort yourself out Apple.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been planning a trip. Reddit is proving to be far more useful than the
usual Trip Advisor trawling. Advice from locals is golden.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL Plex allows you to &lt;a href=&#34;https://support.plex.tv/articles/naming-and-organizing-your-tv-show-files/#:~:text=If%20you%20are,of%20the%20article.&#34;&gt;include the TVDB/IMDB show ID in TV show directory
name&lt;/a&gt; to aid in identifying it correctly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you are using the “Plex TV Series” agent, you can optionally include the
TMDB or TVDB show ID in the folder name to improve matching. If you choose
to do that, it must be inside curly braces: ShowName (2020) {tmdb-123456} or
ShowName (2020) {tvdb-123456}, where 123456 is the show ID. An example can
be found at the end of the article.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Handy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 199: TV heavy</title>
      <link>https://elver.me/weeknotes/199-tv-heavy/</link>
      <pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/199-tv-heavy/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The Last of Us is back with Season 2 🙌&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ants have invaded the kitchen. This means I&amp;rsquo;ve been going on a killing spree
every couple of days. I don&amp;rsquo;t like it, but they won&amp;rsquo;t be herded, and they
won&amp;rsquo;t leave.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theverge.com/news/649851/figma-dev-mode-trademark-loveable-dispute&#34;&gt;Trademarking &amp;ldquo;Dev mode&amp;rdquo;&lt;/a&gt; &amp;ndash; nice one, Figma 🙄&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Figma slapped Swedish AI coding startup Loveable with a cease-and-desist
warning for naming one of its new product features “Dev Mode.” It turns out
Figma successfully trademarked the term Dev Mode in November last year,
according to the US Patent and Trademark office, having introduced its own
Dev Mode feature in 2023.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The US Patent and Trademark office doing a fine job, as usual, too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been watching, and enjoying, &lt;a href=&#34;https://www.themoviedb.org/tv/247718-mobland&#34;&gt;MobLand&lt;/a&gt; solely because Tom Hardy is so
excellent in it. However, the Irish accents, especially Helen Mirren, blimey.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gridfinity.xyz/&#34;&gt;Gridfinity&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The modular, open-source grid storage system&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If I ever needed an excuse to get a 3D printer, this is it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If I don&amp;rsquo;t have a list of to-do items in &lt;a href=&#34;https://culturedcode.com/things/&#34;&gt;Things&lt;/a&gt; things don&amp;rsquo;t get done. I put
everything in there. I even retroactively add them so that I know I&amp;rsquo;ve done
something in the day. A way of combating the &amp;ldquo;What have you even done today?&amp;rdquo;
thoughts that plague me.&lt;/p&gt;
&lt;p&gt;But adding items can become laborious so I&amp;rsquo;ve started taking advantage of the
&lt;a href=&#34;https://support.apple.com/en-gb/guide/iphone/iph6d01d862/ios&#34;&gt;iOS Text Replacement&lt;/a&gt; features to add vim-style mnemonics for oft done tasks.
So typing &lt;code&gt;pwo&lt;/code&gt; is changed to &lt;code&gt;Put washing on&lt;/code&gt;, and so on. And, because I&amp;rsquo;m
fancy, I also add an emoji in there because the iOS emoji picker is awful, and
it jazzes-up how everything looks.&lt;/p&gt;
&lt;p&gt;Unexpectedly these text replacements also automagically sync across to macOS,
which is nice ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://paraxial.io/blog/erlang-ssh&#34;&gt;What the Critical Erlang SSH Vulnerability Means for Elixir Developers&lt;/a&gt; &amp;ndash;
This is potentially bad, very bad, but the average application is likely
unaffected, thankfully.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hot air reworking takes more skill than I thought, of course. Still, some
success during the couple of practice sessions I&amp;rsquo;ve engaged in this week.&lt;/p&gt;
&lt;p&gt;The old motherboards arrived from eBay. There is a good variety so I&amp;rsquo;m happy
with the purchase. The only potential issue that I noticed in retrospect is
that they are all quite new, from fairly recent laptops it seems, whereas my
ultimate goal is to apply hot air to boards that are 30+ years old. Whether
that matters is to be determined.&lt;/p&gt;
&lt;p&gt;I did manage to remove fairly large chips from a couple of the boards. I
&lt;em&gt;think&lt;/em&gt; they were &lt;a href=&#34;https://en.wikipedia.org/wiki/Quad_flat_package&#34;&gt;QFP&lt;/a&gt;  chips which are soldered underneath as well as at the
sides. This means (I think) that they soak up a lot of the heat making it more
difficult to melt the solder beneath. Or something.&lt;/p&gt;
&lt;p&gt;Re-applying is not quite as tricky, but predictably pointed to the need for a
microscope - of course it did - something I&amp;rsquo;ve been trying to avoid for a
while now. The pins are just so physically small that it&amp;rsquo;s hard to see if
they&amp;rsquo;re connected or bridged. Paying a mortgage is overrated anyway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It was a nice surprise to see my blog &lt;a href=&#34;https://crbelaus.com/2025/03/31/elixir-external-resources&#34;&gt;name checked&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://endoflife.date/&#34;&gt;endoflife.date&lt;/a&gt; is a nice idea. It is annoying how hard this sort of
information it to find sometimes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;End-of-life (EOL) and support information is often hard to track, or very
badly presented. endoflife.date documents EOL dates and support lifecycles
for various products.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://martinrobbins.substack.com/p/von-6-why-does-britain-feel-so-poor&#34;&gt;Why does Britain feel so poor?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A long time to-do list item was started and partially completed this week &amp;ndash;
changing my business address details &amp;ndash; hurrah!&lt;/p&gt;
&lt;p&gt;The thought of breaking something has kept this on the back-burner for a long
time, but now I&amp;rsquo;ve decided upon and purchased an account with a virtual office
address provider, so I can start updating my address all over the place.&lt;/p&gt;
&lt;p&gt;That will continue next week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL Royal Mail have a service called &lt;a href=&#34;https://www.postoffice.co.uk/mail/poste-restante&#34;&gt;Poste Restante&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imagine being able to pick up your post when you&amp;rsquo;re travelling around the UK
or abroad. Well now you can – thanks to Poste Restante&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Potentially very handy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wrote some code for the first time in quite some time this week. Then it got
hard and my interest waned. Why am I like this?&lt;/p&gt;
&lt;p&gt;Still, I found the use of Anthrophic&amp;rsquo;s Claude 3.5 absolutely invaluable. It&amp;rsquo;s
like pair programming but without the social anxieties attached.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now that I&amp;rsquo;ve finished Love, Death + Robots, and &lt;a href=&#34;/weeknotes/198-hot-air-station/#:~:text=Siracusa%E2%80%99s%20take%20on%20Death%2C%20Love%20%2B%20Robots&#34;&gt;following Siracusa&amp;rsquo;s lead&lt;/a&gt;,
here are my Top 10 favourite episodes, in no particular order.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sonnie&amp;rsquo;s Edge&lt;/li&gt;
&lt;li&gt;Three Robots&lt;/li&gt;
&lt;li&gt;Automated Customer Service&lt;/li&gt;
&lt;li&gt;The Tall Grass&lt;/li&gt;
&lt;li&gt;All Through the House&lt;/li&gt;
&lt;li&gt;Three Robots: Exit Strategies&lt;/li&gt;
&lt;li&gt;Bad Travelling&lt;/li&gt;
&lt;li&gt;Night of the Mini Dead&lt;/li&gt;
&lt;li&gt;Swarm&lt;/li&gt;
&lt;li&gt;Mason&amp;rsquo;s Rats&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Season 4 is released 15th May.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 198: Hot air station</title>
      <link>https://elver.me/weeknotes/198-hot-air-station/</link>
      <pubDate>Sun, 13 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/198-hot-air-station/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.kickstarter.com/projects/clevetura/clvx-1-for-mac-gesture-keyboard&#34;&gt;CLVX 1 for Mac. Gesture Keyboard&lt;/a&gt; &amp;ndash; A keyboard with a trackpad built into
the keys. Not sure how well this would work in practice, but cool nonetheless.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://evanhahn.com/how-big-is-a-kilobyte/&#34;&gt;How big is a kilobyte?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I saw a few people confidently declare that a kilobyte is 1000
bytes—everyone else is wrong. I also saw the opposite. This ignores a lot of
human nuance!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I always thought we used &lt;code&gt;1000&lt;/code&gt; when talking about networks, and &lt;code&gt;1024&lt;/code&gt; when
talking filesystems. Seems I was wrong too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://chartdb.io/&#34;&gt;ChartDB&lt;/a&gt; is pretty swish!&lt;/p&gt;
&lt;p&gt;And self-hostable too for those of you with beards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tld-list.com/&#34;&gt;TLD-LIST&lt;/a&gt; &amp;ndash; Really useful site for comparing domain prices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A friend invited me along to visit a local &amp;ldquo;hackspace&amp;rdquo; this week. They have
all manner of equipment and gadgets there. I&amp;rsquo;m glad I went but it was a pretty
overwhelming experience to be honest, and I felt like a bit of an imposter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.blog/ai-and-ml/llms/what-the-heck-is-mcp-and-why-is-everyone-talking-about-it/&#34;&gt;&amp;ldquo;What the heck is MCP and why is everyone talking about it?&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hypercritical.co/2025/04/10/love-death-robots&#34;&gt;Siracusa&amp;rsquo;s take on Death, Love + Robots&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;They’re not all winners, but I treasure the ones that succeed on their own
terms.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Agreed. I haven&amp;rsquo;t enjoyed all of these episodes, but the ones that &lt;em&gt;are good&lt;/em&gt;
are &lt;em&gt;really&lt;/em&gt; good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Will &lt;a href=&#34;https://en.m.wikipedia.org/wiki/Jevons_paradox&#34;&gt;Jevon&amp;rsquo;s paradox&lt;/a&gt; save us from A.I.?&lt;/p&gt;
&lt;p&gt;Hat tip to &lt;a href=&#34;https://www.relay.fm/radar/316&#34;&gt;Under The Radar #316&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/197-i-m-a-youtuber-now/#:~:text=bought%20a%20hot%20air%20station&#34;&gt;hot air station&lt;/a&gt; was delivered and seems to work fine with a normal
&amp;ldquo;kettle lead&amp;rdquo; as I&amp;rsquo;d hoped (it came with a European plug). I haven&amp;rsquo;t used it
in anger yet as I&amp;rsquo;m waiting on some scrap motherboards from eBay to practice
on before I unleash it on an unsuspecting Game Boy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;However, the fume extractor I ordered at the same time was &lt;em&gt;not&lt;/em&gt; delivered
even though it says it was. This is the first time I&amp;rsquo;ve had an issue with
something not having been delivered from AliExpress but I guess it was
inevitable eventually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.konnorrogers.com/posts/2025/converting-a-postgres-interval-to-an-integer&#34;&gt;Converting A Postgres Interval To An Integer&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Intervals are very convenient, especially when storing the &amp;ldquo;length of time&amp;rdquo;
of a subscription, but subscriptions &amp;ldquo;timer&amp;rdquo; hasn&amp;rsquo;t started yet, and will
start at a future date.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finally got a third party IPS screen to power up on a Game Boy Pocket 🙌&lt;/p&gt;
&lt;p&gt;What special steps did I follow to reach this milestone? None at all. I
followed exactly the same steps as I did for all my other attempts: connected
the ribbon cable and soldered a small wire from the power switch to the
controller board. And this time it worked 🤷‍♂️&lt;/p&gt;
&lt;p&gt;It seems clear that I have some duff Game Boy Colors.&lt;/p&gt;
&lt;p&gt;This is a small step on a path to reduced self-loathing, and has bolstered my
confidence a bit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 197: I&#39;m a YouTuber now</title>
      <link>https://elver.me/weeknotes/197-i-m-a-youtuber-now/</link>
      <pubDate>Sun, 06 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/197-i-m-a-youtuber-now/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Would you use &lt;a href=&#34;https://www.theverge.com/news/642620/trump-tariffs-formula-ai-chatgpt-gemini-claude-grok&#34;&gt;ChatGPT to calculate tariffs with other countries?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Me neither.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theverge.com/tech/635020/av1-streaming-netflix-youtube-google-adoption&#34;&gt;AV1 is supposed to make streaming better, so why isn&amp;rsquo;t everyone using it?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We were meant to go and see a show last Sunday evening, but we couldn&amp;rsquo;t be
arsed. So we didn&amp;rsquo;t. What is being wasteful and what is being an adult with
the agency to make decisions?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My desk has finally been upgraded with the addition of the &lt;a href=&#34;https://www.tindie.com/products/gcormier/megadesk/&#34;&gt;M-m-m-Megadesk&lt;/a&gt;
(Yes, I am persisting with that) and it was not nearly as scary as I
anticipated. The biggest part of the job is getting the controller casing open
in order to swap the PCB over.&lt;/p&gt;
&lt;p&gt;Check out this completely silent timelapse I made of the disassembly process
featuring my big head.&lt;/p&gt;
&lt;iframe
  width=&#34;560&#34;
  height=&#34;315&#34;
  src=&#34;https://www.youtube.com/embed/yYo_EYP9Rig?si=O0lfoPnMu7tGr1V0&#34;
  title=&#34;Disassembling the IKEA Bekant desk controller ready for Megadesk installation&#34;
  frameborder=&#34;0&#34;
  allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34;
  referrerpolicy=&#34;strict-origin-when-cross-origin&#34;
  allowfullscreen&gt;
&lt;/iframe&gt;
&lt;p&gt;The desk now has programmable memory positions which can be accessed via the
⬆️ button. Pressing ⬆️ ⬆️ now lowers the desk to the perfect sitting position
and pressing ⬆️ ⬆️ ⬆️ raises the desk to standing height.&lt;/p&gt;
&lt;p&gt;Nice ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another new app from &lt;a href=&#34;https://sindresorhus.com/&#34;&gt;Sindre Sorhus&lt;/a&gt; — &lt;a href=&#34;https://sindresorhus.com/text-lens&#34;&gt;TextLens&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Extract text from anywhere on your screen. Select any area containing text -
from images, videos, PDFs, or presentations - and instantly convert it to
editable text.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don&amp;rsquo;t need this is as I already have this functionality built-in to
&lt;a href=&#34;https://cleanshot.com/&#34;&gt;CleanShot&lt;/a&gt; but if you&amp;rsquo;re not a CleanShot X user you might. I&amp;rsquo;ve &lt;a href=&#34;/weeknotes/30-quality-of-life-improvement/#:~:text=nice%20utility%20called%20TRex&#34;&gt;previously
mentioned&lt;/a&gt; &lt;a href=&#34;https://trex.ameba.co/&#34;&gt;TRex&lt;/a&gt; which is another alternative.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.aviator.co/blog/stacked-prs-code-changes-as-narrative/&#34;&gt;Stacked PRs: Code Changes as Narrative&lt;/a&gt; &amp;ndash; The best developers I&amp;rsquo;ve worked
with have done this. Small, focussed PRs that tell a story. The worst; just a
grab bag o’ changes they want to merge.&lt;/p&gt;
&lt;p&gt;(And &lt;a href=&#34;/weeknotes/179-tumultuous-week/#:~:text=Squash%20merges%20are%20dirty%20solution%20for%20people%20who%20cannot%20use%20rebase%20%E2%80%9Cmerges%E2%80%9D%20and%20cannot%20keep%20their%20commit%20history%20clean.&#34;&gt;squash merges are still bad&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://phoenixframework.org/blog/phoenix-1-8-released&#34;&gt;Phoenix 1.8 is nearing&lt;/a&gt; and it&amp;rsquo;s another solid release as usual. A couple of
things stood out to me in particular.&lt;/p&gt;
&lt;p&gt;The context guide has been rewritten.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The context guide has been broken apart into a few separate guides that now
better explores data modeling, using ecommerce to drive the examples.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The core team have obviously been listening to community feedback with this
one as I&amp;rsquo;ve seen a fair few people not understand what to do with Contexts,
myself included. The idea of a Context is a good one; separate your data
access from your core logic. It can be confusing knowing how to apply though,
so I think this change is great.&lt;/p&gt;
&lt;p&gt;The second thing is that Phoenix is moving to using &lt;a href=&#34;https://daisyui.com/&#34;&gt;Daisy UI&lt;/a&gt; by default
(although you can, of course, opt out). I came across Daisy UI a while ago and
thought it looked nice but it didn&amp;rsquo;t seen &amp;ldquo;ready&amp;rdquo; yet. It has come a long way.
It won&amp;rsquo;t be the preferred choice for a lot of people I suspect, but there&amp;rsquo;s a
lot to be said for having your web app look fairly decent by default and I
suspect it&amp;rsquo;s quite a big contributing factor when people choose their web app
stack.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Isn&amp;rsquo;t it wild that in 2025 certain requests to eBay are still routed through a
&lt;a href=&#34;https://en.wikipedia.org/wiki/Dynamic-link_library&#34;&gt;DLL&lt;/a&gt;? (look out for &lt;code&gt;eBayISAPI.dll&lt;/code&gt; in the URL).&lt;/p&gt;
&lt;p&gt;eBay must have a hell of an enterprise support contract set up with Microsoft.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://birchtree.me/blog/this-alert-must-die/&#34;&gt;This alert must die&lt;/a&gt; &amp;ndash; it really &lt;em&gt;must&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another thing I&amp;rsquo;ve been meaning to get to for a while since I &lt;a href=&#34;https://github.com/jordelver/dotfiles/pull/2&#34;&gt;refactored my
Neovim config to use lazy.nvim&lt;/a&gt; was to setup completion and LSP. It wasn&amp;rsquo;t as
hard (are you sensing a pattern?) to get the &lt;a href=&#34;https://github.com/jordelver/dotfiles/pull/3&#34;&gt;basics working&lt;/a&gt; as I had
imagined, but it is tricky to know what is working for me as I&amp;rsquo;m not in full
coding mode at the moment.&lt;/p&gt;
&lt;p&gt;I decided to try the &amp;ldquo;NeoVim way&amp;rdquo; for keymaps. Completion is typically
&lt;kbd&gt;Tab&lt;/kbd&gt; and &lt;kbd&gt;Shift&lt;/kbd&gt; + &lt;kbd&gt;Tab&lt;/kbd&gt; for a lot of editors, but
that is not the default for vim. The pattern of &lt;kbd&gt;CTRL&lt;/kbd&gt;-&lt;kbd&gt;n&lt;/kbd&gt;
and &lt;kbd&gt;CTRL&lt;/kbd&gt;-&lt;kbd&gt;p&lt;/kbd&gt; is seen in many places throughout vim and the
makers of &lt;a href=&#34;https://github.com/Saghen/blink.cmp&#34;&gt;blink.cmp&lt;/a&gt; (the completion plugin I&amp;rsquo;m using) think you should
continue that pattern (although you can configure otherwise if you chose).&lt;/p&gt;
&lt;p&gt;So now I have &lt;kbd&gt;CTRL&lt;/kbd&gt;-&lt;kbd&gt;n&lt;/kbd&gt; to navigate to the next item,
&lt;kbd&gt;CTRL&lt;/kbd&gt; - &lt;kbd&gt;p&lt;/kbd&gt; for previous, and &lt;kbd&gt;CTRL&lt;/kbd&gt;-&lt;kbd&gt;y&lt;/kbd&gt;
for accepting the suggestion.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m still getting used to it. Time  will tell whether I revert back to my
&lt;kbd&gt;Tab&lt;/kbd&gt; safe-space.&lt;/p&gt;
&lt;p&gt;Snippets are also something I want to start using, and I am in the process of
setting that up now. Where those are concerned you &lt;em&gt;do&lt;/em&gt; use &lt;kbd&gt;Tab&lt;/kbd&gt; and
&lt;kbd&gt;Shift&lt;/kbd&gt; + &lt;kbd&gt;Tab&lt;/kbd&gt; to navigate through the placeholders.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mypaycalculator.co.uk/&#34;&gt;Take Home Pay / Salary Calculator (2025/2026)&lt;/a&gt; &amp;ndash; This seems like it might be
worth remembering.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gumroad.com/&#34;&gt;Gumroad&lt;/a&gt; have &lt;a href=&#34;https://github.com/antiwork/gumroad&#34;&gt;open sourced their code&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With Gumroad, anyone can earn their first dollar online. Just start with
what you know, see what sticks, and get paid. It&amp;rsquo;s that easy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Because I&amp;rsquo;ve been so successful in my new electronics hobby I&amp;rsquo;m plowing ahead
with even more advanced soldering techniques and I&amp;rsquo;ve bought a hot air station
to aid in the soldering of tiny components, and in particular the removal of
them. I expect this to follow the same unsuccessful path I&amp;rsquo;ve been following
until now, but I guess at least I&amp;rsquo;m trying.&lt;/p&gt;
&lt;p&gt;Also, retail therapy dopamine is super effective.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 196: Expandable file folder</title>
      <link>https://elver.me/weeknotes/196-expandable-file-folder/</link>
      <pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/196-expandable-file-folder/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The number of programmers who don&amp;rsquo;t seem know how a mailing list works is
concerning for the profession.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When machines/nodes are added to your tailnet the keys used are set to expire
&amp;ndash; a reasonable default. However, Tailscale does not tell you when a key is
&lt;em&gt;about to&lt;/em&gt; expire or &lt;em&gt;has&lt;/em&gt; expired.&lt;/p&gt;
&lt;p&gt;This is a long way of telling you I&amp;rsquo;ve lost access to a remote node on my
tailnet. And I won&amp;rsquo;t be able to get access again without physically being in
the same room. Not the end of the world but a lesson I feel I should have seen
coming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you&amp;rsquo;re wondering just how bored I am, and why wouldn&amp;rsquo;t you be, this week I
bought a multi-pack of A6-sized expandable file folders to organise my
conference sticker collection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.charliemonroe.net/a-few-words-about-indie-app-business/&#34;&gt;A few words about indie app business&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My recommendation is to diversify. Don’t just have one app, but also don’t
have 10 apps – you won’t be able to keep up with all of them. Have 2-4 solid
apps. One of them may be the main source of income, but have some fallback
app(s) that can keep you afloat if something like this happens to you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wise words.&lt;/p&gt;
&lt;p&gt;Now just the small task of coming up with a &lt;em&gt;any&lt;/em&gt; single app idea and
mustering the motivation required.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, a modicum of success in one of my projects. &lt;a href=&#34;/weeknotes/195-funky-town/#:~:text=Throwing%20money%20at%20the%20problem&#34;&gt;Money was indeed thrown&lt;/a&gt;
(&lt;a href=&#34;https://www.amazon.co.uk/dp/B003GDX636&#34;&gt;I bought this doo-dad&lt;/a&gt;) and I have managed to mount some of my office
artwork in a satisfactory way. But boy, did I fuck it up a lot first. This is
what test pieces of mounting board are for. Always buy extra.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.eff.org/deeplinks/2025/03/meet-rayhunter-new-open-source-tool-eff-detect-cellular-spying&#34;&gt;Meet Rayhunter: A New Open Source Tool from EFF to Detect Cellular Spying&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rayhunter is a new open source tool we&amp;rsquo;ve created that runs off an
affordable mobile hotspot that we hope empowers everyone, regardless of
technical skill, to help search out CSS around the world.&lt;/p&gt;
&lt;p&gt;CSS (also known as Stingrays or IMSI catchers) are devices that masquerade
as legitimate cell-phone towers, tricking phones within a certain radius
into connecting to the device rather than a tower.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gpanders.com/blog/whats-new-in-neovim-0-11/&#34;&gt;What&amp;rsquo;s New in Neovim 0.11&lt;/a&gt; &amp;ndash; a new major release of Neovim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://badsoftwareadvice.substack.com/p/how-to-handle-working-software&#34;&gt;How to handle working software&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You have stumbled onto the dark matter of our industry - our ultimate
goal and worst nightmare: working software.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve felt this exact thing, but not often, which is a sad state of affairs
indeed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/179-tumultuous-week/#:~:text=Can%20you%20trust%20a%20bank%20who%20can%E2%80%99t%20correctly%20provision%20your%20bank%20account%3F&#34;&gt;More bank account incompetence&lt;/a&gt; &amp;ndash; two examples this time.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The bank have decided it&amp;rsquo;s important that I accept a dialog in their iOS
app which would let me accept payments via my phone. I won&amp;rsquo;t be doing this,
and I don&amp;rsquo;t want to give you permission. Of course, there is no way to say
&amp;ldquo;no&amp;rdquo; they just re-prompt you until the end of time. It&amp;rsquo;s a good job I don&amp;rsquo;t
need to use the app very often.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Banks are required to collect personal information for &amp;ldquo;checks&amp;rdquo;. I
understand this. But if you&amp;rsquo;re going to ask for it it would be cool if your
app worked when trying to submit it, yeah?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Is the 1% extra interest I&amp;rsquo;m receiving worth this?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been trying out &lt;a href=&#34;https://quiche.industries/browser/&#34;&gt;Quiche Browser&lt;/a&gt; (terrible name) on iOS as a replacement
for Arc Mobile which I&amp;rsquo;m pretty sure The Browser Company are getting bored of.
I&amp;rsquo;m not loving it so far. I will persist for a bit longer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mattgadient.com/x264-vs-x265-vs-vp8-vs-vp9-examples/&#34;&gt;Encoder Comparison &amp;ndash; x264 vs x265 vs VP8 vs VP9&lt;/a&gt; &amp;ndash; Compare different codecs
interactively, nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Last week I decided to return one of the &amp;ldquo;non-working&amp;rdquo; Game Boy Color screens
to whence it came. The helpful support person said they would check it over
when it arrived back with them, and guess what? It worked. They hooked it up,
and it worked.&lt;/p&gt;
&lt;p&gt;Whilst it&amp;rsquo;s good to know the unit it definitely working, this lays the blame
for it not working with my GBCs squarely on my shoulders. A long email thread
ensued and they were very helpful in trying to get it working for me, alas
they were also stumped. Still, I have some generic advice and vague plan on
how to move forward but I am not optimistic. And, of course, I spent more
money.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 195: Funky town</title>
      <link>https://elver.me/weeknotes/195-funky-town/</link>
      <pubDate>Sun, 23 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/195-funky-town/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My slow puncture was repaired. You can stop worrying now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been in a self-destructive funk most of the week for no reason in
particular other than too much time in my own head. A friend asked me if I was
bored not having work at the moment. Sure, but I&amp;rsquo;m bored when &lt;em&gt;in&lt;/em&gt; work too.
The differentiator being not having an income.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I tried my hand at mounting and framing some artworks that I&amp;rsquo;ve had in folders
for some years. It didn&amp;rsquo;t go well. YouTube makes everything look too easy.
Throwing money at the problem and trying again soon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We took a mid-week trip to &lt;a href=&#34;https://en.wikipedia.org/wiki/Helmsley&#34;&gt;Helmsley&lt;/a&gt; in North Yorkshire and spent a few hours
strolling around. It&amp;rsquo;s a lovely little place in the middle of beautiful
countryside if you&amp;rsquo;re ever in the area.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Game Boy updates: This hobby might not be for me 😪 No real progress and not
sure how to move anything forward.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As I&amp;rsquo;ve said before I bought various cheap-o temperature sensors to add to my
future-potential-home-automation-nightmare Zigbee network. I paired them to
the network as temporary nodes so that I could compare what values they output
over time and see if they are aligned in what temperature and humidity they
think the room is.&lt;/p&gt;
&lt;p&gt;I spent most of the week procrastinating over creating a graph because I don&amp;rsquo;t
know why. When I sat down and actually looked at how to do it, it was a piece
of piss, and done in 20 minutes. Jesus.&lt;/p&gt;
&lt;p&gt;And now I have a graph.&lt;/p&gt;
&lt;p&gt;Conclusion, they all report about the same and does it even matter anyway?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://kyrylo.org/html/2024/10/25/why-does-target-blank-have-an-underscore-in-front.html&#34;&gt;&amp;ldquo;Why does target=&amp;quot;_blank&amp;rdquo; have an underscore in front?&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://organicmaps.app/&#34;&gt;Organic Maps&lt;/a&gt; for those wanting to avoid the big tech guys.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Organic Maps is one of the few applications nowadays that supports 100% of
features without an active Internet connection. Install Organic Maps,
download maps, throw away your SIM card, and go for a weeklong trip on a
single battery charge without any byte sent to the network.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/as-code&#34;&gt;&amp;ldquo;As Code&amp;rdquo;&lt;/a&gt; &amp;ndash; Not the overall point of the post, but this quote stood out to
me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some unsolicited business advice: don&amp;rsquo;t create new market categories, enter
existing ones and let your competitors bear the cost of educating the
market.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Say that you were becoming border-line obsessed with sourcing a Zigbee-capable
smart power socket from a &lt;a href=&#34;https://www.ikea.com/&#34;&gt;well-known manufacturer/retailer&lt;/a&gt; because it has
energy measuring capabilities and is “available” at a very reasonable price
which you think makes it the least likely option to burn your house down, then
you might find &lt;a href=&#34;https://easyrebuild.com/stock?country=gb&amp;amp;itemNo=805.698.42&#34;&gt;this website&lt;/a&gt; helpful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://stokerpostgresql.blogspot.com/2025/02/how-postgresqls-aggregate-filter-will.html&#34;&gt;&amp;ldquo;How PostgreSQL&amp;rsquo;s Aggregate FILTER Will Spoil You&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What can&amp;rsquo;t Postgres do?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After &lt;a href=&#34;/weeknotes/182-secret-level/#:~:text=made%20for%20my%20short%20attention%20span&#34;&gt;raving about it some weeks ago&lt;/a&gt; I finally finish Secret Level. I think
there were probably only a couple of episodes which I didn&amp;rsquo;t really get into,
the rest was great.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This series feels like it’s made for my short attention span&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;LOL&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not a dicky bird from the &lt;a href=&#34;/weeknotes/192-birds-are-tweeting/#:~:text=I%20won%E2%80%99t%20know%20for%20real%20for%20a%20few%20weeks&#34;&gt;troublesome smart lock in weeks&lt;/a&gt;! ✅&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 194: Symlink it</title>
      <link>https://elver.me/weeknotes/194-symlink-it/</link>
      <pubDate>Sun, 16 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/194-symlink-it/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;One of my car tyres has a slow puncture.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fly.io/phoenix-files/make-your-liveview-feel-faster/&#34;&gt;&amp;ldquo;LiveView feels faster with a delayed loading indicator&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In less than 5 minutes I made the change and deployed my app. I now have a
LiveView page that feels so much more responsive! Let’s look at how to add
this to an existing app.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Always interesting how small UX tweaks can affect the &lt;em&gt;perceived&lt;/em&gt; performance
even if nothing has actually gotten faster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/193-pasta-machine/#:~:text=I%20briefly%20turned%20direction%20towards%20Home%20Automation&#34;&gt;foray into home automation&lt;/a&gt; continued with setting up the software side of
things. It took a few hours, and some head scratching, but I seem to have the
basics going &amp;ndash; Docker is the way.&lt;/p&gt;
&lt;p&gt;The basics in this case consists of &lt;a href=&#34;https://www.zigbee2mqtt.io/&#34;&gt;zigbee2mqtt&lt;/a&gt;, &lt;a href=&#34;https://mosquitto.org/&#34;&gt;Mosquitto&lt;/a&gt;, and &lt;a href=&#34;https://www.home-assistant.io/&#34;&gt;Home
Assistant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mosquitto is an &lt;a href=&#34;https://en.wikipedia.org/wiki/MQTT&#34;&gt;MQTT&lt;/a&gt; broker, which implements the MQTT pub/sub protocol, and
is used to publish and listen for messages. It sits between zigbee2mqtt and
Home Assistant.&lt;/p&gt;
&lt;p&gt;zigbee2mqtt is a replacement for proprietary hardware bridges and it talks to
the various devices on the &lt;a href=&#34;https://en.wikipedia.org/wiki/Zigbee&#34;&gt;Zigbee&lt;/a&gt; network.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using the &lt;a href=&#34;https://smlight.tech/product/slzb-06m/&#34;&gt;SMLIGHT SLZB-06M&lt;/a&gt; over PoE as discussed last week, and watching
Techno Tim&amp;rsquo;s &lt;a href=&#34;https://www.youtube.com/watch?v=8e4oaUHlMsE&#34;&gt;&amp;ldquo;Creating a ZigBee Hub with the SMLIGHT SLZB-06 and Home
Assistant&amp;rdquo;&lt;/a&gt; sent me in the right direction. My &lt;code&gt;docker-compose.yml&lt;/code&gt; config now
looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;homeassistant:
  container_name: homeassistant
  image: &amp;quot;ghcr.io/home-assistant/home-assistant:stable&amp;quot;
  volumes:
    - /opt/appdata/homeassistant:/config
    - /etc/localtime:/etc/localtime:ro
    - /run/dbus:/run/dbus:ro
  restart: unless-stopped
  privileged: true
  network_mode: host

mqtt:
  container_name: mqtt
  image: eclipse-mosquitto:2.0
  restart: unless-stopped
  volumes:
    - /opt/appdata/mosquitto:/mosquitto
    - /etc/localtime:/etc/localtime:ro
    - /etc/timezone:/etc/timezone:ro
  ports:
    - 1883:1883
    - 9001:9001
  command: &#39;mosquitto -c /mosquitto-no-auth.conf&#39;

zigbee2mqtt:
  container_name: zigbee2mqtt
  image: koenkk/zigbee2mqtt
  restart: unless-stopped
  volumes:
    - /opt/appdata/zigbee2mqtt:/app/data
    - ./zigbee2mqtt/configuration.yaml:/app/data/configuration.yaml:rw
    - /run/udev:/run/udev:ro
  ports:
    - 8080:8080
  environment:
    - /etc/localtime:/etc/localtime:ro
    - /etc/timezone:/etc/timezone:ro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;zigbee2mqtt requires it&amp;rsquo;s own config too, which was the hardest part to figure
out. One of the hardest parts of setting up weirdo hardware you bought online
is identifying exactly what the thing &lt;em&gt;is&lt;/em&gt;. For example, what chipset does it
use? Even for models in the same product line, the chips are likely to be
different, which is the case here.&lt;/p&gt;
&lt;p&gt;The pertinent parts of my zigbee2mqtt config:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: 4
permit_join: false
mqtt:
  base_topic: zigbee2mqtt
  server: mqtt://mqtt
serial:
  port: tcp://192.168.0.220:6638
  adapter: ezsp
advanced:
  channel: 11
frontend
  enabled: true
homeassistant:
  enabled: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I had already purchased an array of temperature sensors, buttons, plug
sockets, etc at a variety of price points. Unsurprisingly perhaps, the more
expensive devices were easier to handle, generally looked nicer, and look to
be better made. Saying that, I was surprised that even the cheapest devices
seemed to pair and work relatively easily.&lt;/p&gt;
&lt;p&gt;A promising start so far, but time will tell how reliable everything is. For
now I&amp;rsquo;m just letting everything run and trialling how it holds up. Actual
automations can come later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://pid1.dev/posts/siren-call-of-sqlite-on-the-server/&#34;&gt;&amp;ldquo;Siren Call of SQLite on the Server&amp;rdquo;&lt;/a&gt;. To balance all my pro-SQLite posts,
here is the case against using SQLite for your web app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elixirstreams.com/tips/awesome-ok-noreply-liveview-helpers&#34;&gt;&amp;ldquo;ok/1 &amp;amp; noreply/1 LiveView helpers!&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A nice tip for removing awkward return tuples from LiveViews.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;During my Home Automation tinkering I learned about &lt;a href=&#34;https://en.wikipedia.org/wiki/Multicast_DNS&#34;&gt;mDNS&lt;/a&gt;. The basics are
that if your device and network supports mDNS you should be able to
automatically refer to your device by &lt;code&gt;&amp;lt;name&amp;gt;.local&lt;/code&gt; instead of it&amp;rsquo;s IP
address or having to rely on separate DNS.&lt;/p&gt;
&lt;p&gt;This did not work for me though.&lt;/p&gt;
&lt;p&gt;As my &amp;ldquo;network&amp;rdquo; only really consists of a Virgin Broadband Hub I suspect that
it lacks whatever is required to make it work.&lt;/p&gt;
&lt;p&gt;Useful to know though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A tip. Like any right thinking person, I want to keep my Docker config in
&lt;code&gt;git&lt;/code&gt;. That part is easy, create a repo, put your &lt;code&gt;docker-compose.yml&lt;/code&gt; in it,
and away you go. But what about other config files? zigbee2mqtt requires a
&lt;code&gt;configuration.yaml&lt;/code&gt; file. I want to version control it too, but in order to
do so it has to live in the repo. So how do you supply it to the container so
zigbee2mqtt can read and write it?&lt;/p&gt;
&lt;p&gt;This is the git repo structure I would like. We can then add new directories
as we add services keeping everything nicely organised.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;.
├── docker-compose.yml
└── zigbee2mqtt
    └── configuration.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;My first thought, symlink it. This works, but when you setup the containers on
a new host you&amp;rsquo;re going to have to remember to run the requisite &lt;code&gt;ln -s&lt;/code&gt;
steps. That is another thing to remember, and another thing to document.&lt;/p&gt;
&lt;p&gt;Instead we can use some Docker magic.&lt;/p&gt;
&lt;p&gt;On the server I already provide a place for containers to put their data under
&lt;code&gt;/opt/appdata/&amp;lt;service&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  zigbee2mqtt:
    volumes:
      - /opt/appdata/zigbee2mqtt:/app/data
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;zigbee2mqtt can read and write to &lt;code&gt;/app/data&lt;/code&gt; inside the running container and
the files are put in &lt;code&gt;/opt/appdata/zigbee2mqtt/&lt;/code&gt; on the host system.&lt;/p&gt;
&lt;p&gt;The magic comes when we &lt;a href=&#34;https://docs.docker.com/engine/storage/bind-mounts/&#34;&gt;bind mount&lt;/a&gt; the config file from the local git repo
directly into the existing container volume.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  zigbee2mqtt:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - /opt/appdata/zigbee2mqtt:/app/data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+     - ./zigbee2mqtt/configuration.yaml:/app/data/configuration.yaml:rw
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(That &lt;code&gt;:rw&lt;/code&gt; part at the end gives read/write permissions).&lt;/p&gt;
&lt;p&gt;Now everything can stay in the git repo ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I very much enjoyed Bong Joon Ho&amp;rsquo;s &lt;a href=&#34;https://www.themoviedb.org/movie/696506-mickey-17&#34;&gt;Mickey 17&lt;/a&gt;. Recommended.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 193: Pasta machine</title>
      <link>https://elver.me/weeknotes/193-pasta-machine/</link>
      <pubDate>Sun, 09 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/193-pasta-machine/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daringfireball.net/linked/2025/03/03/keith-web-on-mobile&#34;&gt;Jeremy Keith on the Web on Mobile&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There are mobile web proponents who are in denial about this state of
affairs, who seek to place the blame at Apple’s feet for the fact that
WebKit is the only rendering engine available on iOS. But WebKit’s
limitations have nothing to do with the reasons so many websites suck when
experienced on mobile devices. The mobile web sucks just as bad on Android.
Apple’s WebKit-only rule on iOS is just a useful scapegoat for the fact that
most websites, as experienced on phones, are designed and engineered to
suck.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Facts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/qdm12/gluetun&#34;&gt;gluetun&lt;/a&gt; &amp;ndash; this will come in handy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VPN client in a thin Docker container for multiple VPN providers, written in
Go, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers
built-in.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When we bought our new house we decided to get the kind of insurance policies
which typically go along with such a purchase. This week I had need to talk to
a GP (nothing to worry about!) and I remembered that we had the ability to
talk to a private GP thrown-in. Like any right thinking person I&amp;rsquo;m a supporter
of the NHS but getting this appointment was way easier than it would&amp;rsquo;ve been
through my regular GP, and my issue was addressed within 15 minutes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://antirez.com/news/145&#34;&gt;We are destroying software&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For Christmas I was bought a pasta making course, and this week we attended.
As my friend said &amp;ldquo;What a great skill to use 2 more times&amp;rdquo; &amp;ndash; true, but I was
still looking at pasta machines online before we left the venue 😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In an act of further procrastination (yawn!) I briefly turned direction
towards Home Automation this week by plugging in the Zigbee Coordinator I
purchased some months ago. It’s nifty in that you can power it via USB or PoE
and communicate with it via USB, Ethernet, or WiFi. I will always chose
Ethernet and PoE if given the option as it rules out a whole raft of things
that can go wrong with WiFi, and this time was no different.&lt;/p&gt;
&lt;p&gt;Unfortunately I don&amp;rsquo;t have any fancy PoE-capable network equipment at the new
house (yet!), which nearly turned into more purchases, but luckily I do own a
PoE injector which I used to get it turned on and connected to the network.&lt;/p&gt;
&lt;p&gt;The web UI for the coordinator is very nice and looks functional &amp;ndash; you can
apparently flash the firmware from it but I&amp;rsquo;m yet to try that. The next step
will be to get some accompanying software up and running with our old friend
Docker.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://make3.co/work/woemeter&#34;&gt;Lumon Industries WoeMeter&lt;/a&gt; &amp;ndash; I&amp;rsquo;ve not seen &lt;a href=&#34;https://www.themoviedb.org/tv/95396-severance?language=en-GB&#34;&gt;Severance&lt;/a&gt;, but this is a cool
walk-through of a prop made for the show.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our house is one of those &amp;ldquo;one socket in each room&amp;rdquo; type places. For a while
I&amp;rsquo;ve been thinking about getting some sort of desktop power strip, and with
the monkeying about I&amp;rsquo;ve been doing with electronics the time came.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.uk/dp/B0DG5LK69Y&#34;&gt;This nifty gadget&lt;/a&gt; looks pretty neat clamped to my desk and has USB-C power
delivery and USB-A ports too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It was my birthday this week. Meh.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 192: Birds are tweeting</title>
      <link>https://elver.me/weeknotes/192-birds-are-tweeting/</link>
      <pubDate>Sun, 02 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/192-birds-are-tweeting/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Birds are tweeting. I&amp;rsquo;m not waking up in the dark. It must be spring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In order to remove Twitter references from my blog (because of obvious
reasons) I needed to install Ruby 2.7 (I know, I know, it’s very old) so I
could build the site using Middleman. I was expecting this to be an unpleasant
experience, but it installed very quickly and easily. Sometimes software does
work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some &lt;a href=&#34;https://basicappleguy.com/basicappleblog/ultramarine-haze&#34;&gt;lovely new gradient wallpapers&lt;/a&gt; from the Basic Apple Guy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/191-5-coupon/#:~:text=I%20plan%20on%20trying%20out%20some%20of%20these%20changes%20next%20week&#34;&gt;unreliable smart lock problem&lt;/a&gt; might be solved. I won&amp;rsquo;t know for real for
a few weeks, but it&amp;rsquo;s looking very promising. I only made a single
configuration change in the end. The WiFi channel was set to &amp;ldquo;auto&amp;rdquo; and I
changed it to always be 11 (11 was as far away from the crowded channels as
possible).&lt;/p&gt;
&lt;p&gt;In the UniFi app, for each device, there is an indicator that shows what the
&amp;ldquo;WiFi Experience&amp;rdquo; is, expressed as a stacked bar chart. This bar used to be
multi-coloured, each colour representing a disconnect or DNS issue, or other
WiFi issue of which their are many. The bar is now solid green indicating a
WIN.&lt;/p&gt;
&lt;p&gt;The messages being logged every minute or so are also gone and have been
replaced with a single disconnect and reconnect message once a day which to me
looks like normal behaviour for this device.&lt;/p&gt;
&lt;p&gt;Whilst in the UniFi app I took the opportunity to update the firmware on all
network devices, so that should be all the fiddling I do for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The more I learn about soldering the clearer it becomes that to remove
components you often need to &lt;em&gt;add&lt;/em&gt; before taking away. You might add flux, and
then add more solder, and then more flux to heat and remove. This feels like
the opposite of what you should do but it really works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/191-5-coupon/#:~:text=I%20really%20hope%20it%20works&#34;&gt;new screen arrived&lt;/a&gt; and after some brief procrastination I tried it out,
this time on three separate Game Boy Colors. It doesn&amp;rsquo;t work 😩&lt;/p&gt;
&lt;p&gt;When AliExpress seller sent the new screen they did not send a whole kit
(which comprises screen, ribbon cable, and controller board). Given that the
neither screen works on three different Game Boy Colors I&amp;rsquo;m suspicious that
the screen part is to blame, and it seems more likely that the controller
board is actually the cause of my woes. I checked the ribbon cable for
continuity across its pins and visually inspected it, but it appears fine, so
I don&amp;rsquo;t think it&amp;rsquo;s that.&lt;/p&gt;
&lt;p&gt;The seller agreed to send these parts if I paid postage (£3), which I thought
was fair enough at this point. I imagine they get a fair amount of people
trying it on because electrical components are fairly easy to break.&lt;/p&gt;
&lt;p&gt;So now we wait. Again. If it doesn&amp;rsquo;t work after this I might just throw
everything in the bin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After a long hiatus I&amp;rsquo;ve been using eBay &lt;em&gt;a lot&lt;/em&gt;. Whilst I like what the
platform affords, buying niche products from the comfort of my home, the
actual website is pants. A prime example of what happens when there is no
competition. Basic things like pages taking an age to load, and clicking on
buttons and links where nothing happens. And it’s not better than 20 years
ago, and dare I say worse than then.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More Game Boys were delivered &amp;ndash; this time of the DS Lite variety. I have
plans. Don&amp;rsquo;t judge me; I can do what I want.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/unkyulee/micro-journal&#34;&gt;Micro Journal: Distraction-Free Writing Device: WriterDeck&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I aimed to create a specialized writing device, focusing on the tactile
experience of mechanical keyboards. This device would be portable, with a
compact form factor, designed to enhance the writing process in a focused
environment. The goal was to provide a distraction-free writing experience,
allowing users to immerse themselves fully in their creative work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://uprn.uk/&#34;&gt;Unique Property Reference Number&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This website allows you to look up all the publicly available data for any
UPRN in Great Britain. Simply put the UPRN into the search box to see all
the information we have for that UPRN. Alternatively, search for a postcode
to see all the UPRNs in the immediate vicinity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(You will &lt;em&gt;really&lt;/em&gt; need your Ad Blocker for this website).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A friend told me about the &lt;a href=&#34;https://en.m.wikipedia.org/wiki/Game_Boy_Player&#34;&gt;Nintendo Game Boy Player&lt;/a&gt; which allows you to play
Game Boy games on the GameCube. The GameCube completely passed me by so I
hadn&amp;rsquo;t heard of this before. Naturally, I now need one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At the weekend we visited to the West Country to see various friends (&lt;a href=&#34;/weeknotes/191-5-coupon/#:~:text=of%20course%2C%20to-,get%20my%20eyes%20tested,-.%20The%20prospect%20of&#34;&gt;my eyes
are in good shape, thanks&lt;/a&gt;) hence the lateness of this post. The journey was
remarkably stress-free, for which we can partly thank the glorious weather we
had from Thursday onwards.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s always a bit odd visiting various groups of people. For me this is a trip
away, for them it&amp;rsquo;s a few hours in between their normal daily activities, so I
can be tricky to schedule and know if you&amp;rsquo;re outstaying your welcome. Still,
it was nice to see everyone.&lt;/p&gt;
&lt;p&gt;We treated ourselves to a meal at our favourite restaurant whilst near
Bristol. The food scene in Bristol is still king imo, and I often miss it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 191: 5% coupon</title>
      <link>https://elver.me/weeknotes/191-5-coupon/</link>
      <pubDate>Sun, 23 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/191-5-coupon/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This week I had a brand new experience. I nearly forgot to have dinner. This
has never happened in all my life.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Given that the UK government is making ludicrous demands to have access to all
of Apple&amp;rsquo;s customer&amp;rsquo;s data in the whole of world, I decided to turn on
&lt;a href=&#34;https://support.apple.com/en-us/108756&#34;&gt;Advanced Data Protection&lt;/a&gt; in iOS just to spite them. Fight the power!&lt;/p&gt;
&lt;p&gt;Unfortunately, that didn&amp;rsquo;t last long as Apple have now turned off the feature
for new users of it. How long I will be able to keep hold of the feature
remains to be seen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/190-no-worky/#:~:text=power%20regulation%20board&#34;&gt;power regulation board I thought I&amp;rsquo;d identified last week&lt;/a&gt; as being the
cause of the final GBC refusing to start arrived in the post this week. I
eagerly removed the existing broken board and started to solder the &amp;ldquo;new&amp;rdquo; one
in it&amp;rsquo;s place when I noticed that one of the components on the board had a leg
missing 🙀 And it also had solder on it&amp;rsquo;s pad which made it look like it should
definitely be connected. I ploughed ahead anyway, because I thought it better
to test it in-place first before doing anything more drastic. It worked!
It turned on, and it made the famous Game Boy ding sound. I turned it off,
connected the screen, and it worked again. So hopefully that will stay
working. Win ✅.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The seller of the new AMOLED screen agreed &lt;a href=&#34;/weeknotes/190-no-worky/#:~:text=The%20new%20AMOLED%20screen%20and%20shell%20arrived&#34;&gt;that it is probably faulty&lt;/a&gt;. I was
not looking forward to having this discussion with a seller in China fearing a
difficult lost in translation situation over a protracted timescale due to
time differences, but it was actually quite pleasant. After sending a photo
and some videos they said they would send a replacement. Not sure when it will
get here but I really hope it works 🤞&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An eBay seller sent me a 5% coupon code for a job lot of Game Boys I was
watching and that is all it took for me to buy them. Why have you bought move
Game Boys when you haven&amp;rsquo;t fixed the current set of Game Boys Jordan? That&amp;rsquo;s a
good question, and well argued, but hear me out &amp;ndash; I am &lt;em&gt;weak&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next weekend we will be visiting the old country to visit some friends, and of
course, to get my eyes tested. The prospect of several days in a Premier Inn
is not filling me with joy, but it will hopefully be nice to see people.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In order to test Game Boys without having to reassemble them each time, and in
lieu of a proper bench power supply, I bought some AA battery holders. They
have crocodile clips attached allowing easy connection to PCB battery
terminals. They were also cheap and as a result they started falling apart
fairly quickly and the wires kept becoming disconnected from the main unit.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s ok, I fix things now! But first&amp;hellip;I break them a bit more. During the
disassembly to change the wires over I tore the pads that said wires need to
connect to from the tiny PCB. A good excuse to use my new grinding pen. I
ground the PCB back to expose new copper and soldered to that. I was pleased
with the result and the battery holders are now back in action.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.indiegogo.com/projects/pomera-full-suite-typewriter-for-focused-writing#/faq&#34;&gt;Pomera - Full-Suite Typewriter For Focused Writing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This device is giving me strong &lt;a href=&#34;https://en.wikipedia.org/wiki/Psion_Series_5&#34;&gt;Psion&lt;/a&gt; vibes but with much less
functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If I never see the sentence &amp;ldquo;Front Door has (dis|re)connected to Wi-Fi&amp;rdquo; it
will be too soon. My smart lock has served me well since it was installed a
year ago, with one issue. Occasionally it loses the plot and spirals into a
disconnect/reconnect meltdown which sometimes goes on for literally weeks.
Then it&amp;rsquo;s fine for months.&lt;/p&gt;
&lt;p&gt;There is no way to turn off &lt;em&gt;just&lt;/em&gt; those notifications either, you have to
turn off &lt;em&gt;all&lt;/em&gt; the notifications which would mean not knowing when people
enter the property.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know what is causing this. I suspect whatever is WiFi chip it has is
just pants (a technical term). I&amp;rsquo;ve done some research and there are a few
things which I can try: 1) Setting a dedicated WiFi channel instead of letting
it auto-select; 2) Moving it to its own network with nothing else; and 3)
Changing the WiFi channel to a less congested frequency.&lt;/p&gt;
&lt;p&gt;All seem reasonable to try, but administering this remotely, of course, is
risky. If I make a change to the network settings and it decides to not do the
reconnecting part, then bad times. I plan on trying out some of these changes
next week so I can be on-site next weekend if required.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.1password.com/docs/web/compatible-website-design/&#34;&gt;&amp;ldquo;You shouldn&amp;rsquo;t have to do anything special to support 1Password on your
website, as long as you develop your pages according to best practices&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sometimes I think the job market is improving, but then I keep reading things
that are very worrying. It&amp;rsquo;s true that I always feel unemployable and yet I
have worked for the last 10 years, but the threat of AI and the state of the
economy are not giving me good vibes.&lt;/p&gt;
&lt;p&gt;(For the record, I don&amp;rsquo;t think AI will replace programmers, but a lot of
business people do which is a problem in the shorter term).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You&amp;rsquo;ll be relieved to know that the &lt;a href=&#34;/weeknotes/190-no-worky/#:~:text=lifetime%20warranty%20socks&#34;&gt;new socks were delivered&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 190: No worky</title>
      <link>https://elver.me/weeknotes/190-no-worky/</link>
      <pubDate>Sun, 16 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/190-no-worky/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After ignoring it for a couple of weeks I tested my keyboard and it no worky.
I cannot lie, I feel a bit dejected by this as I felt I&amp;rsquo;d done a fairly good
job for my &lt;a href=&#34;/weeknotes/184-keyboard-kaput/#:~:text=moving%20onto%20keyboard%202%20instead&#34;&gt;&lt;del&gt;first&lt;/del&gt; second time&lt;/a&gt; at soldering a keyboard. But apparently
not. I can&amp;rsquo;t face troubleshooting this at the moment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Both awful in their own ways, sure. But this is undeniably funny.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OpenAI CEO Sam Altman responds to Elon Musk&amp;rsquo;s nonprofit buyout offer: &amp;rsquo;no
thank you but we will buy twitter for $9.74 billion if you want.&#39;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://usetapestry.com/&#34;&gt;Tapestry from IconFactory&lt;/a&gt; is interesting. I really like the idea, but I&amp;rsquo;m
not sure it works for me. I couldn&amp;rsquo;t work out what was read and what was new.
I will watch with interest though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was a hole in my lifetime warranty socks so I thought why not make a
claim. Am I running out of things to do? You be the judge.&lt;/p&gt;
&lt;p&gt;The manufacturer (&lt;a href=&#34;https://darntough.uk/&#34;&gt;Darn Tough&lt;/a&gt; since you ask) required that I send a photo of
the socks cut in half. I understand why, but doing so when the socks are fine
otherwise didn&amp;rsquo;t feel great. They will make good dusters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some Game Boy wins and losses.&lt;/p&gt;
&lt;p&gt;The contrast wheel on a Game Boy Advance I acquired was visibly very rusty so
I decided to replace it with a new one. I desoldered it, but unfortunately
whilst doing so the pads came off the board too (the pads are the gold bits
that components are soldered to). This means I have nothing to solder the
replacement component on to &amp;ndash; bad times. So a trace repair will be required.
This is a bit above my pay grade at the moment (and I need a couple of tools).
Still, it&amp;rsquo;s a learning opportunity.&lt;/p&gt;
&lt;p&gt;❌ Lose.&lt;/p&gt;
&lt;p&gt;Two out of three Game Boy Colors I have are now working. One was already
working so I can&amp;rsquo;t take credit for that, but another had a dodgy power switch
which I cleaned out with Isopropyl Alcohol (99.9% pure) and it started
working. That one was relatively easy.&lt;/p&gt;
&lt;p&gt;✅ Win.&lt;/p&gt;
&lt;p&gt;The new &lt;a href=&#34;https://en.wikipedia.org/wiki/AMOLED&#34;&gt;AMOLED&lt;/a&gt; screen and shell arrived for one of the Game Boy Colors. The
install was fairly straightforward. You only need to solder two joints to hook
up the power. And yet, it does not work. I&amp;rsquo;ve tried it on two different GBCs
now and the same result, so I&amp;rsquo;m wondering if it&amp;rsquo;s just faulty. Disappointing.&lt;/p&gt;
&lt;p&gt;❌ Lose.&lt;/p&gt;
&lt;p&gt;Taking another break from breaking things, I moved back to the remaining
non-working GBC. There were very small signs of life in this one. When you
turned it on you would only get a quiet noise from the speaker. I cleaned the
power switch and changed over the SMD capacitors, which I&amp;rsquo;ve not done before
so that&amp;rsquo;s a win. I also changed the DC jack just because. Nothing.&lt;/p&gt;
&lt;p&gt;Given my lack of &lt;em&gt;actual&lt;/em&gt; electronics knowledge I thought I&amp;rsquo;d give A.I. a
chance to guide me and with Claude&amp;rsquo;s help I managed to work out that the GBC
is not getting the 5v it requires, and that something is wrong with the &amp;ldquo;power
regulation board&amp;rdquo;. Whatever that is. You can&amp;rsquo;t typically buy a replacement for
these, but I managed to score one second-hand on eBay for a few quid. I&amp;rsquo;m
going to try that and see what happens and if it springs to life go back and
inspect the broken one more closely.&lt;/p&gt;
&lt;p&gt;✅ Win.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jsomers.net/blog/speed-matters&#34;&gt;Speed matters: Why working quickly is more important than it seems&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is true of any to-do list that gets worked off too slowly. A malaise
creeps into it. You keep adding items that you never cross off. If that
happens enough, you might one day stop putting stuff onto the list.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, something I fixed. We use an &lt;a href=&#34;https://support.soundcore.com/s/product/a085g000000Nly7AAC/soundcore-2&#34;&gt;Anker Soundcore 2 portable Bluetooth
speaker&lt;/a&gt; for bathroom tunes that has been unreliable for a while. It still
works great when it&amp;rsquo;s on. The issue is getting it to turn on. The power button
was not working.&lt;/p&gt;
&lt;p&gt;So, with ideas above my station (I&amp;rsquo;ve been watching a lot of YouTube fix
videos), I decided to attempt a repair. I&amp;rsquo;d opened the speaker a few weeks
previous after following a teardown video but I didn&amp;rsquo;t get very far with it
other than knowing something was up with the button. This week I revisited and
I noticed the button switch didn&amp;rsquo;t work when it was outside of the speaker
housing. On a whim I swapped out one of the other buttons into the power
button position to see what would happen. It worked 🎉&lt;/p&gt;
&lt;p&gt;Definitely a knackered switch. I may purchase a replacement so all the buttons
can be working. Or I may not.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recently I noticed that I&amp;rsquo;ve not checked my Mastodon or Bluesky accounts in a
while. Now I know this is because I&amp;rsquo;m looking at Reddit instead, but I still
thought it was interesting how quickly I fell out of the habit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 189: Voodoo Ape</title>
      <link>https://elver.me/weeknotes/189-voodoo-ape/</link>
      <pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/189-voodoo-ape/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This week I realised that &lt;a href=&#34;https://open.spotify.com/track/7H0MOWplwc6gf2AD1vTSYi?si=e15cb8b1435645e1&#34;&gt;Voodoo People&lt;/a&gt; by The Prodigy samples &lt;a href=&#34;https://open.spotify.com/track/0hUit24g1EIoATdKYWUiRj?si=474436c5a1c74348&#34;&gt;Very Ape&lt;/a&gt; by
Nirvana 🤯&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=oX0IgxDOlCk&#34;&gt;iPhone 16 Pro SSD Upgrade: From 128GB to 1TB&lt;/a&gt; &amp;ndash; This video was really
interesting to me. The part where they get out the CNC and start removing the
old chip is wild. Worth a watch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My old computer was serviced by the local Apple Store and seems to be fixed
and with 100% healthy battery to boot. Credit to them, the service was good
throughout. Another thing ticked off my list.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Every time I look at my pension retirement seems further away. Clearly I&amp;rsquo;m not
anywhere close to retiring (I don&amp;rsquo;t actually like the idea of &amp;ldquo;retirement&amp;rdquo;
because what would I do all day) but the time for thinking about retirement is
not a year before retiring, so here we are.&lt;/p&gt;
&lt;p&gt;Given that a lot of people are unable to do much about funding their
retirement it&amp;rsquo;s good that I am a) able to; and b) doing so. Still, it can be
overwhelming both in the amount you supposedly need to live comfortably, and
in the intricacies of &amp;ldquo;investing&amp;rdquo;. When it comes to finances, unless you are a
gazillionaire, financial advisors don&amp;rsquo;t really want to know you, so you&amp;rsquo;re
left with Doing Your Own Research ™. Which is terrifying, but also empowering
(That empowerment part will entirely rely on what has happened in 20+ years
from now &amp;ndash; stay tuned).&lt;/p&gt;
&lt;p&gt;This is all a long winded way of saying that I&amp;rsquo;ve been researching pensions
and ISAs and what to put where. And importantly, how. I do feel that I&amp;rsquo;ve
gained a better understanding of the whole area.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://furbo.org/2025/02/07/making-software-fun/&#34;&gt;Making Software Fun&lt;/a&gt; &amp;ndash; There should be a lot more of this craft in computer
programming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apple Notes is actually quite good. I have avoided it for years. At the
beginning because it wasn&amp;rsquo;t very good. And then it got better, but still not
good. It’s still not &lt;em&gt;that&lt;/em&gt; good. The formatting feels random. Sometimes you
can&amp;rsquo;t unindent list items for no good reason.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s good because it&amp;rsquo;s &lt;em&gt;there&lt;/em&gt;. It&amp;rsquo;s on my phone, and it&amp;rsquo;s on my laptop. And
the sync works. I still reach for other tools when I need more structure
(Notion at the moment, unfortunately) but for making sure I get the
information down. It&amp;rsquo;s always there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mechanical keyboard sounds without the keyboard &amp;ndash; &lt;a href=&#34;https://tryklack.com/&#34;&gt;Klack&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Satisfying sound with every keystroke&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I stopped working on the &lt;a href=&#34;/weeknotes/188-storage-solutions/#:~:text=I%20started%20at%20the%20beginning%20with%20the%20first%20DMG%20Game%20Boy&#34;&gt;first Game Boy&lt;/a&gt; I was fixing up because the last
thing I had in mind for it was to try and fix the case colour. The front of
the case is a bit yellowed and doesn&amp;rsquo;t match the back which is a lighter shade
closer to that of the original grey. This can be achieved with a process &lt;a href=&#34;https://www.youtube.com/results?search_query=retrobrighting&#34;&gt;many
have experimented with&lt;/a&gt; called Retrobrighting. There are a few methods, but
the most popular works by submerging your yellowed case plastics into a bath
of 11.99% Hydrogen Peroxide and shining UV lights on it for an indeterminate
amount of time.&lt;/p&gt;
&lt;p&gt;The first Game Boy wasn&amp;rsquo;t &lt;em&gt;that&lt;/em&gt; yellow though, so it didn&amp;rsquo;t seem like the
correct candidate to experiment on. So, with the threat of chemical burns and
potential eye damage (and making it onto a list for weird online purchases) I
decided to give it a whirl with a much worse example of yellowing.&lt;/p&gt;
&lt;p&gt;I got these two in a bundle on Vinted for the relatively bargain price of
£55.59.&lt;/p&gt;
&lt;p&gt;Before
&lt;img src=&#34;/images/gameboys-before.jpg&#34; alt=&#34;Two Game Boy consoles before refurbishment&#34;&gt;&lt;/p&gt;
&lt;p&gt;I only tried the process on the (can you guess?) left one. The right was in
fairly good condition generally and only needed cleaning inside and out.&lt;/p&gt;
&lt;p&gt;After
&lt;img src=&#34;/images/gameboys-after.jpg&#34; alt=&#34;Two Game Boy consoles after refurbishment&#34;&gt;&lt;/p&gt;
&lt;p&gt;These both have new glass screen lenses but everything else is original.
Pretty happy with how they came out.&lt;/p&gt;
&lt;p&gt;Next I&amp;rsquo;ll be returning to the original now I have a bit of experience of how
the process works and what to expect to try and brighten it up a bit whilst I
wait for my latest AliExpress order to arrive&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.visualmode.dev/a-decade-of-tils&#34;&gt;A Decade of TILs&lt;/a&gt; &amp;ndash; Josh&amp;rsquo;s TIL blog has inspired me (&lt;a href=&#34;/weeknotes/5-professional-bash-programmer/#:~:text=working%20on%20getting%20a%20TIL%20site%20up%20and%20running&#34;&gt;not enough&lt;/a&gt; &lt;a href=&#34;/weeknotes/180-the-secret-to-air-travel/#:~:text=more%20of%20a%20TIL%20type%20post&#34;&gt;to copy
him, yet&lt;/a&gt;) but to post these weeknotes regularly. A lot of what he says rings
true as to why I&amp;rsquo;ve managed to keep up myself.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 188: Storage solutions</title>
      <link>https://elver.me/weeknotes/188-storage-solutions/</link>
      <pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/188-storage-solutions/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can trigger macOS &lt;a href=&#34;https://en.wikipedia.org/wiki/Shortcuts_(Apple)&#34;&gt;Shortcuts&lt;/a&gt; &lt;a href=&#34;https://support.apple.com/en-gb/guide/shortcuts-mac/apd163eb9f95/mac#apd446fbe7fa&#34;&gt;from the menubar&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you enable the option to &amp;ldquo;Pin in Menu Bar&amp;rdquo; for a Shortcut a clickable
menubar icon will appear which shows a menu from which you can execute the
Shortcut. It&amp;rsquo;s a shame that you don&amp;rsquo;t seem to be able to have an icon &lt;em&gt;per
Shortcut&lt;/em&gt;, which would make this a lot more appealing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New pursuits demand new storage solutions. I have lots of bits and pieces that
need to be stored somewhere now. Like most things lately, it seems, this is
just an excuse to exercise my capitalistic tendencies. B&amp;amp;M is your friend for
such purchases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How will I find newly stored stuff?&lt;/p&gt;
&lt;p&gt;Am I cool and do I own a label printer? Yes and YES. I do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I was able to continue my Corne keyboard build now I had all &lt;a href=&#34;/weeknotes/186-approval-granted/#:~:text=parts%20that%20were%20missing%20for%20my%20keyboard%20project%20have%20arrived&#34;&gt;the
parts I needed&lt;/a&gt;. Although most of the delay was waiting for packages to
arrive, regrettably I found that I was procrastinating over starting the build
again since I&amp;rsquo;d taken a break from soldering and I didn&amp;rsquo;t want to fuck it.&lt;/p&gt;
&lt;p&gt;Well, I fucked it.&lt;/p&gt;
&lt;p&gt;The next step was to solder the new sockets I bought to the PCB. I was
expecting this to be easy. You push the legs through holes in the PCB and
solder them to the board. When I did this it was a very tight fit such that
the socket stayed in place whilst I soldered. Or so I thought. I soldered all
the pins and then realised that the socket &lt;em&gt;had&lt;/em&gt; slipped slightly. This is a
problem because the sockets &lt;em&gt;need&lt;/em&gt; to be flush to accommodate the other
components on the board. Bugger.&lt;/p&gt;
&lt;p&gt;I managed to remove the wonky sockets after a lot of trial and error, but it
took ages. And there&amp;rsquo;s a good chance I&amp;rsquo;ve damaged some of the traces on the
boards too (it&amp;rsquo;s fairly easy to do if you scratch or scrape with a metal
object like tweezers).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m trying not to be too hard on myself because I have learnt how you’re meant
to do it now (you’re supposed to solder one leg, check for flushness, then
solder another leg diagonally across from the first, check flushness again,
then solder all the rest - this is what I did after and they are all flush on
the board) and I now have the sockets soldered.&lt;/p&gt;
&lt;p&gt;Whether they&amp;rsquo;ll work or not is another matter. I&amp;rsquo;ve been putting off testing
them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mikeandrianov.github.io/ant-background-job-processing-library&#34;&gt;Introducing Ant: a simple background job processing library for Elixir&lt;/a&gt; &amp;ndash;
it&amp;rsquo;s good to have options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/180-the-secret-to-air-travel/#:~:text=Still%20haven%E2%80%99t%20set%20up%20the%20new%20computer&#34;&gt;You already knew this&lt;/a&gt;, but I am a fool. I &lt;em&gt;made myself&lt;/em&gt; setup this new
computer. How? I dunno. I used Migration Assistant to migrate over using a
Thunderbolt 4 cable and&amp;hellip;it just works. Everything just works. Even my SSH
and gpg keys worked (with minor permission issues solved by a &lt;code&gt;chmod&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The main reason I procrastinated over it for so long was that I just assumed
it wouldn&amp;rsquo;t work. I am too used to computers. I was wrong. However I am yet to
setup any dev stuff because I don&amp;rsquo;t want to program computers at the moment.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://elver.me/uses/&#34;&gt;&lt;code&gt;/uses&lt;/code&gt;&lt;/a&gt; is updated too.&lt;/p&gt;
&lt;p&gt;The screen is absolutely lovely. Size-wise, it feels &lt;em&gt;much&lt;/em&gt; bigger whilst not
actually taking up much more space. I swear it sounds better too, through
AirPods Pro at least.&lt;/p&gt;
&lt;p&gt;Will I learn? Will. I. Fuck.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With my new computer setup it meant I could focus on fixing a couple of
niggles with that old &lt;em&gt;heap&lt;/em&gt; I was using five minutes ago. Namely, the fact
that &lt;a href=&#34;/weeknotes/154-loathe-to-call-this-a-success/&#34;&gt;Mocha-gate&lt;/a&gt; caused one of the ports to stop working, and also that the
battery is not holding the charge it once was.&lt;/p&gt;
&lt;p&gt;I have AppleCare+, so I booked it into the nearest Apple Store to have it
looked at.&lt;/p&gt;
&lt;p&gt;For the port issue I thought it would be a case of replacing the USB-C port
(which I &lt;a href=&#34;https://www.youtube.com/watch?v=bUd97uoBMBk&#34;&gt;learnt from a YouTube video&lt;/a&gt; meant replacing both ports as they come
on a single board) but when the technician ran a diagnostic on the computer it
showed that the ports are both working, but the battery needed replacing. I
don&amp;rsquo;t understand this, but who am I to argue. The fix is apparently to replace
the battery at no additional charge (not even an excess) which will hopefully
fix &lt;em&gt;both&lt;/em&gt; my issues in one go and cost me nothing. Excellent.&lt;/p&gt;
&lt;p&gt;The battery wasn&amp;rsquo;t in stock (which, incidentally, I think is incredible &amp;ndash;
this computer is 4 years old, how do you &lt;em&gt;not&lt;/em&gt; have a battery for this
in-stock?!) so I had to take it back once the stock arrived. It&amp;rsquo;s with Apple
now and I should get it back in a week.&lt;/p&gt;
&lt;p&gt;I was slightly disappointed in a way as I was looking forward to buying &lt;a href=&#34;https://www.ifixit.com/en-gb/products/macbook-air-13-late-2018-late-2020-usb-c-board&#34;&gt;the
part&lt;/a&gt; &lt;a href=&#34;https://www.aliexpress.com/item/1005005596121331.html&#34;&gt;on AliExpress&lt;/a&gt; and &lt;a href=&#34;https://www.ifixit.com/Guide/MacBook+Air+13-Inch+Late+2020+USB-C+Board+Replacement/142552&#34;&gt;having a go myself&lt;/a&gt; 🤭&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.macrumors.com/2025/01/29/openai-says-deepseek-used-its-models/&#34;&gt;OpenAI Alleges DeepSeek Used Its Models for AI Training&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The discovery centers around a technique called &amp;ldquo;distillation,&amp;rdquo; where
developers use outputs from larger AI models to train smaller ones. The
practice is common in AI development, but OpenAI claims DeepSeek crossed a
line by using it to build a rival model.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Boo, and I cannot emphasise this enough, &lt;em&gt;hoo&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We desperately need competition in the Ruby web framework space. &lt;a href=&#34;https://www.mikeperham.com/2025/01/17/sponsoring-hanami/&#34;&gt;Mike Perham
is sponsoring Hanami&lt;/a&gt;. I&amp;rsquo;m not sure what $12k can do but it&amp;rsquo;s a start and I
hope I&amp;rsquo;m wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For those eager for Game Boy updates, I have news 👾👾👾&lt;/p&gt;
&lt;p&gt;Procrastination took over, as usual. It seems obvious in hindsight that the
thrill of buying cheap (ish) Game Boys on the Internet is a far easier way to
obtain dopamine than the actual reality of having to work for it and fix them.
All of my projects are of my own devising and yet when it comes to work on
them I feel overwhelmed.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;ve bought 8 retro consoles and don&amp;rsquo;t possess any of the requisite
skills to fix them, which one do you start with? Well, I started at the
beginning with the first DMG Game Boy I got on eBay.&lt;/p&gt;
&lt;p&gt;This console has a few ailments, but it’s not in terrible shape. Nearly all
the consoles I&amp;rsquo;ve bought are dirty and disgusting, so that is a given for this
one too, but it also had no sound and the screen was showing vertical lines on
it where pixels should&amp;rsquo;ve been.&lt;/p&gt;
&lt;p&gt;I decided to tackle the sound issue first as it felt like it would be easier.
There was sound if you plugged in headphones, but not from the speaker. It
wasn&amp;rsquo;t necessarily a broken speaker though. A common issue that occurs with
these is that the headphone port gets corroded such that the console thinks
that headphones are always plugged in and that turns off the speaker. However
this wasn&amp;rsquo;t it; it &lt;em&gt;was&lt;/em&gt; a broken speaker 😉 In the process I learnt how to
check the headphone port and speaker for continuity using a multimeter.
Learning this will make future repairs to other consoles much easier. I
desoldered the old speaker and soldered on a new one I&amp;rsquo;d already bought from
AliExpress.&lt;/p&gt;
&lt;p&gt;Fixed sound ✅&lt;/p&gt;
&lt;p&gt;The screen was also a common failure. As these consoles are 30+ years old the
connection to the screen becomes degraded. This causes vertical lines on the
screen where nothing shows up. If you gently rub a soldering iron along the
bottom of the screen you can bring the missing screen lines back to life,
which is what I&amp;rsquo;ve done.&lt;/p&gt;
&lt;p&gt;Fixed screen ✅&lt;/p&gt;
&lt;p&gt;Next up for this console is a good clean, maybe a &lt;a href=&#34;https://retr0bright.com&#34;&gt;retr0brite-ing&lt;/a&gt; (to
de-yellow the plastics), and new screen lens.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On &lt;a href=&#34;https://atp.fm/624&#34;&gt;ATP 624&lt;/a&gt; Marco Arment said that Apple have &amp;ldquo;debilitating hubris&amp;rdquo; and I
think that is a &lt;em&gt;perfect&lt;/em&gt; description of them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I attended a retro gaming fair on Sunday. Given my recent interest in the area
it seemed like I should go along with it being so close. I&amp;rsquo;m glad I went and
enjoyed myself, but I in and out in an hour.&lt;/p&gt;
&lt;p&gt;It was absolutely rammed with people. In retrospect this was partly my fault.
The tickets are timed, the idea being that the earlier you get into the event
the better pick of the goods on offer you have. I bought tickets for the first
time slot, so naturally is was really busy. It was so busy that looking at
anything became a bit of a task.&lt;/p&gt;
&lt;p&gt;There wasn&amp;rsquo;t as much Nintendo Game Boy merchandise as I had imagined there
might be. When I think &amp;ldquo;retro&amp;rdquo;, I think &amp;ldquo;Game Boy&amp;rdquo;, but due to the passage of
time there are now &lt;em&gt;many&lt;/em&gt;, &lt;em&gt;many&lt;/em&gt; consoles that fit into that bracket
competing for floor space.&lt;/p&gt;
&lt;p&gt;I had also hoped that there might be parts and supplies for refurbing and
modding consoles, but unfortunately there was nothing like that for sale. I
guess the people selling their wares at the fair are the ones who&amp;rsquo;ve already
done the refurbing and modding in order to sell the consoles on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 187: Oops, I did it again</title>
      <link>https://elver.me/weeknotes/187-oops-i-did-it-again/</link>
      <pubDate>Sun, 26 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/187-oops-i-did-it-again/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://open.spotify.com/track/3vHqlBYlLgog7dOJn8K0Tu?si=cGh8AENCQOGXZCIipV72kg&#34;&gt;Jarvis is still correct&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s a tonic to meet up with friends. You should do that, if you can.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A friend told me about &lt;a href=&#34;https://www.youtube.com/@OatsStudios/featured&#34;&gt;the shorts&lt;/a&gt; by &lt;a href=&#34;https://en.m.wikipedia.org/wiki/Oats_Studios&#34;&gt;Oats Studios&lt;/a&gt;, a studio started by
&lt;a href=&#34;https://en.m.wikipedia.org/wiki/Neill_Blomkamp&#34;&gt;Neill Blomkamp&lt;/a&gt;. So far I&amp;rsquo;ve watched &lt;a href=&#34;https://www.themoviedb.org/movie/461955-rakka&#34;&gt;Rakka&lt;/a&gt;, &lt;a href=&#34;https://www.themoviedb.org/movie/464111-zygote&#34;&gt;Zygote&lt;/a&gt;, and &lt;a href=&#34;https://www.themoviedb.org/movie/485016-praetoria-part-one&#34;&gt;Praetoria&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Rakka and Zygote are impressively full-on. I think this format is perfect for
me for me because they don&amp;rsquo;t demand the concentration a longer film needs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://avi.im/blag/2024/sqlite-facts/&#34;&gt;Collection of insane and fun facts about SQLite&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are indeed a lot of &amp;ldquo;fun facts&amp;rdquo; about SQLite and in particular the way
the core developers operate.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unlike most open source project that uses standard licenses (like MIT or
GPL), SQLite does not come with a OSI-approved license. Instead, SQLite is
released into the public domain and it has even fewer restrictions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As lot of software people think that you are somehow obliged to submit to
their whims and release software as they desire. The SQLite team have chosen
to do it their way. Are some of their modes of operation bit odd? Sure. But
they can choose to act as &lt;em&gt;they&lt;/em&gt; please with &lt;em&gt;their&lt;/em&gt; software that &lt;em&gt;they&lt;/em&gt; wrote.&lt;/p&gt;
&lt;p&gt;I found this fascinating too:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SQLite is so fast, they compete with fopen. For some use cases, you can use
SQLite instead of a filesystem, that can be 35% faster.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;SQLite can be faster than writing to disk!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.viewsonic.com/us/products/monitors/vp2788-5k-27-colorpro-5k-mac-compatible-monitor-with-100w-thunderbolt-4-usb-c-and-dci-p3-color-gamut.html&#34;&gt;Another new&lt;/a&gt; &lt;a href=&#34;/weeknotes/186-approval-granted/#:~:text=New%20Apple%20display%20competitors&#34;&gt;monitor for the Mac user?&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/185-fabric-shaving/#:~:text=which%20led%20me%20to%20fall%20down%20said%20staircase&#34;&gt;Oops, I did it again&lt;/a&gt;. I fell down some stairs. This time outside, and with
added mud and a bruised hip.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have have some architects drawings for our upcoming house renovations and
we wanted to get some paper copies to hand out to contractors who might need
them. I found out that the local University&amp;rsquo;s printing department accept jobs
from external customers, not just current students. This is very convenient
when you need something printed in some format other than black and white A4
&amp;ndash; it cost me £1.50 for 5 copies of A3 in colour &amp;ndash; very reasonable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We took a copy of said documents to two different kitchen design appointments
🥱 Status: Expense incoming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It was the local monthly Ruby meetup this week. It&amp;rsquo;s always nice to see the
few (two) regular people who show up even though I frequently think that this
should be a &lt;em&gt;proper&lt;/em&gt; meetup with talks and pizza. It remains a bit of a catch
22 anyway because I don&amp;rsquo;t think we can realistically put on a talk for an
audience of two people.&lt;/p&gt;
&lt;p&gt;The truth is that I&amp;rsquo;m not really interested in Ruby (or computers) enough at
the moment to even think about giving my own talk, and that&amp;rsquo;s if I put aside
my aversion to public speaking (can 2 people be considered &amp;ldquo;public&amp;rdquo;?).&lt;/p&gt;
&lt;p&gt;The others who join me at this monthly meeting seem fine to continue with the
current situation, so maybe I just let it be.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is interesting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The computer, de-invented
Meet DC-1. A new kind of computer, designed for deep focus and wellbeing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://daylightcomputer.com/&#34;&gt;https://daylightcomputer.com/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have developed a dangerous addiction &amp;ndash; buying non-working Nintendo Game
Boys in some vain hope that I will be able to &amp;ldquo;fix&amp;rdquo; them. I currently own 7
fairly shitty examples in various states of disassembly. Will I get any of
them working again?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Still don&amp;rsquo;t want to work for living.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 186: Approval granted</title>
      <link>https://elver.me/weeknotes/186-approval-granted/</link>
      <pubDate>Sun, 19 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/186-approval-granted/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My car was in the garage this week which stoked my anxiety somewhat. Before
they started any work the mechanic told me he was nervous about it, which
didn&amp;rsquo;t inspire confidence, but I did appreciate his candor. I got it back from
them a lot sooner than I was expecting though, so that was good.&lt;/p&gt;
&lt;p&gt;When someone touches my car I am never convinced that the issue has been
sorted even if it presents that way at first. So we shall see if weird noises
reappear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download age restricted videos from YouTube using &lt;code&gt;yt-dlp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The trick is &lt;code&gt;--cookies-from-browser chrome&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yt-dlp &amp;quot;https://www.youtube.com/watch?v=dQw4w9WgXcQ&amp;quot; --cookies-from-browser chrome
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Log-in to YouTube from Chrome first, and when you run &lt;code&gt;yt-dlp&lt;/code&gt; it will prompt
to allow reading the cookies from Chrome and voila!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the first time in a while I took myself off to the cinema this week to
watch &lt;a href=&#34;https://www.themoviedb.org/movie/1013850-a-real-pain&#34;&gt;A Real Pain&lt;/a&gt; written and directed by &lt;a href=&#34;https://www.themoviedb.org/person/44735-jesse-eisenberg&#34;&gt;Jesse Eisenberg&lt;/a&gt;. I really enjoyed
it. I heard Eisenberg interviewed on a couple of podcasts (I guess marketing
by podcast works) and he seems like a thoughtful guy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Job advert:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We are seeking an experienced Ruby Developer with a strong background in
Hanami&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I bet you are. Do you know how many Ruby Developers there are with &amp;ldquo;strong&amp;rdquo;
Hanami experience? Probably like three, and they&amp;rsquo;re all core team members.
This person doesn&amp;rsquo;t exist.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/185-fabric-shaving/#:~:text=Anyway%2C%20that%E2%80%99s%20the%20story%20of%20how%20a%20man%20ordered%20%C2%A360%20worth%20of%20the%20same%20part%20out%20of%20sheer%20stubbornness&#34;&gt;(many) parts that were missing&lt;/a&gt; for my keyboard project have arrived (in
a surprisingly large box considering the contents) but I haven&amp;rsquo;t resumed the
build yet. From a visual inspection they &lt;em&gt;seem&lt;/em&gt; to be correct, but the proof
is in the &lt;del&gt;pudding&lt;/del&gt; soldering.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our planning application was approved without difficulty ✅&lt;/p&gt;
&lt;p&gt;We weren&amp;rsquo;t expecting any trouble but you never know when dealing with local
council bureaucrats.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I really should have been taking better care of my server. I know why I
haven&amp;rsquo;t taken care of it better &amp;ndash; fear of fubar. Changing things breaks
things. However, waiting a long time to change things breaks things &lt;em&gt;more&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I installed &lt;a href=&#34;https://en.wikipedia.org/wiki/Ubuntu_version_history#1804&#34;&gt;Ubuntu 18.04 LTS&lt;/a&gt; when it was the latest version, and have done
little to it since. Despite the LTS naming tag, support for this version ran
out in 2023. Which to be fair is 5 years of updates. I managed to pull all the
latest updates and upgrade the system.&lt;/p&gt;
&lt;p&gt;What I haven&amp;rsquo;t yet done, but plan to, is upgrade the distro completely to the
next version and beyond. That is a job for next week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Went to a wedding on Saturday. When you don&amp;rsquo;t drink they get boring fast 🥱&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our new house has some eaves storage which we would like to start using, but
it was a bit dirty and shabby in there. The space is fairly cold, but for what
we&amp;rsquo;re going to store in there that should be ok. Condensation is the enemy.&lt;/p&gt;
&lt;p&gt;As the space adjoins a bedroom we use as an office it seems like an
opportunity to add some extra insulation on the wall between the eaves and
office. The office is actually decently warm already, but I don&amp;rsquo;t think it
can hurt to insulate it a bit more for a modest sum.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been doing some research and the advise is all over the place, but the
one thing I don&amp;rsquo;t want to do is make anything worse. The general consensus is
that if you do it wrong you could end up with condensation. And condensation
is bad. V bad.&lt;/p&gt;
&lt;p&gt;The current plan is to use &lt;a href=&#34;https://en.wikipedia.org/wiki/Polyisocyanurate&#34;&gt;PIR&lt;/a&gt; insulation boards cut to size and pushed
between the studs in the wall on the eaves side. That way we&amp;rsquo;re keeping the
eaves as a cold space, and just improving the insulating properties of the
wall whilst still allowing everything to &amp;ldquo;breath&amp;rdquo;. It may be the start of
something more, but easy does it.&lt;/p&gt;
&lt;p&gt;When I get back into &lt;a href=&#34;/weeknotes/180-the-secret-to-air-travel/#:~:text=installing%20Home%20Assistant&#34;&gt;Home Automation mode&lt;/a&gt; I plan on installing
temperature/humidity sensors in both the office and eaves to monitor what&amp;rsquo;s
going on, preferably before doing any insulating so we can hopefully compare
before and after.&lt;/p&gt;
&lt;p&gt;The price of PIR boards is all over the place. To aid in deciding what to buy
and from where I found a &lt;a href=&#34;https://www.opticutter.com/&#34;&gt;sheet material calculator&lt;/a&gt; which has been very handy
so far. You feed in the board sizes you need, and the available boards sizes
from retailers, and it shows you how many boards you need and the most
efficient way to cut them.&lt;/p&gt;
&lt;p&gt;This project feels like our first foray into home improvements that are coming
at us fast. We have kitchen designer appointments booked for next week 🫣&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://airpodnoises.net/&#34;&gt;AirPod Noises&lt;/a&gt; &amp;ndash; Find our what your AirPods are trying to say.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://oban.pro/articles/oss-web-and-new-oban&#34;&gt;Open Sourcing Oban Web&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Years ago we realized our customers needed a more complex set of tools.
Thus, we released Oban Pro. Pro is where the serious business happens now,
and we want more people to have Web available from the start.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a smart move.&lt;/p&gt;
&lt;p&gt;Absolutely tons of new features and improvements too including MySQL support
so Oban now runs on Postgres, SQLite, and MySQL. Nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New Apple display competitors have &lt;a href=&#34;https://kuycon.us/monitors/G27-X/buy/&#34;&gt;entered&lt;/a&gt; &lt;a href=&#34;https://edgeup.asus.com/2025/get-a-stunningly-high-ppi-on-a-32-inch-screen-with-the-proart-display-6k-pa32qcv/&#34;&gt;the&lt;/a&gt; chat. Via &lt;a href=&#34;https://atp.fm/622&#34;&gt;ATP 622&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I still don&amp;rsquo;t want to work for a living. I&amp;rsquo;m pretty happy posting eBay parcels
and pottering about.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 185: Fabric shaving</title>
      <link>https://elver.me/weeknotes/185-fabric-shaving/</link>
      <pubDate>Sun, 12 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/185-fabric-shaving/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Having a real Christmas Tree is like getting pregnant with your second child.
You totally forgot how awful it was the last time you did it, but did it again
anyway. Stood up by an unreliable tree collector meant fighting with it
myself, and boy does chopping up an old Christmas Tree suck.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/The_Fall_(band)&#34;&gt;The Fall&lt;/a&gt; have never really been for me. Or so I thought until, via Spotify&amp;rsquo;s
Discover Weekly, I heard &lt;a href=&#34;https://open.spotify.com/track/2sIaC5trbnNk748yBC8Stc&#34;&gt;Mountain Energei&lt;/a&gt; and couldn&amp;rsquo;t stop listening. The
more you listen the more it hypnotises you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When we moved into this new house we bought a &amp;ldquo;temporary&amp;rdquo; bed which we knew we
wouldn&amp;rsquo;t be our forever bed, but would do for now. It was cheap. It is also,
as it turns out, made out of cardboard in parts. This led to one of the legs
on my side not holding up and slowly disappearing into the &amp;ldquo;cardboard&amp;rdquo;
headboard. I didn&amp;rsquo;t expect much from this bed, but I did naively expect it to
stay in the usual bed shape for longer than 8 months.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve attempted to shore it up with new metal legs from my mate Jeff. I doubt
it will last forever, but hopefully for a few years at least.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mainstream banks are now catching up with features that challenger banks have
had forever. They&amp;rsquo;re still not always doing it particularly well mind. It&amp;rsquo;s
pretty scary to wake up on a Sunday morning to a notification saying Apple Pay
is now available on your Apple Watch when you performed that action &lt;em&gt;days&lt;/em&gt;
before.&lt;/p&gt;
&lt;p&gt;There is a point at which a notification becomes at best useless, and worst
damaging. A terrible user experience and surely impacting their customer
support teams too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our staircase is steep and windy which led me to fall down said staircase.
Calm down, it was only 6 steps, but I did land hard and some choice words were
used. It&amp;rsquo;s not all bad news though. When you need an excuse to not go to the
gym, sometimes it&amp;rsquo;s handed to you on a silver platter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Progress on my &lt;a href=&#34;/weeknotes/184-keyboard-kaput/#:~:text=keyboard%202%20instead&#34;&gt;keyboard build&lt;/a&gt; has stalled because I didn&amp;rsquo;t have a couple of
parts I thought I did &amp;ndash; two &lt;a href=&#34;https://www.littlekeyboards.com/products/ultra-low-profile-sockets&#34;&gt;12 pin ultra low profile sockets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When connecting micro-controllers to keyboards (or to any PCB) you can,
broadly speaking, choose to solder it directly to the PCB or solder a socket
to the PCB and &amp;ldquo;socket&amp;rdquo; (push in) the micro-controller into it. This is what
I &lt;em&gt;didn&amp;rsquo;t&lt;/em&gt; &lt;a href=&#34;/weeknotes/184-keyboard-kaput/#:~:text=before%20I%20soldered%20them%20into%20place&#34;&gt;do last time&lt;/a&gt; so when I needed to remove it I ended up damaging
several parts. This time were doing things properly.&lt;/p&gt;
&lt;p&gt;Acquiring said sockets is another matter entirely. True, this was mainly
caused by me being tight, but I&amp;rsquo;m sorry, I am not paying £36 in postage costs
alone to send two tiny pieces of metal and plastic to the UK. Brexit fucking
over UK-dwelling keyboard enthusiasts, no doubt. There are other suppliers
with less ridiculous postage costs, but still too expensive on principle.&lt;/p&gt;
&lt;p&gt;It has taken me considerable effort to try and work out &lt;em&gt;what&lt;/em&gt; I needed to buy
and from &lt;em&gt;where&lt;/em&gt;. The original supplier didn&amp;rsquo;t specify manufacturer part
numbers (fair enough) so that was the first step. Once I had that, and with
some help, and over the course of a couple of days, I eventually worked out
which parts I needed. Electronic component supplier websites expect that you
know what you&amp;rsquo;re talking about which makes them difficult for the novice (this
guy) to use.&lt;/p&gt;
&lt;p&gt;Success? Of a kind. Soon it became clear that the cost was comparable to the
original supplier &lt;em&gt;unless&lt;/em&gt; you bought in bulk in order to qualify for free
postage. Anyway, that&amp;rsquo;s the story of how a man ordered £60 worth of the same
part out of sheer stubbornness. Take that &amp;ldquo;the man&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I bought a &lt;a href=&#34;https://www.amazon.co.uk/dp/B0BMF6JF8D&#34;&gt;&amp;ldquo;fabric shaver&amp;rdquo;&lt;/a&gt;; it&amp;rsquo;ll change your life. Trust.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 184: Keyboard kaput</title>
      <link>https://elver.me/weeknotes/184-keyboard-kaput/</link>
      <pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/184-keyboard-kaput/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We saw &lt;a href=&#34;https://www.themoviedb.org/movie/516729-paddington-in-peru&#34;&gt;Paddington in Peru&lt;/a&gt; on Sunday. Very enjoyable despite the zoo-like
audience. It doesn&amp;rsquo;t touch the first two for me though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fishshell.com/blog/rustport/&#34;&gt;Fish 4.0: The Fish Of Theseus&lt;/a&gt; &amp;ndash; Why is fish being rewritten in Rust?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Finally, subjectively, C++ isn’t drawing in the crowds. We have never had a
lot of C++ contributors. Over the 11 years fish used C++, only 17 people
have at least 10 commits to the C++ code. We also don’t know a lot of people
who would love to work on a C++ codebase in their free time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://antonz.org/stupid/&#34;&gt;I&amp;rsquo;m a programmer and I&amp;rsquo;m stupid&lt;/a&gt; &amp;ndash; I feel seen.&lt;/p&gt;
&lt;p&gt;Have I given up or accepted reality?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/183-lazy-complete/#:~:text=soldering&#34;&gt;new favourite hobby continues&lt;/a&gt; with mixed success. I moved on to
practicing SMD soldering. The soldering itself wasn&amp;rsquo;t too bad, I think I&amp;rsquo;m
getting the hang of that, the difficult part is dealing with such small
components and figuring out which way up things go. A lot of the components
are tiny oblongs with no markings of any sort.&lt;/p&gt;
&lt;p&gt;Given that the soldering was going well I decided start building keyboard kit
1 of 2. Putting everything together went fairly well, but when I tried
flashing the micro controllers one of them would not respond. I mucked about
with it for a bit to no avail, so I decided to desolder it and test it alone.
Clearly, I should have tested these before I soldered them into place &amp;ndash; a
lesson.&lt;/p&gt;
&lt;p&gt;Unfortunately, the desoldering process did &lt;em&gt;not&lt;/em&gt; go to plan, and I failed to
remove the micro controller without breaking it. And worse still, damaging one
half of the keyboard PCB.&lt;/p&gt;
&lt;p&gt;Anyway, keyboard kit number 1 is kaput for now. This one will be put down to
experience. It is potentially salvageable, but at a later date perhaps.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m moving onto keyboard 2 instead 😱&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://challahscript.com/what_i_wish_someone_told_me_about_postgres&#34;&gt;What I Wish Someone Told Me About Postgres&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The PostgreSQL folks also have a &lt;a href=&#34;https://wiki.postgresql.org/wiki/Don%27t_Do_This&#34;&gt;Don&amp;rsquo;t Do This&lt;/a&gt; page which has a lot of
interesting tidbits.&lt;/p&gt;
&lt;p&gt;Have I read all of this? No.&lt;/p&gt;
&lt;p&gt;Will I read it later when needed? Also likely no.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Postal tracking continues to amuse/confuse. Canada Post reported that &lt;a href=&#34;/weeknotes/182-secret-level/#:~:text=from%20Canada&#34;&gt;the
Megadesk&lt;/a&gt; would be delivered on the 6th January. Then changed their mind to
14th. And it finally arrived early on the 30th December!&lt;/p&gt;
&lt;p&gt;Watch this space to see if I can break a desk as well as a keyboard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/182-secret-level/#:~:text=buying%20random%20stuff&#34;&gt;Home Assistant Voice Preview Edition&lt;/a&gt; arrived. I&amp;rsquo;ve put it on a shelf
next to all the other bits and bobs&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We woke up to snow today (Sunday). It was nice to see it blanket the city
before it quickly turned to the usual brown slush.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next week is the start of &lt;em&gt;properly&lt;/em&gt; being off work. I have a list as long as
my arm for things to do, so I&amp;rsquo;m hoping that I can maintain motivation. I also
haven&amp;rsquo;t touched or looked at any code in about 3 weeks and I&amp;rsquo;m glad.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 183: Lazy complete</title>
      <link>https://elver.me/weeknotes/183-lazy-complete/</link>
      <pubDate>Sun, 29 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/183-lazy-complete/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/180-the-secret-to-air-travel/#:~:text=I%E2%80%99m%20making%20the%20move%20to%20lazy.nvim%20as%20my%20package%20manager&#34;&gt;move to lazy.nvim&lt;/a&gt; &lt;a href=&#34;https://github.com/jordelver/dotfiles/pull/2&#34;&gt;is complete&lt;/a&gt;. I&amp;rsquo;m mostly happy I&amp;rsquo;ve done this but
there are a few small things to work out. I decided to move ahead with the
merge anyway and sort them later/never.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I did &lt;a href=&#34;/weeknotes/182-secret-level/#:~:text=latest%20firmware&#34;&gt;re-install the POWKIDDY v10 and installed some games&lt;/a&gt;. It was a fairly
painless process.&lt;/p&gt;
&lt;p&gt;For some reason it doesn&amp;rsquo;t seem to want to charge past 75% battery capacity.
I&amp;rsquo;m not sure if I care enough to do anything about it yet. I will keep playing
with it and see what happens. The whole product is a fairly ramshackle affair,
but that is part of the appeal with these sort of things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://usetrmnl.com/&#34;&gt;TRMNL&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TRMNL is an e-ink companion that helps you stay focused.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Must. Not. Buy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amongst the &lt;em&gt;many&lt;/em&gt; projects I&amp;rsquo;ve added to my &amp;ldquo;whilst I&amp;rsquo;m taking a break&amp;rdquo; list
is to finally build the keyboard I bought in 2020. In fact, I bought enough
parts for two &lt;em&gt;almost&lt;/em&gt; identical keyboards. &amp;ldquo;Two?&amp;rdquo; It doesn&amp;rsquo;t make sense to me
either, but here we are.&lt;/p&gt;
&lt;p&gt;To that end, I&amp;rsquo;ve been practicing soldering with some cheap kits I bought for
the task. I procrastinated for ages, but enjoyed it once I got into it. So far
the kits have been through-hole component, which I think are generally
considered easier to deal with. The keyboard parts are surface mount instead,
so that is the next thing to try.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The long awaited &lt;a href=&#34;https://ghostty.org/&#34;&gt;Ghostty terminal emulator&lt;/a&gt; has been released after a long
private beta period. I&amp;rsquo;ve installed it, but I have no immediate plans to move
away from iTerm 2. &lt;a href=&#34;https://mitchellh.com/writing/ghostty-1-0-reflection&#34;&gt;Mitchell Hashimoto wrote about the experience&lt;/a&gt; of building
it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://swup.js.org/&#34;&gt;swup&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Versatile and extensible page transition library for server-rendered websites&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was initially pretty interested in this library. &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API&#34;&gt;View Transitions&lt;/a&gt; are a
really important part of moving away from the cancer that is the SPA, but when
playing with the demo it acted in a few strange broken ways which took the off
shine pretty quickly.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll keep it in-mind to try again should the need arise.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I managed to catch a cold whilst holiday. It &lt;em&gt;peaked&lt;/em&gt; on Christmas Day &amp;ndash; good
times. Thankfully it was overall fairly mild, and Christmas was a quiet one
anyway so it wasn&amp;rsquo;t too bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.seangoedecke.com/confidence/&#34;&gt;I don&amp;rsquo;t know how to build software and you don&amp;rsquo;t either&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The longer I work in tech, the less confident I get about any of these big
questions. I’ve seen enough things work that I thought were terrible ideas,
and vice versa. In fact, I’m not convinced it’s even possible to be
justifiably confident that there’s a right answer to these questions. Nobody
knows!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This really resonated with me.&lt;/p&gt;
&lt;p&gt;As we become more experienced we understand that there are no correct answers.
Only trade-offs. This makes dealing with less experienced colleagues difficult
as they are absolutely sure of their correctness. And to make it worse, they
seem to be highly productive to their non-technical bosses due to their over
abundance of confidence and Pull Requests containing hundreds of changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I know it&amp;rsquo;s a cliché, but the amount of space taken up by old &lt;code&gt;node_modules/&lt;/code&gt;
(and to be fair, Rails log files) is crazy. I freed up ~20GB just by casually
browsing the filesystem and deleting.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 182: Secret level</title>
      <link>https://elver.me/weeknotes/182-secret-level/</link>
      <pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/182-secret-level/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Last day at work on Thursday and also paid a week early. A Christmas miracle!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/180-the-secret-to-air-travel/#:~:text=hopeful%20this%20will%20mean%20a%20return%20to%20regular%20gyming&#34;&gt;return to the gym&lt;/a&gt; is going well. I&amp;rsquo;m starting to get back into a proper
routine now rather than just turning up to test the waters. Better still, the
gym is completely closed until the new year 😄&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://simonwillison.net/2024/Dec/22/link-blog/&#34;&gt;&amp;ldquo;My approach to running a link blog&amp;rdquo;&lt;/a&gt; &amp;ndash; My plans to extend this &amp;ldquo;blog&amp;rdquo; are
still that, plans, but Simon has some great tips here that I&amp;rsquo;m likely to
copy soon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Because buying random stuff you don&amp;rsquo;t need when you have no income is clever I
ordered a &lt;a href=&#34;https://www.home-assistant.io/voice-pe/&#34;&gt;Home Assistant Voice Preview Edition&lt;/a&gt; on a whim. There&amp;rsquo;s a lot of
whimming going on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/181-proc-composition/#:~:text=Retail%20therapy%20occurring&#34;&gt;POWKIDDY V10 arrived&lt;/a&gt; but I barely had time to play with it before going
on holiday. It comes with an enormous amount of games, to the point that
finding anything is difficult and overwhelming. A reformat and re-install of
the latest firmware, and a hand-picked selection of games is in order very
soon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The M-m-m-&lt;a href=&#34;/weeknotes/180-the-secret-to-air-travel/#:~:text=The%20order%20I%20made%20for%20a%20Megadesk%20was%20cancelled%20due%20to%20Canada%20Post%20being%20on%20strike&#34;&gt;Megadesk&lt;/a&gt; is back in-stock and now on a boat on it&amp;rsquo;s way from
Canada. Hurrah!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Christmas market time &amp;ndash; the city of choice this year? Munich. We were very
unprepared having booked the hotel and flights months ago in a rare moment of
foresight and then having followed that up with absolutely nothing.&lt;/p&gt;
&lt;p&gt;It didn&amp;rsquo;t start well. During immigration the single person manning the queue
suddenly decided to completely remove the queue, for reasons unknownm and in
the process almost incite a riot. Really fun start to getting away from it
all.&lt;/p&gt;
&lt;p&gt;Munich is a very pretty city, but it rained for a large part of our time there
which made it difficult to appreciate.&lt;/p&gt;
&lt;p&gt;Traveling abroad really does bring to light my love of the British plug.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I lost weight whilst on holiday despite a completely sausage based diet. The
human body is a mystery, but I&amp;rsquo;ll take it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My car was at the garage for an MOT and investigation into non-working air
conditioning. It passed the MOT with flying colours, which is a relief. The
investigation was less successful, so it will be going back in mid-January.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/elixir/comments/1hhc5qz/is_it_true_in_elixir_118_there_wont_be_any_more/&#34;&gt;Jose Valim has confirmed&lt;/a&gt; that Elixir 1.18 IEx will have a &lt;a href=&#34;https://hexdocs.pm/iex/1.18/IEx.html#configure/1-auto-reloading&#34;&gt;&lt;code&gt;auto_reload&lt;/code&gt;
configuration option&lt;/a&gt; so recompilations are automatically reloaded.&lt;/p&gt;
&lt;p&gt;There are some subtleties which &lt;a href=&#34;https://arrowsmithlabs.com/blog/iex-configure-auto-reload&#34;&gt;George Arrowsmith explains&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/-mFJ5rPbY_w?t=3297&#34;&gt;The Creator Of Elixir - Top Shelf 7&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We are going to respect the newline&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And so we should.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice tip on deriving &lt;code&gt;Inspect&lt;/code&gt; to get better output from Ecto models&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defmodule&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Postline.Accounts.User&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008080&#34;&gt;@derive&lt;/span&gt; {&lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Inspect&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;only&lt;/span&gt;: [&lt;span style=&#34;color:#990073&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:email&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:first_name&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:last_name&lt;/span&gt;]}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Ecto&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Schema&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  schema &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;users&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    field &lt;span style=&#34;color:#990073&#34;&gt;:email&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    field &lt;span style=&#34;color:#990073&#34;&gt;:first_name&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    field &lt;span style=&#34;color:#990073&#34;&gt;:last_name&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    field &lt;span style=&#34;color:#990073&#34;&gt;:avatar&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    field &lt;span style=&#34;color:#990073&#34;&gt;:subscribed&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:boolean&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;default&lt;/span&gt;: &lt;span style=&#34;color:#008080&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    field &lt;span style=&#34;color:#990073&#34;&gt;:subscription&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    field &lt;span style=&#34;color:#990073&#34;&gt;:role&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:atom&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;default&lt;/span&gt;: &lt;span style=&#34;color:#990073&#34;&gt;:user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    timestamps()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;From &lt;a href=&#34;https://bsky.app/profile/jskalc.bsky.social/post/3lcitdcq4tg22&#34;&gt;Jakub Skałecki&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.themoviedb.org/tv/261579-secret-level&#34;&gt;Secret level&lt;/a&gt; is very enjoyable. This series feels like it&amp;rsquo;s made for my
short attention span with the episodes being short. I particularly enjoyed
&lt;a href=&#34;https://www.themoviedb.org/tv/261579-secret-level/season/1/episode/5&#34;&gt;Episode 5, Warhammer 40,000: And They Shall Know No Fear&lt;/a&gt;. I do hope that
&lt;a href=&#34;https://www.instagram.com/p/DDY_euNohPB/&#34;&gt;Henry Cavill&lt;/a&gt; can pull off a full series.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 181: Proc composition</title>
      <link>https://elver.me/weeknotes/181-proc-composition/</link>
      <pubDate>Sun, 15 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/181-proc-composition/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Friends visited for a Christmas get together which was delightful because I
wasn&amp;rsquo;t expecting it and I really appreciate the effort of driving 5 or 6
hours. This did however lead to being uncomfortably full due to the sheer
amount of beige consumed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.adam-buxton.co.uk/podcasts/rhwkafw2z2x3xe6-6ysb3-pfp9n-6xxa2-jnpn5-2cacw-6cz8f-gx8fb-nkb87-c6mae-bd5zy-yby4r-6392t-jf5tm-ph55s-cktl3-dsw49-r8ccg-sj9we&#34;&gt;Kim Deal was an absolute delight on Adam Buxton&amp;rsquo;s podcast&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;During &lt;a href=&#34;/weeknotes/180-the-secret-to-air-travel/#:~:text=making%20the%20move%20to%20lazy.nvim&#34;&gt;the move to lazy.nvim&lt;/a&gt; I discovered Neovim has &lt;code&gt;set wrap&lt;/code&gt; on by
default. Who are these monsters who want word wrap turned on &lt;em&gt;by default&lt;/em&gt;?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I was &lt;a href=&#34;https://x.com/RubyCademy/status/1865474663763099946&#34;&gt;reminded of Proc composition in Ruby&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is so cool. Check this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; strip &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0086b3&#34;&gt;proc&lt;/span&gt;(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#990073&#34;&gt;:strip&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;#&amp;lt;Proc:0x000000014dc3b830(&amp;amp;:strip) (lambda)&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; downcase &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0086b3&#34;&gt;proc&lt;/span&gt;(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#990073&#34;&gt;:downcase&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;#&amp;lt;Proc:0x000000016e0746e8(&amp;amp;:downcase) (lambda)&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; remove_alias &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0086b3&#34;&gt;proc&lt;/span&gt; { _1&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;gsub(&lt;span style=&#34;color:#009926&#34;&gt;/\+.*@/&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;@&amp;#39;&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;#&amp;lt;Proc:0x000000016dcfbed0 (starfish):14&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; email &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;   Test+alias@example.com   &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;   Test+alias@example.com   &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; (strip &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; downcase &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; remove_alias)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;call(email)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;test@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I followed this until I got to the &lt;code&gt;(strip &amp;gt;&amp;gt; downcase &amp;gt;&amp;gt; remove_alias)&lt;/code&gt; part.
I&amp;rsquo;ve never seen &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; used in this context so I was confused. This is
apparently the &lt;a href=&#34;https://ruby-doc.org/3.3.6/Proc.html#method-i-3E-3E&#34;&gt;proc composition operator&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Returns a proc that is the composition of this proc and the given g. The
returned proc takes a variable number of arguments, calls this proc with
them then calls g with the result.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;More details about Proc composition over on &lt;a href=&#34;https://rubyreferences.github.io/rubychanges/2.6.html#proc-composition&#34;&gt;Ruby Changes&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rails&amp;rsquo; &lt;code&gt;ActiveSupport::StringInquirer&lt;/code&gt; is cool.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; x &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;ActiveSupport&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;StringInquirer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;new(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;bluesky&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;bluesky&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; x&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;bluesky?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; x&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;foobar?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://bsky.app/profile/jamie.schembri.me/post/3lcil7i4ay22c&#34;&gt;https://bsky.app/profile/jamie.schembri.me/post/3lcil7i4ay22c&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My audiobook listening hasn&amp;rsquo;t been going well. Mainly because I have so many
podcasts to keep up with that poor Lord of the Rings is getting pushed back
farther and farther each day. However, it has not been helped by &lt;a href=&#34;https://prologue.audio/&#34;&gt;Prologue&lt;/a&gt;
randomly losing the place in the book and resetting my listening position back
to the start. Good times.&lt;/p&gt;
&lt;p&gt;Can I be bothered to try and scrub through the back to the position I left it
last? I&amp;rsquo;m not that far in, so it might not be too terrible, but will it happen
again?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice overview of the &lt;a href=&#34;https://www.youtube.com/watch?v=Fe7Y152ak3Y&#34;&gt;new features in Elixir 1.18&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Syntax code highlighting is something that I&amp;rsquo;ve been meaning to enable on my
weeknotes for ages, and this week I finally got to it. Check it 👇&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;bar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;and I&amp;#39;m Ruby!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I went through all previous weeknotes and made sure all the code snippets have
the correct language specified too.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m good to you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I also added Next/Previous links at the bottom of each blog post &amp;ndash; crikey!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/neovim/neovim/pull/31031&#34;&gt;add vim.lsp.config and vim.lsp.enable&lt;/a&gt; &amp;ndash; this seems great to me. I&amp;rsquo;ve seen
some detractors, but I haven&amp;rsquo;t fully embraced LSPs because of the overhead
involved in setting it all up.&lt;/p&gt;
&lt;p&gt;Not all Neovim users have the time or inclination to try and figure out how to
mould the various Lua you need into something that works. If these new APIs
can help me set up an LSP more easily, I&amp;rsquo;m all for it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://stuartschechter.org/posts/password-history/&#34;&gt;How some of the world&amp;rsquo;s most brilliant computer scientists got password
policies so wrong&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;re gradually making this house look more homely, this week by acquiring a
mirror from Facebook Marketplace and hanging said mirror. Drilling two holes
in a wall was harder than necessary, but such is DIY. I hope it stays on the
wall! Really pleased with it though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.honeybadger.io/blog/elixir-module-names/&#34;&gt;Module names in Elixir are actually Atoms&lt;/a&gt; underneath.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iex(&lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Game.DynamicSupervisor&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#990073&#34;&gt;:&amp;#34;Elixir.Game.DynamicSupervisor&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Elixir converts all module names to Atoms prefixed with &lt;code&gt;Elixir.&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was talking to someone about needing to do a rename in a large Rails project
this week, and it&amp;rsquo;s requiring a lot of small, gradual, changes. In other
runtimes/languages this would be a right-click, rename, deploy.&lt;/p&gt;
&lt;p&gt;Ruby is great, but everything is a trade-off, and I think we should be honest
with ourselves when it sucks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/180-the-secret-to-air-travel/#:~:text=the%20next%20step%20was%20to%20go%20straight%20to%20AliExpress%20and%20buy%20a%20random%20variety%20of%20ZigBee%2Denabled%20gubbins&#34;&gt;AliExpress happened again&lt;/a&gt;. Retail therapy occurring in the form of a
&lt;a href=&#34;https://powkiddy.com/en-uk/products/powkiddy-v10-handheld-game-console&#34;&gt;POWKIDDY v10&lt;/a&gt; handheld console ala GameBoy which I&amp;rsquo;m sure I will play and
charge at &lt;em&gt;least&lt;/em&gt; once.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Car goes into the garage tomorrow. Wish me luck!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 180: The secret to air travel</title>
      <link>https://elver.me/weeknotes/180-the-secret-to-air-travel/</link>
      <pubDate>Sun, 08 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/180-the-secret-to-air-travel/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.themoviedb.org/movie/562-die-hard&#34;&gt;&amp;ldquo;You wanna know the secret to surviving air travel?&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Still haven&amp;rsquo;t &lt;a href=&#34;/weeknotes/177-an-afternoon-in-costa/#:~:text=yet%20to%20set%20it%20up&#34;&gt;set up the new computer&lt;/a&gt;. It feels quite disrespectful to leave
a new computer sat next to me unused for this long. However, I have started
refactoring my Neovim config as part of the move. If that&amp;rsquo;s not
procrastination, I don&amp;rsquo;t know what is.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m making the move to &lt;a href=&#34;https://github.com/folke/lazy.nvim&#34;&gt;lazy.nvim&lt;/a&gt; as my package manager instead of packer. All
the cool kids are using it, and it does seem to genuinely allow for the more
modular setup I&amp;rsquo;ve been searching for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://kezhenxu94.me/blog/lazyvim-project-specific-settings&#34;&gt;Project specific configurations in LazyVim with .lazy.lua&lt;/a&gt; &amp;ndash; lazy.nvim also
has project-level config support. Very useful for working on multiple projects
at once.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of Neovim, &lt;a href=&#34;https://www.youtube.com/@teej_dv/videos&#34;&gt;TJ DeVries&lt;/a&gt; is on a great advent run on his YouTube
channel at the moment. Some really great content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After quiting the last gym, which I didn&amp;rsquo;t, like I&amp;rsquo;ve been just not
exercising. Clearly it&amp;rsquo;s good to exercise, so I&amp;rsquo;ve been evaluating
alternatives for a while.&lt;/p&gt;
&lt;p&gt;My original shortlist had on it a gym even closer to me than the last
(literally a 3 minute walk) but I discounted it at the time due to the
perceived lack of equipment, and strange opening hours. But perfect is the
enemy of good, so I decided to sign up for a day pass to see how it really is
in practice.&lt;/p&gt;
&lt;p&gt;The reality is that the photos on the website are very out-of-date and the
breadth of equipment actually really quite good, and it was &lt;em&gt;completely&lt;/em&gt;
empty. The staff said it is almost always empty, so I&amp;rsquo;m very hopeful this will
mean a return to regular gyming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/sasa1977/soul_of_erlang_and_elixir&#34;&gt;Sasa Juric has re-written and released the demo&lt;/a&gt; from his great talk: &lt;a href=&#34;https://www.youtube.com/watch?v=JvBT4XBdoUE&#34;&gt;The
Soul of Erlang and Elixir&lt;/a&gt;. The talk is really worth watching.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Philips eventually delivered the products I had bought. Awful customer
service, see &lt;a href=&#34;/weeknotes/178-bumper-issue/#:~:text=reminds%20me%20why%20Amazon%20reigns%20supreme&#34;&gt;Amazon&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, the products themselves are great so far. I fitted the &lt;a href=&#34;https://www.philips-hue.com/en-gb/p/lightstrips-play-gradient-lightstrip-for-pc/8719514434479&#34;&gt;Play Gradient
Lightstrip&lt;/a&gt; to the back of my monitor (which I was hesitant to do, because
sticking sticky stuff to the back of such a beautiful display feels bad) and
it looks lovely &amp;ndash; just what I was after.&lt;/p&gt;
&lt;p&gt;At the moment it&amp;rsquo;s just setup directly via Bluetooth. I&amp;rsquo;m not sure people are
aware you don&amp;rsquo;t &lt;em&gt;necessarily&lt;/em&gt; need the hub. This allows control via the iOS
app.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve yet to set up the &lt;a href=&#34;https://www.philips-hue.com/en-gb/p/hue-bridge/8719514342583&#34;&gt;Hub&lt;/a&gt; and &lt;a href=&#34;https://www.philips-hue.com/en-gb/p/hue-white-and-colour-ambiance-lightstrip-plus-base-v4-2-metre/8718699703424&#34;&gt;Lightstrip Plus&lt;/a&gt; I also purchased at the
same time, but I&amp;rsquo;ll get to that soon. Once I have the Hub going that will
allow proper automation, and I can use the macOS menubar app, &lt;a href=&#34;https://apps.apple.com/us/app/hue-menu-bar-for-philips-hue/id1500678169&#34;&gt;Hue Menu Bar
for Philips Hue&lt;/a&gt;, I bought to control monitor backlighting via software, and I
can also give the &lt;a href=&#34;https://www.philips-hue.com/en-in/explore-hue/propositions/entertainment/hue-sync&#34;&gt;Hue Sync app&lt;/a&gt; a go to sync the light with the monitor
picture.&lt;/p&gt;
&lt;p&gt;In my frustration with Philips I had also bought an additional lightstrip
direct from Amazon. The point being, I now have too many lightstrips in this
house. Soon it will look like the nightmare disco in every room of the Philips
adverts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After ordering Philips Hue gear and installing Home Assistant, of course, the
next step was to go straight to &lt;a href=&#34;https://en.wikipedia.org/wiki/AliExpress&#34;&gt;AliExpress&lt;/a&gt; and buy a random variety of
ZigBee-enabled gubbins.&lt;/p&gt;
&lt;p&gt;I got some &lt;a href=&#34;https://www.aliexpress.com/item/1005007484865151.html&#34;&gt;temperature and humidy sensors&lt;/a&gt;, some &lt;a href=&#34;https://www.aliexpress.com/item/1005007625460115.html&#34;&gt;temperature and humidity
sensors with screens&lt;/a&gt;, a &lt;a href=&#34;https://www.aliexpress.com/item/1005006578221694.html&#34;&gt;human presence detector&lt;/a&gt; (!), and most importantly a
&lt;a href=&#34;https://www.aliexpress.com/item/1005004942648430.html&#34;&gt;SMLIGHT SLZB-06M ZigBee co-ordinator&lt;/a&gt; to control everything.&lt;/p&gt;
&lt;p&gt;I also bought &lt;a href=&#34;https://www.ikea.com/gb/en/p/tretakt-plug-smart-80556514/&#34;&gt;some plugs&lt;/a&gt; and a &lt;a href=&#34;https://www.ikea.com/gb/en/p/vallhorn-wireless-motion-sensor-smart-white-90504341/&#34;&gt;motion sensor&lt;/a&gt; from IKEA because cheap and
reliable.&lt;/p&gt;
&lt;p&gt;Will all this stuff work together? Fuck knows.&lt;/p&gt;
&lt;p&gt;I plan to place another order because I am helpless.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about &lt;a href=&#34;https://hexdocs.pm/iex/IEx.Helpers.html#import_if_available/1&#34;&gt;&lt;code&gt;import_if_available&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Useful for attempting to import a module if it is available.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://blog.brettbeatty.com/2024_09_28_iex_any_helper.html&#34;&gt;IEx &amp;ldquo;any&amp;rdquo; Helper&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/179-tumultuous-week/#:~:text=Which%20is%20why%20I%E2%80%99ve%20bought&#34;&gt;order I made for a Megadesk&lt;/a&gt; was cancelled due to Canada Post being on
strike. I&amp;rsquo;ve set a new reminder, but it seems unlikely that I&amp;rsquo;ll get one
before Christmas now. Sadness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://vereis.com/posts/disterl_inbox&#34;&gt;Distributed Erlang&lt;/a&gt; &amp;ndash; very nice explanation of Erlang in general, but its
distribution properties more specifically. I was also impressed with the &lt;a href=&#34;https://github.com/vereis/blog/commit/a0bf77480a8d6f5c227feeec6666d1041a8300ef&#34;&gt;CSS
CRT effect&lt;/a&gt; in use, although it made me feel slightly queasy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For as long as I can remember when enqueuing a job in Rails I would always
pass an ID into the job. When the job executed at a later time, I would grab
the ID, find the relevant model object and the go about my business.&lt;/p&gt;
&lt;p&gt;So it shocked me when a code review led to finding out that you can now pass
an ActiveRecord object instead of just an ID. This works because of
&lt;a href=&#34;https://github.com/rails/globalid/blob/main/README.md&#34;&gt;&lt;code&gt;GlobalID&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Active Job supports GlobalID for parameters. This makes it possible to pass
live Active Record objects to your job instead of class/id pairs, which you
then have to manually deserialize. Before, jobs would look like this:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This does clean up job code somewhat as you don&amp;rsquo;t need to do the manual
finding the record step. Rails constantly surprises.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://guides.rubyonrails.org/active_job_basics.html#globalid&#34;&gt;https://guides.rubyonrails.org/active_job_basics.html#globalid&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wasn&amp;rsquo;t expecting to hear Apex Twin on the latest series of the &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Block_%28Australian_TV_series%29&#34;&gt;The Block&lt;/a&gt;.
No, not &lt;a href=&#34;https://en.wikipedia.org/wiki/Come_to_Daddy_(song)&#34;&gt;Come to Daddy&lt;/a&gt; unfortunately - &lt;a href=&#34;https://en.wikipedia.org/wiki/Avril_14th&#34;&gt;Avril 14th&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://island94.org/2024/12/including-rails-view-helpers-concern&#34;&gt;Including Rails View Helpers is a concern&lt;/a&gt; &amp;ndash; This is something I see a lot,
and Ruby makes it easy, just mixin all the things. Need one method? Include
your friend and mine, &lt;code&gt;include ApplicationHelper&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Missing your Apple Touch Bar?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://eniacelec.com/&#34;&gt;Flexbar&lt;/a&gt;, A More Versatile &amp;amp; Fully Customizable Touch-Bar Solution&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;How long until someone slams their laptop shut with this inside it?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hexdocs.pm/mix_test_interactive/readme.html&#34;&gt;mix test.interactive&lt;/a&gt; &amp;ndash; An interactive test runner for ExUnit tests.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It allows you to easily switch between running all tests, stale tests, or
failed tests. Or, you can run only the tests whose filenames contain a
substring.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://testdouble.com/insights/when-code-reviews-arent-mandatory&#34;&gt;What happens when code reviews aren’t mandatory? An experiment&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BridgeCare wanted to try a different approach. While established norms tell
us to wait for review before merging, they were like - what if - what if we
didn&amp;rsquo;t require PRs to have sign-off before merging?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We need to remember we once survived without PRs and without PR reviews.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Building trust with teammates through communication and consensus-building
about key/structural updates is essential&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oh. Never mind.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://keathley.io/blog/sgp.html&#34;&gt;The dangers of the Single Global Process&lt;/a&gt; &amp;ndash; An interesting article on the
dangers of using a single global process in your Elixir app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is more of a TIL type post, I should &lt;a href=&#34;/weeknotes/5-professional-bash-programmer/#:~:text=I%E2%80%99m%20working%20on%20getting%20a%20TIL%20site%20up%20and%20running&#34;&gt;start that TIL site I spoke about in
2021&lt;/a&gt;. Anyway, Elixir processes&amp;hellip;&lt;/p&gt;
&lt;p&gt;Each Elixir process has a mailbox for messages. When a process is sent a
message, it is stored in the mailbox until it is processed. Processing happens
using a &lt;code&gt;receive&lt;/code&gt; block, or we can flush the messages.&lt;/p&gt;
&lt;p&gt;You can see the messages a process has using &lt;code&gt;:erlang.process_info&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iex(&lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#990073&#34;&gt;:erlang&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;process_info(self(), &lt;span style=&#34;color:#990073&#34;&gt;:messages&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#990073&#34;&gt;:messages&lt;/span&gt;, []}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;self()&lt;/code&gt; returns the PID (Process Identifier) of the currently running
process, in this case &lt;code&gt;iex&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Send a message to the process.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iex(&lt;span style=&#34;color:#099&#34;&gt;2&lt;/span&gt;)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; send(self(), {&lt;span style=&#34;color:#990073&#34;&gt;:foo&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#990073&#34;&gt;:foo&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now the process has a message in it&amp;rsquo;s mailbox.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iex(&lt;span style=&#34;color:#099&#34;&gt;3&lt;/span&gt;)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#990073&#34;&gt;:erlang&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;process_info(self(), &lt;span style=&#34;color:#990073&#34;&gt;:messages&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#990073&#34;&gt;:messages&lt;/span&gt;, [&lt;span style=&#34;color:#990073&#34;&gt;foo&lt;/span&gt;: &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;]}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Flush the messages.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iex(&lt;span style=&#34;color:#099&#34;&gt;4&lt;/span&gt;)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; flush()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#990073&#34;&gt;:foo&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#990073&#34;&gt;:ok&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bang and the message is gone.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iex(&lt;span style=&#34;color:#099&#34;&gt;5&lt;/span&gt;)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#990073&#34;&gt;:erlang&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;process_info(self(), &lt;span style=&#34;color:#990073&#34;&gt;:messages&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#990073&#34;&gt;:messages&lt;/span&gt;, []}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.metageek.com/training/resources/zigbee-wifi-coexistence/&#34;&gt;ZigBee and Wi-Fi Coexistence&lt;/a&gt; &amp;ndash; useful for my current house project. Given
that ZigBee and Wi-Fi share space in the radio spectrum it&amp;rsquo;s worth being aware
which frequencies can interfere with each other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.phoenixframework.org/blog/phoenix-liveview-1.0-released?release=1.0&#34;&gt;Phoenix LiveView 1.0 was released!&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Got a real Christmas tree this year? Do yourself a favour and get down the
Middle of Lidl and buy a &lt;a href=&#34;https://de.wikipedia.org/wiki/Weihnachtsbaumst%C3%A4nder&#34;&gt;Weihnachtsbaumständer&lt;/a&gt; for the bargain price of
£14.99. This thing is incredible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 179: Tumultuous week</title>
      <link>https://elver.me/weeknotes/179-tumultuous-week/</link>
      <pubDate>Sun, 01 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/179-tumultuous-week/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stop sending me emails saying that my &amp;ldquo;statement is available&amp;rdquo; when it is, in
fact, not available. If you haven&amp;rsquo;t processed the document yet, don&amp;rsquo;t send the
email. Looking at you Companies House and HMRC.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Black Friday struck again! I bought a Yum Asia Panda Mini rice cooker. It will
pay for itself in literally some amount of years. And now I have an excellent
excuse to buy a fucking massive bag of rice, which I&amp;rsquo;ve been wanting to do for
years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I took the time to actually learn what &lt;a href=&#34;https://hexdocs.pm/elixir/Module.html#module-impl-since-v1-5-0&#34;&gt;&lt;code&gt;@impl true&lt;/code&gt;&lt;/a&gt; is for in Elixir this
week. Up to now I&amp;rsquo;ve just been scattering them about until the compiler was
happy 😆&lt;/p&gt;
&lt;p&gt;Basically, it makes it clear the function you are implementing is a callback
from a Behaviour, which makes the code more obvious.&lt;/p&gt;
&lt;p&gt;This &lt;a href=&#34;https://elixircasts.io/%40impl-attribute&#34;&gt;ElixirCasts video&lt;/a&gt; explained it well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I applied for a new business bank account this week and after the sign-up
process, and application approval, they managed to issue me not the current
and savings accounts I was expecting, but three different accounts.&lt;/p&gt;
&lt;p&gt;Can you trust a bank who can&amp;rsquo;t correctly provision your bank account? I guess
we&amp;rsquo;ll see 😬&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another side project idea struck me this week which made me &lt;em&gt;even less&lt;/em&gt;
interested in the &lt;em&gt;current&lt;/em&gt; side project. I must finish something. I&amp;rsquo;m a bit
stuck again, but I&amp;rsquo;ve made a plan for how to get unstuck.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/178-bumper-issue/#:~:text=Maybe%20next%20though%2C%20they%20could%20send%20the%20items%20I%20bought%20rather%20than%20a%20random%20item%20I%E2%80%99ve%20never%20heard%20of&#34;&gt;Philips have failed to send the items I bought&lt;/a&gt;. Worse still, they can&amp;rsquo;t tell
me when they will, but are still selling the same items on their online store.&lt;/p&gt;
&lt;p&gt;And on top of that the incorrect items were picked up by courier at 4:30pm
when I was given a 11am -&amp;gt; 1pm collection window, ruining my plans.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.yellowduck.be/posts/dynamic-order-by-using-phoenix-ecto&#34;&gt;Dynamic order by using Phoenix Ecto&lt;/a&gt; &amp;ndash; informative post on ordering queries
in Elixir&amp;rsquo;s Ecto.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://simonwillison.net/2024/Nov/27/storing-times-for-human-events/&#34;&gt;Storing times for human events&lt;/a&gt; &amp;ndash; Anyone who tells you &amp;ldquo;just store as UTC&amp;rdquo;
has not understood the complexities involved in times and timezones. Remember,
hubris is rife in this industry. Being able to write a computer programme does
not make you infallible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://bsky.app/profile/sasajuric.bsky.social/post/3lbsmdjncts2h&#34;&gt;Saša Jurić&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My opinion on squash merge: don&amp;rsquo;t. This is the hill I&amp;rsquo;ll die on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There is no need to squash.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I rewrite the history of my work-in-progress branch a lot, with the intent
of getting a nice history that helps reviewers &amp;amp; others. As much as
possible, I try to do this constantly, along with coding, because a big
history cleanup after all is done is usually more difficult.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A lot of the replies to this thread are a bit disappointing.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve said it before and I&amp;rsquo;ll say it again &amp;ndash; empathy. For the reviewers, for
future bug fixers. Showing the story of a change makes review so much easier.
All the information you found along the way to a code change is recorded in
the commit.&lt;/p&gt;
&lt;p&gt;Why would you throw this knowledge away by squashing? Let&amp;rsquo;s be honest, because
you didn&amp;rsquo;t bother to document any of it to start with.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://bsky.app/profile/hauleth.dev/post/3lbtmaxmxxs2k&#34;&gt;Hauleth is more to the point&lt;/a&gt;, but correct:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Squash merges are dirty solution for people who cannot use rebase &amp;ldquo;merges&amp;rdquo;
and cannot keep their commit history clean.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tumultuous week at work. It started by saying goodbye to a couple of
colleagues, and ended with me finding out I will need to say goodbye myself.
The silence from some has been deafening.&lt;/p&gt;
&lt;p&gt;My last day will actually be the end of December. I&amp;rsquo;ll be looking for work in
the new year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.johnnunemaker.com/shrinking-a-postgres-table/&#34;&gt;Shrinking a Postgres Table&lt;/a&gt; &amp;ndash; Some interesting techniques for reducing the
size of a Postgres table, but mostly a showcase for how you can use AI to talk
over ideas. I&amp;rsquo;ve found this invaluable recently.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.yellowduck.be/posts/removing-query-string-parameters-from-a-url-given-a-prefix&#34;&gt;Removing query string parameters from a URL given a prefix&lt;/a&gt; &amp;ndash; with Elixir.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I found a website this week which had &amp;ldquo;links&amp;rdquo; to &amp;ldquo;pages&amp;rdquo;, but no actual &lt;code&gt;&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&lt;/code&gt; in sight! JavaScript required to click on blog post pages? Come. On.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s make proper websites still, yeah?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.yellowduck.be/posts/the-beauty-of-debugging-in-elixir-when-using-dbg&#34;&gt;The beauty of debugging in Elixir when using dbg()&lt;/a&gt; reminded of the &lt;code&gt;dbg&lt;/code&gt;
macro which I apparently wrote about in &lt;a href=&#34;/weeknotes/56-performance-improvements/#:~:text=A%20macro%20that%20you%20can%20use%20on%20the%20end%20of%20a%20pipeline%20and%20it%20will%20output%20each%20value%20in%20turn&#34;&gt;Weeknotes 56&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Elixir is cool!&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;#=&amp;gt; &amp;#34;Elixir is cool!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;trim_trailing(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;!&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;#=&amp;gt; &amp;#34;Elixir is cool&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;split() &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;#=&amp;gt; [&amp;#34;Elixir&amp;#34;, &amp;#34;is&amp;#34;, &amp;#34;cool&amp;#34;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;List&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;first() &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;#=&amp;gt; &amp;#34;Elixir&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Elixir&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jvns.ca/blog/2024/11/29/why-pipes-get-stuck-buffering/&#34;&gt;Why pipes sometimes get &amp;ldquo;stuck&amp;rdquo;: buffering&lt;/a&gt; &amp;ndash; I&amp;rsquo;m pretty sure I&amp;rsquo;ve had this
happen to me and just had no idea what was going on, so it&amp;rsquo;s nice to finally
know what was going on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The IKEA Bekant desk I use has served me well. The only thing is that it
doesn&amp;rsquo;t have any support for saved desk height positions. This might sound
lazy, but raising and lowering to the exact height you want can get tiresome.&lt;/p&gt;
&lt;p&gt;Which is why I&amp;rsquo;ve bought a &lt;a href=&#34;https://www.tindie.com/products/gcormier/megadesk/&#34;&gt;Megadesk&lt;/a&gt;!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Megadesk is an open-source, drop in controller for the IKEA Bekant standing
desk&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don&amp;rsquo;t plan on keeping the Bekant forever, it is feeling a bit old now, but
in the mean time I can upgrade it with the Megadesk to breath some new life
into it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 178: Bumper issue</title>
      <link>https://elver.me/weeknotes/178-bumper-issue/</link>
      <pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/178-bumper-issue/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Blimey it&amp;rsquo;s cold!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Christmas Present Buying Season once again reminds me why Amazon reigns
supreme &amp;ndash; delivery times from a lot of other companies are generally woeful.
I understand that it must be nigh on impossible to compete with Amazon&amp;rsquo;s
logistics, but a lot of places are just like &amp;ldquo;you&amp;rsquo;ll get it one day,
probably&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is a good &lt;a href=&#34;https://peterullrich.com/a-bluesky-starter-guide-for-elixir-devs&#34;&gt;getting started with Bluesky&lt;/a&gt; post should you wish to subject
yourself to more of the same.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you have a folder in your macOS Dock did you know that you can open the
folder directly in Finder by &lt;kbd&gt;Opt&lt;/kbd&gt; + &lt;kbd&gt;Cmd&lt;/kbd&gt; + clicking it?
Neat!&lt;/p&gt;
&lt;p&gt;Hat tip to &lt;a href=&#34;https://atp.fm/&#34;&gt;ATP&lt;/a&gt; 🎩&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://railsdesigner.com/rails-partial-features/&#34;&gt;Rails&amp;rsquo; Partial Features You (didn&amp;rsquo;t) Know&lt;/a&gt; &amp;ndash; I didn&amp;rsquo;t know a lot of these
points. Good article, but you could argue that there are &lt;em&gt;too many&lt;/em&gt; ways to
render partials, and actually a more explicit default would be better. Like a
lot of the cool magic that draws people into Rails, we&amp;rsquo;d be better off without
it. Probably.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This weeks I learnt about the new CSS function &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/light-dark&#34;&gt;&lt;code&gt;light-dark()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The light-dark() CSS &lt;color&gt; function enables setting two colors for a
property - returning one of the two colors options by detecting if the
developer has set a light or dark color scheme or the user has requested
light or dark color theme - without needing to encase the theme colors
within a prefers-color-scheme media feature query.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Via &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://bsky.app/profile/kelseyhightower.com/post/3lbcmw4olzk24&#34;&gt;SQLite inside Postgres anyone?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just when I thought I&amp;rsquo;ve seen it all, a PostgreSQL extension shows up that
allows you to embed a SQLite database inside a table.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Get the best of both worlds 🤪&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Black Friday got a hold of me and I ordered some &lt;a href=&#34;https://www.philips-hue.com/&#34;&gt;Philips Hue&lt;/a&gt; gear. For the
last fews weeks (since it&amp;rsquo;s been getting really dark at 4pm 😢) I&amp;rsquo;ve been
thinking about lighting in my office. If I were a better typist this wouldn&amp;rsquo;t
be a problem, but I&amp;rsquo;m not, so.&lt;/p&gt;
&lt;p&gt;I bought a couple of light strips and a hub to experiment with. And, of
course, I immediately installed &lt;a href=&#34;https://www.home-assistant.io/&#34;&gt;Home Assistant&lt;/a&gt; because this is now going to
become my life. I need something to fill it up with anyway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And to immediately undermine my rant above about delivery times, fair play to
Philips for delivering the goods to me quickly &amp;ndash; within 2 days in fact. Maybe
next though, they could send the items I bought rather than a random item I&amp;rsquo;ve
never heard of. Keep trying guys.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dashbit.co/blog/remix-concurrent-submissions-flawed&#34;&gt;Remix&amp;rsquo;s concurrent submissions are fundamentally flawed (without causal
ordering)&lt;/a&gt; &amp;ndash; always interesting from José.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My partner&amp;rsquo;s car was in for a service last week. These days a lot of main
dealers send you a text with a report of issues they&amp;rsquo;ve found &amp;ndash; how modern.
You might have received one yourself. You can then review the items and accept
or reject the work items.&lt;/p&gt;
&lt;p&gt;Imagine our surprise when a basic service led to an &amp;ldquo;URGENT&amp;rdquo; work item (in
red, no less) where they wanted to more or less replace the entire exhaust
system because a hose had come lose.&lt;/p&gt;
&lt;p&gt;This system, under the guise of modernity, seems to be in-place purely to
scare the shit out of you so you panic click &amp;ldquo;Accept&amp;rdquo; and they make a nice
premium on top. They back-tracked pretty quickly when we applied even the
smallest amount of scrutiny, saying &amp;ldquo;I wouldn&amp;rsquo;t bother, it will be fine&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I think we can safely file them under &amp;ldquo;Cheeky Fuckers&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://elixirforum.com/t/new-community-maintained-otp-builds-for-macos/67338&#34;&gt;New community-maintained OTP builds for macOS&lt;/a&gt; &amp;ndash; this is great. I&amp;rsquo;ve had
trouble in the past with compiling new Erlang versions with all the niceties
such as &lt;code&gt;wx&lt;/code&gt; and &lt;code&gt;observer&lt;/code&gt;, so having pre-compiled versions with everything
built-in is excellent.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s already an &lt;a href=&#34;https://github.com/michallepicki/asdf-erlang-prebuilt-macos&#34;&gt;&lt;code&gt;asdf&lt;/code&gt; plugin&lt;/a&gt; too ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went to see &lt;a href=&#34;https://en.wikipedia.org/wiki/Ivo_Graham&#34;&gt;Ivo Graham&lt;/a&gt; on Wednesday, supported by &lt;a href=&#34;https://linktr.ee/alexkealy&#34;&gt;Alex Kealy&lt;/a&gt;. Both acts
were great. Being within walking distance of this sort of thing is one benefit
of moving. Ivo also reminded me of LCD Soundsystem&amp;rsquo;s &lt;a href=&#34;https://open.spotify.com/track/2cmRpmO04TLaKPzmAzySYZ&#34;&gt;Dance Yerself Clean&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elixir-lang/elixir/pull/14003&#34;&gt;Make protocol errors pretty&lt;/a&gt; &amp;ndash; A nice Elixir quality of life improvement for
errors messages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve actually made some progress on my side project but it&amp;rsquo;s still been very
little, which has resulted in the usual amount of shame, guilt, and
disappointment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A colleague was experiencing macOS kernel panic on their new MacBook Pro M4
when running &lt;code&gt;rails server&lt;/code&gt;. I&amp;rsquo;ve never managed to kernel panic a Mac as long
as I can remember, so this was very surprising indeed.&lt;/p&gt;
&lt;p&gt;It seems to be an Apple issue though. They&amp;rsquo;ve &lt;a href=&#34;https://developer.apple.com/documentation/macos-release-notes/macos-15_2-release-notes#Kernel&#34;&gt;fixed it in macOS Sequoia 15.2
Beta 4&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fixed: Resolved an issue where running Ruby with YJIT enabled causes Mac
with M4 chip to kernel panic. (139714575) (FB15774033)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was surprised to see Apple explicitly mention Ruby in the release notes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Via &lt;a href=&#34;https://simonwillison.net/2024/Nov/16/nuextract-15/&#34;&gt;Simon Willison&amp;rsquo;s blog&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NuExtract 1.5. Structured extraction - where an LLM helps turn unstructured
text (or image content) into structured data - remains one of the most
directly useful applications of LLMs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had a brief discussion at work about how object-orientated our app Rails
is. I don&amp;rsquo;t believe that most Rails apps are very object-orientated at all.
Most Rails apps are Rails apps, not Ruby apps.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://noelrappin.com/blog/2024/11/object-constellations/&#34;&gt;Object Constellations&lt;/a&gt; by Noel Rappin illustrates some proper OO techniques
for removing conditionals. There are ups and downs, of course. Everything is a
trade-off 🤪.&lt;/p&gt;
&lt;p&gt;The gem linked in the article, &lt;a href=&#34;https://github.com/wohlgejm/null_associations&#34;&gt;null_associations&lt;/a&gt;, is a cool idea too.&lt;/p&gt;
&lt;p&gt;Again, this might be my problem, but I think I would get push-back if I were
to introduce a &lt;code&gt;NullUser&lt;/code&gt; class into projects I&amp;rsquo;ve worked on, which is &lt;em&gt;maybe&lt;/em&gt;
a shame.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 177: An afternoon in Costa</title>
      <link>https://elver.me/weeknotes/177-an-afternoon-in-costa/</link>
      <pubDate>Sun, 17 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/177-an-afternoon-in-costa/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The “journaling suggestion” notifications that iOS produces are continuing to
paint a sad picture of my life - “An afternoon in Costa Coffee” is not
something I would ordinarily feel I need to process via a journal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I created a &lt;a href=&#34;https://en.wikipedia.org/wiki/Bluesky&#34;&gt;Bluesky&lt;/a&gt; account. I&amp;rsquo;m nothing if not a hypocrite.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/175-dramatization-do-not-attempt/#:~:text=placed%20an%20order%20for%20a%20new%20M4%20MacBook&#34;&gt;new computer&lt;/a&gt; arrived after I missed the first attempt at delivery when the
couriers arrived outside of the delivery window I was given. I&amp;rsquo;ve yet to set
it up other than to connect to the WiFi and run software updates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I saw this &lt;a href=&#34;https://github.com/speedshop/ids_must_be_indexed/tree/main&#34;&gt;ids_must_be_indexed&lt;/a&gt; GitHub workflow and because it&amp;rsquo;s written in
Bash it&amp;rsquo;s a very lightweight addition to any CI. It didn&amp;rsquo;t work for me on
GitHub unfortunately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/folke/snacks.nvim?tab=readme-ov-file&#34;&gt;snacks.nvim&lt;/a&gt; by folke. A similar idea to &lt;a href=&#34;https://github.com/echasnovski/mini.nvim&#34;&gt;mini.nvim&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It sounds like the first version of an official Elixir LSP will be out with
Elixir 1.18.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The official Elixir LSP should be out with the next @elixirlang version, 1.18.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Via &lt;a href=&#34;https://x.com/NickGnd/status/1846103330352697455&#34;&gt;@NickGnd&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ronjeffries.com/articles/-x024/biot/-bs70/s/&#34;&gt;Small Steps&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some thoughts on choosing small steps. I think it’s always possible. Is it
always the right way to go? I issue a challenge to myself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://justin.searls.co/mails/2024-10/#a-new-kind-of-job-market&#34;&gt;Justin Searls&amp;rsquo; essay on the current job market&lt;/a&gt; is an interesting read. I
think a lot of this rings true, and it made me reflect on my own position.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One of my side project ideas a few months ago was to build a customer
communication platform similar to Intercom &amp;ndash; not to start a business, but as
a real-life example of a project. I got as far as mocking-up a simple UI for
the &amp;ldquo;chat&amp;rdquo; interface, but didn&amp;rsquo;t go any further with it.&lt;/p&gt;
&lt;p&gt;I would&amp;rsquo;ve chosen Elixir and Phoenix for this, for the reasons I&amp;rsquo;ve written
about before. If there was ever a &lt;a href=&#34;https://world.hey.com/dhh/the-one-person-framework-711e6318&#34;&gt;one person framework&lt;/a&gt;, this is it.&lt;/p&gt;
&lt;p&gt;Well, it seems that someone else has been building such a thing called
&lt;a href=&#34;https://github.com/papercups-io/papercups&#34;&gt;Papercups&lt;/a&gt;, in Elixir, but for the last few years and it has developed an
impressive amount of features. Check out &lt;a href=&#34;https://www.romaglushko.com/blog/papercups/&#34;&gt;this interesting blog post the
feature set&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.campsite.com/blog/how-we-made-a-ruby-method-200x-faster&#34;&gt;How we made a Ruby method 200x faster&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wrote some test cases with AI for the time this week. It was surprisingly
good at it. Of course I had to tweak and test them, but it took the grunt work
out of the task.&lt;/p&gt;
&lt;p&gt;When I come across some code which I’d like to refactor if it’s untested
theres an extra obstacle in the way of that change happening. If AI can help
me quickly test it, that&amp;rsquo;s a good thing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 176: Not renewed</title>
      <link>https://elver.me/weeknotes/176-not-renewed/</link>
      <pubDate>Sun, 10 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/176-not-renewed/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We spent the first few days of the week down south. I managed to catch up with
several people I haven&amp;rsquo;t seen in a while, which was worth the trip. I was glad
to get home though. I guess this is a good sign.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The plans we have for the house are starting to firm up. We now have drawings,
which will soon be submitted to the council for planning approval. The
beginning of many headaches I fear.&lt;/p&gt;
&lt;p&gt;The amount of decision making that is going to be necessary for the
renovations to take place is a bit overwhelming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I attended another local meetup group this week. It&amp;rsquo;s good to be getting back
into the swing of things. Having something to focus on that is regular is a
good thing for my routine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Heroku is expensive, but &lt;a href=&#34;https://x.com/yongfook/status/1853047127947305364&#34;&gt;he&amp;rsquo;s not wrong&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hot take: it’s trending right now but indiehackers launching on a VPS are
creating infra overhead for themselves that could be better spent on
building product or doing marketing.&lt;/p&gt;
&lt;p&gt;If you’re a solo founder I still think Heroku is the best fit, and I’ll die
on that hill.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.themoviedb.org/tv/204154-scavengers-reign&#34;&gt;Scavengers Reign&lt;/a&gt; which I &lt;a href=&#34;/weeknotes/123-this-isnt-for-you-its-for-me/#:~:text=really%20good&#34;&gt;really enjoyed last year&lt;/a&gt; has &lt;a href=&#34;https://www.instagram.com/p/DB-DuB5Se07/&#34;&gt;unfortunately not
been renewed&lt;/a&gt; for second season. I hope they can get it off the ground some
other way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new computer arrives tomorrow so I spent some time tidying up my dotfiles,
which are in a constant state of flux as I try out random snippets of Lua I
found on the Internet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some small progress on my new side project this week. I&amp;rsquo;ve been thinking about
starting a development journal of sorts, so I can get my thoughts down on
progress. I tend to see all problems as too difficult for me to solve, but if
I do solve them then I attribute that to luck, or pick holes in the solution.
Maybe writing down what has been done will help.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 175: Dramatization. Do not attempt.</title>
      <link>https://elver.me/weeknotes/175-dramatization-do-not-attempt/</link>
      <pubDate>Sun, 03 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/175-dramatization-do-not-attempt/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I came down with a cold during our trip Edinburgh. This is what happens when
you leave the house. I&amp;rsquo;m feeling congested, but otherwise fine now though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After some deliberation about nano texture screen coatings I &lt;a href=&#34;/weeknotes/173-program-like-an-idiot/#:~:text=There%20are%20new%20computers%20due%20from%20Apple%20very%20soon&#34;&gt;bit the bullet&lt;/a&gt;
and placed an order for a new M4 MacBook. I&amp;rsquo;ve gone for the Pro chip. The Max
just seems so far beyond what I need, and with the configuration I&amp;rsquo;ve chosen
I&amp;rsquo;ll still be tripling the RAM and doubling my disk space, so it&amp;rsquo;s a very nice
upgrade. And of course, in black. It should arrive in just over a week.&lt;/p&gt;
&lt;p&gt;(I didn&amp;rsquo;t opt for the nano texture based my current machine not having it and
that hasn&amp;rsquo;t been a problem for me).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We took a trip down south over the weekend to visit friends. It remains a long
way to drive. We decided to stay in a Premier Inn instead of the old place. I
still feel weird about going back there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As a fan of the &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Lord_of_the_Rings_(film_series)&#34;&gt;The Lord of the Rings films&lt;/a&gt;, I&amp;rsquo;ve been meaning to read the
books for a long time. Unfortunately, I have the reading age of a small child,
and when I previously tried to read them I got no where fast. Instead I&amp;rsquo;ve
decided to try the audiobook versions read by Andy Serkis.&lt;/p&gt;
&lt;p&gt;In the past I&amp;rsquo;ve attempted to use Apple Music for audiobooks, but the syncing
of books it always a pain, and the app is not really suited to the task.
Instead I&amp;rsquo;ve opted to co-opt Plex into the job combined with &lt;a href=&#34;https://apps.apple.com/us/app/prologue/id1459223267&#34;&gt;Prologue&lt;/a&gt;. I&amp;rsquo;ll
see how it goes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It &lt;a href=&#34;https://www.youtube.com/shorts/mKp30PNM_Q4&#34;&gt;sounds like Oban Web&lt;/a&gt; is going to become an open source product. I think
Parker is correct that it will affect the adoption of Oban as a whole because
Oban Web is extremely compelling, and you often can&amp;rsquo;t afford to pay for it
until your project is making money later&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fucking dark isn&amp;rsquo;t it? Better remind myself to take those Vitamin D
supplements.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 174: Haggis Ruby</title>
      <link>https://elver.me/weeknotes/174-haggis-ruby/</link>
      <pubDate>Sun, 27 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/174-haggis-ruby/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/173-program-like-an-idiot/#:~:text=unremarkable%20ticket%20I%20was%20working%20on%20suddenly%20became%20important&#34;&gt;The work thing&lt;/a&gt; I was stressing about unnecessarily has now gone to
production, so that&amp;rsquo;s that. For now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/ghostty-is-coming&#34;&gt;Ghostty 1.0 is Coming&lt;/a&gt; and I&amp;rsquo;m interested in trying it when it is released in
December.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;&lt;a href=&#34;https://github.com/tris203/precognition.nvim&#34;&gt;precognition.nvim&lt;/a&gt; assists with discovering motions (Both vertical and
horizontal) to navigate your current buffer &amp;ndash; I&amp;rsquo;m trying this out to try and
get better at Motions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://haggisruby.co.uk/&#34;&gt;Haggis Ruby&lt;/a&gt; was on Thursday this week, so I travelled up to Edinburgh on
the train Wednesday afternoon.&lt;/p&gt;
&lt;p&gt;It was, from my perspective, a great success! This shouldn&amp;rsquo;t be a massive
surprised given the heritage of the organisers. Very well attended, and it
seemed to go off without a hitch.&lt;/p&gt;
&lt;p&gt;I enjoyed this conference a lot more than my recent Rails World experience,
and although I enjoyed the talks (in particular &lt;a href=&#34;https://rosa.codes/&#34;&gt;Rosa Gutierrez&amp;rsquo;s on UTF-8&lt;/a&gt;),
the main reason was the opportunity to catch up with people I haven&amp;rsquo;t seen for
a long time. Past colleagues who I&amp;rsquo;ve never met in person; meetup attendees
from long dissolved Ruby User Groups of past; you name it. Needless to say, it
was GREAT to catch-up.&lt;/p&gt;
&lt;p&gt;Long may Haggis Ruby continue if for no reason than it selfishly gives me
another opportunity in the year, other than Brighton Ruby, to see people.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We took the opportunity of me being in Edinburgh already to extend the trip
(as is my want) and do some sight seeing.&lt;/p&gt;
&lt;p&gt;Edinburgh is a city full of amazing views. It feels like everywhere you look
there is something nice to look at. At least in the very centre, where we
spent most of our time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As you&amp;rsquo;ll know from &lt;a href=&#34;/weeknotes/153-overwhelmed/#:~:text=Rubocop&#34;&gt;various&lt;/a&gt; &lt;a href=&#34;/weeknotes/154-loathe-to-call-this-a-success/#:~:text=Rubocop&#34;&gt;times&lt;/a&gt; I&amp;rsquo;ve ranted about Rubocop, I think a lot
of the defaults are, in a word, bonkers. They don&amp;rsquo;t reflect a lot of the
idiomatic Ruby code I&amp;rsquo;ve seen through the years.&lt;/p&gt;
&lt;p&gt;However, changing those defaults results in &lt;a href=&#34;https://en.wiktionary.org/wiki/bikeshedding&#34;&gt;bikeshedding&lt;/a&gt; and arguments (we
should just be using &lt;a href=&#34;https://github.com/standardrb/standard&#34;&gt;standard&lt;/a&gt;, alas). Still, I submitted a PR this week
which changed the configuration of &lt;code&gt;Metrics/MethodLength&lt;/code&gt;. It can treat
&lt;a href=&#34;https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Metrics/MethodLength#:~:text=to%20fold%20with%20%E2%80%98-,CountAsOne,-%60.&#34;&gt;Array and Hash definitions as a single line&lt;/a&gt; when counting the method size,
this means that simple code that just returns either an array or hash is now
possible even if it exceeds the overall length of the method.&lt;/p&gt;
&lt;p&gt;I was expecting a lot of push back on this change, so imagine my surprise when
it wasn&amp;rsquo;t just approved, but approved by several people with positive
feedback.&lt;/p&gt;
&lt;p&gt;The fact I thought it wasn&amp;rsquo;t going to go this way probably says more about my
psychology than anything.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 173: Program like an idiot</title>
      <link>https://elver.me/weeknotes/173-program-like-an-idiot/</link>
      <pubDate>Sun, 20 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/173-program-like-an-idiot/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Busy, busy week after an unremarkable ticket I was working on suddenly became
important. It isn&amp;rsquo;t &lt;em&gt;quite&lt;/em&gt; done yet, but it&amp;rsquo;s under control after some nice
collaboration. It&amp;rsquo;s good to feel supported occasionally after so much siloed
working.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=ea9reHDIrOo&#34;&gt;&amp;ldquo;Just program like you&amp;rsquo;re an idiot&amp;rdquo;&lt;/a&gt; &amp;ndash; amen!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://stdgems.org/&#34;&gt;Ruby Standard Gems&lt;/a&gt; - A useful reference for which gems, and their versions,
are installed in the Ruby standard library.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are new computers due from Apple very soon and I think I&amp;rsquo;m ready to
upgrade. In a lot of ways the computer I&amp;rsquo;m using now, the MacBook Air M1
bought in 2021, is still great for my needs. It never feels slow and I love
the portability.&lt;/p&gt;
&lt;p&gt;However, there are two things that are not quite perfect 1) the battery is no
longer what is was. I&amp;rsquo;ve gone from literally &lt;em&gt;never&lt;/em&gt; worrying about power when
I&amp;rsquo;m out and about, to having to be aware that I&amp;rsquo;m fully charged when I leave
the house and also sometimes charging on the go; and 2) since &lt;a href=&#34;/weeknotes/154-loathe-to-call-this-a-success/#:~:text=I%20knocked%20half%20an%20Oat%20Mocha%20over%20my%20computer&#34;&gt;Mocha-gate&lt;/a&gt; one
of the two USB-C ports does not work, and I could do with getting this
properly cleaned under AppleCare.&lt;/p&gt;
&lt;p&gt;But&amp;hellip;the new computers are apparently not Airs, and do I want to give up the
extreme portability that I&amp;rsquo;ve enjoyed from this one?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.railsbump.org/&#34;&gt;RailsBump&lt;/a&gt; might be useful for checking whether the gems you&amp;rsquo;re using in your
Rails app are compatible with different Rails versions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sam Stephenson released a productivity/concentration app a while ago called
&lt;a href=&#34;https://n10.app/&#34;&gt;N10&lt;/a&gt; which I bought this week and I am trying it out. Sam has given so much
to the community so I decided to give back in this small way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;ParadeDB is a modern Elasticsearch alternative built on Postgres. Built for
real-time, update-heavy workloads.&amp;rdquo; &amp;ndash; this seems cool.&lt;/p&gt;
&lt;p&gt;I was watching &lt;a href=&#34;https://www.youtube.com/watch?v=DIC9iJDrKBs&#34;&gt;this interview with Jesse Hanley&lt;/a&gt; of &lt;a href=&#34;https://bentonow.com/&#34;&gt;Bento&lt;/a&gt; this week where
he mentions that he does basically all his querying of data, with the
exception of simple &lt;code&gt;SELECT&lt;/code&gt;s via primary key, via &lt;a href=&#34;https://en.wikipedia.org/wiki/Elasticsearch&#34;&gt;Elasticsearch&lt;/a&gt; because
that&amp;rsquo;s what it is built for. An interesting technique and I&amp;rsquo;m glad it works
for him (the rest of interview is very interesting too), but I wonder if it
could all be done inside Postgres with &lt;a href=&#34;https://www.paradedb.com/&#34;&gt;ParadeDB&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Incidentally, if you wanna use ParadeDB with Elixir&amp;rsquo;s Ecto you can do so with
&lt;a href=&#34;https://moosie.us/paradex&#34;&gt;Paradex&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://world.hey.com/dhh/passwords-have-problems-but-passkeys-have-more-95285df9%5D&#34;&gt;Passwords have problems, but passkeys have more&lt;/a&gt; &amp;ndash; I have to say I am
lukewarm on passkeys too. (This agreement is becoming a worrying habit).&lt;/p&gt;
&lt;p&gt;I have yet to create a single Passkey. I just don&amp;rsquo;t trust them yet, and as
&lt;a href=&#34;https://daringfireball.net/linked/2024/10/17/dhh-argues-against-passkeys&#34;&gt;Gruber has said&lt;/a&gt; (what is happening to me?) &amp;ndash; &amp;ldquo;if you’re using a proper
password manager, your passwords should all be unique and random&amp;rsquo; &amp;ndash; which is
the case for me. I currently see Passkeys as a way for me to potentially lose
access to an account, whilst having no upside.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.websitecarbon.com/&#34;&gt;Calculate the carbon footprint of your website&lt;/a&gt; &amp;ndash; I don&amp;rsquo;t wanna brag (I do)
but this website gets an A+. Simply create a text only website and you too can
save the world.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been exploring &lt;a href=&#34;https://en.wikipedia.org/wiki/Tindersticks&#34;&gt;Tindersticks&lt;/a&gt;&amp;rsquo; back catalogue a bit this week. &lt;a href=&#34;https://open.spotify.com/track/24ZFJvPZB1viPZVkHLFLE6?si=0c94407857ae48aa&#34;&gt;&amp;ldquo;The Not
Knowing&amp;rdquo;&lt;/a&gt; is lovely.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 172: Polygon click target</title>
      <link>https://elver.me/weeknotes/172-polygon-click-target/</link>
      <pubDate>Sun, 13 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/172-polygon-click-target/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I finished off the second series of &lt;a href=&#34;/weeknotes/171-don-t-believe-all-the-hype/#:~:text=series%20from%202016%2C-,Flowers,-%2C%20is%20really%20good&#34;&gt;Flowers&lt;/a&gt; this week.&lt;/p&gt;
&lt;p&gt;Honestly, it&amp;rsquo;s superb.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://buttondown.com/hillelwayne/archive/goodharts-law-in-software-engineering/&#34;&gt;Goodhart&amp;rsquo;s Law in Software Engineering&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When a measure becomes a target, it ceases to be a good measure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hey 100% code coverage 👋&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://medium.com/@beard-programmer/service-objects-as-functions-a-functional-approach-to-build-business-flows-in-ruby-on-rails-bf34bf18331d&#34;&gt;Service Objects as Functions: A functional approach to build business flows
in Ruby on Rails&lt;/a&gt; &amp;ndash; I thought this was interesting.&lt;/p&gt;
&lt;p&gt;Incidentally, I&amp;rsquo;ve been wondering how hard refactoring is in a non-OOP
language because I don&amp;rsquo;t have very much experience outside Ruby. When
refactoring with Ruby it feels like there are so many options, and choosing a
path is difficult.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have somehow managed to not know about &lt;a href=&#34;https://json5.org/&#34;&gt;JSON5&lt;/a&gt;, a &lt;a href=&#34;https://en.wikipedia.org/wiki/JSON#JSON5&#34;&gt;superset of JSON&lt;/a&gt; which
has support for human features such as&amp;hellip;.comments! I&amp;rsquo;m not sure how wide
spread it is though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=Df_K7pIsfvg&#34;&gt;Cabel Sasser, Panic - XOXO Festival (2024)&lt;/a&gt; &amp;ndash; watch this please. Brought a
tear to my eye.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I worked on some refactoring this week for the first time in a while and it
felt good. Some collaboration was also involved, so that was novel and very
welcome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And I  used Ruby&amp;rsquo;s &lt;code&gt;Enumerable#tally&lt;/code&gt; for the first time in production code
too. Very satisfying when you can leverage Ruby&amp;rsquo;s rich standard library.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://kk.org/thetechnium/1000-true-fans/&#34;&gt;1,000 True Fans&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As far as I can tell there is nothing — no product, no idea, no desire —
without a fan base on the internet. Every thing made, or thought of, can
interest at least one person in a million — it’s a low bar. Yet if even only
one out of million people were interested, that’s potentially 7,000 people
on the planet. That means that any 1-in-a-million appeal can find 1,000 true
fans.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I heard about this article from &lt;a href=&#34;https://en.wikipedia.org/wiki/Tobias_L%C3%BCtke&#34;&gt;Tobi Lütke&lt;/a&gt; during the &lt;a href=&#34;https://www.youtube.com/watch?v=zPBbHu-BKpQ&#34;&gt;Fireside Chat with
DHH and Matz at Rails World 2024&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://world.hey.com/dhh/automattic-is-doing-open-source-dirty-b95cf128&#34;&gt;Automattic is doing open source dirty&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The terms of the deal are spelled out in the license agreement&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you set out a licence, and then someone follows that licence.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://walnut356.github.io/posts/language-documentation/&#34;&gt;Why is language documentation still so terrible?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rust is given as a good example of language docs, and I wholeheartedly agree.
The Elixir docs are also excellent. Ruby&amp;rsquo;s are unfortunately not.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.kickstarter.com/projects/electr/ble-caberqu-a-digital-usb-c-to-usb-c-cable-tester?rdt_cid=4451609530094436111&#34;&gt;BLE caberQU: a digital USB-C to USB-C cable tester&lt;/a&gt; &amp;ndash; a version of the
&lt;a href=&#34;/weeknotes/116-consumer-whore/#:~:text=To%20aid%20in%20that%20quest&#34;&gt;cable tester I already have&lt;/a&gt; but with a cool screen on it!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Did you know that it&amp;rsquo;s possible to have &lt;a href=&#34;https://css-tricks.com/the-many-ways-to-link-up-shapes-and-images-with-html-and-css/#aa-svg-shapes&#34;&gt;non-square click targets in HTML&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;In fact, for SVGs it&amp;rsquo;s as simple as putting a &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; around the particular path
in question &lt;em&gt;inside&lt;/em&gt; the SVG, and the target will automatically be the same
shape.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 171: Don&#39;t believe all the hype</title>
      <link>https://elver.me/weeknotes/171-don-t-believe-all-the-hype/</link>
      <pubDate>Sun, 06 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/171-don-t-believe-all-the-hype/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/168-early-return/#:~:text=I%20bet%20that%20no%20one%20even%20checks%20it%20when%20I%20travel&#34;&gt;They did check the passport!&lt;/a&gt; &amp;ndash; well, technically it was British Airways
staff that checked it before flying, but I still needed it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/zig-donation&#34;&gt;Mitchell Hashimoto has pledged&lt;/a&gt; to &lt;a href=&#34;https://ziglang.org/news/300k-from-mitchellh/&#34;&gt;donate £300k to the Zig Software
Foundation&lt;/a&gt;. I might give Zig a go.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/169-text-objects/#:~:text=Rails%20World%20is%20next%20week&#34;&gt;As you&amp;rsquo;ll be aware&lt;/a&gt;, I was at Rails World last week. With all the travelling
I hadn&amp;rsquo;t had time to contemplate my thoughts. But I just about have now.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I didn&amp;rsquo;t have a &lt;em&gt;great time&lt;/em&gt;, and I&amp;rsquo;m wondering if it&amp;rsquo;s them or me. Maybe
this is just not for me anymore.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Toronto was nice enough, but I wouldn&amp;rsquo;t feel the need to go back any time
soon. Having only ever been to Nova Scotia before it was a shock to the
system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Talks from Aaron Patterson and Justin Searls were the highlights for me.
Unsurprising as they consistently deliver interesting talks well. I also
enjoyed the various SQLite content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I don&amp;rsquo;t know why conferences don&amp;rsquo;t make sure that the seating is comfortable
but I would imagine that it involves the difficulty in getting thousands of
chairs in one place.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was a lot of emphasis on Rails being a one person framework, and in
particular the deployment of Rails with new tools like &lt;a href=&#34;https://kamal-deploy.org/&#34;&gt;Kamal&lt;/a&gt; &lt;a href=&#34;https://dev.37signals.com/kamal-2/&#34;&gt;now on
version 2&lt;/a&gt;. However, some of the rhetoric leaves out of lot of subtly, as
usual.&lt;/p&gt;
&lt;p&gt;The pricing of Heroku &lt;em&gt;is&lt;/em&gt; ridiculous in 2024, and you &lt;em&gt;can&lt;/em&gt; rent a server
at Hetzner with a lot of power for a lot less money these days. And Kamal
does &lt;em&gt;look&lt;/em&gt; like (having not used it) it simplifies getting your Rails app
deployed.&lt;/p&gt;
&lt;p&gt;But ease of initial setup is not the only reason that people use a platform
like Heroku. Once you have setup your Linux VPS with Docker, and your
container is running, and serving your website, what about maintenance?&lt;/p&gt;
&lt;p&gt;Who is patching the underlying host system? You. Who is rotating logs? You.
Who is increasing the disk size when it runs out of space? You. Heroku do
all that for you, and that&amp;rsquo;s why you pay.&lt;/p&gt;
&lt;p&gt;We hear about Shopify and GitHub all the time, but the majority of Rails
apps are tiny in comparison and using a VPS on Hetzner for that is a good
option. Just don&amp;rsquo;t believe all the hype.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next year the conference is back in Amsterdam, which is disappointing. If
I&amp;rsquo;m going to pay a lot of money to attend an event I don&amp;rsquo;t even love then it
can at least be in a place I would like to visit. Or the very least
somewhere other than where it&amp;rsquo;s already been.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apart from the conference itself we spent some extra time in Toronto, and at
Niagara Falls.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been to the Falls before, but I was 5 years old at the time, so it was a
good as new experience for me. We did all the touristy stuff you would expect:
a night time boat trip to the Falls for the nightly fireworks, a visit to the
power station, &lt;a href=&#34;https://en.wikipedia.org/wiki/Whirlpool_Aero_Car&#34;&gt;cable car&lt;/a&gt; across the &lt;a href=&#34;https://en.wikipedia.org/wiki/Niagara_Gorge&#34;&gt;Niagara Gorge&lt;/a&gt;, and white water walk by
the river &amp;ndash; a highlight!&lt;/p&gt;
&lt;p&gt;I was glad to have visited, and glad to leave the madness.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Whilst in Toronto I discovered the &lt;a href=&#34;https://en.wikipedia.org/wiki/London_fog_(drink)&#34;&gt;London Fog&lt;/a&gt;, and it&amp;rsquo;s cousin the Lavender
Fog (a London Fog with Lavender infused flavours).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rails 8 is to get an authentication generator &amp;ndash; &lt;a href=&#34;https://dashbit.co/blog/a-new-authentication-solution-for-phoenix&#34;&gt;what a good idea&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve thought of a new side project!&lt;/p&gt;
&lt;p&gt;Yeah, I know. I&amp;rsquo;ve already given up, don&amp;rsquo;t worry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://departuremono.com/&#34;&gt;Departure Mono&lt;/a&gt; [Via &lt;a href=&#34;https://simplebits.shop/&#34;&gt;Simple Bits&lt;/a&gt; newsletter]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Departure Mono is a monospaced pixel font with a lo-fi technical vibe&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lovely website.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I booked to see Daniel Kitson again, solo this time, in Manchester. I hope
no one &lt;a href=&#34;/weeknotes/151-dumbfounded/#:~:text=the%20whole%20event%20was%20ruined%20by%20a%20couple%20who%20tried%20to%20essentially%20bully%20us%20out%20of%20our%20seats&#34;&gt;tries to steal my seat this time&lt;/a&gt; and that the PTSD doesn&amp;rsquo;t kick in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://justin.searls.co/shots/2024-10-04-07h02m01s/&#34;&gt;I hate code review less now&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But instead of waiting hours for feedback I&amp;rsquo;m waiting for literal seconds.
There&amp;rsquo;s also zero ego, politics, or posturing. And while it does hallucinate
bullshit, there&amp;rsquo;s far less of it than one can expect from bleary-eyed
developers squinting at the GitHub web UI looking for a way to score points.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Truth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The TV series from 2016, &lt;a href=&#34;https://www.themoviedb.org/tv/66230-flowers&#34;&gt;Flowers&lt;/a&gt;, is really good.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 170: Check yo timezones</title>
      <link>https://elver.me/weeknotes/170-check-yo-timezones/</link>
      <pubDate>Sun, 29 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/170-check-yo-timezones/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You think this is late, but no, check yo timezones.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m in Canada because I attended Rails World 2024 on Thursday and Friday. A
good opportunity to have a holiday. I&amp;rsquo;ll make an effort to summarize Rails
World next week. Probably.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ia.net/topics/our-android-app-is-frozen-in-carbonite&#34;&gt;Our Android App is Frozen in Carbonite&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Google’s chaos makes Apple’s control seem reasonable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://futurism.com/neoscope/paralyzed-man-exoskeleton-too-old&#34;&gt;Paralyzed Man Unable to Walk After Maker of His Powered Exoskeleton Tells Him
It&amp;rsquo;s Now Obsolete&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fortunately, Lifeward eventually capitulated and Straight was able to get
his exoskeleton repaired — but that was only after an intense campaign in
which he went on local TV, got highlighted in a horse industry publication,
and gained steam on social media.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oh course they did.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://openfreemap.org/&#34;&gt;OpenFreeMap&lt;/a&gt; &amp;ndash; OpenFreeMap lets you display custom maps on your website and
apps for free.&lt;/p&gt;
&lt;p&gt;No more broken Google Maps due to missing or expired API keys.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This Week I Learnt about &lt;a href=&#34;https://en.m.wikipedia.org/wiki/Lindy_effect&#34;&gt;the Lindy effect&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Lindy effect (also known as Lindy&amp;rsquo;s Law[1]) is a theorized phenomenon by
which the future life expectancy of some non-perishable things, like a
technology or an idea, is proportional to their current age. Thus, the Lindy
effect proposes the longer a period something has survived to exist or be
used in the present, the longer its remaining life expectancy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[Via &lt;a href=&#34;https://avdi.codes/how-to-cope-with-technology-fomo/&#34;&gt;How to cope with technology FOMO&lt;/a&gt;].&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 169: Text objects</title>
      <link>https://elver.me/weeknotes/169-text-objects/</link>
      <pubDate>Sun, 22 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/169-text-objects/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;TIL that &lt;a href=&#34;https://en.wikipedia.org/wiki/CockroachDB&#34;&gt;CockroachDB&lt;/a&gt; is Postgres compatible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mastodon.social/@marcoarment/113176871729373771&#34;&gt;Marco Arment on Overcast&amp;rsquo;s episode deletion feature&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For instance, when evaluating an episode past the limit for deletion:&lt;/p&gt;
&lt;p&gt;What if it&amp;rsquo;s an old episode that I went back and added?&lt;br&gt;
What if I&amp;rsquo;ve partly listened to it?&lt;br&gt;
What if I partly listened, but never finished it? (How long ago? How much is left?)&lt;br&gt;
What if I&amp;rsquo;m currently listening to it?&lt;br&gt;
What if I&amp;rsquo;m listening to it, but on a device that hasn&amp;rsquo;t been used in a while?&lt;br&gt;
What if it&amp;rsquo;s downloaded to the Watch? (How recently has that watch been used for standalone playback?)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even features which sound simple are often not. Experienced developers know
this so when you&amp;rsquo;re building a &amp;ldquo;simple&amp;rdquo; feature and someone says &amp;ldquo;just do x&amp;rdquo;
and they look at you like an idiot point them at this list of &amp;ldquo;what ifs&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://chromewebstore.google.com/detail/control-panel-for-twitter/kpmjjdhbcfebfjgdnpjagcndoelnidfj&#34;&gt;Control Panel for Twitter&lt;/a&gt; [Via &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt; again]&lt;/p&gt;
&lt;p&gt;Make Twitter slightly less shit.&lt;/p&gt;
&lt;p&gt;Still full o&amp;rsquo; grifters though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been frustrated this week dealing with an endless list of unhelpful
idiots.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maybe this is elitist or something, but I like that Mastodon is never going to
take off like Twitter did.&lt;/p&gt;
&lt;p&gt;Back in 2007 when I joined Twitter is was full developers, programmers,
designers, web types etc, and it was an interesting place. Then the rest of
the world found it and it got worse and worse until we got to where it is now.&lt;/p&gt;
&lt;p&gt;Mastodon is too difficult for the average person to join: What is an instance?
Where do I &amp;ldquo;sign up&amp;rdquo;? etc so it won&amp;rsquo;t ever grow like Twitter. And the
federated nature keeps it smaller whilst allowing, well, federation.&lt;/p&gt;
&lt;p&gt;And I&amp;rsquo;m glad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rails World is next week, and predictably, I can&amp;rsquo;t be arsed. I&amp;rsquo;m sure the trip
will be worth it in the end.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It was the third Ruby meetup I&amp;rsquo;ve been trying to organise this week. Back down
to two of us this time. It was a little bit disappointing, but when the group
is already small it only takes few dropouts to get here. I will try to get
more organised for the next one and hopefully we can turn it into something
more consistently attended.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, I created a &lt;a href=&#34;https://yorkruby.org&#34;&gt;website for said meetup&lt;/a&gt;. Still got it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Elixir ecosystem continues to impress. &lt;code&gt;ExUnit&lt;/code&gt; just got a new flag to
help with tracking down intermittent test failures:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mix test --repeat-until-failure N
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Via &lt;a href=&#34;https://www.elixirstreams.com/tips/mix-test-repeat-until-failure&#34;&gt;Elixir Streams&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/elixir-lang/elixir/pull/13851&#34;&gt;Soft-deprecate Kernel.unless/2&lt;/a&gt; &amp;ndash; &lt;a href=&#34;/weeknotes/168-early-return/#:~:text=this%20is%20one%20of%20the%20few%20places%20I%20think%20unless%20is%20acceptable&#34;&gt;down with &lt;code&gt;unless&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Usual story; I&amp;rsquo;m not using Neovim to it&amp;rsquo;s fullest. This time, &lt;a href=&#34;https://neovim.io/doc/user/usr_04.html#04.8&#34;&gt;Text Objects&lt;/a&gt;.
For example, if your cursor position was in the middle of a paragraph of text,
you could type &lt;code&gt;vap&lt;/code&gt; to visually select the whole paragraph. It&amp;rsquo;s very cool.&lt;/p&gt;
&lt;p&gt;However, sometimes some of the combinations are a bit tricky to type.
Particularly when you want to involve your friend and mine, the curly brace &amp;ndash;
&lt;code&gt;{&lt;/code&gt; and &lt;code&gt;}&lt;/code&gt; &amp;ndash; or in fact any character that requires &lt;kbd&gt;shift&lt;/kbd&gt; to
reach it.&lt;/p&gt;
&lt;p&gt;Thankfully, I discovered that &lt;a href=&#34;https://github.com/echasnovski/mini.ai&#34;&gt;&lt;code&gt;mini.ai&lt;/code&gt;&lt;/a&gt; extends &lt;code&gt;a&lt;/code&gt;/&lt;code&gt;i&lt;/code&gt; textobjects to make
this easier by adding &lt;a href=&#34;https://github.com/echasnovski/mini.ai/blob/40e380a589d07ec2c856940c6422aafe5d949a0d/doc/mini-ai.txt#L118-L185&#34;&gt;&lt;code&gt;aq&lt;/code&gt;/&lt;code&gt;iq&lt;/code&gt; for quotes, and &lt;code&gt;ab&lt;/code&gt;/&lt;code&gt;ib&lt;/code&gt; for brackets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Quotes&amp;rdquo; includes &lt;code&gt;&amp;quot;&lt;/code&gt; &lt;code&gt;&#39;&lt;/code&gt; &lt;code&gt;`&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Brackets&amp;rdquo; includes &lt;code&gt;(&lt;/code&gt; &lt;code&gt;)&lt;/code&gt; &lt;code&gt;{&lt;/code&gt; &lt;code&gt;}&lt;/code&gt; &lt;code&gt;[&lt;/code&gt; &lt;code&gt;]&lt;/code&gt; &lt;code&gt;&amp;lt;&lt;/code&gt; &lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This means that in the case of brackets, you can type &lt;code&gt;vab&lt;/code&gt; and it will select
any text within any of the matching &amp;ldquo;bracket&amp;rdquo; characters above. Much less
typing and easier to use.&lt;/p&gt;
&lt;p&gt;But there&amp;rsquo;s more. I noticed whilst experimenting that &lt;code&gt;am&lt;/code&gt; and &lt;code&gt;im&lt;/code&gt; also
worked for Ruby methods, so if you wanted to visually select the contents of a
Ruby method you could do &lt;code&gt;vim&lt;/code&gt; &amp;ndash; nice.&lt;/p&gt;
&lt;p&gt;However, it wasn&amp;rsquo;t clear &lt;em&gt;why&lt;/em&gt; this worked, but I found that these &lt;a href=&#34;https://github.com/vim-ruby/vim-ruby/blob/f06f069ce67bdda6f2cd408f8859cdf031e5b6b4/doc/ft-ruby-plugin.txt#L58-L79&#34;&gt;text
objects are defined by the vim-ruby&lt;/a&gt; runtime files maintained by tpope. And
it&amp;rsquo;s not only &lt;code&gt;am&lt;/code&gt; and &lt;code&gt;im&lt;/code&gt; that work, you can also do &lt;code&gt;aM&lt;/code&gt; and &lt;code&gt;iM&lt;/code&gt; for Ruby
classes!&lt;/p&gt;
&lt;p&gt;Pretty sure I&amp;rsquo;m going to be learning Vim forever.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 168: Early return</title>
      <link>https://elver.me/weeknotes/168-early-return/</link>
      <pubDate>Sun, 15 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/168-early-return/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I signed up for a &lt;a href=&#34;https://www.brickeconomy.com/&#34;&gt;BrickEconomy&lt;/a&gt; account this week. I am cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_properties&#34;&gt;private properties in JavaScript&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; ClassWithPrivate {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;#&lt;/span&gt;privateField;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;#&lt;/span&gt;privateFieldWithInitializer &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#099&#34;&gt;42&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;#&lt;/span&gt;privateMethod() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;//...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Leading with a &lt;code&gt;#&lt;/code&gt; makes it private.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gpanders.com/blog/whats-new-in-neovim-0.10/&#34;&gt;What&amp;rsquo;s New in Neovim 0.10&lt;/a&gt; [via &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Neovim content, which was once the nexus of this publication, has dwindled in
recent months. No longer, we&amp;rsquo;re back baby.&lt;/p&gt;
&lt;p&gt;This summary of what&amp;rsquo;s new in 0.10 was an interesting read, in particular, the
built-in commenting support which means I can remove a plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We attended a &amp;ldquo;A Night at the Movies&amp;rdquo; this weekend. Classical renditions of
famous movie scores. It was a relaxing way to spend a couple of hours in
beautiful surroundings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=aZ9Os8cP_gg&#34;&gt;BLADE RUNNER 2049 - &amp;ldquo;2048: Nowhere to Run&amp;rdquo; Short&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you liked &lt;a href=&#34;https://en.wikipedia.org/wiki/Blade_Runner_2049&#34;&gt;Blade Runner 2049&lt;/a&gt;, you might also like this short focussing on
the character &lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_Blade_Runner_(franchise)_characters#Sapper_Morton&#34;&gt;Sapper Morton&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://defector.com/neither-elon-musk-nor-anybody-else-will-ever-colonize-mars&#34;&gt;Neither Elon Musk Nor Anybody Else Will Ever Colonize Mars&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mars does not have a magnetosphere. Any discussion of humans ever settling
the red planet can stop right there, but of course it never does. Do you
have a low-cost plan for, uh, creating a gigantic active dynamo at Mars&amp;rsquo;s
dead core? No? Well.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I guess we&amp;rsquo;re not going to Mars.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Canadian passport has arrived! Whilst I am relieved to now have it in my
possession I bet that no one even checks it when I travel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The early return. What is it about it that is so appealing?&lt;/p&gt;
&lt;p&gt;I think that in Ruby it is loved because partly because it has a knack of
making it read so damned nicely.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;unless&lt;/span&gt; something?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# do more stuff...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Look at it. It&amp;rsquo;s so pretty. (Incidentally, this is one of the few places I
think &lt;code&gt;unless&lt;/code&gt; is acceptable).&lt;/p&gt;
&lt;p&gt;The thing is, people are going around early returning everything and it makes
code hard to read in many cases. In my view, early returns should be used for
guard checks. Can this method run if this condition is false sort of stuff.&lt;/p&gt;
&lt;p&gt;I often see the humble &lt;code&gt;if&lt;/code&gt;/&lt;code&gt;else&lt;/code&gt; shunned in favour of the disjointed early
return. If your whole method is a decision between two branches, don&amp;rsquo;t do
this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#990073&#34;&gt;:bar&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;unless&lt;/span&gt; something?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#990073&#34;&gt;:baz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; something?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:baz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:bar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Future readers will thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/zig-comptime-conditional-disable&#34;&gt;Conditionally Disabling Code with Comptime in Zig&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Zig is interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Like every other week, this week I discovered another Ruby/Rails method which
I sort of knew about, but haven&amp;rsquo;t really used. This one is simple:
&lt;code&gt;Object.in?&lt;/code&gt; for checking if something exists in an Enumerable.&lt;/p&gt;
&lt;p&gt;The traditional way would be something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;PRODUCT_CATEGORIES&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;include?(category)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But the expression is a bit backwards in terms of how we think about what
we&amp;rsquo;re trying to achieve. &lt;code&gt;Object.in?&lt;/code&gt; let&amp;rsquo;s you do this instead.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;category&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;in?(&lt;span style=&#34;color:#008080&#34;&gt;PRODUCT_CATEGORIES&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://island94.org/2024/09/the-novice-problem&#34;&gt;The Novice Problem&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Will they exercise discretion and nuance? Will they have the ability to
prioritize based on that information? Will they make appropriate tradeoffs?
[No.]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the problem with linters. Rules will be followed without thinking
about whether they are appropriate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 167: Bidirectional</title>
      <link>https://elver.me/weeknotes/167-bidirectional/</link>
      <pubDate>Sun, 08 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/167-bidirectional/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Quite grumpy this week. Strap in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of course, donating blood is worthwhile if you are able. But in the last few
years the process has gotten so much worse. It used to be great end-to-end.
The website was convenient and easy to use. The staff were great. You didn&amp;rsquo;t
have to wait &lt;em&gt;that long&lt;/em&gt;, and you got a &lt;a href=&#34;https://mcvities.co.uk/products/club&#34;&gt;chocolate Orange Club biscuit&lt;/a&gt; at the
end and some &lt;a href=&#34;https://www.youtube.com/watch?v=6B3so5iWyKw&#34;&gt;weak lemon drink&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now it&amp;rsquo;s gotten to the point where you can never be sure you will actually be
donating. Appointments are cancelled on the same day, seemingly randomly. If
you do make it to the local village hall the lack of staff mean that you end
up waiting ages to donate. Or worse turned away at the door (non &lt;a href=&#34;https://www.blood.co.uk/why-give-blood/blood-types/o-positive-blood-type/&#34;&gt;O positive&lt;/a&gt;
blood types in particular). Even the website mucks you about now.&lt;/p&gt;
&lt;p&gt;All whilst enduring endless begging texts and emails constantly asking you to
donate. I&amp;rsquo;m trying mate.&lt;/p&gt;
&lt;p&gt;You do still get a biscuit though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mikezornek.com/posts/2024/9/liveview-modules-must-end-in-live/&#34;&gt;LiveView Modules Must End in &lt;code&gt;Live&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We drafted some simple LiveView demos with modules that did not end in Live,
and things worked fine. I had a gut feeling that this was required, but I
could not put my finger on it.&lt;/p&gt;
&lt;p&gt;Today, I was reminded when and why you need the Live suffix.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When you order postage stamps online, not only do the Royal Mail take 4 days
to despatch said stamps, they also charge you for postage, which I find
absolutely mind-boggling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/166-metal-framed/#:~:text=ordered%20a%20load%20more%20rando%20cables%20from%20Amazon&#34;&gt;rando DisplayPort to Thunderbolt cables arrived&lt;/a&gt;; all 6 of &amp;rsquo;em. Not a
single one worked. Great success.&lt;/p&gt;
&lt;p&gt;I plugged the original (&lt;em&gt;deep breath&lt;/em&gt;) &lt;a href=&#34;https://www.amazon.co.uk/gp/product/B01LYD2Y19/&#34;&gt;Cable Matters 32.4Gbps Bidirectional
USB C to DisplayPort 1.4 Cable&lt;/a&gt; back in, and this time the picture was
perfect?! No visual artifacts at all.&lt;/p&gt;
&lt;p&gt;Everything was hunky dory until I started to actually play a game. The game
started, and the menus loaded, but as soon as it attempted to start the game
itself the screen would go blank!&lt;/p&gt;
&lt;p&gt;On a hunch I disabled &amp;ldquo;G-Sync&amp;rdquo; in the Nvidia Control Panel settings and
everything fell into place and I managed to play a game of Age of Empires IV
without a single issue. Fucking computers, man.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m thinking that perhaps there was some sort of interference going on before.
I had the cable routed next to some others, so it is possible. I will
investigate further. Or I won&amp;rsquo;t because I can&amp;rsquo;t be bothered and I just wanna
play games once a year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is there something wrong with this?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ rg &#39;rubocop:disable Metrics/MethodLength&#39; | wc -l
   433
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If we chose to ignore is 433 times, is it useful?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had never heard of the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Web_Share_API&#34;&gt;Web Share API&lt;/a&gt; until I read &lt;a href=&#34;https://farens.me/blog/implement-the-web-share-api-in-phoenix-liveview&#34;&gt;Implement the Web Share
API in Phoenix LiveView&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Web Share API provides a mechanism for sharing text, links, files, and
other content to an arbitrary share target selected by the user.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, for example, in the context of iOS you can trigger the Share Sheet to
share content directly with installed apps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://elixir-lang.org/blog/2024/08/28/typing-lists-and-tuples/&#34;&gt;Typing lists and tuples in Elixir&lt;/a&gt; by Jose Valim. Very interesting
explanation of the trade-offs required to make a type system work with Elixir.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://accu.org/&#34;&gt;ACCU&lt;/a&gt; is not an organisation I had heard of before. It seems to have started
as a C++ group, but is now more general computing/programming. There is a
local group near me and I went along for the first time this week. They were a
friendly bunch, and I intend to go along again. The talk was on Ruby too.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 166: Metal-framed</title>
      <link>https://elver.me/weeknotes/166-metal-framed/</link>
      <pubDate>Sun, 01 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/166-metal-framed/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Somehow it is September. This is disappointing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.chiark.greenend.org.uk/~sgtatham/quasiblog/code-review-antipatterns/&#34;&gt;Code review antipatterns&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In this case, that’s to make the patch as good as possible, according to
whatever definition of ‘good’ the development team as a whole has agreed on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We recently discussed this at work. What is &amp;ldquo;good&amp;rdquo;?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our bed started squeaking. I knew this would happen because all metal-framed
beds eventually do. I didn&amp;rsquo;t know it was metal-framed when we bought it or I
would not have bought it. Anyway, how to stop it? I have no idea other than to
tighten all the screws and bolts, and hope.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We joined a free, local, walking tour this weekend as a way to get to know
some more about our new home. It was led by a very dry humoured older
gentlemen and was very informative. Time well spent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In an effort to control eating I decided to do some meal prepping on Saturday.
This would give us a stock in the freezer for when we&amp;rsquo;re feeling particularly
lazy &amp;ndash; laziness is when pizza is consumed. Good plan. Unfortunately I did not
plan to remember to put the food in the freezer before going to bed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Are you aware how difficult it is to connect a PC to an Apple Studio Display?
No? Very difficult. It. Is. Tricky.&lt;/p&gt;
&lt;p&gt;I had seemingly forgotten everything about this since &lt;a href=&#34;/weeknotes/124-show-me-your-feed/#:~:text=How%20do%20you%20plug%20a%20PC%20into%20an%20Apple%20Studio%20Display%3F&#34;&gt;when I tried last
time&lt;/a&gt;. The only evidence being a stack of only nondescript cables in my
drawer.&lt;/p&gt;
&lt;p&gt;After trying many cables I did eventually get a picture on the Studio Display
from my PC, but I had to reboot the monitor (a.k.a. unplug it, wait 20
seconds, and re-plug it) with the PC connected in order to make it happen 🙄&lt;/p&gt;
&lt;p&gt;Despite what was very obviously going to be a hassle every time I wanted to
use the PC, I was pleased that I had at least something showing on-screen.
That was until the flickering and visual artifacts showed up during &lt;a href=&#34;https://en.wikipedia.org/wiki/Age_of_Empires_IV&#34;&gt;Age of
Empires IV&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There was a brief dalliance with the idea of getting a Thunderbolt 4 expansion
card to add to my PC which would allow a direct Thunderbolt to Thunderbolt
connection, but that was quickly over when I realised my motherboard does not
have the requisite connections to do so.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m at a bit of a loss now, so I&amp;rsquo;ve just ordered a load more rando cables from
Amazon in the hope that one of them gives a better result.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have been slowly continuing the &lt;a href=&#34;/weeknotes/160-many-small-queries/#:~:text=I%20bought%20High%20Performance%20SQLite%20video%20course%20to%20learn%20more%20about%20SQLite&#34;&gt;High Performance SQLite course I
purchased&lt;/a&gt;. I&amp;rsquo;m finding it a bit of a slog to be honest, but not because the
content isn&amp;rsquo;t good, because it is, I&amp;rsquo;ve just lost interest. I&amp;rsquo;m trying to
watch one video a day to get through it even though I&amp;rsquo;m not really taking in
any of the information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve only gone and read another book &amp;ndash; &lt;a href=&#34;https://www.goodreads.com/book/show/188543465-the-trading-game&#34;&gt;The Trading Game by Gary Stevenson&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;2 out of 24 read ✅&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 165: House prints</title>
      <link>https://elver.me/weeknotes/165-house-prints/</link>
      <pubDate>Sun, 25 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/165-house-prints/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve started a new side-project &amp;ndash; yadda, yadda. Of course I have. Already
losing interest.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kaspth/active_record-associated_object&#34;&gt;&lt;code&gt;ActiveRecord::AssociatedObject&lt;/code&gt;&lt;/a&gt; seems interesting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rails applications can end up with models that get way too big, and so far,
the Ruby community response has been Service Objects. But sometimes
app/services can turn into another junk drawer that doesn&amp;rsquo;t help you build
and make concepts for your Domain Model.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ActiveRecord::AssociatedObject&lt;/code&gt; takes that head on. Associated Objects are
a new domain concept, a context object, that&amp;rsquo;s meant to help you tease out
collaborator objects for your Active Record models.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/DGatl7bH2yQ?si=n27zAmGW7J3qNQfI&amp;amp;t=51&#34;&gt;Kasper Timm Hansen (the author of the library) gave a talk at the Ruby
Türkiyek group&lt;/a&gt; about it (I&amp;rsquo;ve yet to watch), and &lt;a href=&#34;https://garrettdimon.com/journal/posts/organizing-rails-code-with-activerecord-associated-objects&#34;&gt;Garrett Dimon also wrote
about it&lt;/a&gt; (I&amp;rsquo;ve yet to read &amp;ndash; lol).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Since moving I&amp;rsquo;ve been keen to get into the local Ruby &amp;ldquo;scene&amp;rdquo;. The only
problem being that there didn&amp;rsquo;t really seem to be one&amp;hellip;&lt;/p&gt;
&lt;p&gt;When we were first thinking of moving I joined a local developer community in
the new area we had in our sights, and put a call out for Rubyists. Around
half a dozen replied. It gave me hope. I never expected a large number of
people. Remember, Ruby is dying.&lt;/p&gt;
&lt;p&gt;However since actually moving the response has been more tepid. So it was me,
and a another guy. Is two people a &amp;ldquo;group&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;There were a couple of things affecting this I think. People have forgotten,
to an extent, about meeting-up since COVID, and it&amp;rsquo;s August &amp;ndash; classic school
holidays territory. Not ideal timing to try and rekindle a group.&lt;/p&gt;
&lt;p&gt;Do you know what though? I think we have an actual Ruby meetup on our hands
now. The group has now grown from 2 people to an impressive 5 in just a few
weeks. We don&amp;rsquo;t have speakers, but we do have a group of people coming
together to talk Ruby, and that&amp;rsquo;s pretty great. I hope we can keep it going.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tangentially, do you know how expensive Meetup.com is? I expected that it
would be free for upto 10 members or something, but no, straight into paid
plans &amp;ndash; I&amp;rsquo;m reluctant to pay for it tbh.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We met up with the previous owner of our new house this week. Bit weird? He
seemed like a good person in our dealings with him during the house buying
process &amp;ndash; negotiation, but without any of the agro.&lt;/p&gt;
&lt;p&gt;(Maybe we&amp;rsquo;ll find out the house is built out of straw later and change our
minds!).&lt;/p&gt;
&lt;p&gt;Anyway, his late wife, whose house it was originally, was a food historian and
took up painting in her later life. He wondered whether we&amp;rsquo;d like one of her
paintings as a print for the house &amp;ndash; a bit of history carried through. It
sounded life a wonderful idea to us, so we agreed and gratefully received two
prints for the house.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Despite what some reviews have apparently said I enjoyed &lt;a href=&#34;https://www.themoviedb.org/movie/945961-alien-romulus&#34;&gt;Alien: Romulus&lt;/a&gt;. It
did seem to lose it&amp;rsquo;s way a bit, and I wasn&amp;rsquo;t sure to make of the finale, but
I really enjoyed the world building and found it very entertaining.&lt;/p&gt;
&lt;p&gt;And, get this, the cinema was good and there weren&amp;rsquo;t any people talking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve got my &lt;a href=&#34;/weeknotes/164-endless-shrimp/#:~:text=Be%20there%20or%20be%20square&#34;&gt;ticket to Haggis Ruby now&lt;/a&gt;, and train and hotel bookings to go
along with it. I haven&amp;rsquo;t been to Edinburgh since 2019 when I was there for
work, so I&amp;rsquo;m looking forward to visiting again. I expect it will be fucking
freezing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 164: Endless shrimp</title>
      <link>https://elver.me/weeknotes/164-endless-shrimp/</link>
      <pubDate>Sun, 18 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/164-endless-shrimp/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Posted on a Tuesday? Yes. No further comment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After I don&amp;rsquo;t know how long I finished &lt;a href=&#34;https://www.goodreads.com/book/show/75531803-killing-thatcher&#34;&gt;Killing Thatcher by Rory Carroll&lt;/a&gt;. I
highly recommend it. This brings my books read this year total to an
impressive 1 book.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;https://monzo.com/pots&#34;&gt;Monzo Pots&lt;/a&gt; were looking a bit drab so I decided to spruce them up with
some custom images when I came across this &lt;a href=&#34;https://potimages.rknight.me/&#34;&gt;Monzo Pot Image Generator&lt;/a&gt; by Robb
Knight.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ericportis.com/posts/2024/endless-shrimp-jesus/&#34;&gt;Endless Shrimp Jesus&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s not just that the folks who still have money to spare think AI is the
next big thing. It’s also that it’s much easier to invest a couple billion
in something when you know you’re going to get a bunch of it right back.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a very interesting theory as to why AI is so booming but everyone is
struggling in comparison.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://angelika.me/2024/08/12/how-to-add-css-rules-only-in-test-env-phoenix-app/&#34;&gt;How to add CSS rules only in the test env in your Phoenix app&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://elixir-lang.org/blog/2024/08/15/welcome-elixir-language-server-team/&#34;&gt;Announcing the official Elixir Language Server team&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The current language server maintainers have agreed to move forward with a
single Language Server Protocol project, relying on the strengths of each
implementation&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Open Source co-operation and leadership in action.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I bought some Sketchers this week. Either I&amp;rsquo;m on-brand, young, and vibrant, or
I&amp;rsquo;ve reached middle age where I just want comfortable shoes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theverge.com/2024/8/16/24221688/ikea-drones-us-warehouse&#34;&gt;Ikea’s stock-counting warehouse drones will fly alongside workers in the US&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Swedish furniture chain announced that the autonomous drones will soon
operate alongside workers in its Perryville, Maryland&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Can you imagine working in an Ikea warehouse with drones flying above your
head all day?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continuing improvements for SQLite in Rails with &lt;a href=&#34;https://github.com/rails/rails/pull/52562&#34;&gt;Bulk insert fixtures on
SQLite #52562&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;creating a single bulk insert per fixture table and making tests with
SQLite considerably faster.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://haggisruby.co.uk/&#34;&gt;Haggis Ruby&lt;/a&gt; is happening! Be there or be square.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 163: Slow internet</title>
      <link>https://elver.me/weeknotes/163-slow-internet/</link>
      <pubDate>Sun, 11 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/163-slow-internet/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://toolshed.com/2024/07/greenfield.html&#34;&gt;Greenfield, Brownfield&amp;hellip; Blackfield? &amp;ndash; Andy Hunt&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One of the things that we always forget is that software development is a
completely human endeavor. The programming languages, the container
orchestration, the tech stack—all that is secondary. It’s all about us, as
people. And people have both history and future.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rectangleapp.com/&#34;&gt;Rectangle&lt;/a&gt; has served me well for many years, but since I&amp;rsquo;m using Raycast
anyway, and it supports the same actions that I use in Rectangle, I thought it
was worth relying on one less app, so I&amp;rsquo;m no longer using it 👋&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://brr.fyi/posts/engineering-for-slow-internet&#34;&gt;Engineering for Slow Internet&lt;/a&gt; &amp;ndash; Of course, the South Pole is an extreme
environment, but the issues raised in this article do affect all of us, to a
lesser extent, often.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;From my berthing room at the South Pole, it was about 750 milliseconds,
round trip, for a packet to get to and from a terrestrial US destination.
This is about ten times the latency of a round trip between the US East and
West coasts (up to 75 ms). And it’s about thirty times the expected latency
of a healthy connection from your home, on a terrestrial cable or fiber
connection, to most major content delivery networks (up to 25 ms).&lt;/p&gt;
&lt;p&gt;Seriously, I can’t emphasize how jarring this is. At my apartment back home,
on GPON fiber, it’s about 3 ms roundtrip to Fastly, Cloudflare, CloudFront,
Akamai, and Google. At the South Pole, the latency was over two hundred and
fifty times greater.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.elixirstreams.com/tips/process-labels&#34;&gt;Elixir &amp;amp; Erlang&amp;rsquo;s new process labels!&lt;/a&gt; &amp;ndash; Label Elixir processes to help
identify them when debugging or observing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The kitchen tap in our new place has a couple of problems: 1) it has been
dripping since we moved in (and obviously much longer) which is very annoying
in itself, and 2) it also has separate controls for hot and cold requiring us
to carefully balance the two levers in order to not scold our hands like some
sort of cave people.&lt;/p&gt;
&lt;p&gt;This week I decided that I&amp;rsquo;d had enough and bought a new tap to solve these
two issues. I fitted it myself, and to my (and perhaps your) surprise it went
very well and worked first time. Result. I was quite proud of myself for not
flooding the kitchen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jobs.apple.com/en-us/details/200561949/sr-software-engineer-elixir-environmental-systems&#34;&gt;Apple are hiring a Senior Elixir Software Engineer&lt;/a&gt; &amp;ndash; I don&amp;rsquo;t see many
Elixir jobs advertised very often, so this was surprising and welcome to see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I met with a couple of Rubyists in the local area this week because I&amp;rsquo;m keen
to try and get a Ruby user group going. There used to be one, but keeping
meetups going seems to require a fair amount of effort, and especially so
after the COVID years. It&amp;rsquo;s the wrong time of year to try and get something
going really what with holidays in full swing, but we will see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dockyard.com/blog/2024/06/27/self-healing-liveviews-fun-with-llms-and-the-beam&#34;&gt;Self-Healing LiveViews: Fun with LLMs and the BEAM&lt;/a&gt; &amp;ndash; this is a fun
experiment into using LLMs to automatically repair broken code at runtime.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://evilmartians.com/chronicles/soft-deletion-with-postgresql-but-with-logic-on-the-database&#34;&gt;Soft deletion with PostgreSQL: but with logic on the database!&lt;/a&gt; &amp;ndash; this is
very cool, I had no idea this was possible with Postgres.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So, how can we apply this particular approach to our problem? Actually, this
is easily done: all we need to do is create a rule which changes the
deletions to updates.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can rewrite queries using rules stored in the database.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;CREATE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;RULE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;_soft_deletion&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;AS&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;ON&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;DELETE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;TO&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;orders&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;DO&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;INSTEAD&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;(&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;UPDATE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;orders&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;SET&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;deleted&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;WHERE&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;old&lt;/span&gt;.id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;AND&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;NOT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;deleted&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;);&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve stayed away from logic in the database since my Microsoft SQL Server days
(where it felt like too much logic was stored in the database) but this is
undeniably cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://longform.asmartbear.com/impostor-syndrome/&#34;&gt;Impostor Syndrome: Why I felt like a fraud, and how I overcame it&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t stop striving, just stop holding yourself to an impossible standard,
and don&amp;rsquo;t worry what other people think.&lt;/p&gt;
&lt;p&gt;They’re not thinking about you at all.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maybe there is &lt;a href=&#34;https://www.youtube.com/watch?v=yDvl4fZGk40&amp;amp;t=810s&#34;&gt;something to learn about creative pursuits from Josh Homme&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you expect anything from music, you expect too much. So, you play for
yourself, you play to enjoy it, and you make the most it, for you. Period.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Whenever I want to build something I always have the other in mind. What will
they think? Will they like it? Will I be loved for it?&lt;/p&gt;
&lt;p&gt;Perhaps it is enough to just &lt;em&gt;make it&lt;/em&gt; and &lt;em&gt;enjoy doing so&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 162: Locked out</title>
      <link>https://elver.me/weeknotes/162-locked-out/</link>
      <pubDate>Sun, 04 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/162-locked-out/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rails/rails/pull/52480&#34;&gt;Implement the bin/rails boot command&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is handy. I had an occasion to use something like this once. We had an
issue where the Rails app did not boot in production mode. This is bad. We
decided to add a check in CI for it. This would&amp;rsquo;ve been useful for that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I eventually managed to get my &lt;a href=&#34;/weeknotes/161-passport-shenanigans/#:~:text=get%20a%20Canadian%20passport%20before%20September!&#34;&gt;passport application&lt;/a&gt; notarized and sent off.
This whole process has cost me £452.85 &lt;em&gt;so far&lt;/em&gt;  😒&lt;/p&gt;
&lt;p&gt;Now we wait.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://agiletechnicalexcellence.com/2024/07/22/chunks-and-beacons.html&#34;&gt;Code comprehension: Chunks and Beacons&lt;/a&gt; &amp;ndash; I found this interesting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We talk about making source code readable and it turns out that this isn’t
just stylistic interpretation; there is actual research into this topic. As
we read through the code, what we’re scanning for are chunks and beacons.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/fatkodima/active_record_tracer&#34;&gt;ActiveRecordTracer&lt;/a&gt; &amp;ndash; For posterity, I&amp;rsquo;m sure to need this one day. I
remember using some hacky solution before now, but this looks a lot nicer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You identified (or suspect) that the reason for the slowness of some code is
Active Record, specifically lots of queries and/or loaded records. How do
you easily detect which queries, which records are loaded the most, and the
sources of those? This tool to the rescue!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.mistys-internet.website/blog/blog/2024/07/12/github-is-starting-to-feel-like-legacy-software/&#34;&gt;&amp;ldquo;GitHub&amp;rdquo; Is Starting to Feel Like Legacy Software&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The problem wasn’t that the line I wanted wasn’t on the page—it’s that the
whole document wasn’t being rendered at once, so my browser’s builtin search
bar just couldn’t find it. On a hunch, I tried disabling JavaScript entirely
in the browser, and suddenly it started working again. GitHub is able to
send a fully server-side rendered version of the page, which actually works
like it should, but doesn’t do so unless JavaScript is completely
unavailable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I mean, really? It&amp;rsquo;s not that the page is so big that it can&amp;rsquo;t be reasonably
rendered, it&amp;rsquo;s that the JavaScript can&amp;rsquo;t or won&amp;rsquo;t show the page.&lt;/p&gt;
&lt;p&gt;I feel similar to this about Heroku too. There was a time when it innovated on
a weekly basis, but now it chugs. Nothing lasts forever.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I learnt about the &lt;a href=&#34;https://neovim.io/doc/user/cmdline.html#cmdline-window&#34;&gt;&lt;code&gt;cmdline-window&lt;/code&gt;&lt;/a&gt; this week. I have, like a lot of vim
features, only ever accidentally invoked this in the past. But it looks to be
very useful.&lt;/p&gt;
&lt;p&gt;When you run a command like a search and replace (&lt;code&gt;:%s/foo/bar/&lt;/code&gt;) you can&amp;rsquo;t
edit the command using regular vim features &amp;ndash; moving the cursor requires me
to use the arrow keys, for example, like a heathen.&lt;/p&gt;
&lt;p&gt;By chance I came across &lt;a href=&#34;https://www.reddit.com/r/neovim/comments/1cnm60i/do_i_need_to_use_the_arrow_keys/&#34;&gt;this Reddit thread on the exact problem&lt;/a&gt;, and it
turns out that if you issue &lt;code&gt;CTRL-f&lt;/code&gt; whilst editing a command it opens the
command in the &lt;code&gt;cmdline-window&lt;/code&gt; which allows the usual power of Vim to edit
commands, and when you&amp;rsquo;re ready to execute the command you hit &lt;code&gt;&amp;lt;enter&amp;gt;&lt;/code&gt; ✅&lt;/p&gt;
&lt;p&gt;However, I have a config peculiarity which I added some time a go, which
already uses &lt;code&gt;&amp;lt;enter&amp;gt;&lt;/code&gt; to clear any search highlights. The config looks like
this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;-- Clear search highlights when hitting &amp;lt;enter&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;n&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;lt;cr&amp;gt;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;:nohlsearch&amp;lt;cr&amp;gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So I asked Claude 3.5 Sonnet how I could use enter to clear search highlights
most of the time, but not in the &lt;code&gt;cmdline-window&lt;/code&gt; and it gave me this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;-- Clear search highlighting when hitting &amp;lt;enter&amp;gt; in normal mode,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;-- but not in the command-line window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;n&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;lt;cr&amp;gt;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; vim.fn.getcmdwintype() &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;:nohlsearch&amp;lt;cr&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;lt;cr&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;, { expr &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;m not sure if this is the most idiomatic way to do this. But it works and
seems reasonable enough.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We locked ourselves out of the house this week &amp;ndash; it was inevitable. Due to
the super speedy arrival of a locksmith, and his skill with a horseshoe shaped
piece of aluminium pipe, we were back in without 25 minutes. And it only cost
us £65, which I thought was very reasonable.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t feel particularly safe in the house now though given the ease with
which he was able to gain entry 😬&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 161: Passport shenanigans</title>
      <link>https://elver.me/weeknotes/161-passport-shenanigans/</link>
      <pubDate>Sun, 28 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/161-passport-shenanigans/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I &lt;a href=&#34;/weeknotes/155-snag-a-sofa/#:~:text=I%20might%20consider%20upgrading%20to%20Sonama%20soon&#34;&gt;upgraded to macOS Sonama&lt;/a&gt; and it seems to have happened without incident.
I&amp;rsquo;m always scared my development environment will be broken is some hard to
debug way (which would be bad because it would stop me earning) but all good
so far.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Playing around with a LiveView app this week I wondered why my LiveView kept
falling back to long polling instead of using a web socket. Long polling is an
alternative transport for LiveViews for when websockets are blocked by
corporate networks and the like, and are far less efficient, but a necessary
backup.&lt;/p&gt;
&lt;p&gt;Apparently, this can happen in development mode, for reasons. There is a
session cookie called &lt;code&gt;phx:longpoll&lt;/code&gt;. The solution is to clear that session
cookie and the websocket will re-connect. It does happen with annoying
regularity though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Counting values stored in a Postgres text array (&lt;code&gt;text[]&lt;/code&gt;) column can be
achieved by &amp;ldquo;unnesting&amp;rdquo; the values. This creates a row for each value stored
in the text array column making counting easy.&lt;/p&gt;
&lt;p&gt;Given values like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;| locales                |
|------------------------|
| {en-US,en-GB,de,sv,nl} |
| {en-GB}                |
| {en-GB,nb}             |
| {en-US}                |
| {en-US}                |
| {en-US}                |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You write this query:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;locale,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;COUNT&lt;/span&gt;(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;as&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;table&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;unnest&lt;/span&gt;(locales)&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;as&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;locale&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;GROUP&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;BY&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;locale&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;ORDER&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;BY&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;DESC&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which yields this result:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;| locale | count |
|--------|-------|
| en-US  |     4 |
| en-GB  |     3 |
| sv     |     1 |
| de     |     1 |
| nl     |     1 |
| nb     |     1 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lovely stuff.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As you&amp;rsquo;ll know reader, I&amp;rsquo;m supposed to be &lt;a href=&#34;/weeknotes/150-cleanpods-pro/#:~:text=I%20am%20planning%20to%20attend%20RailsWorld%20in%20Toronto%20this%20September&#34;&gt;travelling to Canada in September&lt;/a&gt;
for RailsWorld and a short holiday.&lt;/p&gt;
&lt;p&gt;It seems that if you are a dual citizen of the UK and Canada (as I am) then
you need a Canadian passport in order to travel to Canada. I know this because
I applied for an Electronic travel authorization and I was  denied me for
&amp;ldquo;being a Canadian citizen&amp;rdquo; 🙄&lt;/p&gt;
&lt;p&gt;This is madness, right? I&amp;rsquo;ve been to Canada maybe 4 or 5 times and never had
this problem before, but &lt;a href=&#34;https://www.canada.ca/en/immigration-refugees-citizenship/services/visit-canada/dual-canadian-citizens-visit-canada.html&#34;&gt;it looks like the rules were changed in 2016&lt;/a&gt; and
now here I am.&lt;/p&gt;
&lt;p&gt;So now there is a mad scramble to get a Canadian passport before September!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When Rails is in development mode it will tell show a warning error page if
you have pending migrations aka migrations that need to be run. Normally this
is what you want because the code you are running likely depends on that
database state being up-to-date.&lt;/p&gt;
&lt;p&gt;However, this week I was fixing some migrations that weren&amp;rsquo;t inserting data
correctly and I didn&amp;rsquo;t want all the other migrations to run because I was
working through them one-by-one.&lt;/p&gt;
&lt;p&gt;You can turn that pending migration check off with this in
&lt;code&gt;config/environments/development.rb&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;active_record&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;migration_error &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, I&amp;rsquo;ve been writing way more SQL than usual this week. I&amp;rsquo;m
sure I&amp;rsquo;ve mentioned this before but I don&amp;rsquo;t write a great deal of SQL,
ActiveRecord (the ORM) shields you from it most of the time. When I do, I
struggle a bit if I&amp;rsquo;m being honest.&lt;/p&gt;
&lt;p&gt;This is where AI comes in. I&amp;rsquo;ve had really great success with using &lt;a href=&#34;https://www.anthropic.com/news/claude-3-5-sonnet&#34;&gt;Claude
3.5 Sonnet&lt;/a&gt; this week to help me get started with some fairly involved queries
using database features I have never used before. It&amp;rsquo;s not that it&amp;rsquo;s correct
all the time, because it isn&amp;rsquo;t. But I struggle with &lt;em&gt;starting things&lt;/em&gt;. Using
AI gets me started so that I can iterate on what it produces until I have a
working solution is a real life saver.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finally bought a licence to &lt;a href=&#34;https://tableplus.com/&#34;&gt;TablePlus&lt;/a&gt; because I&amp;rsquo;ve been free-loading for
longer than I&amp;rsquo;d care to admit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 160: Many small queries</title>
      <link>https://elver.me/weeknotes/160-many-small-queries/</link>
      <pubDate>Sun, 21 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/160-many-small-queries/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://encore.dev/blog/queueing&#34;&gt;Queueing &amp;ndash; An interactive study of queueing strategies&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Queues are everywhere. We queue at bars, in restaurants, and at the bank.
When you loaded this web page, the request to fetch it interacted with
dozens of different queues on its way from your machine to the server this
page is hosted on. Queues are fundamental.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I saw this a while ago, but it was nice to refresh my memory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://codepen.io/plfstr/pen/zYqQeRw&#34;&gt;HTML Tags Memory Test&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How many HTML tags can you remember? 114 to recall…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I got 63&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.sqlite.org/np1queryprob.html&#34;&gt;&amp;ldquo;Many Small Queries Are Efficient In SQLite&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SQLite is not client/server, however. The SQLite database runs in the same
process address space as the application. Queries do not involve message
round-trips, only a function call. The latency of a single SQL query is
far less in SQLite. Hence, using a large number of queries with SQLite is
not the problem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When you understand that SQLite &lt;em&gt;is&lt;/em&gt; your program this makes a lot of sense.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://uuid7.com/&#34;&gt;UUIDv7: The Time-Sortable Identifier for Modern Databases&lt;/a&gt; &amp;ndash; another UUID
type!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about the &lt;a href=&#34;https://www.fossil-scm.org/home/doc/trunk/www/index.wiki&#34;&gt;Fossil&lt;/a&gt; source control system.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In addition to doing distributed version control like Git and Mercurial,
Fossil also supports bug tracking, wiki, forum, email alerts, chat, and
technotes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find when a file was introduced in git&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git log --follow -- path/to/file
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://aaronfrancis.com/2024/youre-always-doing-something-wrong-21981fe7&#34;&gt;You&amp;rsquo;re always doing something wrong&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You have to keep going. Being occasionally wrong is a small price to pay.
Your alternative is to watch your life tick by as you&amp;rsquo;re perfecting one last
thing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I bought &lt;a href=&#34;https://highperformancesqlite.com/&#34;&gt;High Performance SQLite&lt;/a&gt; video course to learn more about SQLite.
It&amp;rsquo;s very well made and I&amp;rsquo;ve learnt a lot so far. I&amp;rsquo;m looking forward to
delving into the more advanced topics.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Since &lt;a href=&#34;/weeknotes/154-loathe-to-call-this-a-success/#:~:text=I%20knocked%20half%20an%20Oat%20Mocha%20over%20my%20computer&#34;&gt;I poured coffee into my computer&lt;/a&gt; I decided that maybe I should be
taking backups a bit more seriously than I have been.&lt;/p&gt;
&lt;p&gt;I already have cloud-based backups, but getting up-and-running from those
would take too long. In the past I had both a &lt;a href=&#34;https://en.wikipedia.org/wiki/Time_Machine_(macOS)&#34;&gt;TimeMachine&lt;/a&gt; backup and a full
disk clone but I stopped doing that for reasons I can&amp;rsquo;t remember.&lt;/p&gt;
&lt;p&gt;Well, Amazon Prime Day came along, and with the help of &lt;a href=&#34;https://uk.camelcamelcamel.com/&#34;&gt;Camel Camel Camel&lt;/a&gt; I
decided to buy an external &lt;a href=&#34;https://en.wikipedia.org/wiki/NVM_Express&#34;&gt;NVMe&lt;/a&gt; SSD (&lt;a href=&#34;https://www.amazon.co.uk/dp/B08GS7748F&#34;&gt;Samsung 980 PRO&lt;/a&gt;) and external
Thunderbolt 4 enclosure (&lt;a href=&#34;https://www.amazon.co.uk/dp/B0BL6F56DP&#34;&gt;ACASIS 40Gbps M.2 NVMe&lt;/a&gt;) to go along with it so I
could start cloning the disk again each night, but blimey.&lt;/p&gt;
&lt;p&gt;I performed a manual test clone (using &lt;a href=&#34;https://www.shirt-pocket.com/SuperDuper/SuperDuperDescription.html&#34;&gt;SuperDuper!&lt;/a&gt;) and it completed without
incident (I will schedule it later). However the enclosure got &lt;em&gt;extremely&lt;/em&gt;
hot. From what I&amp;rsquo;ve read I think that&amp;rsquo;s fairly normal, and hopefully shouldn&amp;rsquo;t
an issue as I will stick it to the underside of my desk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=ovYbgbrQ-v8&#34;&gt;Super-interesting interview with Chris Lattner creator of many things&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://marco.org/&#34;&gt;Marco Arment&lt;/a&gt; has been re-building his popular &lt;a href=&#34;https://overcast.fm/&#34;&gt;Overcast podcast app&lt;/a&gt; over
the past few years to modernise it and make it easier to work on. On &lt;a href=&#34;https://atp.fm/596&#34;&gt;ATP 596&lt;/a&gt;
he mentioned how much the process had made him question his whole identity as
a programmer. It can be extremely comforting to hear someone so successful
feeling this way as I do this often (I even feel weird calling myself a
programmer).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s finally been a good and &lt;em&gt;proper&lt;/em&gt; Summer this week, which is great because
it gives me the opportunity to complain about how hot it has been.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 159: Slow software</title>
      <link>https://elver.me/weeknotes/159-slow-software/</link>
      <pubDate>Sun, 14 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/159-slow-software/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The weekend was dominated by a solo trip to Bristol for a standup comedy gig
with a friend. The idea of a train trip is always so much better in my head
than in reality.&lt;/p&gt;
&lt;p&gt;On the way down I had grand plans for the train. I would read, I would write,
I would finish my work! Unfortunately, I just felt sick any time I tried any
of that. On the way back, it was a different story. I actually &lt;em&gt;did&lt;/em&gt; get some
stuff done. No idea why.&lt;/p&gt;
&lt;p&gt;Still, I can recommend getting a cheap upgrade to First Class to make it
bearable (First Class is, after all, what every seat should be). I used an app
called &lt;a href=&#34;https://seatfrog.com/&#34;&gt;Seatfrog&lt;/a&gt; on the way down and paid £20. On the way back Seatfrog
didn&amp;rsquo;t have any upgrades available but I was still able to upgrade &lt;em&gt;on the
train&lt;/em&gt; for even less, £17.50. It is more stressful though because you don&amp;rsquo;t
know if there will be availability, and you don&amp;rsquo;t know how much it will cost
as that information is nowhere to be found on their website 🙄&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dice.camp/@uncanny_kate/112724979643603832&#34;&gt;Kate Kirby on Mastodon&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We desperately need to start a Slow Software movement. High quality,
intentionally designed, low defect software done at a quarter of the pace
for the same price. Because we&amp;rsquo;ve been destroying the mental health of
developers for the last quarter century, and what do we have to show for it
but a giant mess?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=qf0GqRz-c74&#34;&gt;SQLite&amp;rsquo;s WAL mode is fast fast&lt;/a&gt; &amp;ndash; introduction to what WAL mode is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The super prolific &lt;a href=&#34;https://sindresorhus.com/&#34;&gt;Sindre Sorhus&lt;/a&gt; has released yet another app &amp;ndash; &lt;a href=&#34;https://sindresorhus.com/online-check&#34;&gt;Online
Check&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Online status in your menu bar&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I could do with something like this as I fight to get online in various coffee
establishments. It requires Sonama though and I&amp;rsquo;m still on Ventura because I&amp;rsquo;m
cool and relevant. I must upgrade.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://robertheaton.com/pyskywifi/&#34;&gt;PySkyWiFi: completely free, unbelievably stupid wi-fi on long-haul flights&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But suddenly I realised that this was no ordinary button. This clickable
rascal would allow me to access the entire internet through my airmiles
account. This would be slow. It would be unbelievably stupid. But it would
work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have a transatlantic flight coming up&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ludic.mataroa.blog/blog/on-burnout-mental-health-and-not-being-okay/&#34;&gt;On Burnout, Mental Health, And Not Being Okay&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;a href=&#34;https://highperformancesqlite.com/watch/good-uses-for-sqlite&#34;&gt;Good uses for SQLite&lt;/a&gt; Aaron Francis made this comment on storing lots of
small files in SQLite rather than directly on the filesystem.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;it&amp;rsquo;s better than having 1,000 and thousands and thousands of individual
little files because putting all of those files in a SQLite database and
reading out of there can be up to &lt;strong&gt;35% faster&lt;/strong&gt; than going straight to the
disk. Let me say that again. Reading from a SQLite database can be 35
percent faster than reading similar files from a disk.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This seems extremely counter-productive, but I guess that you avoid the
overhead of opening and closing files on the file system in the same way that
SQLite itself avoids network overhead by just being a file on disk rather than
a client/server architecture.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 158: Difficult job control</title>
      <link>https://elver.me/weeknotes/158-difficult-job-control/</link>
      <pubDate>Sun, 07 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/158-difficult-job-control/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Apparently I&amp;rsquo;ve been writing weeknotes every week for 3 years now! Maybe I can
be consistent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://schmonz.com/2015/08/12/tdd-saved-my-brain/&#34;&gt;TDD saved my brain&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For any given problem, I never quite totally believe I’ll be able to solve
it. If I start at a whiteboard, I have to think, so I have to be smart, and
I’m not sure when I’ll be done thinking, so it’s really hard to start.
Instead, I make a to-do list: an even simpler one, with a single
dumb-as-rocks failing test that points vaguely in a direction of some sort,
possibly the wrong one, who knows. I don’t have to be smart to make it pass,
so I can just do it, so I do do it. This helps me spend less time not
starting, and leaves me with much-needed momentum.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I could not relate to this more.&lt;/p&gt;
&lt;p&gt;I hardly ever TDD because although I strongly believe in it as a practice,
getting a test setup can often be more difficult than writing then actual
production code. However, I should remember to attempt this more often.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jamie.ideasasylum.com/2024/06/21/the-manager-s-unbearable-lack-of-endorphins&#34;&gt;The manager’s unbearable lack of endorphins&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’d feel competent, and valuable, and worthy and just good. It’s the best
feeling.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This blog post made me realize that the vast majority of the time I feel
nothing from what I do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I spent a surprising amount of time trying to figure out how to populate a
&lt;code&gt;jsonb&lt;/code&gt; column fixture because various Rails versions seem to have changed the
way it should be done 🤔&lt;/p&gt;
&lt;p&gt;For a nested JSON object you can specify the key/values in YAML like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;translations:
    en-US:
      title: Title here
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Julia Evans&amp;rsquo; &lt;a href=&#34;https://jvns.ca/blog/2024/07/03/reasons-to-use-job-control/#reason-3-running-a-command-while-using-vim&#34;&gt;Reasons to use your shell&amp;rsquo;s job control&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I use &lt;code&gt;CTRL-z&lt;/code&gt; and &lt;code&gt;fg&lt;/code&gt; &lt;em&gt;a lot&lt;/em&gt; during my normal programming workflow for the
same reasons as &lt;strong&gt;reason 3&lt;/strong&gt; in this article (running a command while using
vim).&lt;/p&gt;
&lt;p&gt;This is despite me using &lt;code&gt;tmux&lt;/code&gt; &amp;ndash; which takes a tiny bit longer to switch
between windows. I imagine I could achieve a better workflow if I had some
sort of custom keybindings setup in &lt;code&gt;tmux&lt;/code&gt; but I&amp;rsquo;ve always found it fairly
inscrutable when it comes to configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://akrabat.com/indenting-output-in-a-shell-script-with-pr/&#34;&gt;Indenting output in a shell script with pr&lt;/a&gt; &amp;ndash; Another day, another Unix
utility I&amp;rsquo;ve never heard of.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week at work was very difficult. I really need to figure out how to get
things done without all the self-hatred. I felt like quitting and going to
live in the woods.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ladybird.org/announcement.html&#34;&gt;Announcing the Ladybird Browser Initiative&lt;/a&gt; &amp;ndash; a new web browser.&lt;/p&gt;
&lt;p&gt;Chris Wanstrath, GitHub co-founder:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The world needs an independent, open source browser free of corporate
interests.&lt;/p&gt;
&lt;p&gt;Today @awesomekling and I are launching the Ladybird Browser Initiative, a
nonprofit focused on @ladybirdbrowser, and my family is donating $1M.&lt;/p&gt;
&lt;p&gt;Join us in supporting a browser that supports you!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Andreas Kling:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ladybird uses a brand new engine based on web standards, without borrowing
any code from other browsers. It started as a humble HTML viewer for the
SerenityOS hobby project, but since then it&amp;rsquo;s grown into a full
cross-platform browser project supporting Linux, macOS, and other Unix-like
systems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hell of a task, this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about &lt;a href=&#34;https://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html#method-i-reflect_on_all_associations&#34;&gt;&lt;code&gt;.reflect_on_all_associations&lt;/code&gt;&lt;/a&gt; which will return all associations
defined on an ActiveRecord model. I&amp;rsquo;ve needed this before, and thought this
must be new, but no, it has been in Rails for 20 years 😮&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(byebug) &lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;reflect_on_all_associations&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;map(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#990073&#34;&gt;:name&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#990073&#34;&gt;:client&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:versions&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:category&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:related&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:translations&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=Sw_Ze9zIafM&#34;&gt;End of Days Bolognese&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bolognese is an exercise in restraint&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have finally booked my flights to Toronto in September ✅&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 157: Anxiety-inducing deadline</title>
      <link>https://elver.me/weeknotes/157-anxiety-inducing-deadline/</link>
      <pubDate>Sun, 30 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/157-anxiety-inducing-deadline/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I don&amp;rsquo;t want to sound like a broken record, but another busy week. The good
news is that hopefully all my commitments are now fulfilled for a while.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A friend and I went to see Foo Fighters during the week. The approx. 1 hour
journey somehow took 4, so that was a lot of fun, but once we got there it was
nice to engage with the event in quite a loose way where I just sat at the
back and chilled out. This must be middle age.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was given an anxiety-inducing deadline out of nowhere this week. Setting
expectations is important, but setting them a week before something is due is
not OK.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know why I&amp;rsquo;m so anxious all the time. I catastrophize that I&amp;rsquo;m going
to get sacked and never work again, but the last 10 years of self employment
would seem to indicate that that is an unlikely event. None of this matters.
Still, here we are.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of course, the big event of the week was Brighton Ruby 2024. I travelled down
on Thursday afternoon and worked on the train. I was ready to have to take a
half day off of work, but this was the first time that I have actually gotten
work done on the train due to having no one sat next to me, air conditioning,
and access to a table. Of course, it was still late causing me to miss my
connection to Brighton.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I enjoyed Brighton Ruby far more than I had expected. Mainly, I think, because
I didn&amp;rsquo;t &lt;em&gt;have&lt;/em&gt; an expectations. Like not watching trailers for films, this is
the way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was a talk about &lt;a href=&#34;https://github.com/oldmoe/litestack&#34;&gt;Litestack&lt;/a&gt; at Brighton Ruby.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Litestack is a Ruby gem that provides both Ruby and Ruby on Rails
applications an all-in-one solution for web application data infrastructure.
It exploits the power and embeddedness of SQLite to deliver a full-fledged
SQL database, a fast cache , a robust job queue, a reliable message broker,
a full text search engine and a metrics platform all in a single package.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There has been a lot of noise about SQLite in the Rails community recently and
before that with Elixir programmers (and Fly.io are big into it too). I&amp;rsquo;ve
written about it before a few times and I&amp;rsquo;m still really interested in how we
can use it. It is still fascinating to me how technologies can sit on a
shelf being mostly ignored for years before a sudden resurgence hits.&lt;/p&gt;
&lt;p&gt;Someone I spoke with at the conference said how they felt that using SQLite
(which is essentially a single file on disk) felt wrong, and I can certainly
understand that. It&amp;rsquo;s not rational or logical, but we&amp;rsquo;ve been using
client/server database systems for so long that using something else can feel
weird.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new Ruby conference was announced at Brighton Ruby. It will be in Edinburgh
this coming October, on the 24th. I will be going if I get a ticket because
it&amp;rsquo;s so much closer to me now. And of course because I know the organisers.
It&amp;rsquo;s good to have another conference in the UK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Absolutely no plans this week &amp;ndash; yes!&lt;/p&gt;
&lt;p&gt;But shit loads of work to get done &amp;ndash; no!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 156: Fatigue</title>
      <link>https://elver.me/weeknotes/156-fatigue/</link>
      <pubDate>Sun, 23 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/156-fatigue/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Our first ever Tuesday posting! Oh dear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://luminousmen.com/post/senior-engineer-fatigue&#34;&gt;Senior Engineer Fatigue&lt;/a&gt; &amp;ndash; I thought this was interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Still feeling super busy and stressed. I&amp;rsquo;m not good at being under pressure,
even when that pressure is coming from my biggest inner critic. The lesson
I&amp;rsquo;ve learnt is, never try.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=8reaJG7z-is&#34;&gt;I Visited Apple&amp;rsquo;s Secret iPhone Testing Labs!&lt;/a&gt; from MKBHD is super interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I briefly installed, and tried out, a new file manager &amp;ndash; &lt;a href=&#34;https://github.com/sxyazi/yazi&#34;&gt;yazi&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Blazing fast terminal file manager written in Rust, based on async I/O.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I said, not much time to play with it, but I will hopefully go back to it
later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ispreview.co.uk/index.php/2024/06/isp-bt-reveals-uk-broadband-traffic-for-first-euro-2024-matches.html&#34;&gt;ISPreview had some interesting numbers&lt;/a&gt; on the traffic going through BT&amp;rsquo;s
network during the first Euro 2024 matches.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Total network traffic: 15,664 TB of data, peaking at 18.5 Terabits per second.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wowsers 😮&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another visit to our new house this weekend. It was complicated, but nice, and
I&amp;rsquo;m glad we made the effort. We visited Bridlington and Scarborough, both
places I&amp;rsquo;ve never been before with mixed reviews.&lt;/p&gt;
&lt;p&gt;However, the weekend of driving really did me in (🧟), and it has worried me
about how regularly I can do this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m very interested in the new Apple Passwords app. 1Password has fallen so
far &amp;ndash; it just doesn&amp;rsquo;t work most of the time. VCs man.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A super busy week (for me) this week coming up. Brighton Ruby is a highlight.
I&amp;rsquo;m not quite ready for it, like every year. I did consider not going because
I just feel I need a rest, but I will likely still go.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t like sitting around idle, and I don&amp;rsquo;t like being really busy. Where is
the happy medium?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 155: Snag a sofa</title>
      <link>https://elver.me/weeknotes/155-snag-a-sofa/</link>
      <pubDate>Sun, 16 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/155-snag-a-sofa/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Mood: Generally a bit fucked-off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/154-loathe-to-call-this-a-success/#:~:text=I%20knocked%20half%20an%20Oat%20Mocha%20over%20my%20computer&#34;&gt;Mocha-gate&lt;/a&gt; &amp;ndash; One of the USB-C ports is now being flaky. I&amp;rsquo;ve bought some
&amp;ldquo;contact cleaner&amp;rdquo; to see if a little spray of that will do the job. Some keys
still sticking too. I&amp;rsquo;m typing in a particularly aggressive way as a result.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work has been stressful this week. I am starting a larger piece of work and
I&amp;rsquo;m paralysed. Why? I &lt;em&gt;know&lt;/em&gt; that I can do this work, but I&amp;rsquo;m completely
stuck. And this happens every time.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s hard to explain the toll it takes because obviously my life is easy in
many ways, but the affect on my self-esteem has been life-long and I&amp;rsquo;m really
sick of it. I just want to work on stuff and make progress. I know rationally
that none of this matters, but it still causes great anguish for me and those
around me.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m dreading next week; that will help.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/154-loathe-to-call-this-a-success/#:~:text=They%20tried%20to%20deliver%20it%20whilst%20I%20was%20away%20instead&#34;&gt;long-awaited chair&lt;/a&gt; arrived. I gave it a quick look over and it seems to
be a good replacement, but I haven&amp;rsquo;t had any time to set it up properly yet.
It seems like they&amp;rsquo;re letting me keep the old chair too &amp;ndash; CASHBACK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The second set of guests visited this week. It was very nice to see them and
we had a good time. This was our first guests staying with us at the house,
which was a bit weird as I&amp;rsquo;m not used to a full house.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We managed to snag a second sofa off of Facebook Marketplace and hired a van
to go and pick it up. With the sofa, a new rug, and a lamp, the front room is
feeling a lot more homely than it was and allowed our house guests to sit
down.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A parental visit coming up this week (why did we arrange guests on consecutive
weekends for a month?), but this time I will be doing the driving back and
forth. It&amp;rsquo;s very nice to see everyone and I really appreciate the efforts
people have made, but I think we did a bad job at planning all these visits so
close together. I feel like a need to sit and stare at the wall for a bit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Due to children being present during our last visit I decided to setup my
Nintendo Switch in an attempt to entertain them should it be necessary. They
didn&amp;rsquo;t seem bothered, but I have been playing it a bit instead, and with one
of this batch of guests.&lt;/p&gt;
&lt;p&gt;It is undeniable how good &lt;a href=&#34;https://en.wikipedia.org/wiki/Mario_Kart_8&#34;&gt;Mario Kart 8&lt;/a&gt; is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.sansbullshitsans.com/&#34;&gt;Sans Bullshit Sans&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The font that replaces every buzzword by a Comic Sans-styled censorship bar&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;macOS Sequoia will soon be with us so I might consider upgrading to Sonama
soon ;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 154: Loathe to call this a success</title>
      <link>https://elver.me/weeknotes/154-loathe-to-call-this-a-success/</link>
      <pubDate>Sun, 09 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/154-loathe-to-call-this-a-success/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You know when something is obviously going to be a problem, but the person
you&amp;rsquo;re talking to insists it will be fine? It was not fine.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/148-honeymoon-period/#:~:text=offered%20to%20replace%20the%20entire%20chair&#34;&gt;The replacement chair&lt;/a&gt; was due to dispatch at the &amp;ldquo;end of May&amp;rdquo;. I was told I
would be notified of dispatch. Reader, they did not notify me. They tried to
deliver it whilst I was away instead.&lt;/p&gt;
&lt;p&gt;And then sent me a passive aggressive email about me not being available to
take delivery.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So after all the drama of my car breaking I drove for 5 hours on Sunday and
didn&amp;rsquo;t lose any coolant at all. I then took it to the garage the next day,
where the mechanic couldn&amp;rsquo;t find &lt;em&gt;any&lt;/em&gt; leaks whatsoever.&lt;/p&gt;
&lt;p&gt;It seems that any leak that was present has been fixed by me adding some
Radweld to the coolant system a few weeks previous. The inexplicable thing is
why the previous garage thought there was a leak from the radiator. Hopefully
it stays fixed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;However, my partner&amp;rsquo;s car didn&amp;rsquo;t make the journey unscathed and developed
it&amp;rsquo;s own set of problems. They too, then mysteriously disappeared. Cars, man.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I forgot to say last week that the &lt;a href=&#34;/weeknotes/152-your-seller/#:~:text=Perhaps%20that%20why%20our%20neighbour%20surreptitiously%20trespassed%20on%20our%20property%20and%20cut%20back%20our%20rose%20bush&#34;&gt;trespassing gardener&lt;/a&gt; returned, and this
time with a ladder!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;ll come as no surprise to you that I agree &lt;a href=&#34;https://ruby.social/@soulcutter/112495949162567841&#34;&gt;with this&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Life before rubocop:&lt;/p&gt;
&lt;p&gt;Once in a while you’d come across some unusual formatting and it was
possibly a small annoyance.&lt;/p&gt;
&lt;p&gt;Life after rubocop:&lt;/p&gt;
&lt;p&gt;Constant stream of “fix rubocop” commits, everyone finding their own bespoke
workflow trying to automate rubocopping, CI failing valid ruby because of
its format, magic comments sprinkled across code, new versions of rubocop
continuing to change code that has no problems into a form that a few people
(who call themselves the community) thought was better&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the bit that annoys me most.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;who call themselves the community&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can change Rubocop rules, of course, but the problem is that a lot of
people have decided they are &amp;ldquo;best practice&amp;rdquo; as they&amp;rsquo;ve been decided by the
&amp;ldquo;community&amp;rdquo; &amp;ndash; they haven&amp;rsquo;t. So many of the decisions are very un-rubyish at
best, and actively harmful at worse.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/standardrb/standard&#34;&gt;Standard Ruby&lt;/a&gt; makes it sane.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week has been very busy and stressful. It wouldn&amp;rsquo;t be so bad if the
majority of this stress wasn&amp;rsquo;t self-inflicted, but it absolutely was. The
Other Place is almost ready, but now we&amp;rsquo;re being ghosted by the cleaners we
had set up and ready to go. Excellent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One of my jobs this week was to setup the &lt;a href=&#34;/weeknotes/153-overwhelmed/#:~:text=I%20received%20the%20tiny%20computer&#34;&gt;new Lenovo tiny PC&lt;/a&gt; to act as my
UniFi controller.&lt;/p&gt;
&lt;p&gt;Because I was doing all this &amp;ldquo;on the move&amp;rdquo; I didn&amp;rsquo;t have a monitor to plug-in
to the new PC for the initial Ubuntu install (it will run headless
afterwards). Then I remembered &lt;a href=&#34;/weeknotes/129-autoexpand-on/#:~:text=It%20dawned%20on%20me%20this%20would%20be%20a%20good%20solution%20to%20my%20occasional%20need%20for%20a%20monitor%20that%20I%20can%20connect%20to%20various%20computers&#34;&gt;my experiment with Orion&lt;/a&gt;, which allows, with
the addition of a HDMI capture dongle, to plug any old PC into an iPad. I have
an iPad ✅ I have a &lt;a href=&#34;https://www.amazon.co.uk/dp/B08Z3XDYQ7&#34;&gt;HDMI capture dongle&lt;/a&gt; ✅ This time, it worked really well.
Very handy.&lt;/p&gt;
&lt;p&gt;The Ubuntu Server install was straightforward. I was pleasantly surprised to
see a section in the install wizard where it asks for your GitHub username so
it can download your public key and configure SSH automatically.&lt;/p&gt;
&lt;p&gt;The VESA mount I bought also worked really well.&lt;/p&gt;
&lt;p&gt;Setting up the software was easy too. The first thing I did was setup
Tailscale using their supplied installation script. This was stupidly easy to
do. In retrospect I should have setup Tailscale inside Docker like I have in
the past just so everything was in one place, but alas I forgot. Once I had
Tailscale installed I knew I could perform the rest of the configuration
anywhere I happened to be.&lt;/p&gt;
&lt;p&gt;For the UniFi controller, I already had the Docker config from my old server
so this was a case of installing Docker, and setting up that with some slight
tweaks. Once the software was running in Docker I took a backup from the old
controller and restored it in the new. Everything clicked into place with the
exception that my devices didn&amp;rsquo;t automatically adopt because I had a hardcoded
IP for the &amp;ldquo;Inform URL&amp;rdquo; setup in the web UI. Once I changed that value
everything worked.&lt;/p&gt;
&lt;p&gt;I am loathe to call this a success for fear of future failure, but it sure
looks like one so far.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://robindev.substack.com/p/cloudflare-took-down-our-website/comments&#34;&gt;Cloudflare took down our website after trying to force us to pay 120k$ within 24h&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It felt like extortion. Pay us $120k until tomorrow or we destroy your business.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve always found the idea of handing over my DNS records to Cloudflare scary.
How would you use Cloudflare whilst mitigating their ability to extort you?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week it finally happened. I knocked half an Oat Mocha over my computer 😢
A public breakdown then followed. The good news is that is still seems to work
normally. The bad news is that it smells of coffee and some of the keys are
becoming sticky, so we will see how it goes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 153: Overwhelmed</title>
      <link>https://elver.me/weeknotes/153-overwhelmed/</link>
      <pubDate>Sun, 02 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/153-overwhelmed/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Current status: Overwhelmed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had our first visitors to the new house this week, which was great. One of
my fears was that I would never again see my friends so it was very nice to
see some! I&amp;rsquo;m still getting used to living here, so I&amp;rsquo;m not sure how good of a
tour guide I was, but I did my best and I think a good time was had.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, we bought a fuck-ton of houseplants to try and brighten up
the house and make it look lived in. I like having a lot of plants around,
they just don&amp;rsquo;t always like me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://slashpages.net/&#34;&gt;slash pages&lt;/a&gt; &amp;ndash; a nice round-up.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A guide to common pages you can add to your website&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I may implement a couple of these that I don&amp;rsquo;t already have.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went to see our first gig since moving - a live version of the Adam Buxton
Podcast of which I am a long time listener. It was a fun show, but ran really
long &amp;ndash; too much of a good thing. The venue was really hot. Like &lt;em&gt;really&lt;/em&gt; hot.
I&amp;rsquo;d hate to think what it must be like in the height of Summer. However, it is
nice to be within walking distance of this sort of thing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you need a &lt;a href=&#34;https://hachyderm.io/@knickish/112510641342808484&#34;&gt;Mastodon client for your PalmOS&lt;/a&gt; device?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I received the &lt;a href=&#34;/weeknotes/152-your-seller/#:~:text=I%E2%80%99ve%20bought%20a%20Lenovo%20ThinkCentre%20M900%20Tiny%20off%20eBay&#34;&gt;tiny computer&lt;/a&gt; I decided to buy for my UniFi controller needs.
First impressions are that it indeed very smol. And it turns on. I will
evaluate it more this week coming. The VESA mount I ordered for it also arrive
and looks suitable for installing the tiny computer in a cabinet I already
have setup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The computer came with two DisplayPort ports, which I surprised me a bit.
Guess who has every single display cable permutation except a DisplayPort to
HDMI?&lt;/p&gt;
&lt;p&gt;👉 This guy 👈&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to setup &lt;a href=&#34;https://optimum.ba/blog/feature-preview-pr-review-apps-on-fly-io&#34;&gt;Heroku-like review apps on Fly&lt;/a&gt; &amp;ndash; Heroku review apps are a
killer feature so this is a welcome guide.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I thought &lt;a href=&#34;https://joshfrankel.me/blog/destructuring-the-world-in-ruby/&#34;&gt;this article on destructuring in Ruby&lt;/a&gt; was really interesting. The
syntax is still strange to me so I&amp;rsquo;ve barely used the feature. I expect the
Rubocop rules on my current project will have a problem with it for Very Good
Reasons anyway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another visit at my old place next week - the final push hopefully. Each visit
is a strange set of emotions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 152: Your Seller</title>
      <link>https://elver.me/weeknotes/152-your-seller/</link>
      <pubDate>Sun, 26 May 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/152-your-seller/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://cssisntreal.com/&#34;&gt;CSS Isn’t Real&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lsquo;I need a twelve column grid layout. It should be four columns on small
screens.&amp;rsquo; —  Statements dreamed up by the utterly Deranged&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When I moved, my UniFi controller came with me, but the &lt;a href=&#34;https://uk.store.ui.com/uk/en/pro/category/all-cloud-keys-gateways/products/usg&#34;&gt;USG&lt;/a&gt; and &lt;a href=&#34;https://uk.store.ui.com/uk/en/pro/category/all-cloud-keys-gateways/products/usg&#34;&gt;AP&lt;/a&gt; stayed
where they are; there will be a future project to install new gear in the new
place. So my old network is now controller-less, which means no monitoring, no
remote debugging, and crucially, no &lt;a href=&#34;https://en.wikipedia.org/wiki/Captive_portal&#34;&gt;captive portal&lt;/a&gt; capability.&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;ve been looking at how I run the controller, but on the cheap.&lt;/p&gt;
&lt;p&gt;There are a few options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Host on a &lt;a href=&#34;https://www.raspberrypi.com/products/raspberry-pi-4-model-b/&#34;&gt;Raspberry Pi&lt;/a&gt; &amp;ndash; this seems like a no-brainer, but I&amp;rsquo;ve read some
things that indicate they are not particularly reliable over the long-term&lt;/p&gt;
&lt;p&gt;SD cards don&amp;rsquo;t like being constantly written to, or losing power in the
middle of an I/O operation, and I don&amp;rsquo;t really want to have to muck about
with software workarounds.&lt;/p&gt;
&lt;p&gt;But, I &lt;em&gt;do&lt;/em&gt; have one of these (let&amp;rsquo;s be honest, I have several). So that
would be zero cost, but I don&amp;rsquo;t want to be having to fix it all the time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remote hosting &amp;ndash; the controller software runs on a web host somewhere
outside of the local network. Once the software is running you point your
UniFi devices at a FQDN rather than an internal IP.&lt;/p&gt;
&lt;p&gt;There are a few commercial providers (&lt;a href=&#34;https://www.hostifi.com/&#34;&gt;HostiFi&lt;/a&gt;, &lt;a href=&#34;https://www.unihosted.com/&#34;&gt;UniHosted&lt;/a&gt;, and &lt;a href=&#34;https://uk.store.ui.com/uk/en/collections/unifi-accessory-tech-hosting-and-gateways-cloud/products/unifi-hosting&#34;&gt;Ubiquiti
themselves&lt;/a&gt;) who offer this service, but you can always just install the
controller software on a host such as Digital Ocean or Vultr instead.&lt;/p&gt;
&lt;p&gt;I was already running the controller in Docker before, so this seems like
something I could setup quite easily by using the same Docker config, but
there are downsides. I don&amp;rsquo;t want to pay an on-going cost for something that
is little used, and I would prefer to not expose this sort of thing to the
Internet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Buy a dedicated hardware device from UniFi. They make various &amp;ldquo;Cloud Key&amp;rdquo;
products which are dedicated to just running the controller software.
However, pickings are slim.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://dl.ubnt.com/guides/UniFi/UniFi_Cloud_Key_UC-CK_QSG.pdf&#34;&gt;&amp;ldquo;Gen 1&amp;rdquo; Cloud Key&lt;/a&gt; is old and no longer supported. It won&amp;rsquo;t run the
latest controller software. &lt;a href=&#34;https://uk.store.ui.com/uk/en/pro/category/all-cloud-keys-gateways/products/unifi-cloudkey-plus&#34;&gt;CloudKey+ (gen2)&lt;/a&gt; is a bit too capable, and as
such out of budget.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://uk.store.ui.com/uk/en/pro/category/all-unifi-cloud-gateways/products/ucg-ultra&#34;&gt;Cloud Gateway Ultra&lt;/a&gt; seems like a good option, and would takeover the USG&amp;rsquo;s
WAN duties which mean reconfiguring that. However, it is continually
out-of-stock it seems. It&amp;rsquo;s also a bit more money than I want to spend.
Although it may be possible to recoup some of that cost by selling the
existing USG, but I&amp;rsquo;m not sure how hard that would be (there are a lot of
them on eBay).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dedicated Linux box &amp;ndash; so that leaves us with our old friend the Linux box.
The problem with this option is the amount of choice. What hardware are we
going to buy for this? It needs to be low power ideally, cheap enough to
buy, and small in size because it has to fit into an existing cabinet I have
setup.&lt;/p&gt;
&lt;p&gt;This has the benefit that I could install other stuff on it as well such as
Tailscale for subnet routing capabilities.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve bought a Lenovo ThinkCentre M900 Tiny off eBay. Is this a terrible
idea? Only time will tell, but I&amp;rsquo;m hopeful.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.phoenixframework.org/blog/phoenix-liveview-1.0-released&#34;&gt;Phoenix LiveView 1.0-rc is here!&lt;/a&gt; 👏&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We inherited a well looked after garden when we moved. This is a bit daunting
because we know nothing about gardening but now we need to keep it in good
shape. Perhaps that why our neighbour surreptitiously trespassed on our
property and cut back our rose bush.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/151-dumbfounded/#:~:text=hopefully%20I%E2%80%99ll%20trade%20shambolic%20customer%20service%20for%20honesty%2C%20low%20prices%2C%20and%20mechanical%20ability&#34;&gt;hope was misplaced&lt;/a&gt; and the car is still not fixed. After several phone
frustrating phone calls it became evident that the garage couldn&amp;rsquo;t fit me in
until the 7th June, which would be nearly 5 weeks since it first went in, and
nearly 7 since the original fault.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve decided to take it into the garage I used to use to coincide with a visit
to my old flat. Hopefully they can sort it. I&amp;rsquo;ll be attempting to seal the
coolant system enough to get back down the motorway. Wish me luck.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had emails from Amazon Shipping about a package due for delivery. Subjects
include the following sentences:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;Your package from Your Seller has shipped&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;Your Your Seller package is out for delivery&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;Your Your Seller package was delivered&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The question is, who the fuck are &amp;ldquo;Your Seller&amp;rdquo;? There was literally no way to
know. So I have had a package delivered and not a clue what it is. Well done
everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/151-dumbfounded/#:~:text=Ruby%203.4.0%2Dpreview1%20is%20out&#34;&gt;Last week I mentioned&lt;/a&gt; about Ruby string literals now behaving as if they
were frozen.&lt;/p&gt;
&lt;p&gt;Xavier Noria wrote up a blog post to explain what this change means: &lt;a href=&#34;https://gist.github.com/fxn/bf4eed2505c76f4fca03ab48c43adc72&#34;&gt;Ruby:
The future of frozen string literals&lt;/a&gt;. So, it is happening, but is going to
require community effort.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://ruby.social/@benoit/112489435908965490&#34;&gt;@benoit@ruby.social&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 151: Dumbfounded</title>
      <link>https://elver.me/weeknotes/151-dumbfounded/</link>
      <pubDate>Sun, 19 May 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/151-dumbfounded/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Apparently &lt;a href=&#34;https://front-end.social/@stefan/112432321967368933&#34;&gt;we don&amp;rsquo;t need &lt;code&gt;rel=noopener&lt;/code&gt;&lt;/a&gt; and I only started adding it
recently&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My car was at the garage until Friday when I decided to call for an update.
Apparently they left me a voicemail message even though I have voicemail
turned off&amp;hellip;&lt;/p&gt;
&lt;p&gt;The seeming good news is that the issue is apparently with a leaking radiator
rather than some other part of the coolant system. The radiator is original so
the fact it has failed now it not really surprising, and it is on the lower
end of the potential cost scale.&lt;/p&gt;
&lt;p&gt;I think it&amp;rsquo;s clear that this garage is not the most efficient business, but
hopefully I&amp;rsquo;ll trade shambolic customer service for honesty, low prices, and
mechanical ability 🤞&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our bathroom now has a mirrored cabinet, and the bedroom a mirror; so the
house is starting to become less annoying to live in. Thanks, IKEA.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you have multiple episodes of television series in a single file, you can
name the file like &lt;code&gt;ShowName – s02e17-e18 – Optional_Info.ext&lt;/code&gt; so Plex
identifies it correctly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We travelled down to London on Sunday to see &lt;a href=&#34;https://www.danielkitson.com/&#34;&gt;Daniel Kitson&lt;/a&gt; and &lt;a href=&#34;https://www.instagram.com/mrgavinosborn/&#34;&gt;Gavin
Osbourne&lt;/a&gt; perform &lt;a href=&#34;https://danielkitson.bandcamp.com/album/the-ballad-of-roger-and-grace-2006&#34;&gt;The Ballad of Roger and Grace&lt;/a&gt; at &lt;a href=&#34;https://unionchapel.org.uk/&#34;&gt;Union Chapel&lt;/a&gt;, which is
one of my absolute favourites, but I&amp;rsquo;d never seen it performed live.&lt;/p&gt;
&lt;p&gt;Unfortunately, the whole event was ruined by a couple who tried to essentially
bully us out of our seats. We queued and got seats on the end of a pew. Others
filed in and filled up the rest with the exception of two spaces next to us.
The couple arrived and sat down. My partner had gone to the toilet so left her
bag on her seat. They asked me if I had &amp;ldquo;another coming&amp;rdquo; and that they had a
&amp;ldquo;plus one&amp;rdquo; too and would there be space. I told them the seat was already
taken, so it didn&amp;rsquo;t look like there would be space.&lt;/p&gt;
&lt;p&gt;Now, it&amp;rsquo;s worth pointing out that at this point there was &lt;em&gt;loads&lt;/em&gt; of other
seating with 3 seats together to which the couple could have moved. They chose
not too.&lt;/p&gt;
&lt;p&gt;Then, over the course of the next 45 minutes they continually tried various
tactics to get us to allow their &amp;ldquo;plus one&amp;rdquo;, who had yet to arrive, to sit
next to them. Of course we&amp;rsquo;re happy to shift-up if the space allows, but there
was literally &lt;em&gt;nowhere&lt;/em&gt; for this person to sit. The space simply did not
exist.&lt;/p&gt;
&lt;p&gt;At one point the man told me I was &amp;ldquo;manspreading&amp;rdquo;. I was dumbfounded.&lt;/p&gt;
&lt;p&gt;What is the right thing to do here? It&amp;rsquo;s seems like a no-win situation. If I
move  I&amp;rsquo;ve been bullied out of my seats and would be rightly annoyed. If I
stand-up for myself, and stand my ground, the show is now ruined as I sit
seething at the altercation.&lt;/p&gt;
&lt;p&gt;We left at the interval because 1) I couldn&amp;rsquo;t enjoy the show, and 2) I was
worried about missing my train back as the show looked like it was going to
overrun.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s left me a bit shaken to be honest.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://andycroll.com/ruby/railsconf-detroit-2024-cochairs-perspective/&#34;&gt;Railsconf Detroit 2024: A Co-chair’s Perspective&lt;/a&gt; &amp;ndash; Andy Croll reflects on
the penultimate RailsConf.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.mocoso.co.uk/posts/tech-debt-is-a-terrible-metaphor/&#34;&gt;Technical Debt Is A Terrible Metaphor&lt;/a&gt; &amp;ndash; Some great points on technical debt
being misunderstood. Programmers also constantly misunderstand the concept in
the same way that they say &amp;ldquo;refactor&amp;rdquo; instead of &amp;ldquo;change&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ruby 3.4.0-preview1 is out.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;String literals in files without a frozen_string_literal comment now behave
as if they were frozen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This stood out; I thought this wasn&amp;rsquo;t going to be happening, but apparently
it is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I used &lt;code&gt;rowspan&lt;/code&gt; on a HTML table this week for the first time since 1998.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 150: CleanPods Pro</title>
      <link>https://elver.me/weeknotes/150-cleanpods-pro/</link>
      <pubDate>Sun, 12 May 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/150-cleanpods-pro/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Normally I recommend things to watch, but this time a warning. &lt;a href=&#34;https://www.themoviedb.org/movie/848326-rebel-moon-part-one-a-child-of-fire&#34;&gt;Rebel Moon -
Part One: A Child of Fire&lt;/a&gt; is not a good film, but &lt;a href=&#34;https://www.themoviedb.org/movie/934632-rebel-moon-part-two-the-scargiver&#34;&gt;Part Two&lt;/a&gt; is somehow even
worse. I watched the first one because it looked like some space-fun. Just
don&amp;rsquo;t.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I washed my AirPods Pro case 🤦‍♂️. Once I found it amongst the clean, and
damp, clothes it immediately lit up and I was able to start charging my
headphones immediately 😮 That was several days ago and it is still working
fine. Impressive from Apple.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.heroku.com/heroku-http2-public-beta&#34;&gt;Improved Heroku App Performance with HTTP/2&lt;/a&gt; &amp;ndash; Heroku now supports HTTP/2.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/148-honeymoon-period/#:~:text=Still%20no%20sign%20of%20our%20bed&#34;&gt;We have a bed&lt;/a&gt; &amp;ndash; it&amp;rsquo;s &lt;em&gt;fine&lt;/em&gt;. I discovered we&amp;rsquo;ve been sleeping on the wrong
side of the mattress, but that the &amp;ldquo;wrong side&amp;rdquo; seems more comfortable
🤷‍♂️. Again, never move.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Still car-less, so I took my first LNER train this week. It turned up early,
and arrived at it&amp;rsquo;s destination on-time. My new normal will be LNER trains so
I&amp;rsquo;m not sure if they are just better than GWR or if this was a fluke.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There will &lt;a href=&#34;https://rubycentral.org/news/anewearforrubycentralevents/&#34;&gt;only be one more RailsConf&lt;/a&gt;. This didn&amp;rsquo;t particularly surprise me
given recent events in the world of Rails conferences. I&amp;rsquo;ve never been to a
RailsConf and one of the reasons for that is they were always in the US.
Ironically, I am planning to attend RailsWorld in Toronto this September
(which I am aware in not in the US).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Steve_Albini&#34;&gt;Steve Albini&lt;/a&gt; died this week way too soon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went to see a film at a brand new to us cinema &amp;ndash; &lt;a href=&#34;https://www.themoviedb.org/movie/653346-kingdom-of-the-planet-of-the-apes&#34;&gt;Kingdom of the Planet of
the Apes&lt;/a&gt;. I thought the first half of the film was better than the second;
the ending just seemed to fizzle out and didn&amp;rsquo;t make sense.&lt;/p&gt;
&lt;p&gt;However, the bigger issue, as usual, was the rest of the audience. Get this;
the people behind us talked constantly for the 30 minutes of adverts and
trailers, and then as the film comes on, &lt;em&gt;that&lt;/em&gt; was the moment they chose to
get up and go to the toilet. I will never understand some people.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I take the car in to the garage tomorrow &amp;ndash; pray for me.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 149: Warning light</title>
      <link>https://elver.me/weeknotes/149-warning-light/</link>
      <pubDate>Sun, 05 May 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/149-warning-light/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My car decided to start losing coolant. About an hour away from home the
warning light came on. I&amp;rsquo;ve had this happen in many cars across many years. It
hasn&amp;rsquo;t ended well in the past. Hopefully it doesn&amp;rsquo;t turn into a big and
expensive job. I will find out the week after next when it goes into the
garage.&lt;/p&gt;
&lt;p&gt;Maybe it&amp;rsquo;s upset for &lt;a href=&#34;/weeknotes/148-honeymoon-period/#:~:text=I%20only%20used%20the%20car%20once&#34;&gt;not being driven&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you know what&amp;rsquo;s annoying? Programmers on a team asking &amp;ldquo;Do you know why we
did x?&amp;rdquo; but then never themselves writing anything down. Commit messages? Nah.
On the JIRA ticket? I haven&amp;rsquo;t got time!&lt;/p&gt;
&lt;p&gt;This is a solved problem in many cases if you can be arsed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://vfox.lhan.me/guides/intro.html&#34;&gt;&lt;code&gt;vfox&lt;/code&gt;&lt;/a&gt; &amp;ndash; I&amp;rsquo;m an &lt;code&gt;asdf&lt;/code&gt; user, but this new version manager might interest
some. It seems quite mature already. I&amp;rsquo;m not sure it offers enough for me to
want to switch at the moment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are using Ruby 3.3 I learnt &lt;a href=&#34;https://ruby.social/@tom/111692223737713163&#34;&gt;you can limit backtraces&lt;/a&gt; to make them more
readable by exporting &lt;code&gt;RUBYOPT=&amp;quot;--backtrace-limit=5&amp;quot;&lt;/code&gt; in your shell config of
choice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Back to the old place for a few days this week to sort out various things. I&amp;rsquo;m
feeling pretty overwhelmed with what feels like a never-ending list of tasks
at the moment.&lt;/p&gt;
&lt;p&gt;A visit from an electrician and a damp expert were the major highlights. They
&lt;em&gt;both&lt;/em&gt; turned up on-time and as expected! &amp;ndash; there are some good people
around.&lt;/p&gt;
&lt;p&gt;The electrician replaced my gas hob with induction, and installed new smoke,
heat and carbon monoxide alarms, so that should be hassle-free for the next
10 years I&amp;rsquo;m sure.&lt;/p&gt;
&lt;p&gt;The damp expert was very knowledgeable and told me what I would need to do to
fix the decoration issues I&amp;rsquo;ve had in the bedroom for a long time. The good
news is that there is no on-going issue with water ingress. The bad news is
that his estimate of costs was considerably more than I expected. So with that
in-mind I decided, for now, to replace the damaged plasterboard, and will soon
paint to make it liveable for now. I can&amp;rsquo;t do everything at once.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We also had a new second-hand three-piece suite delivered, which is grubby,
but comfortable. I think it will clean up ok.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I needed some keys cut this week, and handily a Timpsons had opened near me,
so I thought I&amp;rsquo;d give it a go. 12 different keys, and four visits to the shop,
resulted in zero working keys&amp;hellip;I got a refund and they were very nice, but I
didn&amp;rsquo;t expect getting some keys cut to turn into such a saga.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m looking forward to a quieter, and shorter, week.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 148: Honeymoon period</title>
      <link>https://elver.me/weeknotes/148-honeymoon-period/</link>
      <pubDate>Sun, 28 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/148-honeymoon-period/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;On Monday we needed to drive back from our new house to collect our cars. Of
course there was also more stuff to move. I hurt my back loading the car but
luckily this was after the vast majority of the carrying had already been
done.&lt;/p&gt;
&lt;p&gt;It seemed fine on Tuesday. Is this a sign that my time in the gym has made me
more resilient to injury or do I need to spend even more time focussing on my
back?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, I have been to the gym 4 times this week as planned. I&amp;rsquo;m
pleased about that. I don&amp;rsquo;t love the gym I&amp;rsquo;ve joined but that was almost
inevitable as all change is bad. I&amp;rsquo;m going to try it out for a few weeks and
see how it goes. At least I&amp;rsquo;m exercising in the meantime.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Food has been less successful, but not horrendous. Just too many bad foods
rather than any bingeing behaviour. It&amp;rsquo;s hard to be super healthy when you&amp;rsquo;re
driving for hours and trying to find your forks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As you&amp;rsquo;d expect, this week was dominated by moving-in activities.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We can now wash clothes as the washing machine is plumbed in and working
well ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/147-moving-is-a-hassle/#:~:text=The%20fridge%20we%20bought%20doesn%E2%80%99t%20fit%20in%20the%20gap%20available&#34;&gt;fridge incident&lt;/a&gt; was resolved by some joiners who cut down the worktop
a tiny bit and removed a skirting board ✅&lt;/p&gt;
&lt;p&gt;It was a stressful experience as they enthusiastically started cutting
within much consultation, but the worktop was left in a good state. However
after they left we discovered that the fridge was missing some paint from
when they helpfully moved the appliance into place. Oh well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Trip to IKEA (on a Saturday!) for random bits of &amp;ldquo;make do&amp;rdquo; furniture just to
make the place habitable for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m experimenting with new shower heads because I&amp;rsquo;m a fun guy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Still no sign of our bed frame&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tonsky.me/blog/centering/&#34;&gt;Hardest Problem in Computer Science: Centering Things&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Even if it’s hard. Even if tools make it inconvenient. Even if you have to
search for solutions. Together, I trust, we can find our way back to putting
one rectangle inside another rectangle without messing it up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Why do programmers love complexity? Most claim to hate it, and espouse their
desire to simplify. Until, that is, you try and replace their clever code with
something simple.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;ll make excuses to justify what &lt;em&gt;they want&lt;/em&gt; the code to be. They&amp;rsquo;ll cite
readability like its some form of objective measure. Readable doesn&amp;rsquo;t exist
except for the original author of the code.&lt;/p&gt;
&lt;p&gt;The code isn&amp;rsquo;t just &lt;em&gt;for&lt;/em&gt; you. It&amp;rsquo;s for everyone else later who has to make a
change. Every time you&amp;rsquo;re clever, or overly concise, you&amp;rsquo;re making it harder
to change.&lt;/p&gt;
&lt;p&gt;This &lt;a href=&#34;https://en.wiktionary.org/wiki/bikeshedding&#34;&gt;bikeshedding&lt;/a&gt; is burning me out again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I discovered &lt;a href=&#34;https://github.com/mgkoenig/lyft&#34;&gt;LYFT&lt;/a&gt; &lt;a href=&#34;https://po-ru.com/2024/04/24/week-172-tear-down-this-wall&#34;&gt;via Paul Battley&lt;/a&gt; this week. It&amp;rsquo;s a hardware and software
project to replace the controller on IKEA Bekant desks to add features it
doesn&amp;rsquo;t have like presets. I am the owner of an IKEA Bekant so I might look
into this or other similar projects.&lt;/p&gt;
&lt;p&gt;I had planned on replacing this desk in the next few years, but the in
meantime it would be nice to enhance it with more capabilities.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/124-show-me-your-feed/#:~:text=I%20bought%20a%20new%20office%20chair&#34;&gt;new chair&lt;/a&gt; started squeaking a month or so ago (can you sense a &lt;a href=&#34;/weeknotes/147-moving-is-a-hassle/#:~:text=shoes%20I%20bought%20squeak&#34;&gt;theme&lt;/a&gt;?)
so I contacted Steelcase support to see what they could do. They surprisingly
offered to replace the entire chair, which is the correct thing to do, but
still a surprise.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You&amp;rsquo;re not going to believe this &amp;ndash; another pair of shoes (a different brand)
starting squeaking!&lt;/p&gt;
&lt;p&gt;Yes, I&amp;rsquo;ve emailed them too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The move seems to be affecting my car usage as I had hoped and anticipated.&lt;/p&gt;
&lt;p&gt;We drove up on Monday and I only used the car once during the working week,
and that was to pick up some large items from the supermarket which we
couldn&amp;rsquo;t reasonably carry whilst walking. Over the weekend we took a couple of
trips, and I&amp;rsquo;d expect this to be more the norm.&lt;/p&gt;
&lt;p&gt;The first week in a new place is not a normal week, so only time will tell
what routine I settle into. The impulse to &amp;ldquo;just drive&amp;rdquo; is still in me after
&lt;em&gt;needing&lt;/em&gt; to drive to do almost anything before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Less driving means my step count is increasing. I&amp;rsquo;m now getting around 4000
steps in before I start work just walking to the gym and back. This was often
the &lt;em&gt;total&lt;/em&gt; amount of steps I would get in a day before 📈&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://okayfail.com/garden/youre-not-facebook-why-use-their-tools.html&#34;&gt;You’re not Facebook. Why use their tools?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have come to believe that “whatever Facebook does is an anti-pattern” is a
much more useful heuristic.&lt;/p&gt;
&lt;p&gt;My reasoning goes like this: you are not Facebook.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I &lt;a href=&#34;/weeknotes/144-sneaky-backdoor/#:~:text=you%20are%20not%20Facebook&#34;&gt;obviously&lt;/a&gt; totally agree with this article.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;They can afford to pay developers obscene salaries to compensate for the
moral injury of working at Facebook&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I. Love. It.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;re now moving in to the honeymoon period.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 147: Moving is a hassle</title>
      <link>https://elver.me/weeknotes/147-moving-is-a-hassle/</link>
      <pubDate>Sun, 21 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/147-moving-is-a-hassle/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/146-fancy-italian-tomatoes/#:~:text=storm&#34;&gt;I am the storm&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Because I really haven&amp;rsquo;t had enough to do recently, this week I started
complaining about things, specifically that the brand new Nike shoes I bought
squeak to an extremely annoying degree. Is this a defect in my gait or in
the manufacturing?&lt;/p&gt;
&lt;p&gt;To my surprise they refunded me. WIN.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.themoviedb.org/tv/209851-mammoth&#34;&gt;Mammoth&lt;/a&gt; is really good fun. Give it a go, there are only three episodes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was let down by two different tradespeople on the same day. A new, but
unsurprising, record.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All about &lt;del&gt;that bass&lt;/del&gt; moving this week. We massively underestimated just how
much work loading the van we hired would be. And I over packed many of the
boxes which means I&amp;rsquo;m now a) knackered, and b) the owner of bruised arms.&lt;/p&gt;
&lt;p&gt;We arrived late at the house, and &lt;em&gt;just&lt;/em&gt; managed to empty the van before it
got completely dark, with the smell of chocolate lingering on the air. We met
some of our new neighbours whilst sweaty and swearing at a sofa. They helped
us get it in the house &amp;ndash; good sorts it seems.&lt;/p&gt;
&lt;p&gt;The fridge we bought doesn&amp;rsquo;t fit in the gap available, even though I measured
it. So that&amp;rsquo;s good and I&amp;rsquo;m completely fine about it.&lt;/p&gt;
&lt;p&gt;I also forgot to bring any tools with me which meant we couldn&amp;rsquo;t install the
new washing machine either. This. Is. Fine.&lt;/p&gt;
&lt;p&gt;No sooner had we arrived than we had to leave again to drop the van back to
whence it came. I was sad going back to the flat. The new place is not yet
home, but neither in the old place now. It’s not going away, but it &lt;em&gt;is&lt;/em&gt;
changing, but so am I, and hopefully for the better&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had a cracking sandwich on Saturday though, so it&amp;rsquo;s not all bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So far, my new Internet seems to be working. Yodel decided to hang on to the
router sent from the ISP for 5 days. No real reason, just zero attempts to
deliver. Yodel gonna Yodel I suppose. Still, the WiFi signal seems like it&amp;rsquo;s
going to be decent enough &lt;em&gt;for now&lt;/em&gt; until I can get more organised.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Moving has really brought to light all the things I that order off Kickstarter
and receive two years later 😆 I&amp;rsquo;m expecting a parcel &lt;em&gt;soon&lt;/em&gt;, apparently.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We finished &lt;a href=&#34;https://www.themoviedb.org/tv/106379-fallout&#34;&gt;Fallout&lt;/a&gt; and it has been renewed for second series. Looking
forward to it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If being excited about an easily accessible Amazon Locker near my house is
wrong then I don&amp;rsquo;t wanna be right&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 146: Fancy Italian tomatoes</title>
      <link>https://elver.me/weeknotes/146-fancy-italian-tomatoes/</link>
      <pubDate>Sun, 14 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/146-fancy-italian-tomatoes/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The weeknotes have really suffered this week; can you guess why? The physical
move is a massive hassle, obviously, but it&amp;rsquo;s the admin and bureaucracy that
gets you. Still, I am &lt;em&gt;sort of&lt;/em&gt; getting excited about moving now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My Amazon account and debit card at getting absolutely hammered with stuff for
the new house 🔨&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In an attempt to continue my health and fitness progress I&amp;rsquo;ve signed up for a
new gym a 10 minute walk from my new house (I&amp;rsquo;m hoping this will mean at least
&lt;em&gt;some&lt;/em&gt; steps each day). They happened to be running a special deal when I
signed up so I get my first month for £13, which is a nice way to see if it
suits me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been doing small, but tedious jobs around the flat this week. The flat,
has, in the past, suffered from some sort of water ingress as is evidenced by
persistent water marks. We (all the residents in the building) had expensive
chimney restoration done last year, and previous to that, a complete new flat
roof.&lt;/p&gt;
&lt;p&gt;Still, I have decoration issues inside which may be leading to something more
as my attempts to &amp;ldquo;make it good&amp;rdquo; went downhill. I think I need an expert.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We started watching &lt;a href=&#34;https://www.themoviedb.org/tv/106379-fallout&#34;&gt;Fallout&lt;/a&gt; and despite never having played the games I like
it so far. Considering &lt;a href=&#34;https://www.themoviedb.org/movie/20766-the-road&#34;&gt;The Road&lt;/a&gt; is one of my favourite films, anything with
a bit of apocalypse suits me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Taskmaster exposed me to &lt;a href=&#34;https://en.wikipedia.org/wiki/Sophie_Willan&#34;&gt;Sophie Willan&lt;/a&gt; and I also started watching &lt;a href=&#34;https://en.wikipedia.org/wiki/Alma%27s_Not_Normal&#34;&gt;Alma&amp;rsquo;s
Not Normal&lt;/a&gt;. Worth checking out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Despite being busy with loads of other stuff, I procrastinated enough to book
my hotel and train to &lt;a href=&#34;https://brightonruby.com/&#34;&gt;Brighton Ruby 2024 in June&lt;/a&gt;. I&amp;rsquo;m glad that&amp;rsquo;s sorted.
I&amp;rsquo;m more interested in seeing friends than I am the conference tbh, but it&amp;rsquo;s
been a constant for some years now, and I think that&amp;rsquo;s worth supporting. See
you then.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don&amp;rsquo;t worry, I had still had time this week to uncontrollably, unnecessarily,
worry about my current task at work. Sorted it now 🙄&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We attended a cookery course a few weeks ago which I seem to have forgotten to
mention until now. One of the things we made was &lt;a href=&#34;https://en.wikipedia.org/wiki/Gnocchi&#34;&gt;Gnoochi&lt;/a&gt;, which I&amp;rsquo;m
ambivalent to at best, but this turned out nice and we had a lot leftover to
freeze. So I made &lt;a href=&#34;https://www.foodiecrush.com/gnocchi-with-pomodoro-sauce/&#34;&gt;this sauce&lt;/a&gt; to go with remainder this week &amp;ndash; recommended.&lt;/p&gt;
&lt;p&gt;Of course, in order to do so these &lt;a href=&#34;https://www.amazon.co.uk/dp/B00UW9EFQY&#34;&gt;fancy Italian tomatoes&lt;/a&gt; were absolutely
crucial to the success of the dish. I am a fool, but a happy one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Great Move is next Friday. Will the weeknotes weather that storm?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 145: Completed it mate</title>
      <link>https://elver.me/weeknotes/145-completed-it-mate/</link>
      <pubDate>Sun, 07 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/145-completed-it-mate/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Another late weeknotes Jordan? &amp;lsquo;fraid so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.pentagrid.ch/en/blog/ibis-hotel-check-in-terminal-keypad-code-leakage/&#34;&gt;IBIS hotel check-in terminal keypad-code leakage&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;After a hacker congress in Hamburg, Pentagrid noticed that an IBIS Budget
hotel check-in terminal leaked room keypad codes of almost half of the hotel
rooms, when a users searches for a specific form of a non-alphanumeric
booking number.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With a booking ID, guests can lookup their room number and keypad code.
However, when entering a &amp;lsquo;&amp;mdash;&amp;mdash;&amp;rsquo; as booking ID, the check-in terminal lists
other people&amp;rsquo;s bookings and keypad codes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Oh dear.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/144-sneaky-backdoor/#:~:text=We%E2%80%99ve%20been%20catching%20up%20with%20The%20Bear&#34;&gt;Finished The Bear&lt;/a&gt;. Now I&amp;rsquo;m marking tupperware with green masking tape.
Brilliant!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I needed to buy a new TV to leave behind when we move, so I&amp;rsquo;ve been scouring
&lt;a href=&#34;https://www.hotukdeals.com/&#34;&gt;hotukdeals&lt;/a&gt; for something suitable. I finally settled on a &lt;a href=&#34;https://www.lg.com/uk/tvs-soundbars/smart-tvs/55ur78006lk/&#34;&gt;LG LED UR78 55&amp;quot;
4K&lt;/a&gt; at the rather tidy price of £269.99, which I&amp;rsquo;m happy with. It isn&amp;rsquo;t nearly
as good as the &lt;a href=&#34;https://www.philips.co.uk/c-p/55OLED754_12/oled-7-series-4k-uhd-oled-smart-tv-with-ambilight-3-sided/support&#34;&gt;Philips&lt;/a&gt; I currently watch, but it&amp;rsquo;ll do for the intended
purpose.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PRO-TIP: Don&amp;rsquo;t try and load your car with 25 flat pack cardboard boxes whilst
a storm named Kathleen is blowing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We completed on the new house &lt;a href=&#34;/weeknotes/144-sneaky-backdoor/#:~:text=Completion%20next%20week&#34;&gt;as planned&lt;/a&gt; this week. Despite the inevitable
faff and stress it was fairly straightforward in the end &amp;ndash; 3 months almost to
the day. We picked up the keys on Saturday and went for our first visit.&lt;/p&gt;
&lt;p&gt;I was afraid I wouldn&amp;rsquo;t like the house after not having seen it for so long &amp;ndash;
a weird feeling. By the end of the visit I was happy and &lt;em&gt;almost&lt;/em&gt; enthusiastic
about it.&lt;/p&gt;
&lt;p&gt;However, the house has revealed to us just how much work needs doing. It&amp;rsquo;s
completely liveable, but the list of self-imposed jobs is long.&lt;/p&gt;
&lt;p&gt;The previous owner left us a nice note, and the offer of an artwork his late
wife had painted. A lovely gesture; but didn&amp;rsquo;t clean the oven. No one is
perfect.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve hired a cleaning company to deep-clean before we properly move in
because we&amp;rsquo;re part of the bourgeois middle classes now apparently, of which I
am uncomfortable, but also because lazy.&lt;/p&gt;
&lt;p&gt;We move the majority of our stuff in a couple of weeks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new house is a good reason for a new gadget. I bought a &lt;a href=&#34;https://www.bosch-professional.com/gb/en/products/glm-40-0601072900&#34;&gt;laser tape
measure&lt;/a&gt;. I &lt;em&gt;need&lt;/em&gt; it for ALL THE MEASURING I&amp;rsquo;ll be doing!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ispreview.co.uk/&#34;&gt;ISPreview&lt;/a&gt; (my new favourite website) has a &lt;a href=&#34;https://www.ispreview.co.uk/index.php/2024/04/ipv6-and-cgnat-support-survey-of-uk-altnet-fttp-broadband-isps.html&#34;&gt;nice overview of which ISPs
support IPv6 and CGNAT&lt;/a&gt; &amp;ndash; a.k.a. how they give you an IP address for your
broadband connection. Generally, CGNAT = bad, IPv6 = good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I learnt about the &lt;a href=&#34;https://en.wikipedia.org/wiki/Rhubarb_Triangle&#34;&gt;Rhubarb Triangle&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Rhubarb Triangle is a 9-square-mile (23 km2) area of West Yorkshire,
England between Wakefield, Morley, and Rothwell famous for producing early
forced rhubarb.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Put the &lt;a href=&#34;https://experiencewakefield.co.uk/event/rhubarb-festival/&#34;&gt;21st February 2025 in your diary&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Health-wise, I&amp;rsquo;ve been far more consistent with exercise (18 sessions in a
row) and diet (lost 10kg) recently (with the exception of this weekend as
travelling has made it difficult).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m trying to get into a groove so that when I move, and am forced into new
routines, hopefully I can transition smoothly and continue a healthy lifestyle
journey ™.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 144: Sneaky backdoor</title>
      <link>https://elver.me/weeknotes/144-sneaky-backdoor/</link>
      <pubDate>Sun, 31 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/144-sneaky-backdoor/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You may have heard of security issue taking over the Internet this week.
Someone called Jia Tan seems to have been gradually sneaking a backdoor into
&lt;code&gt;xz&lt;/code&gt; - a widely data compression library.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t kept up with everything but the things that stand out 1) it was
&lt;a href=&#34;https://mastodon.social/@AndresFreundTec/112180083704606941&#34;&gt;discovered by accident&lt;/a&gt;; 2) some automatic checks were sneakily disabled by
&lt;a href=&#34;https://git.tukaani.org/?p=xz.git;a=commitdiff;h=328c52da8a2bbb81307644efdb58db2c422d9ba7&#34;&gt;adding a single period to the beginning of a line&lt;/a&gt; - would you have spotted
that in code review?&lt;/p&gt;
&lt;p&gt;Here is a &lt;a href=&#34;https://boehs.org/node/everything-i-know-about-the-xz-backdoor&#34;&gt;very exhaustive post detailing what&amp;rsquo;s happened&lt;/a&gt; by Evan Boehs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deposit transferred. Exchanged on Thursday. Completion next week. Let&amp;rsquo;s do
this!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://shkspr.mobi/blog/2024/03/theres-nothing-you-can-do-to-prevent-a-sim-swap-attack/&#34;&gt;There’s nothing you can do to prevent a SIM-swap attack&lt;/a&gt; by Terence Eden is a
very scary prospect.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is tempting to think that users are to blame for their own misfortune. If
only they&amp;rsquo;d had a stronger password! If only they didn&amp;rsquo;t re-use credentials!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I try to use an app-based 2nd factor when I can, but there are a lot of
services, especially important ones like banks, that will only send you an
SMS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/charmbracelet/freeze&#34;&gt;Freeze&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Generate images of code and terminal output.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is &lt;em&gt;charming&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/ruby/ruby/commit/12be40ae6be78ac41e8e3f3c313cc6f63e7fa6c4&#34;&gt;&amp;ldquo;Chilled strings&amp;rdquo; are soon to be thing in Ruby&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a path toward enabling frozen string literals by default in the future,
this commit introduce &amp;ldquo;chilled strings&amp;rdquo;. From a user perspective chilled
strings pretend to be frozen, but on the first attempt to mutate them, they
lose their frozen status and emit a warning rather than to raise a
&lt;code&gt;FrozenError&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I thought frozen strings were not happening, so this is an interesting
development.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Rails docs are getting an overhaul and &lt;a href=&#34;https://edgeguides.rubyonrails.org/&#34;&gt;they look promising so far&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;ve been catching up with &lt;a href=&#34;https://www.themoviedb.org/tv/136315-the-bear&#34;&gt;The Bear&lt;/a&gt; the last couple of weeks. I watched up
to half way season 2 before but got distracted and never finished the series.
This is such good television.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bitecode.dev/p/there-is-no-eu-cookie-banner-law&#34;&gt;There is no EU cookie banner law&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;while people think terrible banners are legal requirements enforced from
the EU, most cookie banners are actually&amp;hellip; illegal according to the EU law.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Huh.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This situation is superbly paradoxical. And not just because Americans
complaining about EU having too much influence outside of its border is peak
irony.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;🔥&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fediverse.zachleat.com/@zachleat/112139706471681328&#34;&gt;From Zach Leatherman&lt;/a&gt; of &lt;a href=&#34;https://www.11ty.dev/&#34;&gt;11ty&lt;/a&gt; fame:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here’s the source code between the doctype and the &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; for this site:&lt;/p&gt;
&lt;p&gt;×26 &lt;code&gt;&amp;lt;link rel=&amp;quot;preload&amp;quot;&amp;gt;&lt;/code&gt;&lt;br&gt;
×36 external &lt;code&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;/code&gt;&lt;br&gt;
×91 external &lt;code&gt;&amp;lt;script src&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is not a nuanced point I’m making. We’re not debating the finer points
of complicated web performance trade-offs. This is a very slow web site.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pretty compelling, right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stop GraphQL-ing, you are not Facebook.&lt;/p&gt;
&lt;p&gt;(Yes, I did have to deal with GraphQL this week).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fly.io/phoenix-files/phoenix-dev-blog-server-logs-in-the-browser-console/&#34;&gt;Phoenix Dev Blog – Server logs in the browser console&lt;/a&gt; &amp;ndash; very nice.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let’s collocate the server logs with the client logs! The first place you’re
going to look while using the UI is the browser’s web console. Your UI
framework logs and UI errors are already there and built into your workflow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yet another example of developer UX improvements in Phoenix apps.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 143: Swipe down to die</title>
      <link>https://elver.me/weeknotes/143-swipe-down-to-die/</link>
      <pubDate>Sun, 24 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/143-swipe-down-to-die/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://indignity.substack.com/p/swipe-down-to-die&#34;&gt;Swipe down to die&lt;/a&gt; &amp;ndash; It seems a lot of car manufacturers are realising that
physical controls are good, actually. Except one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With your car rolling backwards out of control, simply turn your attention
to the touchscreen—because there is no physical button to feel for—stab your
finger at the letter P, hit it precisely, and hold it there. What could be
easier?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We arranged for a survey to be carried out last week at the new house. When
buying a house, it is nice to know if the house works.&lt;/p&gt;
&lt;p&gt;The company carrying out the survey ignored my pleas for an update for an
ENTIRE week, eventually responding without including the quote they blamed for
the delay.&lt;/p&gt;
&lt;p&gt;Do you know what the quote looked like? It looked like a single line saying
&amp;ldquo;Fix a thing £??? + VAT&amp;rdquo;. Then, they had the cheek to send their invoice
requiring payment &lt;em&gt;within one&lt;/em&gt; business day!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be waiting a week to pay the invoice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;EE continues to impress. I&amp;rsquo;ve been out and about this week and it has saved me
from shitty coffee shop Wi-Fi a couple of times. Of course, my favourite
coffee shop still remains a blackspot, but the signal &lt;em&gt;is&lt;/em&gt; improved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fosstodon.org/@AkaSci/112091847867604195&#34;&gt;Debugging Voyager 1&lt;/a&gt; when commands take 22.5 hours distance to reach the
computer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Good news from the Voyager 1 spacecraft that has been stuck sending a 0101
pattern since Nov 2023.&lt;/p&gt;
&lt;p&gt;The team has long suspected the root cause to be a corrupted area of memory
in the FDS computer. On Mar 1, they sent some commands to make the FDS skip
around sections of memory. The data stream rcvd 45 hours later looked
different and was decoded to contain a read-out of the entire FDS memory!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://motherduck.com/blog/perf-is-not-enough/&#34;&gt;PERF IS NOT ENOUGH&lt;/a&gt; &amp;ndash; interesting take on database performance.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Performance in general, and general-purpose benchmarking in particular, is a
poor way to choose a database. You’re better off making decisions based on
ease of use, ecosystem, velocity of updates, or how well it integrates with
your workflow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went over to Bath on Thursday to see Jonathan Pie at The Forum. It was very
enjoyable, but very full on. Preaching to the choir, for sure, but it was a
fun night out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A friend of mine had an idea for a SaaS web product. The product would need to
expose an endpoint to which JSON could be POSTed. It needs to be highly
available, and never drop a request. I find this very interesting.&lt;/p&gt;
&lt;p&gt;It made me think of &lt;a href=&#34;https://github.com/plausible/analytics/&#34;&gt;Plausible&lt;/a&gt;, a privacy friendly web analytics product
which I use on my own websites. It&amp;rsquo;s written in Elixir, and is a very good
comparison problem space I think. Of course, Plausible has lots of features
that are a more traditional SaaS product, but the thing it needs to do very
well is ingest web analytics events and store them somewhere for later
analysis.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve never worked on, or been solely responsible for, a very highly available
service like this. To be honest, I find the idea a bit scary. But I also find
it really interesting. How do you receive and persist loads of events like
this with no downtime?&lt;/p&gt;
&lt;p&gt;Well, Elixir is about processes. They are not comparable to OS processes;
they&amp;rsquo;re far cheaper and lightweight. I looked at the Plausible source code and
the way they do it is to have an Elixir process which receives and buffers
events, and they periodically flush the events to disk (aka write them to a
database).&lt;/p&gt;
&lt;p&gt;How do you end up with certain magic numbers in a system like this? How many
events do you buffer, and how often do you choose to flush them to the
database? I have &lt;em&gt;no&lt;/em&gt; idea where to start.&lt;/p&gt;
&lt;p&gt;I often look at software and assume that the end product is a result of
genius, but in reality it&amp;rsquo;s more than likely the result of trial and error.
Start with buffering 100 events, test, and see what happens. How often should
you flush to disk? Choose a number of seconds, and test, test, test.&lt;/p&gt;
&lt;p&gt;A realistic, repeatable, test script is your friend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which&amp;hellip;I tried out &lt;a href=&#34;https://github.com/wg/wrk&#34;&gt;&lt;code&gt;wrk&lt;/code&gt;&lt;/a&gt; and it seems really neat. You can
script your load tests using Lua.&lt;/p&gt;
&lt;p&gt;Still, one of the biggest issues for me with load testing is coming up with
realistic numbers to use in tests. How many concurrent users? How many
requests? Tricky.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 142: Blazingly fast Wi-Fi</title>
      <link>https://elver.me/weeknotes/142-blazingly-fast-wi-fi/</link>
      <pubDate>Sun, 17 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/142-blazingly-fast-wi-fi/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The house: One step forward. One step backward.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apparently I&amp;rsquo;ve reached the age where I&amp;rsquo;m being randomly asked by the local GP
to go in for annual blood tests 🤷‍♂️&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new &lt;a href=&#34;https://techspecs.ui.com/unifi/wifi/u6-pro#datasheet&#34;&gt;U6 Pro AP&lt;/a&gt; &lt;a href=&#34;/weeknotes/141-waiting-for-the-line-to-settle/#:~:text=Buy%20a%20faster%20UniFi%20AP&#34;&gt;I ordered last week to try and boost my Wi-Fi speeds&lt;/a&gt;
arrived as scheduled on Monday. I ordered the U6 Pro because it was the
fastest AP available that still worked on standard PoE. I haven&amp;rsquo;t been keeping
up with the latest developments in PoE technology, but a new standard, PoE+,
now exists which can supply more power. I am not in the mood for upgrading
switches, so the choice was made.&lt;/p&gt;
&lt;p&gt;It was impressively easy to setup, of which I was very glad. I plugged it into
a PoE capable Ethernet cable and it sprung to life. After a brief booting up
period I started getting notifications on my watch that it was ready to adopt
(because I have the UniFi iOS installed on my phone). It updated itself to the
latest firmware and became available in the UniFi controller, and once I
clicked &amp;ldquo;Adopt&amp;rdquo;, it was working. Slick.&lt;/p&gt;
&lt;p&gt;So did I achieve my goals of improving Wi-Fi speeds? Yes, but I did end up
having to make some small configuration changes to do so. I changed the
channel width on the 5GHz network to 80MHz.&lt;/p&gt;
&lt;p&gt;I ran some speed tests and I achieved 503.98Mbps in the front room around 2
metres from the AP, and 447.80Mbps in my office around 5/6 metres from the AP
with walls in the way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://johnskinnerportfolio.com/blog/ruby_330_error.html&#34;&gt;OpenSSL error installing Ruby&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am having a persistent problem installing Ruby. It is OpenSSL problem, one
that a lot of other people in the Ruby community also seem to be banging
their heads against.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve experienced this and it can be extremely stressful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://social.jvns.ca/@b0rk/112078499917987668&#34;&gt;Julia Evans on git merges&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;a bunch of people have said that they feel embarrassed that they&amp;rsquo;re still
confused about which side of a merge conflict is which, even after many
years using git.&lt;/p&gt;
&lt;p&gt;I want to say that I have a hard time with it too (and I am uh EXTREMELY
confident in my git skills at this point).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Of the many things I like about Julia Evans, it&amp;rsquo;s her willingness to say she
doesn&amp;rsquo;t know something. This is very comforting in this
you-must-know-everything industry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You know what really gets my goat? (I might have ranted about this before).
Those of us who work on the web, know, and use URLs. The Uniform Resource
Locator. The way we find our way to websites. So why, do so many of us insist
on sending cropped screenshots around when a URL is so much better? WHY?!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tonsky.me/blog/js-bloat/&#34;&gt;JavaScript Bloat in 2024&lt;/a&gt; &amp;ndash; the sizes of websites today. Web developers
everywhere hang your heads in shame.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Compare it to people who really care about performance — Pornhub, 1.4 MB&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nice one, Pornhub.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My smart lock kept notifying me that it had lost it&amp;rsquo;s Wi-Fi connection this
week. My heart sank. I really don&amp;rsquo;t need to be trying to fix Wi-Fi connectivity
issues whilst 4 hours drive away, especially when that Wi-Fi controls access to
the building.&lt;/p&gt;
&lt;p&gt;Almost all the notifications happened on the same day, with a couple trickling
in the day after. I know I&amp;rsquo;ve just changed my Access Point, but the sporadic
nature of the notifications was the strangest thing.&lt;/p&gt;
&lt;p&gt;All quiet since then, so hopefully we can blame sunspots and move on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As part of my new broadband, EE offer a discount on mobile contracts. &lt;a href=&#34;/weeknotes/109-payg-esim/#:~:text=Lyca%20Mobile%2C%20who%20piggyback%20on%20EE%20and%20offer%20PAYG%20with%20an%20eSIM&#34;&gt;I&amp;rsquo;ve
flirted with the idea of moving to the EE network before&lt;/a&gt;, but this move meant
full unadulterated access to EE&amp;rsquo;s coverage and speed.&lt;/p&gt;
&lt;p&gt;I have little doubt that Three remains the best for raw speed (I once tested
970Mbps in Sheffield City centre) but the speed means nothing if you don&amp;rsquo;t
have a signal. And I was not having a signal quite a lot.&lt;/p&gt;
&lt;p&gt;I was with SMARTY before which cost £10 a month for 60GB of data (which I
never used, but was a promotional offer). I&amp;rsquo;m now paying £16 a month with EE
for unlimited data (which I also won&amp;rsquo;t use).&lt;/p&gt;
&lt;p&gt;The number porting was a thankfully smooth process. Time will tell if the
coverage is overall better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, the broadband also comes with 6 months of Apple Music (So.
Much. Value!) so I&amp;rsquo;m also trialling that. I guess it shouldn&amp;rsquo;t be surprising
that moving away from Spotify is difficult.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I discovered that my toilet seat has a button that allows it to simply unclip
from the main bowl. What a revelation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 141: Waiting for the line to settle</title>
      <link>https://elver.me/weeknotes/141-waiting-for-the-line-to-settle/</link>
      <pubDate>Sun, 10 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/141-waiting-for-the-line-to-settle/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/139-i-m-a-swiftie-now/#:~:text=Somewhat%20on%20a%20whim%20I%20decided%20to%20start%20learning%20Swift%20UI&#34;&gt;My Swift UI learning&lt;/a&gt; has continued steadily. I will probably need a project
to work on soon or I might lose interest. The issue is that I find made-up
learning projects difficult to commit to. I know that the learning is in and
of itself the valuable part, but my brain still isn&amp;rsquo;t convinced. On the other
hand I&amp;rsquo;m not experienced enough to take on any real work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://xcodereleases.com/&#34;&gt;Xcode Releases&lt;/a&gt; &amp;ndash; a handy website if you want to keep up with the latest
Xcode releases via various feed formats.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We got over one of the two remaining hurdles with the new house this week,
which was a relief. Another one to go 🤞 I&amp;rsquo;m starting to become disillusioned
with our solicitor though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When my &lt;a href=&#34;/weeknotes/140-paint-factory/#:~:text=I%20now%20have%20fibre%20to%20the%20premises&#34;&gt;new broadband was installed last week&lt;/a&gt; I immediately ran a speed test
to see what I was actually achieving in speed vs what was advertised. And I
was getting slightly below or above 500Mbps &amp;ndash; good times.&lt;/p&gt;
&lt;p&gt;The engineer stressed that leaving the ISP-supplied router plugged in until
the next day (Friday) would be a good idea for the &amp;ldquo;line to settle&amp;rdquo;, whatever
that means. I dutifully did so until Sunday when I had time to transition back
to my usual over-the-top UniFi networking gear.&lt;/p&gt;
&lt;p&gt;This meant setting up my UniFi router to connect to EE&amp;rsquo;s network using &lt;a href=&#34;https://en.wikipedia.org/wiki/Point-to-Point_Protocol_over_Ethernet&#34;&gt;PPPoE&lt;/a&gt;.
I expected a hassle, but I was pleasantly surprised upon plugging in my own
equipment that everything just sprung into action. No username or password
changes. No configuration change at all. It just worked!&lt;/p&gt;
&lt;p&gt;However the speedtest told a different story this time. Now I was only getting
about half of what I should ~250Mbps. Strange. I initially assumed that my
UniFi gateway couldn&amp;rsquo;t handle the faster Internet speed so I turned off
traffic inspection which I&amp;rsquo;d read can slow things down, and Googled other
software fixes to no avail.&lt;/p&gt;
&lt;p&gt;Then it dawned on me that I should try a speedtest using an Ethernet
connection to rule out Wi-Fi being the issue (I used the Speedtest tvOS app on
my Apple TV for this!). This confirmed Wi-Fi &lt;em&gt;was&lt;/em&gt; the issue as I got my full
Internet allowance via Ethernet.&lt;/p&gt;
&lt;p&gt;So the ISP router, supplied for free, can achieve better Wi-Fi performance that
my fancy UniFi gear, which shouldn&amp;rsquo;t be that surprising given that the UniFi
AP is nearly 6 years old.&lt;/p&gt;
&lt;p&gt;There are two ways to go about fixing this: 1) Look at tweaking the existing
AP configuration whilst having no idea what I&amp;rsquo;m doing, or 2) Buy a faster
UniFi AP and hope. &lt;a href=&#34;https://techspecs.ui.com/unifi/wifi/u6-pro#datasheet&#34;&gt;The new AP&lt;/a&gt; arrives next week.&lt;/p&gt;
&lt;p&gt;If it doesn&amp;rsquo;t fix the issue in a plug-and-play fashion I might return it and
go back to step 1.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I saw Dune 2 last Sunday. Better pacing, and things &lt;em&gt;happen&lt;/em&gt;. I really enjoyed
it and am looking forward to the next film. I also found out that a TV series,
&lt;a href=&#34;https://www.themoviedb.org/tv/90228-dune-the-sisterhood&#34;&gt;Dune: Prophecy&lt;/a&gt;, is currently being made!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.npr.org/sections/thesalt/2015/03/26/394339284/how-snobbery-helped-take-the-spice-out-of-european-cooking&#34;&gt;How Snobbery Helped Take The Spice Out Of European Cooking&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Back in the Middle Ages, spices were really expensive, which meant that only
the upper class could afford them. But things started to change as Europeans
began colonizing parts of India and the Americas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What I took away from this is that snobbery has robbed me of eating Chicken
Tikka Masala for dinner every day.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As &lt;a href=&#34;/weeknotes/140-paint-factory/#:~:text=taken%20away%20on%20holiday&#34;&gt;I mentioned last week&lt;/a&gt; we were going away for a long weekend. The surprise
location was Porto, Portugal. Porto must have the most changeable weather I&amp;rsquo;ve
ever experienced which has made experiencing it a bit more difficult than we
would have liked. We&amp;rsquo;ve enjoyed our visit though.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 140: Paint Factory</title>
      <link>https://elver.me/weeknotes/140-paint-factory/</link>
      <pubDate>Sun, 03 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/140-paint-factory/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theverge.com/2024/3/1/24087666/apple-disable-iphone-web-apps-eu-reversal&#34;&gt;Now Apple says it won’t disable iPhone web apps in the EU&lt;/a&gt; &amp;ndash; great news. Now
we can all go back to not using PWAs as before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The house purchase remains a constant anxiety. Hopefully we are approaching
the end, but every time we make progress something else crops up.&lt;/p&gt;
&lt;p&gt;Waiting, waiting, waiting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All &lt;a href=&#34;/weeknotes/135-planning-stages/#:~:text=guess%20what%E2%80%99s%20happened%3F-,Yep%2C%20FTTP%20is%20here,-and%20I%20can&#34;&gt;this talk of  broadband&lt;/a&gt; led me to pull the plug and upgrade to FTTP,
saving money in the process. The installation was delayed a few days because
the first engineer didn&amp;rsquo;t have long enough ladders. The second engineer who
came a couple of days later didn&amp;rsquo;t use a ladder at all! Anyway, I now have
fibre to the premises. I had to be restrained and not go for the 1.6Gbps
variation. Instead, I&amp;rsquo;m slumming it with a mere 500Mbps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dan Cederholm over at &lt;a href=&#34;https://simplebits.shop/&#34;&gt;SimpleBits&lt;/a&gt; has released his new typeface, &lt;a href=&#34;https://simplebits.shop/products/paint-factory&#34;&gt;Paint
Factory&lt;/a&gt;. It&amp;rsquo;s a beaut.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was sorry to hear of Dave Myers death this week. &lt;a href=&#34;https://www.theguardian.com/tv-and-radio/2024/feb/29/genuinely-groundbreaking-how-the-hairy-bikers-dave-myers-redefined-masculinity-on-british-tv&#34;&gt;This is a lovely tribute
to the man&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It was, in retrospect, a fairly accurate depiction of the perfect male
friendship.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/139-i-m-a-swiftie-now/#:~:text=Installing%20my%20new%20smart%20lock&#34;&gt;The smart lock&lt;/a&gt;. I had to swallow my pride and call in an expert. He was
stumped for quite a long time too, which did make me feel better. In the end
he slightly adjusted the positioning - and I mean slightly; barely a
millimetre - and it now appears to be working.&lt;/p&gt;
&lt;p&gt;It seems the tolerances for a working lock are quite precise. I&amp;rsquo;m glad it&amp;rsquo;s
now working for the bargain sum of £40. I still don&amp;rsquo;t fully trust it but will
be trying it out over the next few weeks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apparently Windows is suddenly a good OS for web development. I wonder what
could&amp;rsquo;ve prompted such a change of heart 🤔&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s my birthday next week (27 actually, thanks) and I&amp;rsquo;m being taken away on
holiday so there will be a blissful 3 day week 👌&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 139: I&#39;m a Swiftie now</title>
      <link>https://elver.me/weeknotes/139-i-m-a-swiftie-now/</link>
      <pubDate>Sun, 25 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/139-i-m-a-swiftie-now/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Installing my new smart lock was very not easy, even with the skills of my
good friend helping. Let&amp;rsquo;s just say we managed to burn a small hole in the
carpet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ok. I don&amp;rsquo;t have a clue about &lt;a href=&#34;https://mastodon.social/@fj/111969752716686597&#34;&gt;how this works&lt;/a&gt;. I don&amp;rsquo;t math good.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Delighted to announce iMessage PQ3, our formally-verified protocol for
end-to-end encryption that provides the strongest post-quantum protections
against “Harvest Now, Decrypt Later” attackers by not only performing a
quantum-secure key establishment, but also performing post-quantum ongoing
rekeying.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I don&amp;rsquo;t use iMessage at all, but seems good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Somewhat on a whim I decided to start learning Swift UI. And, by association,
Swift I guess ;) Saying that, building UIs with Swift UI very much feels like
using a DSL so there is much to learn language-wise.&lt;/p&gt;
&lt;p&gt;Some thoughts as a complete beginner:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve found it very approachable so far.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are a lot of very high-quality learning resources available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fairly complex looking view stuff is very easy to achieve - I had something
resembling an app UI very quickly. I expect the stuff that isn&amp;rsquo;t easy is
&lt;em&gt;very&lt;/em&gt; hard. We will see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using XCode is not horrendous, but not great either. I have Vim keybindings
turned on, but of course that means you only get default Vim behaviour, not
the countless muscle memory configurations I have added over the years, so
it isn&amp;rsquo;t perfect.&lt;/p&gt;
&lt;p&gt;It crashes; often.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Previews are very handy and provide really good feedback &amp;ndash; they also need
&amp;ldquo;resuming&amp;rdquo; a lot when a build failed &amp;ndash; &lt;kbd&gt;Opt&lt;/kbd&gt; + &lt;kbd&gt;Cmd&lt;/kbd&gt; +
&lt;kbd&gt;P&lt;/kbd&gt; is your friend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Property Wrappers are nice, and are used a lot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Swift interpolation and closure variable syntax is weird.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.apple.com/sf-symbols/&#34;&gt;SF Symbols&lt;/a&gt; are vast. It&amp;rsquo;s great to have this built-in, especially when
learning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Any integrating with &lt;a href=&#34;https://developer.apple.com/documentation/uikit&#34;&gt;UIKit&lt;/a&gt; feels scary and opaque. Avoiding that for now.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So far I don&amp;rsquo;t feel like a complete loser as I&amp;rsquo;m learning. I think it&amp;rsquo;s
because this is definitely outside of my wheelhouse, so my usual expectation
that I should know everything doesn&amp;rsquo;t come into play.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lots of interesting &lt;a href=&#34;https://jvns.ca/blog/2024/02/16/popular-git-config-options/&#34;&gt;git configuration options compiled by Julia Evans&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tummychow/git-absorb&#34;&gt;&lt;code&gt;git-absorb&lt;/code&gt;&lt;/a&gt; looks cool. I want to try this but I haven&amp;rsquo;t needed it yet!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You have a feature branch with a few commits. Your teammate reviewed the
branch and pointed out a few bugs. You have fixes for the bugs, but you
don&amp;rsquo;t want to shove them all into an opaque commit that says fixes, because
you believe in atomic commits.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lander was one of the first games I played. I remember it being very tricky.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lander was the very first game to be released for the ARM processor, and it
is both a milestone and a masterpiece.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mark Moxon has created &lt;a href=&#34;https://lander.bbcelite.com/&#34;&gt;this awesome website&lt;/a&gt; about&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This site contains reconstructed source code for Lander, David Braben&amp;rsquo;s epic
game for the Acorn Archimedes, with every single line documented and (for
the most part) explained.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I love this kind of deep dive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The ending of True Detective didn&amp;rsquo;t quite wrap up things how I would have
liked. They refer to previous series&amp;rsquo; and then don&amp;rsquo;t tie up the loose ends as
far as I could tell. Even so, I really enjoyed the series, but it doesn&amp;rsquo;t even
come close to the first (and neither do the others either).&lt;/p&gt;
&lt;p&gt;A series 5 has been announced already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mastodon.social/@stroughtonsmith/111970198404398471&#34;&gt;&amp;ldquo;We&amp;rsquo;re back to this again.&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This idea that we&amp;rsquo;re all thickos for clearing the launcher does indeed need to
stop. I&amp;rsquo;m not closing apps because I&amp;rsquo;m saving precious iPhone memory; I&amp;rsquo;m
closing them so I can find things later!&lt;/p&gt;
&lt;p&gt;The UI is bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had to deal with a pretty difficult rebase this week. In the end, I failed.&lt;/p&gt;
&lt;p&gt;Usually when I get conflicts during a rebase I will manually fix the conflict
in Vim (&lt;a href=&#34;https://social.jvns.ca/@b0rk/111975796153138514&#34;&gt;incidentally it seems I am not alone&lt;/a&gt;). This is, for the most part,
easy because code conflicts tend to be manageable in terms of the size of the
change. However, this conflict was caused my a very large (38k+ lines)
automated log file committed to the repo.&lt;/p&gt;
&lt;p&gt;The conflict markers contained such big chunks that I couldn&amp;rsquo;t visually see
the changes all at once which made choosing which part was correct very
difficult. I thought maybe this was the time to investigate a dedicated a
mergetool, but after trying &lt;code&gt;vimdiff&lt;/code&gt; and VSCode I gave up.&lt;/p&gt;
&lt;p&gt;In the end I created a new branch and hacked it about until things were
working, but it did not feel satisfactory. This needs improvement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://mastodon.social/@castropodcasts/111964488680823411&#34;&gt;new owners of Castro are communicating&lt;/a&gt; better.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yesterday we successfully deployed new appservers for Castro. This included
the first substantial code changes to the server in about a year. This
morning, &amp;ldquo;popular&amp;rdquo; feeds are the most up-to-date they&amp;rsquo;ve been since
November.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well done. I have re-subscribed, because this looks promising, and the
alternatives are not good.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 138: Minimum version</title>
      <link>https://elver.me/weeknotes/138-minimum-version/</link>
      <pubDate>Sun, 18 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/138-minimum-version/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This week I&amp;rsquo;ve been making lists of drain, gutter, and woodworm experts. It&amp;rsquo;s
a lot of fun.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rails/rails/pull/50505&#34;&gt;Add allow_browser to set minimum versions for your application&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Shouldn&amp;rsquo;t a web framework default be what the majority of people using the
framework would want rather than the whims of the few?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, how&amp;rsquo;s that Progressive Web App plan going now that &lt;a href=&#34;https://www.theregister.com/2024/02/16/apple_web_apps/&#34;&gt;Apple is
crippling them in the EU&lt;/a&gt;?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;These weeknotes use two different typefaces. I&amp;rsquo;ve self-hosted one of them
since the beginning because I bought it specifically but the other was hosted
on Google Fonts&amp;rsquo; CDN. I was always unsure (still am) about what is best
performance-wise.&lt;/p&gt;
&lt;p&gt;Anyway, I am now self-hosting. I downloaded &lt;a href=&#34;https://fonts.google.com/specimen/Montserrat&#34;&gt;Montserrat from Google Fonts&lt;/a&gt; and
then converted the &lt;a href=&#34;https://en.wikipedia.org/wiki/TrueType&#34;&gt;TrueType&lt;/a&gt; to a &lt;a href=&#34;https://en.wikipedia.org/wiki/Web_Open_Font_Format&#34;&gt;WOFF&lt;/a&gt; like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ brew install woff2

$ woff2_compress static/fonts/Montserrat-Bold.ttf
Processing static/fonts/Montserrat-Bold.ttf =&amp;gt; static/fonts/Montserrat-Bold.woff2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The conversion shaves off quite a few bytes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;193K Montserrat-Bold.ttf
 61K Montserrat-Bold.woff2
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Did you know you should receive automatic compensation from your ISP &lt;em&gt;if&lt;/em&gt; they
are signed up to the &lt;a href=&#34;https://www.ofcom.org.uk/phones-telecoms-and-internet/advice-for-consumers/costs-and-billing/automatic-compensation-need-know&#34;&gt;Automatic compensation scheme&lt;/a&gt;? This includes failure to
install a service on time, delays in fixing etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I bought my smart look this week. You&amp;rsquo;ll hear about it if I get locked out of
my house 👀&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My broadband searching led me to a term I&amp;rsquo;ve heard many times, but never
really understood &amp;ndash; Peering.&lt;/p&gt;
&lt;p&gt;What is Peering? Well, the Internet is actually made up of lots of smaller
networks. Getting from one place to another means the traffic needs to be
routed via many different networks. Without adequate peering agreements
traffic may have to flow through non-optimal routes.&lt;/p&gt;
&lt;p&gt;Peering is generally an agreement between network providers to allow traffic
to flow through their networks, improving resiliency and/or latency, as
traffic can now flow more directly.&lt;/p&gt;
&lt;p&gt;You can even lookup what peering an ISP has at PeeringDB. For example, &lt;a href=&#34;https://www.peeringdb.com/net/118&#34;&gt;you
can see that BT have many peers&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The structural survey from last week has created a lot of admin in the form of
asking for and gathering quotes for various checks, services, and works. This
is home ownership.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I didn&amp;rsquo;t see &lt;a href=&#34;https://www.ispreview.co.uk/index.php/2024/02/revolut-becomes-first-uk-financial-institution-to-launch-esim.html&#34;&gt;Revolut being the company to introduce an eSIM&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://turso.tech/&#34;&gt;&amp;ldquo;Turso makes it easy to offer one database per tenant on your SaaS platform.&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is kinda what Fly are aiming for too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One of the core developers of nginx &lt;a href=&#34;http://freenginx.org/pipermail/nginx/2024-February/000000.html&#34;&gt;has forked the project&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unfortunately, some new non-technical management at F5 recently decided that
they know better how to run open source projects.  In particular, they
decided to interfere with security policy nginx uses for years, ignoring
both the policy and developers’ position.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://visualstudiomagazine.com/articles/2024/01/25/copilot-research.aspx&#34;&gt;New GitHub Copilot Research Finds &amp;lsquo;Downward Pressure on Code Quality&amp;rsquo;&lt;/a&gt; &amp;ndash;
&lt;em&gt;Shocking&lt;/em&gt; news.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fly.io/blog/tigris-public-beta/&#34;&gt;Fly.io are partnering with Tigris&lt;/a&gt; to give their customers access to an
S3-compatible object store that is globally distributed by default.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I know how this looks for a lot of you. It looks like we’re partnering with
Tigris because we’re chicken, and we didn’t want to build something like
this. Well, guess what: you’re right!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I added a &lt;a href=&#34;https://www.jsonfeed.org/&#34;&gt;JSON Feed&lt;/a&gt; feed to this site this week. Why? I dunno. All the cool
kids seem to be doing it, so I thought &amp;ldquo;why not?&amp;rdquo; &amp;ndash; it is accessible at
&lt;a href=&#34;https://weeknotes.elver.me/feed.json&#34;&gt;https://weeknotes.elver.me/feed.json&lt;/a&gt; if you&amp;rsquo;re so inclined.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I can feel the pull of home automation. I feel it&amp;rsquo;s presence. Soon.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 137: Tune</title>
      <link>https://elver.me/weeknotes/137-tune/</link>
      <pubDate>Sun, 11 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/137-tune/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This week I&amp;rsquo;ve been I&amp;rsquo;ve been borderline obsessed with &lt;a href=&#34;https://en.wikipedia.org/wiki/Yes_(McAlmont_%26_Butler_song)&#34;&gt;McAlmont &amp;amp; Butlers&#39;
Yes&lt;/a&gt;. Tune.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Slow week, link-wise, but a lot of admin has been underway. Never ending admin.
It&amp;rsquo;s a bit of a rollercoaster as some days it feels under control and then
something else needs doing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m still &lt;a href=&#34;/weeknotes/135-planning-stages/#:~:text=The%20only%20real%20option%20at%20the%20new%20house%20is%201Gbps%20Virgin&#34;&gt;periodically checking my new postcode&lt;/a&gt; against broadband providers
websites.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I also bit the bullet and placed an order for 500Mbps fibre at my current
address &amp;ndash; it should be cheaper and faster. The installation is booked near to
the end of the month, so fingers crossed they can successfully install it and
I can make my UniFi gear co-operate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ground.news&#34;&gt;Ground News&lt;/a&gt; &amp;ndash; A news website which shows the political leanings of the
various sources reporting it. Interesting idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A FAQ section on your website is not a replacement for a well thought out
information architecture. Please.&lt;/p&gt;
&lt;p&gt;(Yes, it&amp;rsquo;s been necessary to browse &lt;em&gt;a lot&lt;/em&gt; of FAQs this week :-/).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yet another car service required this week. It went without incident; the
worst part being the trudge into town in drizzle, and the bill when picking it
up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The structural survey we&amp;rsquo;d booked for the new house was moved forward due to a
cancellation so we already have the results of that. I am yet to read it
thoroughly, but there wasn&amp;rsquo;t anything to stop the purchase. But there are
things that need doing, but it&amp;rsquo;s better to know than not I guess.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;True Detective Season 4 is still good, but I&amp;rsquo;m worried there is only a single
episode left and lots to wrap up still.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 136: Checkbox love</title>
      <link>https://elver.me/weeknotes/136-checkbox-love/</link>
      <pubDate>Sun, 04 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/136-checkbox-love/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tonsky.me/blog/checkbox/&#34;&gt;In Loving Memory of Square Checkbox&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mastodon published a vulnerability this week &amp;ndash; &lt;a href=&#34;https://github.com/mastodon/mastodon/security/advisories/GHSA-3fjr-858r-92rw&#34;&gt;Remote user impersonation and
takeover&lt;/a&gt;. Seems pretty bad. Upgrade as soon as possible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve spent a large amount of time this week researching smart locks. There are
a lot of different lock types, and trying to find something compatible with my
door is proving tricky.&lt;/p&gt;
&lt;p&gt;A lot of the reviews I&amp;rsquo;ve found are US focussed, but of course they have
different incompatible standards in North America. Here in the UK, the market
seems to be dominated by cheaper locks built on the TTLock platform, a sort of
SDK for building smart locks, and a lot of the lock hardware from different
manufacturers is almost identical apart from their logo. It&amp;rsquo;s very confusing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finding detailed specifications of UniFi equipment, especially if it&amp;rsquo;s not
sold anymore, is difficult. Thankfully, I found this &lt;a href=&#34;https://evanmccann.net/blog/ubiquiti/unifi-comparison-charts&#34;&gt;UniFi Network Comparison
Charts&lt;/a&gt; page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/orgs/community/discussions/16925&#34;&gt;GitHub apparently supports these blockquote extensions&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Alerts are an extension of Markdown used to emphasize critical information.
On GitHub, they are displayed with distinctive colors and icons to indicate
the importance of the content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nice for making certain page elements more visible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PRO TIP: Never fuck up a payment to HMRC. You will quickly regret your error
after having to ring them, be on hold for &lt;em&gt;ages&lt;/em&gt;, and having to listen to them
&lt;em&gt;insisting&lt;/em&gt; that there is &amp;ldquo;help available online&amp;rdquo; EVERY FIVE MINUTES!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://castro.fm/blog/castro-is-back&#34;&gt;A Fresh Start for Castro&lt;/a&gt; &amp;ndash; Castro has new owners!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We know that over the past few months Castro has not communicated well. The
new team&amp;rsquo;s #1 priority will be keeping our users informed. Starting today,
all support emails will be answered in a timely manner.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We&amp;rsquo;ll see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://xeiaso.net/shitposts/no-way-to-prevent-this/CVE-2023-6246/&#34;&gt;&amp;ldquo;No way to prevent this&amp;rdquo; say users of only language where this regularly happens&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lsquo;This was a terrible tragedy, but sometimes these things just happen and
there&amp;rsquo;s nothing anyone can do to stop them,&amp;rsquo; said programmer Willodean
Santorella, echoing statements expressed by hundreds of thousands of
programmers who use the only language where 90% of the world&amp;rsquo;s memory safety
vulnerabilities have occurred in the last 50 years, and whose projects are
20 times more likely to have security vulnerabilities.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;🤣&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.glyph.im/2024/01/unsigned-commits.html&#34;&gt;Unsigned Commits&lt;/a&gt; &amp;ndash; an interesting perspective on signing git commits. I
sign my commits at the moment; maybe I should stop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://arc.net/blog/arc-search&#34;&gt;Arc Search on iOS&lt;/a&gt; is really good. It will &amp;ldquo;build&amp;rdquo; a webpage which is a
summary of whatever you search for. You have to check what it returns, this is
&lt;a href=&#34;https://en.wikipedia.org/wiki/Large_language_model&#34;&gt;LLM&lt;/a&gt; generated I assume, but you have to do that anyway when manually
searching.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve seen discourse online along the lines of &amp;ldquo;Why don&amp;rsquo;t they stick to making
a good web browser?&amp;rdquo; &amp;ndash; I don&amp;rsquo;t understand this. Of course a good web browser
is what we all want, but is there no room for something different? Some
innovation in what a web browser is?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m looking forward to what the Arc team are planning on the desktop.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 135: Planning stages</title>
      <link>https://elver.me/weeknotes/135-planning-stages/</link>
      <pubDate>Sun, 28 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/135-planning-stages/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Season Two of &lt;a href=&#34;https://www.bbc.co.uk/sounds/brand/m0011cpr&#34;&gt;Jon Ronson&amp;rsquo;s Things Fell Apart&lt;/a&gt; is now available and is as
interesting as ever.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ever since the first screeches of my &lt;a href=&#34;https://en.wikipedia.org/wiki/Modem#56_kbit.2Fs_technologies&#34;&gt;56k modem&lt;/a&gt; I’ve craved faster Internet
access. I waited and waited for ADSL to become available, and when it finally
was, it was a genuine revelation. I don&amp;rsquo;t think any speed could ever beat that
feeling now.&lt;/p&gt;
&lt;p&gt;The 70Mbps broadband I have at the moment has been fast enough to get work
done, and reliable. I&amp;rsquo;ve flirted with the idea of changing to Virgin where I
can currently get 1Gbps, but I&amp;rsquo;ve been waiting. Waiting to see if local
altnets can change the game with symmetrical connections &amp;ndash; as fast up as
down. And so I&amp;rsquo;ve watched with interest over the last 5 or 6 years as my house
has fallen in and out of “planned” network building areas.&lt;/p&gt;
&lt;p&gt;Then &lt;a href=&#34;https://en.wikipedia.org/wiki/Fiber_to_the_x&#34;&gt;FTTP&lt;/a&gt; was announced. I was &amp;ldquo;planned again. And then I wasn&amp;rsquo;t (not sure
what happened there). Well, &lt;a href=&#34;/weeknotes/133-big-stressful-week/&#34;&gt;now that I&amp;rsquo;m moving&lt;/a&gt;, guess what&amp;rsquo;s happened? Yep,
FTTP is here and I can now get 1.6Gbps down &amp;ndash; a speed that teenage me would
have lost his mind over.&lt;/p&gt;
&lt;p&gt;What would you even do with 1.6Gbps? Listen, I would find a way to use it &amp;ndash;
&lt;a href=&#34;https://www.computerworld.com/article/2534312/the--640k--quote-won-t-go-away----but-did-gates-really-say-it-.html&#34;&gt;have some ambition, Bill&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The only real option at the new house is 1Gbps Virgin, which is great, but the
lack of alternative is worrying. A different altnet, &lt;a href=&#34;https://cityfibre.com/&#34;&gt;CityFibre&lt;/a&gt;, brings the
potential for even faster broadband to that area &amp;ndash; maybe up to 2.5Gbps
symmetrical 🤯&lt;/p&gt;
&lt;p&gt;It’s in the &amp;ldquo;planning&amp;rdquo; stages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://zed.dev/blog/zed-is-now-open-source&#34;&gt;Zed is now open source&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://greenallianceblog.org.uk/2023/12/22/my-heat-pump-a-personal-story-about-a-broken-heating-industry/&#34;&gt;This blog post on getting heat pump installed&lt;/a&gt; did not encourage me to get one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Boilers tend to ‘just work’, but with heat pumps, things like flow
temperatures, the width of your pipework, radiator size, heat stores and
buffers, and peak demand at design temperature can make the difference
between cheap clean heat and a system that struggles. No consumer should
have to understand any of this, and the fact that I felt I had to is
testament to how immature the market is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One day maybe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.m.wikipedia.org/wiki/David_L._Mills&#34;&gt;David Mills&lt;/a&gt;, inventor of &lt;a href=&#34;https://en.m.wikipedia.org/wiki/Network_Time_Protocol&#34;&gt;NTP&lt;/a&gt; has died.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;RIP the man who was the absolute incarnation of XKCD&amp;rsquo;s &amp;ldquo;one random dude
holding up the entire internet&amp;rdquo;.  You may never have heard of David Mills,
but your entire goddamn world depends on what he did.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Via &lt;a href=&#34;https://m.blank.org/@memory/111783966091745984&#34;&gt;@memory@blank.org&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Post Office Horizon scandal continues and I listened to a &lt;a href=&#34;https://www.youtube.com/watch?v=MS_mNWGwHnQ&#34;&gt;good interview
with Nick Wallis&lt;/a&gt; who was involved in early reporting (and still is).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hypercritical.co/2024/01/11/i-made-this&#34;&gt;I Made This&lt;/a&gt; by John Siracusa.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not 100% against AI, because I think it can be useful, but I am definitely
wary of what is to come.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=hYd5etBpsO0&#34;&gt;Your Apple TV is a Subnet Router for Tailscale now!&lt;/a&gt; &amp;ndash; this is very cool.
Allow access to local devices which can&amp;rsquo;t install Tailscale themselves via
your Apple TV.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The toner ran out on my Brother HL-L2350DW printer. In order to figure out how
to change over the replacement I had to &lt;a href=&#34;https://www.youtube.com/watch?v=Qaxbt84v-6o&#34;&gt;watch a YouTube video&lt;/a&gt; to and do a
Google search 😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As part of the home buying process I was required to fill out &amp;ldquo;source of
funds&amp;rdquo; checks this week.&lt;/p&gt;
&lt;p&gt;It requires you to connect your back accounts via Open Banking and it will, it
says, find your &amp;ldquo;income&amp;rdquo; and flag all the transactions as such. Except for it
doesn&amp;rsquo;t, obviously. It just shows you a load of transactions it &lt;em&gt;thinks&lt;/em&gt; are
income and then you need to manually change all the incorrect guesses.&lt;/p&gt;
&lt;p&gt;What a farce.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://public.digital/2024/01/12/avoiding-another-horizon&#34;&gt;Avoiding another Horizon scandal&lt;/a&gt; by Mike Bracken, former Chief Digital
Officer in charge of GDS.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But it is important to stress - this is not simply an IT failure or one
rogue supplier. This is an organisational and systemic failure. One where
senior officials and politicians did not get it right in ways that are
predictable and repeated.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kagi are giving away a t-shirt and sticker pack to their first 20,000 paying
members.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now, you may ask, why did we go through all this trouble and allocate nearly
a third of our investor-raised funds to produce and freely distribute 20,000
t-shirts?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m totally up for stickers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Episode two of True Detective season 4 is still on-point 👌&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 134: Extinct cheese</title>
      <link>https://elver.me/weeknotes/134-extinct-cheese/</link>
      <pubDate>Sun, 21 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/134-extinct-cheese/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve got so many small tasks to do at the moment that I&amp;rsquo;m feeling pretty
overwhelmed at times.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The door button on my ancient microwave looked shabby. Years of pressing had
worn away the fake metal finish revealing the black plastic beneath.&lt;/p&gt;
&lt;p&gt;I thought replacing this button shouldn&amp;rsquo;t be too difficult, but finding the
parts might be tricky. I got lucky though, so now I have rejuvenated
microwave!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/True_Detective_(season_4)&#34;&gt;True Detective is back&lt;/a&gt; and it&amp;rsquo;s good!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Say what now?! (via &lt;a href=&#34;https://twitter.com/thomaspaulmann/status/1746923308694503482&#34;&gt;@thomaspaulmann&lt;/a&gt;)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TIL: If you prefix an emoji with &amp;ldquo;+&amp;rdquo; in @SlackHQ
, you can react to the previous message&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I received an email from Monzo this week saying they were doing &amp;ldquo;Know Your
Customer&amp;rdquo; checks.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As a regulated bank, from time to time we need to reach out to our customers
to gain further information. We need to ask you some questions as part of
our ongoing Know Your Customer (KYC) checks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Naturally I thought this was fake, because why would a bank be asking me to
send sensitive personal information to them by email? We have banks who are
&lt;em&gt;training&lt;/em&gt; people to believe phishing emails. Neat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://inessential.com/2024/01/17/corporations_are_not_to_be_loved&#34;&gt;Corporations Are Not To Be Loved by Brent Simmons&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But I need to remember, now and again, that Apple is a corporation, and
corporations aren’t people, and they can’t love you back. You wouldn’t love
GE or Exxon or Comcast — and you shouldn’t love Apple. It’s not an exception
to the rule: there are no exceptions.&lt;/p&gt;
&lt;p&gt;Apple doesn’t care about you personally in the least tiny bit, and if you
were in their way somehow, they would do whatever their might — effectively
infinite compared to your own — enables them to deal with you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Same goes for any business.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.newyorker.com/culture/annals-of-gastronomy/how-a-cheese-goes-extinct&#34;&gt;How a Cheese Goes Extinct&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My UniFi controller software was both &lt;a href=&#34;https://github.com/linuxserver/docker-unifi-controller&#34;&gt;out-of-date and deprecated&lt;/a&gt;, so I
decided to upgrade and migrate in one step to &lt;a href=&#34;https://github.com/linuxserver/docker-unifi-network-application/&#34;&gt;unifi-network-application&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The new image uses an external MongoDB, which means a little more setup. &lt;a href=&#34;https://github.com/linuxserver/docker-unifi-network-application/issues/13&#34;&gt;As
some people have pointed out&lt;/a&gt; it would be nice if the docs had a complete
example of how to setup MongoDB even though it was easy enough to figure out.&lt;/p&gt;
&lt;p&gt;What wasn&amp;rsquo;t easy to figure out was why the UniFi controller was trying to
connect to MongoDB over TLS, as I thought I had told it not to by setting
&lt;code&gt;MONGO_TLS=false&lt;/code&gt;. Eventually I realised that it was because I must have had
it set to &lt;code&gt;true&lt;/code&gt; when I first tried to start the container, and &lt;code&gt;MONGO_TLS&lt;/code&gt; is
only evaluated on first run &lt;a href=&#34;https://github.com/linuxserver/docker-unifi-network-application?tab=readme-ov-file#parameters&#34;&gt;(as the docs say)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But what does &amp;ldquo;evaluated on first run&amp;rdquo; mean, and how do you reset the state if
you do something wrong? When you start the container for the first time there
is a shell script which inspects the values of various &lt;code&gt;MONGO_*&lt;/code&gt; environment
variables. &lt;a href=&#34;https://github.com/linuxserver/docker-unifi-network-application/blob/48af2a584942b66b3d0bd139e0601ea1abbaee33/root/etc/s6-overlay/s6-rc.d/init-unifi-network-application-config/run#L45-L49&#34;&gt;Those are used to decide what the UniFi controller configuration&lt;/a&gt;
file should look like, and that is written to wherever you&amp;rsquo;ve set &lt;code&gt;/config&lt;/code&gt; to
(this is &lt;code&gt;/opt/appdata/unifi&lt;/code&gt; in my case).&lt;/p&gt;
&lt;p&gt;Once I edited the config file directly to turn off TLS the rest was
straightforward. I restored a backup from the old controller and everything
worked.&lt;/p&gt;
&lt;p&gt;This is my complete &lt;code&gt;docker-compose.yml&lt;/code&gt; edits:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unifi-db:
  image: docker.io/mongo:4.4.27
  container_name: unifi-db
  volumes:
    - /opt/appdata/mongodb/data:/data/db
    - /opt/appdata/mongodb/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro
  restart: unless-stopped

unifi-network-application:
  image: lscr.io/linuxserver/unifi-network-application:latest
  container_name: unifi-network-application
  environment:
    - PUID=1000
    - PGID=1000
    - TZ=Etc/UTC
    - MONGO_USER=unifi
    - MONGO_PASS=password
    - MONGO_HOST=unifi-db
    - MONGO_PORT=27017
    - MONGO_DBNAME=unifi
    # - MONGO_TLS= # Mongodb enable TLS. Only evaluated on first run.
    # - MEM_LIMIT=1024 # Change the Java memory limit (in megabytes). Set to default to reset to default
    # - MEM_STARTUP=1024 # Change the Java initial/minimum memory (in megabytes). Set to default to reset to default
    # - MONGO_AUTHSOURCE= # Mongodb authSource. For Atlas set to admin. Defaults to MONGO_DBNAME. Only evaluated on first run.
  volumes:
    - /opt/appdata/unifi:/config
  ports:
    - 8443:8443 # UniFi web admin port
    - 3478:3478/udp # UniFi STUN port
    - 10001:10001/udp # Required for AP discovery
    - 8080:8080 # Required for device communication
    - 1900:1900/udp # Required for Make controller discoverable on L2 network option
    - 8843:8843 # UniFi guest portal HTTPS redirect port
    - 8880:8880 # UniFi guest portal HTTP redirect port
    - 6789:6789 # For mobile throughput test
    # - 5514:5514/udp # Remote syslog port
  restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A reminder that &lt;a href=&#34;https://docs.github.com/en/authentication/connecting-to-github-with-ssh/using-ssh-agent-forwarding&#34;&gt;SSH agent forwarding&lt;/a&gt; is very cool if you need to access a
git repo (in this case) from a remote host with which you don&amp;rsquo;t want to share
SSH keys.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 133: Big, stressful, week</title>
      <link>https://elver.me/weeknotes/133-big-stressful-week/</link>
      <pubDate>Sun, 14 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/133-big-stressful-week/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Vim magic 🧙 Delete all lines that don&amp;rsquo;t start with &lt;code&gt;rails&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:g!/^rails/d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&amp;rsquo;m a wizard, Harry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My car was in the garage last week and whilst I was waiting for it I decided
it might be nice if my &lt;a href=&#34;https://elver.me/uses/&#34;&gt;/uses page&lt;/a&gt; had a changelog. Not just a changelog, but
an accompanying RSS feed too.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s total over-engineering, but fun over-engineering. I now keep a
CHANGELOG.md (in &lt;a href=&#34;https://keepachangelog.com/en/1.1.0/&#34;&gt;keep a changelog&lt;/a&gt; format) and I &lt;del&gt;hacked together&lt;/del&gt; expertly
crafted a Ruby script to parse the Markdown and create an RSS feed from it.&lt;/p&gt;
&lt;p&gt;So &lt;a href=&#34;/uses/feed.rss&#34;&gt;subscribe NOW&lt;/a&gt; so you can keep track of when I buy an unnecessary new
phone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Castro &lt;a href=&#34;https://512pixels.net/2024/01/castro-is-having-another-very-bad-time/&#34;&gt;went down &lt;em&gt;again&lt;/em&gt; this week&lt;/a&gt;, with zero comms about it, &lt;em&gt;again&lt;/em&gt;. They
clearly haven&amp;rsquo;t learnt any lessons from the &lt;a href=&#34;/weeknotes/127-proper-cold/&#34;&gt;previous outage&lt;/a&gt;. This time it
was a DNS issue.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m glad I&amp;rsquo;ve exported the OPML file of all my subscriptions, because I
clearly need to move to something more reliable. I tried a few options last
time but nothing really stuck.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I briefly visited Swindon this weekend. I won&amp;rsquo;t be bothering with that again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Big, stressful, week. We had an offer accepted on a house, so hopefully we&amp;rsquo;re
going to be moving. Scrabbling to find a solicitor and mortgage was not how I
wanted to start the week, but I was pleased with how quickly we managed to get
everything up together.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m scared/stressed/excited about the prospect of the move. There&amp;rsquo;s a hell of
a lot of do, and lot to catastrophize about too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you want a hardware keyboard for your iPhone? &amp;ndash; &lt;a href=&#34;https://www.clicks.tech/product/clicks-for-iphone&#34;&gt;Clicks Creator Keyboard&lt;/a&gt;.
I&amp;rsquo;m not sure what is wrong with me either, but yes, I have ordered one of
these.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m feeling quite behind on everything.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 132: How many keys do you have left?</title>
      <link>https://elver.me/weeknotes/132-how-many-keys-do-you-have-left/</link>
      <pubDate>Sun, 07 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/132-how-many-keys-do-you-have-left/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Christmas is over, thank fuck for that. Back to work; sort of. I caught a cold
towards the end of the week, stress induced (more on that another time), so I
took Friday off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=7DKv5H5Frt0&#34;&gt;After ten years, it&amp;rsquo;s time to stop making videos&lt;/a&gt; &amp;ndash; Tom Scott has decided to
end his video-a-week streak. Who can blame him for wanting to take a bit of a
break? I&amp;rsquo;m glad he&amp;rsquo;s not giving up completely though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theatlantic.com/international/archive/2023/12/nord-stream-pipeline-attack-theories-suspects-investigation/676320/&#34;&gt;The Most Consequential Act of Sabotage In Modern Times&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The destruction of the Nord Stream pipeline curtailed Europe’s reliance on
Russian gas. But who was responsible?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a fascinating read.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.wired.com/story/mirai-untold-story-three-young-hackers-web-killing-monster/?ueid=b4f3a6152578f90ffbdaa44714d0648d&#34;&gt;The Mirai Confessions: Three Young Hackers Who Built a Web-Killing Monster
Finally Tell Their Story&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was going to write up a &amp;ldquo;2023 in review&amp;rdquo; post as I&amp;rsquo;ve seen lots of people
doing. And, in fact, I wrote the majority of it, but it just felt like moaning
so I&amp;rsquo;ve decided not to publish it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I &lt;a href=&#34;https://twitter.com/fatkodima/status/1740703726812406022&#34;&gt;saw this tip&lt;/a&gt; on speeding up your Rails test suite by &amp;ldquo;unlogged tables&amp;rdquo; in
Postgres.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PostgreSQL allows the creation of “unlogged” tables, which do not record
data in the PostgreSQL Write-Ahead Log. This can make the tables faster,
but significantly increases the risk of data loss if the database crashes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I tried this out at work but it didn&amp;rsquo;t have much affect. I think that&amp;rsquo;s
because we use fixtures, which tend to be loaded all at once. If you use
factories you might find it has more benefit for you.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.crunchydata.com/blog/postgresl-unlogged-tables&#34;&gt;Crunchy Data have a good overview&lt;/a&gt; of &amp;ldquo;unlogged&amp;rdquo; tables.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://keysleft.com/&#34;&gt;how many keys do you have left?&lt;/a&gt; &amp;ndash; in a similar vein, you should probably
stop reading this drivel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://alexcabal.com/posts/standard-ebooks-and-classic-web-tech&#34;&gt;How Standard Ebooks serves millions of requests per month with a 2GB VPS; or,
a paean to the classic web&lt;/a&gt; &amp;ndash; worth remembering that you don&amp;rsquo;t always need a
&amp;ldquo;cloud&amp;rdquo; provider.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went to see &lt;a href=&#34;https://www.imdb.com/title/tt13097932/&#34;&gt;One Life&lt;/a&gt; on New Year&amp;rsquo;s Day and enjoyed it. There&amp;rsquo;s nothing
particularly stand-out about it, just a well told real story. From 20 minutes
in I had tears in my eyes and by at the end I was making involuntary blubbing
noises.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Carol_%26_The_End_of_The_World&#34;&gt;Carol &amp;amp; The End of The World&lt;/a&gt; is a delightful new find. I&amp;rsquo;m two episodes in.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 131: A lot more faff</title>
      <link>https://elver.me/weeknotes/131-a-lot-more-faff/</link>
      <pubDate>Sun, 31 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/131-a-lot-more-faff/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Another year almost over. Happy New Year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ben Sheldon wrote up his &lt;a href=&#34;https://island94.org/2023/12/solid-queue-first-impressions&#34;&gt;first impressions of Solid Queue&lt;/a&gt; now &lt;a href=&#34;https://dev.37signals.com/introducing-solid-queue/&#34;&gt;it has been
released&lt;/a&gt;. tl;dr; He likes it.&lt;/p&gt;
&lt;p&gt;Good Job, like &lt;a href=&#34;https://github.com/basecamp/solid_queue&#34;&gt;Solid Queue&lt;/a&gt;, uses the database to persist jobs. I keep
hearing variations on &amp;ldquo;a database is not a queue&amp;rdquo;. The majority of apps are
not Shopify, so get a grip.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GoodJob is easy mode just targeting Postgres, because there are Advisory
Locks and lots of Postgres-only niceties. I do not envy Solid Queue being
multi-database, because it has to implement a bunch of stuff with a coarser
toolbox.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was &lt;a href=&#34;/weeknotes/122-closing-all-buffers/#:~:text=leans%20heavily%20on%20Postgres&#34;&gt;what I was interested in too&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.blog/2023-12-07-upgrading-github-com-to-mysql-8-0/&#34;&gt;Upgrading GitHub.com to MySQL 8.0&lt;/a&gt; &amp;ndash; GitHub have 8000 MySQL hosts! Scale of
this magnitude is hard for me to fathom.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://defector.com/youre-supposed-to-be-glad-your-tesla-is-a-brittle-heap-of-junk&#34;&gt;You’re Supposed To Be Glad Your Tesla Is A Brittle Heap Of Junk&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Look, pal, all I can tell you is that I don&amp;rsquo;t know how to make the thing I
sold you at great expense.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been attempting to securely wipe my &lt;a href=&#34;/weeknotes/129-autoexpand-on/#:~:text=wanted%20to%20wipe%20the%20data%20from%20the%20disks&#34;&gt;old disks&lt;/a&gt;. It&amp;rsquo;s a lot more faff
than you might think.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://dban.org/&#34;&gt;DBAN&lt;/a&gt; used to be the defacto way to wipe data from disks, but it is
unmaintained, and apparently &lt;a href=&#34;https://github.com/martijnvanbrummelen/nwipe&#34;&gt;&lt;code&gt;nwipe&lt;/code&gt;&lt;/a&gt; is the hot new thing. The easiest
way to get &lt;code&gt;nwipe&lt;/code&gt; going seemed to be to creatable a &lt;a href=&#34;https://github.com/PartialVolume/shredos.x86_64&#34;&gt;Shredos&lt;/a&gt; USB stick
and boot from that, which I successfully did.&lt;/p&gt;
&lt;p&gt;I knew the process was going to be time-consuming, and I didn&amp;rsquo;t want to tie up
my main computer whilst it was going on so I decided to hook up the drives to
a separate PC for the duration. This was wise. Even at the lowest security
setting, which just writes zeroes to the disk, it is estimated to take 40
hours!&lt;/p&gt;
&lt;p&gt;At least I managed to hook up two disks at once. One via the &lt;a href=&#34;/weeknotes/129-autoexpand-on/#:~:text=bought%20this%20USB%20to%20SATA%20adapter&#34;&gt;new USB
interface I bought recently&lt;/a&gt;, and the other directly via SATA cable. Strangely
the USB interface seems faster, which I was not expecting. Computers are
weird.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bryanbraun.com/after-dark-css/all/flying-toasters.html&#34;&gt;Flying Toasters CSS&lt;/a&gt; via &lt;a href=&#34;https://mastodon.social/@dosnostalgic/111627384859481942&#34;&gt;Anatoly Shashkin&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=I2J2MzKjcqY&#34;&gt;Christina Warren takes are look at GitHub&amp;rsquo;s custom M1 macOS runners&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I don’t know why but it surprised me that they transplant the innards of a Mac
Mini to a rack compatible “sled”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/129-autoexpand-on/#:~:text=It%20dawned%20on%20me%20this%20would%20be%20a%20good%20solution%20to%20my%20occasional%20need%20for%20a%20monitor%20that%20I%20can%20connect%20to%20various%20computers&#34;&gt;Orion/HDMI capture combo&lt;/a&gt; is not working out to be as handy as I&amp;rsquo;d
originally hoped. I hooked it up to a PC it doesn&amp;rsquo;t seem to show any output
until it reaches Windows, which isn&amp;rsquo;t very helpful when you&amp;rsquo;re trying to get
into the BIOS :-/&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not sure where the problem lies; it could be something PC related. And
let&amp;rsquo;s face it, that&amp;rsquo;s fairly likely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Have I done any more &lt;a href=&#34;/weeknotes/130-mid-level-vimmer/#:~:text=jsonb%20columns%20in%20Postgres&#34;&gt;experimenting with &lt;code&gt;jsonb&lt;/code&gt; columns in Postgres&lt;/a&gt;? You
won&amp;rsquo;t believe this, no. I haven&amp;rsquo;t.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theguardian.com/environment/ng-interactive/2023/dec/06/the-winterkeeper-steven-fuller-yellowstone-national-park&#34;&gt;The Winterkeeper&lt;/a&gt; &amp;ndash; I enjoyed this mini-documentary about Yellowstone
national park.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Steven Fuller is a winter caretaker who has lived at Yellowstone national
park for the past 50 years. As the cold weather approaches and the seasonal
transformation begins, he hunkers down in his remote mountain cabin. But
Fuller and Yellowstone face an uncertain future, with the climate crisis
threatening to forever change one of North America’s last great wildernesses&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Adam Buxton had &lt;a href=&#34;https://www.adam-buxton.co.uk/podcasts/lpbk8k9zbhx54zt-8yl8m-mdzjc-whmf8-2lwfg-emz92-cxnlh-ghwwh-r34cb-sfwnb-kmjcj-x8cgn-gzmzx-xfpt5-x6cma-d8lbc-9adl4-5smea-llfek-a8j99-hzncc-gesss-kyfpd-8pz8g-e3fsz-4fmyk-snpb2-bxaxs-g389b-hfcsc&#34;&gt;Daudi Matsiko on this podcast&lt;/a&gt; recently and I just got around
to listening today. &lt;a href=&#34;https://hellodaudi.bandcamp.com/track/fool-me-as-many-times-as-you-like-2&#34;&gt;This is lovely&lt;/a&gt;. Enjoy!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 130: Mid-Level Vimmer</title>
      <link>https://elver.me/weeknotes/130-mid-level-vimmer/</link>
      <pubDate>Sun, 24 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/130-mid-level-vimmer/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Christmas, again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Very quiet week as I&amp;rsquo;ve been preparing for Christmas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://elixir-lang.org/blog/2023/12/22/elixir-v1-16-0-released/&#34;&gt;Elixir v1.16 has been released&lt;/a&gt; &amp;ndash; some nice improvements especially in
regard to compiler output and documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Native HTML toggle switches!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;the latest Safari Technology Preview missed the introduction of a native
#HTML Switch widget via &lt;code&gt;&amp;lt;input type=checkbox switch&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Switches have some usability issues, but people are going to use them and a
native version seems to make sense.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://indieweb.social/@anthony/111615784563058490&#34;&gt;@anthony@indieweb.social&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://johnwhiles.com/posts/vimming-pains&#34;&gt;The Loneliness of the Mid-Level Vimmer&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But there is a downside to Vimming. It&amp;rsquo;s a weird fringe interest, even
amongst software developers who are already a weird fringe group. Most
people who know what Vim is don&amp;rsquo;t know how to use it, are scared of it, and
are happy to keep it that way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://arstechnica.com/security/2023/12/hackers-can-break-ssh-channel-integrity-using-novel-data-corruption-attack/&#34;&gt;SSH protects the world’s most sensitive networks. It just got a lot weaker&lt;/a&gt;
&amp;ndash; ruh roh. This sounds fairly bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been experimenting a bit with &lt;code&gt;jsonb&lt;/code&gt; columns in Postgres. I&amp;rsquo;ve used them
a bit in the past but not for anything particularly involved. I was wondering
whether they can be used for a &amp;ldquo;custom fields&amp;rdquo; feature where the user can
define additional database fields they want to save to sit alongside those
defined by the developer.&lt;/p&gt;
&lt;p&gt;The saving of the data is not really an issue as far as I can tell. The
querying is a bit more work. My immediate concern is speed. Is querying a lot
of fields from a &lt;code&gt;jsonb&lt;/code&gt; column going to cause performance issues? From what
I&amp;rsquo;ve read the answer is &amp;ldquo;no&amp;rdquo; but I&amp;rsquo;d like to experiment with this myself.&lt;/p&gt;
&lt;p&gt;The are &lt;em&gt;tons&lt;/em&gt; of &lt;code&gt;jsonb_*&lt;/code&gt; functions to learn in Postgres.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://nooshu.com/blog/2023/12/12/govuk-cookie-banner-browser-privacy-and-security/&#34;&gt;GOV.UK Cookie banner and why it “won&amp;rsquo;t go away”&lt;/a&gt; &amp;ndash; the cookie banners on
.gov.uk websites are far more involved than you might imagine. What a waste of
time they are.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 129: autoexpand=on</title>
      <link>https://elver.me/weeknotes/129-autoexpand-on/</link>
      <pubDate>Sun, 17 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/129-autoexpand-on/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Have you heard of &lt;a href=&#34;https://git-scm.com/docs/git-rerere&#34;&gt;&lt;code&gt;git rerere&lt;/code&gt;&lt;/a&gt;?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git-rerere - Reuse recorded resolution of conflicted merges
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You know when you rebase and have to fix the same conflicts over and over?
Well this is supposed to help with that. It remembers what you did to fix each
conflict and re-uses it.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m waiting for the opportune moment to try this out. I haven&amp;rsquo;t needed to do
any gnarly rebases recently.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wish flying were &lt;a href=&#34;https://www.404media.co/no-record-of-russian-economist-who-flew-to-lax-without-a-ticket-didnt-remember-how-he-got-here/&#34;&gt;this easy&lt;/a&gt; for me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No Record of &amp;lsquo;Russian Economist&amp;rsquo; Who Flew to LAX Without a Ticket, Didn&amp;rsquo;t
Remember How He Got Here&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You know all those mandatory linting checks you have? They just train
programmers to workaround linting checks. Does that make your codebase better?&lt;/p&gt;
&lt;p&gt;Am I frustrated? &lt;code&gt;# rubocop:enable IAmABit/Yeah&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was intrigued by &lt;a href=&#34;https://www.lux.camera/meet-orion/&#34;&gt;Orion&lt;/a&gt; after seeing it mentioned a lot. It dawned on me
this would be a good solution to my occasional need for a monitor that I can
connect to various computers. So I bought the &lt;a href=&#34;https://www.amazon.co.uk/dp/B08Z3XDYQ7&#34;&gt;recommended adaptor from
Amazon&lt;/a&gt; and (&lt;a href=&#34;https://tomstu.art/weeknotes-205-call-it-even#:~:text=The%20adapter%20didn%E2%80%99t%20work%20so%20I%20returned%20it%20and%20deleted%20the%20app&#34;&gt;unlike Tom&lt;/a&gt;) it worked perfectly. Will I remember this when I
need a monitor twice a year? Doubtful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/128-jeff-bezos-rowing-boat/#:~:text=I%20kicked%20off%20the%20process%20this%20week&#34;&gt;disk upgrade that I started last week&lt;/a&gt; has finished and was a painless
procedure in the end. I &lt;a href=&#34;/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/&#34;&gt;replaced each disk as if it had failed&lt;/a&gt; and let each
resilver &amp;ndash; that took ages, but was easy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;m hoping that the new space is going to magically become available once
all disks have been swapped out, but I&amp;rsquo;ll have to wait and see.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reader, the space was &lt;em&gt;not&lt;/em&gt; automatically available. I needed to do some
&lt;del&gt;noodling&lt;/del&gt; careful configuration. I set &lt;code&gt;autoexpand&lt;/code&gt; on, and rebooted, but
this didn&amp;rsquo;t see to do the trick on it&amp;rsquo;s own.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo zpool set autoexpand=on &amp;lt;pool&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I had to tell each vdev to expand, so I did this once for each new device.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo zpool online -e &amp;lt;pool&amp;gt; &amp;lt;vdev&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And &lt;em&gt;then&lt;/em&gt; the new space became available. I now have 48TB of usable space.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of disks, I wanted to wipe the data from the disks I just replaced
but had no way to plug them into anything. I bought &lt;a href=&#34;https://www.amazon.co.uk/dp/B07S8MQVRZ&#34;&gt;this USB to SATA adapter&lt;/a&gt;
which allows plugging in 2.5 (and with a &lt;a href=&#34;https://www.amazon.co.uk/dp/B09QG4R1R4&#34;&gt;12V power supply&lt;/a&gt;) 3.5 disks via
USB-A.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve not done the actual wiping yet, but I will at least be able to physically
connect them when I get around to it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another comedy gig this week (they tend to come in groups, like buses), &lt;a href=&#34;https://en.wikipedia.org/wiki/John_Robins_%28comedian%29&#34;&gt;John
Robins&amp;rsquo;&lt;/a&gt; Howl at the Bristol Beacon &amp;ndash; top vibes. This is my first trip to the
Beacon since it was renovated. They&amp;rsquo;ve done a pretty nice job with the
exception of not having stagged seating. Why all theatre spaces don&amp;rsquo;t have
staggered seating is&amp;hellip;staggering to me (this is my blog and I&amp;rsquo;ll tell as many
Dad jokes as I like).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As is my usual behaviour, I spent a full day worrying about a tiny issue at
work which was solved with a 30 second conversation the next day. Why am I
like this?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I respect what &lt;a href=&#34;https://signal.org/&#34;&gt;Signal&lt;/a&gt; are doing for secure messaging. But, for me, the app
leaves a lot to be desired. Notifications just don&amp;rsquo;t work for me, which makes
using it very difficult. Anyone else?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 128: Jeff Bezos Rowing Boat</title>
      <link>https://elver.me/weeknotes/128-jeff-bezos-rowing-boat/</link>
      <pubDate>Sun, 10 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/128-jeff-bezos-rowing-boat/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I went to London for work on Monday. Of course my train home was cancelled 5
minutes before it was due to leave on the homeward leg which meant I ended up
on a train headed for Swansea. Needless to say, I didn&amp;rsquo;t want to go to
Swansea. Trains gonna train.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ln.hixie.ch/?count=1&amp;amp;start=1700627373&#34;&gt;Reflecting on 18 years at Google&lt;/a&gt; &amp;ndash; Google has changed a bit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You should &lt;a href=&#34;https://justin.searls.co/mails/2023-11/&#34;&gt;read Searls&amp;rsquo; blog&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;every time I looked closely at any of these wannabe Steve Jobs types, I&amp;rsquo;d
be repulsed to find their own work was drenched in mediocrity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=XRpHIa-2XCE&#34;&gt;Simple, Non-Commercial, Open Source Notes&lt;/a&gt; &amp;ndash; I really enjoyed this video on
the various ways to take notes with free and open source software.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;if you&amp;rsquo;ve watched this whole video, you are lost&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And he&amp;rsquo;s right, I am lost.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I thought I&amp;rsquo;d better actually start using the &lt;a href=&#34;/weeknotes/126-brown-butter/#:~:text=Western%20Digital%20have%20been%20reliable%20for%20me%20for%20since%20I%20bought%20the%20original%20disks%20in%202018%2C%20so%20when%20they%20started%20offering%2030%25%20off%20when%20you%20buy%202%20it%20was%20hard%20to%20resist%2C%20so%20I%20got%206%20new%20disks&#34;&gt;hard drives that I bought
recently&lt;/a&gt; so I kicked off the process this week. I&amp;rsquo;ve been putting it off
because it&amp;rsquo;s scary.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m following the &lt;a href=&#34;/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/&#34;&gt;blog post which I wrote last time I did this&lt;/a&gt; for most
part. I&amp;rsquo;ve yet to see the results as I&amp;rsquo;m currently resilvering disk 4 of 6.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m hoping that the new space is going to magically become available once all
disks have been swapped out, but I&amp;rsquo;ll have to wait and see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://joanwestenberg.com/blog/the-block-button-is-the-ultimate-source-of-dopamine-use-it&#34;&gt;The block button is the ultimate source of dopamine. Use it.&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There&amp;rsquo;s a crucial difference between silencing someone and choosing not to
engage with them. Blocking someone isn’t about denying them their right to
speak. It’s about asserting your right not to listen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went to &lt;a href=&#34;https://en.wikipedia.org/wiki/Gda%C5%84sk&#34;&gt;Gdańsk, Poland&lt;/a&gt; for a long weekend, our third Polish city having
already visited Kraków and Wrocław in recent years. It was very nice. Both the
&lt;a href=&#34;https://muzeum1939.pl/&#34;&gt;Museum of the Second World War&lt;/a&gt; and the &lt;a href=&#34;http://www.ecs.gda.pl/&#34;&gt;European Solidarity Centre&lt;/a&gt; museum
were excellent. Well worth the time.&lt;/p&gt;
&lt;p&gt;This trip was a lesson in paying more attention to the &amp;ldquo;Feels like&amp;rdquo;
temperatures of a weather forecast&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Any time on an aeroplane reveals just how little testing this industry is
doing without an active Internet connection. Spotify on iOS for example. The
iOS system dialog appears when you start the app, fine. To be expected I
suppose. It then is shown again at regular, but surprising, intervals whenever
switching back and forth.&lt;/p&gt;
&lt;p&gt;Has no one at Spotify been on an aeroplane?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I discovered that you can hook into Ruby on Rails generators so you
can executed your own code after they run.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Application&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Rails&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  config&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;generators&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;after_generate &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;files&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# do things with the files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nice ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you need to launder some money? Apparently &lt;a href=&#34;https://indieweb.social/@web3isgreat/111546025046424341&#34;&gt;&amp;ldquo;hackers&amp;rdquo; are using MTG cards&lt;/a&gt; 😆&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Uranium Finance hacker cashes out in Magic: The Gathering cards&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theguardian.com/food/2023/dec/02/the-weird-secretive-world-of-crisp-flavours&#34;&gt;&amp;ldquo;the weird, secretive world of crisp flavours&amp;rdquo;&lt;/a&gt; &amp;ndash; Find out why Paprika is so
popular in Germany.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=VGhcSupkNs8&#34;&gt;Jeff Bezos Rowing Boat&lt;/a&gt; by Bobby Fingers &amp;ndash; God this is good. Seriously,
watch this. The creativity is mind-blowing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 127: Proper cold</title>
      <link>https://elver.me/weeknotes/127-proper-cold/</link>
      <pubDate>Sun, 03 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/127-proper-cold/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A new feature in Rails &amp;ndash; &lt;a href=&#34;https://github.com/rails/rails/pull/49951&#34;&gt;&lt;code&gt;ErrorReporter#unexpected&lt;/code&gt; to report in production
but raise in development&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This method is intended for reporting violated assertions about
preconditions, or similar cases that can and should be gracefully handled in
production, but that aren&amp;rsquo;t supposed to happen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My podcast player of choice, &lt;a href=&#34;https://castro.fm/&#34;&gt;Castro&lt;/a&gt;, had a FOUR DAY outage that ran into this
week. It was very inconvenient.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We&amp;rsquo;re aware of the current database issue and working hard to resolve this
as quickly as possible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Really, the whole debacle is a lesson in how to communicate with your users
i.e., you &lt;em&gt;should&lt;/em&gt; communicate with your users. &lt;a href=&#34;https://twitter.com/CastroPodcasts/status/1729346575221366924&#34;&gt;One or two tweets&lt;/a&gt; is not
sufficient.&lt;/p&gt;
&lt;p&gt;The app changed hands a few years ago and since then it&amp;rsquo;s been going downhill,
so this is disappointing, but not that surprising. Unfortunately, the design
of a lot of other podcast players leaves a lot to be desired, at least to my
eyes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It was proper cold this week. I am woefully under prepared for it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Up (across?) to London on Thursday for &lt;a href=&#34;https://kinglearbranagh.com/&#34;&gt;King Lear in the West End&lt;/a&gt;. I&amp;rsquo;ve never
seen any Shakespeare before, and it wouldn&amp;rsquo;t be my first choice, but enjoyed
what I understood of it.&lt;/p&gt;
&lt;p&gt;The journey back was very chaotic as our train was cancelled (due to
industrial action which wasn&amp;rsquo;t supposed to be happening), and we eventually,
with several hundred other people, managed to get aboard a train that headed
in the general direction of home.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m pretty quick over a short distance, &lt;em&gt;if&lt;/em&gt; I&amp;rsquo;m running with a suitcase up a
train platform.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m off to London for work tomorrow. Will I ever get back?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Three had a major outage whilst I was in London which affected Smarty, my
mobile provider. Their handling of the incident was not good with much cutting
and pasting of answers on Twitter.&lt;/p&gt;
&lt;p&gt;I was looking to move anyway as their signal just cannot compare to EE. Seems
now is the time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/tobi/status/1728524453854756883&#34;&gt;From Shopify&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Shopify’s egress processed 145 billion requests on Friday. App servers
handled peak of ~60 million requests per minute. Increase of 38%. Total GMV
was $4.1b, up by 22% from last year.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;😮&lt;/p&gt;
&lt;p&gt;And &lt;a href=&#34;https://twitter.com/ShopifyEng/status/1729500628861223290&#34;&gt;some more details from Shopify Engineering&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We achieved 99.999+% uptime, handling 29.7 PB of data served from across our
infrastructure over the entire event! That’s over 5 TB/min&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Blimey!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We saw &lt;a href=&#34;https://www.imdb.com/title/tt13287846/&#34;&gt;Napoleon&lt;/a&gt; on Saturday. For all it&amp;rsquo;s incorrect history I enjoyed it well
enough. The battle scenes were brutal. Too long though.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 126: Brown butter</title>
      <link>https://elver.me/weeknotes/126-brown-butter/</link>
      <pubDate>Sun, 26 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/126-brown-butter/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ok, why do Mince Pies have &amp;ldquo;brown butter&amp;rdquo; in them this year?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://simonhearne.com/2020/network-faster-than-cache/&#34;&gt;When Network is Faster than Cache&lt;/a&gt; &amp;ndash; some really impressive research.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is an assumption that cached assets are retrieved instantly and at
zero cost. What we have discovered here is that there is in fact a cost to
retrieving assets from cache based on the number of cached assets (not file
size) and the user&amp;rsquo;s devices.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Concatenating / bundling your assets is probably still a good practice, even
on H/2 connections.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, there you go.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rknight.me/using-svg-sprites/&#34;&gt;Using SVG Sprites&lt;/a&gt; &amp;ndash; I didn&amp;rsquo;t know that SVG sprites where a thing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I &lt;a href=&#34;/weeknotes/119-airpods-pro-wanker/#:~:text=However%2C%20if%20you%20deploy%20to%20Heroku,works&#34;&gt;previously mentioned&lt;/a&gt; that we couldn&amp;rsquo;t yet use bundler&amp;rsquo;s new ability to
read your Ruby version number out of a file with &lt;code&gt;ruby file: &#39;.ruby-version&#39;&lt;/code&gt;
on Heroku.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, if you deploy to Heroku there is a small spanner in the works. I
had no idea about this, but Heroku always uses certain versions of bundler
when you deploy (currently 2.3.25), so we can’t use this new feature until
the Heroku buildpack is updated.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, it now looks &lt;a href=&#34;https://github.com/heroku/heroku-buildpack-ruby/pull/1404&#34;&gt;like bundler might soon be updated on Heroku&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I know we should all be anti-Amazon, but the Christmas shopping season really
brings into &lt;em&gt;sharp&lt;/em&gt; focus just how good they are at delivering goods vs almost
everyone else.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have been planning to upgrade the hard disks in my home file server for a
while, and I&amp;rsquo;ve been keeping an eye on prices with Black Friday coming up.&lt;/p&gt;
&lt;p&gt;Western Digital have been reliable for me for since I bought the original
disks in 2018, so when they started offering 30% off when you buy 2 it was
hard to resist, so I got 6 new disks&amp;hellip;&lt;/p&gt;
&lt;p&gt;One day I&amp;rsquo;d like to go all SSD, but I think &lt;a href=&#34;https://techhub.social/@cg32/111403284275629288&#34;&gt;we&amp;rsquo;re a few years away from
that&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/105-back-under-the-dome/#:~:text=I%20heard%20about,like&#34;&gt;As I&amp;rsquo;ve said before I&amp;rsquo;m trying out Kagi&lt;/a&gt; as my main search engine, and I was
pleasantly surprised to find that they are big users of Crystal.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://www.youtube.com/watch?v=r7t9xPajjTM&#34;&gt;Zac Nowicki&amp;rsquo;s talk at CrystalConf 2023&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://johnwhiles.com/posts/programming-as-theory&#34;&gt;Suddenly, I Understand Software&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why is it that when you join a company, the engineer who&amp;rsquo;s been there for
years seems like an incredible genius?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is really worth reading.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ronjeffries.com/articles/-y023/small-steps/&#34;&gt;Ron Jeffries on taking smaller steps&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In my experience, when we shorten the time it takes to go from green back to
green again, things go better. And I don’t mean shortening it from an hour
to thirty minutes. I mean shortening it down and down and down, until we are
committing our code every couple of minutes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As he says, the idea is simple, but the discipline is much harder.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 125: Collaborator</title>
      <link>https://elver.me/weeknotes/125-collaborator/</link>
      <pubDate>Sun, 19 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/125-collaborator/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/Rivian/comments/17usikn/202342_ota_update_issue/&#34;&gt;2023.42 OTA Update Issue&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We made an error with the 2023.42 OTA update - a fat finger where the wrong
build with the wrong security certificates was sent out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Awks 🫢&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bbc.co.uk/programmes/m001rrhy&#34;&gt;The Cows Are Mad&lt;/a&gt; &amp;ndash; I really enjoyed this terrifying story of &amp;ldquo;Mad cow
disease&amp;rdquo;. I remember it at the time, but didn&amp;rsquo;t really realise how scary it
was/is until much later.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Science has still failed to definitively answer two major questions about
mad cow disease - where did it come from and how did humans get it?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.naildrivin5.com/blog/2023/10/17/the-katz-conjecture-you-must-understand-what-an-abstraction-abstracts.html&#34;&gt;The Katz Conjecture: You Must Understand What an Abstraction Abstracts&lt;/a&gt; by
David Bryant Copeland&lt;/p&gt;
&lt;p&gt;These examples of leaky abstractions are really good. I&amp;rsquo;ve found it hard to
put into words what a leaky abstraction is.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, if you are really writing a reporting system with a ton of
complicated joins across many tables, an ORM like Active Record might make
things worse. Complicated queries in Active Record are often more
complicated than the SQL you’d need to run. But you wouldn’t know that if
you don’t know how to solve the problem with SQL.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve found myself writing a query by hand and then having to shoehorn it back
into an ActiveRecord many times.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://brightonruby.com/2023/twenty-years-of-ruby-in-five-minutes-paul-battley/&#34;&gt;Twenty Years of Ruby in Five Minutes&lt;/a&gt; &amp;ndash; this was my favourite talk at
Brighton Ruby 2023. The lightning talks are almost always the best.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.learnwithjason.dev/blog/oklch-better-color-css-browser&#34;&gt;OKLCH for better color in the browser&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;TIL about the &lt;code&gt;oklch&lt;/code&gt; colorspace coming to a web browser near you soon. &lt;a href=&#34;https://evilmartians.com/chronicles/oklch-in-css-why-quit-rgb-hsl&#34;&gt;Evil
Martians have a great blog post&lt;/a&gt; that goes into loads of detail about this new
way of specifying colors, most of which went over my head. But one thing is
obvious &amp;ndash; the colours just look &lt;em&gt;nicer&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/yhirano55/trace_location&#34;&gt;TraceLocation&lt;/a&gt; looks very neat for exploring unfamiliar Ruby code.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TraceLocation helps you trace the source location to ease reading huge
open-source libraries in Ruby.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Via &lt;a href=&#34;https://twitter.com/lucianghinda/status/1704099278849991027&#34;&gt;Lucian Ghinda&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I knew we don&amp;rsquo;t get enough Vitamin D during the Winter in the UK, but I didn&amp;rsquo;t
realise that it was for so long.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nhs.uk/conditions/vitamins-and-minerals/vitamin-d/&#34;&gt;But between October and early March we do not make enough vitamin D from
sunlight&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I used to take a supplement, but like other healthy life behaviours, I
stopped. I&amp;rsquo;ve ordered some more and will start taking them ASAP.&lt;/p&gt;
&lt;p&gt;Stupid angle of the sun 🌞&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Making a note of &lt;a href=&#34;https://github.com/sqlfluff/sqlfluff&#34;&gt;sqlfluff&lt;/a&gt; should I need it one day.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A modular SQL linter and auto-formatter with support for multiple dialects
and templated code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I watched another of Andrew Courter&amp;rsquo;s videos, this time &lt;a href=&#34;https://www.youtube.com/watch?v=qN6BuJpsFbQ&#34;&gt;Autocommands in Neovim&lt;/a&gt;.
As a result I&amp;rsquo;ve added this autocommand to my config which highlights on yank
showing you what was yanked visually.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;-- Autocommands&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.api.nvim_create_augroup(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;custom_buffer&amp;#34;&lt;/span&gt;, { clear &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;-- Highlight yanks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.api.nvim_create_autocmd(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;TextYankPost&amp;#34;&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  group &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;custom_buffer&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pattern &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  callback &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt;() vim.highlight.on_yank { timeout &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#099&#34;&gt;200&lt;/span&gt; } &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;m going to trial it for a bit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wrote my first Elixir macro last week (I forgot to say).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defmodule&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Foo.DocsHelper&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defmacro&lt;/span&gt; __using__(_) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;quote&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; docs() &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        fetch_docs() &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; render_markdown()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defp&lt;/span&gt; fetch_docs() &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        module &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;unquote&lt;/span&gt;(__CALLER__&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;module)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        docs &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Code&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;fetch_docs(module)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;case&lt;/span&gt; docs &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          {_, _, _, _, %{&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; moduledoc}, _, _} &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            moduledoc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          _ &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#008080&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defp&lt;/span&gt; render_markdown(&lt;span style=&#34;color:#008080&#34;&gt;nil&lt;/span&gt;), &lt;span style=&#34;color:#990073&#34;&gt;do&lt;/span&gt;: &lt;span style=&#34;color:#008080&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defp&lt;/span&gt; render_markdown(moduledoc) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        moduledoc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;trim()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Earmark&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;as_html!()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Phoenix.HTML&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;raw()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Turns out that I didn&amp;rsquo;t need it in the end, but I still think it&amp;rsquo;s cool.&lt;/p&gt;
&lt;p&gt;You can &lt;code&gt;use&lt;/code&gt; the module and it will add a &lt;code&gt;docs/0&lt;/code&gt; function to your LiveView
which reads the documentation from your &lt;code&gt;@moduledoc&lt;/code&gt; and renders it as
Markdown.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defmodule&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;FooWeb.BarLive&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008080&#34;&gt;@moduledoc&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;  I am documentation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;  &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;use&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Foo.DocsHelper&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; render(assigns) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d14&#34;&gt;~H&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;    &amp;lt;p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;      &amp;lt;%= docs() %&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;    &amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;    &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Neat!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.appsignal.com/2023/11/07/validating-data-in-elixir-using-ecto-and-nimbleoptions.html&#34;&gt;Validating Data in Elixir: Using Ecto and NimbleOptions&lt;/a&gt; is a good
introduction to &lt;a href=&#34;https://hexdocs.pm/nimble_options/NimbleOptions.html&#34;&gt;NimbleOptions&lt;/a&gt;, which I hadn&amp;rsquo;t heard of before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://railsatscale.com/2023-11-07-yjit-is-the-most-memory-efficient-ruby-jit/&#34;&gt;YJIT Is the Most Memory-Efficient Ruby JIT&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The YJIT team has spent a significant amount of effort optimizing YJIT so
that it doesn’t just show good peak performance numbers, but also does this
while being memory-efficient. This effort has paid off, with YJIT having the
least memory overhead of any Ruby JIT, which has been crucial in enabling
YJIT to handle Shopify’s SFR deployment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Impressive work on YJIT.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.threads.net/@quiverquantitative/post/CzcB-Gsgqow/&#34;&gt;&amp;ldquo;I built a trading bot that buys stocks that are being bought by politicians&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is up 20% since it launched in May 2022.
The market has been flat during the same time period.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;😠&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We went to see &lt;a href=&#34;https://www.danielkitson.com/livestuff/2023/11/14/collaborator-a-work-in-progress-by-daniel-kitson-jw9dw-pmpx5-krgll&#34;&gt;Daniel Kitson&amp;rsquo;s new show, Collaborator&lt;/a&gt; this week. One of the
most anxiety-inducing hours of my life. He handed out scripts to everyone,
some speaking parts, some not. And then everyone put on a play! Thankfully,
you didn&amp;rsquo;t &lt;em&gt;have&lt;/em&gt; to take part. It was amazing good!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitchellh.com/writing/github-changesets&#34;&gt;Reorient GitHub Pull Requests Around Changesets&lt;/a&gt; &amp;ndash; some great points here!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 124: Show me your feed</title>
      <link>https://elver.me/weeknotes/124-show-me-your-feed/</link>
      <pubDate>Sun, 12 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/124-show-me-your-feed/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I was prompted by &lt;a href=&#34;https://rknight.me/please-expose-your-rss/&#34;&gt;this Rob Knight post&lt;/a&gt; to make the RSS feed for this website
more visible. Have a look. Up there &lt;span style=&#34;display: inline-block;transform: rotate(25deg);&#34;&gt;👆&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://phoenixonrails.com/blog/why-im-in-the-tailwind-cult&#34;&gt;Why I&amp;rsquo;m in the Tailwind cult&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Master the art of Cascading Style Sheets - in particular the “cascading”
part, which refers to the hierarchical system by which style rules are
inherited or overridden - and you’ll be writing clean, composable, reusable,
readable, maintainable stylesheets that are a pleasure to work with and a
joy to behold.&lt;/p&gt;
&lt;p&gt;That’s what they told me I would discover. But twenty years later, I’m still
searching.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve seen a lot of people framing the Tailwind debate as &amp;ldquo;just learn CSS&amp;rdquo;,
without realising that a lot of people have tried that. CSS is &lt;em&gt;not perfect&lt;/em&gt;
regardless of how many times you imply it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I bought a new office chair &lt;a href=&#34;/weeknotes/4-bye-bye-comfort-hello-hugo/#:~:text=the%20chair%20arrived&#34;&gt;(again)&lt;/a&gt; &amp;ndash; a &lt;a href=&#34;https://www.amazon.co.uk/Steelcase-Ergonomic-Adjustable-Comfortable-Upholstery/dp/B0B32WXV5N/?th=1&#34;&gt;Steelcase Gesture&lt;/a&gt;. The uPVC pipe
holding up my previous Steelcase Leap V2 chair finally cracked.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had my eye on one of these for a while (2 years+), but they were a bit
hard to get hold of in the UK (only being sold by a couple of office
suppliers), but Amazon have started selling them now so I went for it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/11ty/eleventy/issues/3098&#34;&gt;Use tabs.&lt;/a&gt; &amp;ndash; a very ballsy move!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you plug a PC into an Apple Studio Display? It&amp;rsquo;s not as easy as you
might think. I basically haven&amp;rsquo;t used my PC since I got the Apple monitor
because I hadn&amp;rsquo;t solved this issue. I gave it a try this week.&lt;/p&gt;
&lt;p&gt;The PC has HDMI and DisplayPort &lt;strong&gt;out&lt;/strong&gt;, and the Studio Display only has
Thunderbolt-4 &lt;strong&gt;in&lt;/strong&gt;. &lt;a href=&#34;https://justin.searls.co/posts/connecting-a-gaming-pc-to-apple-studio-display/&#34;&gt;Justin Searls has a good blog post&lt;/a&gt; that was a great
help figuring out which cable to buy. I will report back on which cables I
bought and what did and didn&amp;rsquo;t work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A new font from GitHub, &lt;a href=&#34;https://monaspace.githubnext.com/&#34;&gt;Monaspace&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rails/rails/pull/49947&#34;&gt;YJIT will be enabled in Rails by default&lt;/a&gt; in a future release.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There was many public reports of 15-25% latency improvements for Rails apps
that did enable Ruby 3.2 YJIT, and in 3.3 it&amp;rsquo;s even better.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In order to try our various Elixir stuff when I see it, I keep a Phoenix app
around which I attempt to keep up-to-date, ready for experiments. I decided it
would be a good idea to document what the various experiments were and how
they worked, so I&amp;rsquo;ve been looking at using &lt;a href=&#34;https://hexdocs.pm/ex_doc/readme.html&#34;&gt;&lt;code&gt;ex_doc&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/elixir-lang/elixir/releases/tag/v1.16.0-rc.0&#34;&gt;Elixir v1.16.0-rc.0 release&lt;/a&gt; mentions that they have now added
&lt;a href=&#34;https://mermaid.js.org/&#34;&gt;Mermaid.js&lt;/a&gt; diagrams to the &lt;a href=&#34;https://hexdocs.pm/elixir/main/GenServer.html&#34;&gt;&lt;code&gt;GenServer&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;https://hexdocs.pm/elixir/main/Supervisor.html&#34;&gt;&lt;code&gt;Supervisor&lt;/code&gt;&lt;/a&gt; docs &amp;ndash; very
nice, and I plan on doing the same to my &lt;code&gt;ex_doc&lt;/code&gt; generated pages.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Finally, we have started enriching our documentation with Mermaid.js
diagrams. You can find examples in the GenServer and Supervisor docs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Elixir documentation story continues to get better and better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On that note, I wanted to automatically build my docs. &lt;code&gt;fswatch&lt;/code&gt; seems to be
the new kid on the run-things-when-files-change block, so I tried that.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fswatch -o docs/ | xargs -n1 -I{} mix docs
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It works well. You could use this to run tests too.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 123: This isn’t for you. It’s for me.</title>
      <link>https://elver.me/weeknotes/123-this-isnt-for-you-its-for-me/</link>
      <pubDate>Sun, 05 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/123-this-isnt-for-you-its-for-me/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.themoviedb.org/tv/204154-scavengers-reign&#34;&gt;Scavengers Reign&lt;/a&gt; is really good. I devoured 9 episodes in a couple of days
and can&amp;rsquo;t wait for the final 3 episodes of Season 1 next week.&lt;/p&gt;
&lt;p&gt;The series is based on the short &lt;a href=&#34;https://youtu.be/1TRzemJbUsw&#34;&gt;Scavengers&lt;/a&gt;, from 2016. I haven&amp;rsquo;t watched
yet because I&amp;rsquo;m avoiding spoilers, if any, but I will once I&amp;rsquo;ve finished the
series.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.sicpers.info/2023/10/ive-vastly-misunderstood-the-single-responsibility-principle/&#34;&gt;I’ve vastly misunderstood the Single Responsibility Principle&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The fact that I and so many others can hold a completely different view, for
so long, in the face of such obvious contradictory evidence, tells us
something about knowledge transfer in software engineering that we probably
ought to attend to.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Miles&amp;rsquo; &lt;a href=&#34;https://mileswoodroffe.com/articles/this-writing-experiment&#34;&gt;Reflections on Writing&lt;/a&gt; caused me to reflect on my own &amp;ldquo;writing&amp;rdquo; on
the web.&lt;/p&gt;
&lt;p&gt;I wanted to publish a blog for a long time. Blogging, believe it or not, was a
big deal in the past. Before Medium and Twitter, people wrote things on their
own websites. And some were pretty famous for it. My &lt;a href=&#34;https://jordanelver.co.uk/blog/&#34;&gt;main blog&lt;/a&gt; has been
around since 2008, but it is rarely updated. These weeknotes are the most
consistent I&amp;rsquo;ve ever been with publishing on the web. 123 times so far. Mostly
on a Sunday, occasionally on a Monday.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t post much before having weeknotes because I never thought I had
anything particularly interesting to say. Why would anyone read what I wrote?&lt;/p&gt;
&lt;p&gt;But then I realised this blog isn&amp;rsquo;t for &lt;em&gt;you&lt;/em&gt;. It&amp;rsquo;s for &lt;em&gt;me&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m still aware of the potential for an audience to read it, even though I try
to forget (and can assure you that the audience is very much &lt;em&gt;potential&lt;/em&gt; at
this stage), but I write because it helps me process, remember, and engage
with the things I write about.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Please add a feed to your blog. It&amp;rsquo;s not really a blog without a feed 😉&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ludic.mataroa.blog/blog/i-accidentally-saved-half-a-million-dollars/&#34;&gt;I Accidentally Saved Half A Million Dollars&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I would have been better off not doing anything. Let that be a lesson to
you. Do you hear me? I applied myself for five minutes against my own better
judgement, had the greatest success of my career, and have immediately been
punished for it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve seen this &lt;a href=&#34;https://news.ycombinator.com/item?id=15659076&#34;&gt;Hacker News comment&lt;/a&gt; pop-up a few times on social media but I&amp;rsquo;m
recording it here for posterity because I think it rings true.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Entrepreneurship is like one of those carnival games where you throw darts
or something.&lt;/p&gt;
&lt;p&gt;Middle class kids can afford one throw. Most miss. A few hit the target and
get a small prize. A very few hit the center bullseye and get a bigger
prize. Rags to riches! The American Dream lives on.&lt;/p&gt;
&lt;p&gt;Rich kids can afford many throws. If they want to, they can try over and
over and over again until they hit something and feel good about themselves.
Some keep going until they hit the center bullseye, then they give speeches
or write blog posts about &amp;ldquo;meritocracy&amp;rdquo; and the salutary effects of hard
work.&lt;/p&gt;
&lt;p&gt;Poor kids aren&amp;rsquo;t visiting the carnival. They&amp;rsquo;re the ones working it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Following on from my renewed interest in HTTP/2 and whether or not we can give
up on bundling, I finally got around to reading &lt;a href=&#34;https://csswizardry.com/2023/10/the-three-c-concatenate-compress-cache/&#34;&gt;The Three Cs: 🤝 Concatenate,
🗜️ Compress, 🗳️ Cache&lt;/a&gt; and it&amp;rsquo;s really good.&lt;/p&gt;
&lt;p&gt;The affects of latency explained:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Say we have one file that takes 1,000ms to download with 100ms of latency.
Downloading this one file takes:&lt;/p&gt;
&lt;p&gt;(1 × 1000ms) + (1 × 100ms) = 1,100ms&lt;/p&gt;
&lt;p&gt;Let’s say we chunk that file into 10 files, thus 10 requests each taking a
tenth of a second, now we have:&lt;/p&gt;
&lt;p&gt;(10 × 100ms) + (10 × 100ms) = 2,000ms&lt;/p&gt;
&lt;p&gt;Because we added ‘nine more instances of latency’, we’ve pushed the overall
time from 1.1s to 2s.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The conclusion: &amp;ldquo;Bundling is here to stay for a while.&amp;rdquo;. But it depends.&lt;/p&gt;
&lt;p&gt;Sidenote: I was very surprised to find that 66% of all websites are running
HTTP/2.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Elixir team have been working hard on improving documentation, and the
forthcoming Elixir 1.16 is looking great. &lt;a href=&#34;https://www.elixirstreams.com/tips/elixir-1-16-improved-docs&#34;&gt;German Velasco shows the new
features in this video&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.testdouble.com/posts/2023-10-10-16-things-you-believe-about-software&#34;&gt;16 things you believe about software: A retrospective on the Searls-Briggs
Type Indicator®&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;most developers seem to love long, detailed commit messages and
carefully-coiffed revision histories&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The amount of times I&amp;rsquo;ve longed for an explanation as to &lt;em&gt;why&lt;/em&gt; something was
changed only to be met with &amp;ldquo;Changed x&amp;rdquo;. I wish this was my experience. But
it&amp;rsquo;s not.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The hard thing about programming, it turns out, isn’t to spell out each step
of complexity so computers will understand, but to organize it
comprehensibly so that humans will.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Amen to that. Hardly any of the systems I work on are trying to do this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I heard on the &lt;a href=&#34;https://changelog.com/podcast/562&#34;&gt;Changelog podcast episode 562&lt;/a&gt; that &lt;a href=&#34;https://ntfy.sh/&#34;&gt;ntfy&lt;/a&gt;, a service that
lets you send notifications to your phone or desktop via scripts, runs using a
SQLite database and &lt;a href=&#34;https://changelog.com/podcast/562#transcript-97&#34;&gt;currently sends nearly 700k messages&lt;/a&gt; a day. More SQLite
usage in the wild.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dear reader, I have read a book (&lt;a href=&#34;https://www.goodreads.com/book/show/123669877-berserker&#34;&gt;Berserker! by Adrian Edmondson&lt;/a&gt; &amp;ndash; it was
good!). That makes 2 books in 2023, &lt;em&gt;so far&lt;/em&gt;. Only 22 to go to reach the
self-imposed challenge I set upon myself at the start of the year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some interesting discussion on &lt;a href=&#34;https://yagni.fm/episodes/friday-deploys-w-charity-majors&#34;&gt;Friday Deploys by Charity Majors and Matt
Swanson on the YAGNI podcast&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It reminded me of a place I used to work where we did quarterly releases. That
was bad enough, but for every change you made in that quarter you had to fill
in a Word document that listed the files you&amp;rsquo;d changed&amp;hellip;&lt;/p&gt;
&lt;p&gt;Did we have source control at the time? Yes, we did, &lt;a href=&#34;https://subversion.apache.org/&#34;&gt;Subversion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The paperwork made people feel better, but did absolutely nothing to reduce
risk of the release being deployed to production. Like taking your shoes off
at the airport.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On the same podcast, Charity says &amp;ldquo;I think the cultural message though of
you&amp;rsquo;re writing tests therefore you&amp;rsquo;re safe is just not true&amp;rdquo; (Transcribed
using &lt;a href=&#34;https://news.livebook.dev/speech-to-text-with-whisper-timestamping-streaming-and-parallelism-oh-my---launch-week-2---day-2-36osSY&#34;&gt;Livebook Whisper Speech-to-Text&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I couldn&amp;rsquo;t agree with this more. They give you confidence that you&amp;rsquo;re &lt;em&gt;safer&lt;/em&gt;,
but they don&amp;rsquo;t reduce risk to zero. No change is fully safe.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 122: Closing all buffers</title>
      <link>https://elver.me/weeknotes/122-closing-all-buffers/</link>
      <pubDate>Sun, 29 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/122-closing-all-buffers/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://protomaps.com/&#34;&gt;Protomaps - A free and open source map of the world&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Protomaps is an open source map of the world, deployable as a single static
file on cloud storage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I will have to remember this next time I need a map.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://sqlite.org/wasm/doc/trunk/index.md&#34;&gt;Hosting SQLite databases on Github Pages&lt;/a&gt; 🤯&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hosting a static website is much easier than a &amp;ldquo;real&amp;rdquo; server - there’s many
free and reliable options (like GitHub, GitLab Pages, Netlify, etc), and it
scales to basically infinity without any effort. So I wrote a tool to be
able to use a real SQL database in a statically hosted website!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This led to &lt;a href=&#34;https://sqlite.org/wasm/doc/trunk/index.md&#34;&gt;official support for Wasm from SQLite&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been &lt;del&gt;mucking about with&lt;/del&gt; improving my Neovim workflow a bit this week
(or attempting to anyway) after I took part in some pairing with another
developer and found myself flailing about. As a result I learnt about
&lt;code&gt;iskeyword&lt;/code&gt; in Neovim.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;iskeyword&lt;/code&gt; tells Neovim what to consider a &amp;ldquo;word&amp;rdquo;. In particular this affects
word motions using &lt;code&gt;w&lt;/code&gt; and searching using &lt;code&gt;*&lt;/code&gt;. When I am focussed on a word
and hit &lt;code&gt;*&lt;/code&gt; it searches for that word in the current buffer.&lt;/p&gt;
&lt;p&gt;By default &lt;code&gt;iskeyword&lt;/code&gt; includes all the normal &amp;ldquo;word&amp;rdquo; characters you would
expect, but it can be useful for this setting to include other characters
dependant on the context. For example, Ruby code often has methods which end
with &lt;code&gt;?&lt;/code&gt; or &lt;code&gt;!&lt;/code&gt;. In that case if you want to search for a method name which
ended with a &lt;code&gt;?&lt;/code&gt; the default &lt;code&gt;iskeyword&lt;/code&gt; setting would &lt;em&gt;not&lt;/em&gt; include it. (I&amp;rsquo;ve
been working around this by visually selecting the whole method name and then
hitting &lt;code&gt;*&lt;/code&gt;, but this is slow and error prone).&lt;/p&gt;
&lt;p&gt;So, &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/1ab0f2211832d33ebecf74f3f54d5afda79a3f15&#34;&gt;I&amp;rsquo;ve included &lt;code&gt;?&lt;/code&gt; and &lt;code&gt;!&lt;/code&gt; in my &lt;code&gt;iskeyword&lt;/code&gt; setting for Ruby files&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m slightly hesitant about this change because it feels like it could have
far reaching affects, but I will see how it goes. So far, so good. It
certainly seems to work.&lt;/p&gt;
&lt;p&gt;Reference: &lt;a href=&#34;https://vi.stackexchange.com/a/18508/28669&#34;&gt;https://vi.stackexchange.com/a/18508/28669&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve also been working on a way to clear out buffers I no longer need. Closing
all buffers is easily achieved with &lt;code&gt;:%bd&lt;/code&gt;, but I often only want to close
&lt;em&gt;some&lt;/em&gt; and that is more of a hassle.&lt;/p&gt;
&lt;p&gt;It turns out that I already had &lt;a href=&#34;https://github.com/jordelver/dotfiles/blob/6af402ae0af31ab9f07301f8a46df09ea31cd298/config/nvim/lua/functions.lua#L35-L43&#34;&gt;&lt;code&gt;:BD&lt;/code&gt; command&lt;/a&gt; which allowed fuzzy finding
and deleting of buffers using &lt;code&gt;fzf&lt;/code&gt;, but I had forgotten about it, and now
that I&amp;rsquo;m all in on the Telescope lifestyle it would be good to have something
that fits in with that.&lt;/p&gt;
&lt;p&gt;So now &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/6af402ae0af31ab9f07301f8a46df09ea31cd298&#34;&gt;I can hit &lt;kbd&gt;ctrl&lt;/kbd&gt; &lt;kbd&gt;d&lt;/kbd&gt;&lt;/a&gt; when using &lt;code&gt;Telescope buffers&lt;/code&gt;
command and buffers will be removed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://varnish-cache.org/docs/trunk/phk/h2againagainagain.html&#34;&gt;On the deck-chairs of HTTP/2&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unless you have solid numbers to show that H2 is truly improving things for
you and your clients, you should just turn it off.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Someone is not a fan of HTTP/2.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://heather-buchel.com/blog/2023/10/why-your-web-design-sucks/&#34;&gt;It&amp;rsquo;s 2023, here is why your web design sucks.&lt;/a&gt; It does, indeed, suck.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://island94.org/&#34;&gt;Ben Sheldon&lt;/a&gt; of &lt;a href=&#34;https://github.com/bensheldon/good_job&#34;&gt;GoodJob&lt;/a&gt; &lt;a href=&#34;https://island94.org/2023/10/reflections-on-good-job-for-solid-queue&#34;&gt;reflects on job queue design&lt;/a&gt; in the context of
Rails including a new job queue by default called Solid Queue.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GoodJob targets the small and medium end of projects (though some big ones
use it too) and prioritizes operational simplicity over performance. That
works for me (and a lot of others!) but also isn’t really reflective of the
scale of companies leading Rails development. There’s a tension here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The reality is that &lt;em&gt;a lot&lt;/em&gt; of projects will probably be fine storing their
jobs in a database. Maybe not your Shopifys or your GitHubs, but lots of
people.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve not had the chance to use GoodJob, but it seems similar to &lt;a href=&#34;https://github.com/sorentwo/oban&#34;&gt;Oban&lt;/a&gt; in that
it leans heavily on Postgres-only features (although Oban also supports SQLite
so I&amp;rsquo;m not sure what they do there?) so it will be interesting to see how this
ends up working with MySQL, which some big players are keen on.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GoodJob maintains a lot of bookkeeping, keeping job and granular execution
data around after execution so it can be inspected.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This has been my experience in my experiments with Oban. Being able to &lt;em&gt;see&lt;/em&gt;
the jobs after they have executed is massively helpful. With Sidekiq the jobs
just disappear into the ether. This is surely by design to sell Sidekiq Pro,
which is absolutely fair enough.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m definitely interested in seeing what Solid Queue might become.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Back to the gym properly this week after &lt;em&gt;several&lt;/em&gt; weeks off due to a
combination of laziness and travel 🏋️&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 121: Self closing tag</title>
      <link>https://elver.me/weeknotes/121-self-closing-tag/</link>
      <pubDate>Sun, 22 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/121-self-closing-tag/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It was properly cold at one point this week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not getting on with Slack&amp;rsquo;s new workspace dropdown selector thingy?&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cmd&lt;/code&gt;-&lt;code&gt;shift&lt;/code&gt;-&lt;code&gt;s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re welcome (sorry, can&amp;rsquo;t remember where I saw this 🙈).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I remember the transition to XHTML and then onto HTML 5 but I have to admit
that I never really understood what was going on, just that it was &amp;ldquo;better&amp;rdquo;
and more &amp;ldquo;correct&amp;rdquo; and could be &amp;ldquo;parsed&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;So here I am now confused about why, and if, we should be self-closing tags
aka, your friend and mine:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;tag /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&#34;https://jakearchibald.com/2023/against-self-closing-tags-in-html/&#34;&gt;Jake Archibald&lt;/a&gt; and &lt;a href=&#34;https://remysharp.com/2023/10/09/why-i-stopped-loving-slashes-in-self-closing-tags&#34;&gt;Remy Sharp&lt;/a&gt; both had excellent articles on the subject.
Jake&amp;rsquo;s goes into the history of how we go into this situation, but also notes
that self-closing is not really required any more.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;And that&amp;rsquo;s where things are today. /&amp;gt; is mostly meaningless in HTML
documents, with foreign content being the exception.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Which Remy agrees with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In short, what I&amp;rsquo;m saying say is that the / character is completely and
utterly redundant in HTML as a way of saying this is self closing. It has no
effect and, effectively, is ignored.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But he also points out that JSX is not really HTML.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The thing that&amp;rsquo;s easy to forget is that JSX is a language that only lives
inside the React compilers. It looks like HTML but it&amp;rsquo;s not HTML, at all.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;React and JSX specifically is to blame for putting this back into the
mainstream development process as JSX offers this as a prerequisite of it&amp;rsquo;s
language.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m happy report with can blame React and JSX.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://world.hey.com/dhh/the-price-of-managed-cloud-services-4f33d67e&#34;&gt;The price of managed cloud services&lt;/a&gt; by DHH.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because running things on premise is not a materially different scope of
work from running it in the cloud. That&amp;rsquo;s the whole premise behind our
overall cloud exit: The team it takes to run our scale of operations in the
cloud wasn&amp;rsquo;t any less than what it takes to run that same scale on our own
hardware.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can believe this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dashbit.co/blog/latency-rendering-liveview&#34;&gt;Supercharge your app: latency and rendering optimizations in Phoenix LiveView&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Fascinating walk-through the optimisation the Phoenix team have made to
LiveView over time. Chipping away bit by bit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://bsd.network/@solene/111249266470247090&#34;&gt;&lt;code&gt;git pull --autostash&lt;/code&gt;&lt;/a&gt; &amp;ndash; where have you been all my life?!&lt;/p&gt;
&lt;p&gt;Saves the constant &lt;code&gt;git stash&lt;/code&gt;, &lt;code&gt;git pull&lt;/code&gt;, &lt;code&gt;git stash pop&lt;/code&gt; 💃 dance that I do
every day. You can also configure this to be the default behaviour in your
config file with &lt;code&gt;merge.autoStash&lt;/code&gt; option.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ghuntley.com/fracture/&#34;&gt;Visual Studio Code is designed to fracture&lt;/a&gt; (via &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Microsoft gonna Microsoft. &lt;a href=&#34;https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish&#34;&gt;Embrace, extend, and extinguish&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://notes.valdikss.org.ru/jabber.ru-mitm/&#34;&gt;Encrypted traffic interception on Hetzner and Linode targeting the largest
Russian XMPP (Jabber) messaging service&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TL;DR: we have discovered XMPP (Jabber) instant messaging protocol encrypted
TLS connection wiretapping (Man-in-the-Middle attack) of jabber.ru (aka
xmpp.ru) service’s servers on Hetzner and Linode hosting providers in
Germany.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://matklad.github.io/2023/10/18/obligations.html&#34;&gt;Unless Explicitly Specified Otherwise, Open Source Software With Users
Carries Moral Obligations&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The subtle point here is, if I make an Open Source Project, push it to some
forge, write a nice readme explaining why one would want to use it, provide
one-liner for installation, and publish builds to some package registries, I
am already creating some expectations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As a non-maintainer who barely contributes, I agree with this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://open.spotify.com/album/2KqSL3vLfyVO7rrZJL9tUs&#34;&gt;Sufjan Steven&amp;rsquo;s new album, Javelin&lt;/a&gt;, is 👌&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 120: Maybe both sides are correct</title>
      <link>https://elver.me/weeknotes/120-maybe-both-sides-are-correct/</link>
      <pubDate>Sun, 15 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/120-maybe-both-sides-are-correct/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You might have heard something on the &lt;a href=&#34;https://world.hey.com/dhh/you-can-t-get-faster-than-no-build-7a44131c&#34;&gt;Internet about HTTP/2 and no build
JavaScript&lt;/a&gt;? (I saw &lt;a href=&#34;https://www.youtube.com/watch?v=iqXjGiQ_D-A&amp;amp;t=81s&#34;&gt;the keynote at Rails World&lt;/a&gt; last week). I planned on
writing something more substantial but I haven’t got the facts or energy
required.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=jKC0OQC5UDw&#34;&gt;The Primeagen&amp;rsquo;s take is very fair&lt;/a&gt; &amp;ndash; &amp;ldquo;Maybe both sides are correct&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Someone in his Twitch stream: &amp;ldquo;Nuance? On the Internet?&amp;rdquo; &amp;ndash; I think that sums
it up for me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In related news, you should be aware that &lt;a href=&#34;https://github.com/heroku/roadmap/issues/34#issuecomment-1739992565&#34;&gt;HTTP/2 is not yet supported on Heroku&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;(You probably shouldn&amp;rsquo;t be serving assets from Heroku anyway).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;del&gt;Chicago trip next week 🪁&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;I managed to pick up a cold whilst in Amsterdam. Long story short, Chicago
didn&amp;rsquo;t happen 🫤&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you want to check whether you&amp;rsquo;ve enabled &lt;a href=&#34;https://docs.ruby-lang.org/en/master/yjit/yjit_md.html&#34;&gt;YJIT&lt;/a&gt; in your Ruby environment,
&lt;a href=&#34;https://til.simplificator.com/posts/82&#34;&gt;you can check from the console&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ irb
irb(main):001:0&amp;gt; RubyVM::YJIT.enabled?
=&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jose Valim and team are had another &lt;a href=&#34;https://news.livebook.dev/label/45764&#34;&gt;Livebook &amp;ldquo;Launch Week&amp;rdquo;&lt;/a&gt; this week where
they unveiled some really nice new features: &lt;a href=&#34;https://news.livebook.dev/introducing-file-integration---launch-week-2---day-3-2HoFfa&#34;&gt;File Integration&lt;/a&gt; and a
&lt;a href=&#34;https://news.livebook.dev/remote-execution-smart-cell---launch-week-2---day-1-m3dv2&#34;&gt;Remote execution Smart cell&lt;/a&gt; were the highlights for me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://front-end.social/@jensimmons/111212178918345738&#34;&gt;Jen Simmons tooted&lt;/a&gt; that the CSS Working Group are adding a new CSS rule to
allow form input and textarea elements to grow, something normally you&amp;rsquo;d need
JavaScript for.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You know how, by default, the &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; field stays the same size when
people type sentences into the form field? The CSS Working Group is creating
a new CSS property so you can style a form field (&lt;code&gt;text-area&lt;/code&gt;  and &lt;code&gt;input&lt;/code&gt;)
to grow fit its content —so you don’t have to use JavaScript to do this!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=pQ0CvjAJXz4&#34;&gt;Bryan Hunter spoke at GigCityElixir23 about a project called Waterpark&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The project is a data pipeline of sorts for a healthcare company and has high
requirements for availability, which took them on a path towards an unusual
architecture where each patient is modelled as a process within the Erlang VM,
and all data is stored with that process. A copy of each process is then
replicated, using distributed Elixir, across to to geographically different
nodes to stand-by in case the original process dies. No database involved.&lt;/p&gt;
&lt;p&gt;Very interesting 🧠&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href=&#34;https://www.reddit.com/r/neovim/comments/172fl46/set_spelloptionscamel/&#34;&gt;post on the Neovim subreddit drew my attention to &lt;code&gt;set spelloptions=camel&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When a word is CamelCased, assume &amp;ldquo;Cased&amp;rdquo; is a separate word: every
upper-case character in a word that comes after a lower case character
indicates the start of a new word.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So without &lt;code&gt;spelloptions=camel&lt;/code&gt;, &amp;ldquo;LiveBook&amp;rdquo; would be considered a spelling
mistake, but with it, it is not. &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/15361a9ce5c4132f74e74687f0957f06eaa80111&#34;&gt;I&amp;rsquo;ve added it to my config&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://joshcollinsworth.com/blog/tailwind-is-smart-steering&#34;&gt;Classic rock, Mario Kart, and why we can&amp;rsquo;t agree on Tailwind&lt;/a&gt; &amp;ndash; an
interesting take on Tailwind CSS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/chacon/status/1713442709409501388&#34;&gt;From Scott Chacon&lt;/a&gt;, one of the very first GitHub employees, on the naming of
&amp;ldquo;Pull Request&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For those of you too young, the @github naming comes from this Git builtin:
&lt;a href=&#34;https://git-scm.com/docs/git-request-pull&#34;&gt;https://git-scm.com/docs/git-request-pull&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had no idea.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 119: AirPods Pro wanker</title>
      <link>https://elver.me/weeknotes/119-airpods-pro-wanker/</link>
      <pubDate>Sun, 08 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/119-airpods-pro-wanker/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I attended &lt;a href=&#34;https://rubyonrails.org/world&#34;&gt;Rails World&lt;/a&gt; in Amsterdam this week. I&amp;rsquo;m writing this in Schiphol
Airport.&lt;/p&gt;
&lt;p&gt;Mixed feelings. There was some good stuff, some not so good stuff, and a few
disappointing things. I&amp;rsquo;m not sure how I feel about it at the moment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I forgot to say last week, I’m now an AirPods Pro wanker. I decided to give
them a go because I wanted something with good sound-cancelling abilities for
an upcoming flight.&lt;/p&gt;
&lt;p&gt;I have to say, they’re really good. The sound cancelling is excellent. But the
best feature is the lack of friction using them. They are (almost) always
connected to the correct device somehow &amp;ndash; the opposite of my Sony
WF-1000XM3&amp;rsquo;s which I hardly use as a result. Regular Bluetooth devices
constantly need pairing and unpairing. The AirPods are always just ready.&lt;/p&gt;
&lt;p&gt;Really happy with them so far.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You know what? After using a USB-C iPhone for a couple of weeks it&amp;rsquo;s made me
realise that the Lightening connector was really quite good. The rounded
edges. The satisfying snap into place. It’s just a shame it grew old and never
worked outside of the Apple ecosystem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m a regular listener of the &lt;a href=&#34;https://atp.fm/&#34;&gt;ATP podcast&lt;/a&gt;, and one of the hosts, &lt;a href=&#34;https://www.caseyliss.com/2023/8/7/callsheet&#34;&gt;Casey
Liss, recently released a new iOS app called Callsheet&lt;/a&gt; which is an
alternative to IMDB. Basically, an ad-free, fast, &lt;em&gt;nice&lt;/em&gt; experience. I was
very in the &amp;ldquo;Why would I pay for this app?&amp;rdquo; camp until I used it for a bit,
and it became clear it was worth the yearly subscription.&lt;/p&gt;
&lt;p&gt;Anyway, the reason I&amp;rsquo;m telling you all this is because &lt;a href=&#34;https://www.caseyliss.com/2023/9/20/callsheet-2023-4#:~:text=now%20shows%20what%20you%E2%80%99re%20actively%20playing%20in%20channels%20and%2C%20experimentally%2C%20plex&#34;&gt;he recently released a
cool integration with Plex&lt;/a&gt;. If you have something playing on Plex when you
open the app it automatically looks up what you&amp;rsquo;re watching and shows it at
the top of the app!&lt;/p&gt;
&lt;p&gt;(If you have trouble getting it working, like I did, &lt;a href=&#34;https://mastodon.social/@caseyliss/111165429769180005&#34;&gt;try these instructions
on Mastodon&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new &lt;code&gt;Phoenix.LiveView.assign_async&lt;/code&gt; and &lt;code&gt;Phoenix.Component.async_result&lt;/code&gt;
functions in  LiveView 0.20.0 look to be very helpful.&lt;/p&gt;
&lt;p&gt;This is a nice guide &amp;ndash; &lt;a href=&#34;https://johnelmlabs.com/posts/async-assigns&#34;&gt;How to Use LiveView&amp;rsquo;s Async Assigns&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As an &lt;code&gt;asdf&lt;/code&gt; user I like to keep a &lt;code&gt;.tool-versions&lt;/code&gt; file in my projects. That
way I can specify everything I need in one place. Typically, this might
include Ruby, Elixir, PostreSQL, or Redis versions.&lt;/p&gt;
&lt;p&gt;However, for Ruby projects you need to specify a Ruby version in the project
&lt;code&gt;Gemfile&lt;/code&gt;. Now we need to update it in two places. Duplication of a version
number is bad.&lt;/p&gt;
&lt;p&gt;Good news! bundler now supports &lt;a href=&#34;https://github.com/rubygems/rubygems/pull/6876&#34;&gt;reading the version number from either a
&lt;code&gt;.ruby-version&lt;/code&gt;&lt;/a&gt; or &lt;a href=&#34;https://github.com/rubygems/rubygems/pull/6898&#34;&gt;&lt;code&gt;.tool-versions&lt;/code&gt;&lt;/a&gt; file 😎&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ruby file: &#39;.ruby-version&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, if you deploy to Heroku there is a small spanner in the works. I had
no idea about this, but &lt;a href=&#34;https://devcenter.heroku.com/articles/ruby-support#libraries&#34;&gt;Heroku always uses certain versions of &lt;code&gt;bundler&lt;/code&gt; when
you deploy&lt;/a&gt; (currently &lt;code&gt;2.3.25&lt;/code&gt;), so we can&amp;rsquo;t use this new feature until the
&lt;a href=&#34;https://github.com/heroku/heroku-buildpack-ruby/blob/9d5d8c4732b6962e12981f5948ca72d7b40dca0a/lib/language_pack/helpers/bundler_wrapper.rb#L40&#34;&gt;Heroku buildpack is updated&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We can &lt;a href=&#34;https://andycroll.com/ruby/read-ruby-version-in-your-gemfile/&#34;&gt;work around it using this hack&lt;/a&gt; until &lt;code&gt;&amp;gt;= 2.4.20&lt;/code&gt; is available.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ruby File.read(&amp;quot;.ruby-version&amp;quot;).strip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not perfect, but still better than having multiple Ruby version numbers in the
codebase.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://chanind.github.io/rails/2019/03/28/why-i-miss-rails.html&#34;&gt;&amp;ldquo;Why I miss Rails&amp;rdquo;&lt;/a&gt;. &lt;a href=&#34;https://jasoncharnes.com/&#34;&gt;Jason Charnes&lt;/a&gt; mentioned this blog post in his
&lt;a href=&#34;https://rubyonrails.org/world&#34;&gt;Rails World&lt;/a&gt; talk.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All these things that used to be easy in Rails take a fair bit of manual
effort today because there’s not a standardized setup and eco-system. We’re
spending a lot of time re-solving all these boilerplate issues that every
web app needs and everyone has already solved countless times before.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rails is still here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://herman.bearblog.dev/how-i-stay-motivated-as-a-solo-creator/&#34;&gt;How I stay motivated as a solo-creator&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For one, my income is somewhat tied to my productivity, and my productivity
highly correlates to my state of mind.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is the most important point for me, and perhaps the hardest one to
fulfil. When going down the early stages of product development the main
question on my mind is &amp;ldquo;If this project works out, do I want to spend the
next few years working on it?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, the trick is: work on something that interests you. Hopefully that can
crossover with something that makes money&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mastodon.social/@DiConX/111166456905357384&#34;&gt;Sebastian Staacks is making a wooden Gameboy case&lt;/a&gt;. Looks awesome!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chicago trip next week 🪁&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 118: Grazing the tops of houses</title>
      <link>https://elver.me/weeknotes/118-grazing-the-tops-of-houses/</link>
      <pubDate>Sun, 01 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/118-grazing-the-tops-of-houses/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I wanted to stash only a few files this week and it hadn&amp;rsquo;t occurred to me that
&lt;code&gt;git stash&lt;/code&gt; would take a &lt;code&gt;--patch&lt;/code&gt;, but like many other &lt;code&gt;git&lt;/code&gt; commands, it
does (try out &lt;code&gt;add&lt;/code&gt; and &lt;code&gt;checkout&lt;/code&gt; with &lt;code&gt;--patch&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve had a balloon ride voucher (that was bought for a birthday present) ready
to be used for about approximately 3 years. Because of COVID and cancellations
due to the weather (6 times!) it was still unused. This Monday the weather was
&lt;em&gt;just&lt;/em&gt; right and we managed to take the trip.&lt;/p&gt;
&lt;p&gt;It was was amazing. I wouldn&amp;rsquo;t say I&amp;rsquo;m scared of heights, but I am scared of
falling to my death. It was surprisingly calming though.&lt;/p&gt;
&lt;p&gt;However, the end was almost better. As we were getting lower and lower, almost
grazing the tops of houses, people on the ground started to notice us and
began coming  following the balloon to it&amp;rsquo;s landing place on a local playing
field. The pilot let the kids from the houses climb into the basket and got
them involved in packing up the balloon. They were all so excited. It was
really lovely. Some stories told at school the next day, for certain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.railway.app/p/railway-v2#welcome-to-v2&#34;&gt;Introducing Railway V2&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;They say the day you delete all the Kubernetes code from your codebase is
the day you truly start living&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jenson.org/text/&#34;&gt;The invisible problem by Scott Jenson&lt;/a&gt; had me nodding throughout.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Whenever I explain my research at Google into mobile text editing, I’m
usually met with blank stares or a slightly hostile “Everyone can edit text
on their phones, right? What’s the problem?”&lt;/p&gt;
&lt;p&gt;Text editing on mobile isn’t ok.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I find typing into my phone infuriating most of the time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ruby.social/@garrettdimon/111098708322288267&#34;&gt;&amp;ldquo;Today&amp;rsquo;s obscure Rails discovery&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;has_secure_password&lt;/code&gt; validates password character length using the string&amp;rsquo;s
character size (72) but the real limitation is driven by Bcrypt&amp;rsquo;s limit of
72 &lt;em&gt;bytes&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So it&amp;rsquo;s possible to have a 72-character password that passes ActiveRecord
validations but fails to satisfy BCrypt&amp;rsquo;s limit if one of the characters is
multi-byte.&lt;/p&gt;
&lt;p&gt;Unfortunately, it seems that when this happens, it is not considered valid,
but an error is not added to the model&amp;rsquo;s errors.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git tip! Find the history of a particular function/method/whatever in a file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git log -L :method_name:path/to/file
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is super handy because sometimes you are only interested in the history
of a particular function, not the whole file.&lt;/p&gt;
&lt;p&gt;From &lt;a href=&#34;https://dev.to/soniasingla/git-tracking-method-function-history-332g&#34;&gt;Git - Tracking method/function history&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I started watching &lt;a href=&#34;https://www.imdb.com/title/tt10574236/&#34;&gt;Station Eleven&lt;/a&gt; &amp;ndash; enjoying it so far. I also watched a
couple of films this week: &lt;a href=&#34;https://www.imdb.com/title/tt13957560/&#34;&gt;Dumb Money&lt;/a&gt; and &lt;a href=&#34;https://www.imdb.com/title/tt11858890/&#34;&gt;The Creator&lt;/a&gt;, I enjoyed both, but
The Creator stood out &amp;ndash; amazing world building.&lt;/p&gt;
&lt;p&gt;Yes, the &lt;a href=&#34;/weeknotes/117-nae-good-pal/#:~:text=this%20applies%20to%20the%20cinema%20too&#34;&gt;audience were well behaved&lt;/a&gt;. Thanks for asking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=giYbq4HmfGA&#34;&gt;ElixirConf 2023 - José Valim - The foundations of the Elixir type system&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The type system being worked on by the Elixir team is exciting. It &lt;em&gt;sounds&lt;/em&gt;
like they&amp;rsquo;ve found a nice balance between type safety and ease of use. At
least to my Type ignorant brain.&lt;/p&gt;
&lt;p&gt;It seems very intentional and will be gradual. I think a lot of people were
worried that it would be a big-bang change and be forced on users, but it
doesn&amp;rsquo;t sound that way at all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/90-collect-your-internet/#:~:text=i%E2%80%99m%20now%20using%20it%20full%20time&#34;&gt;Arc update&lt;/a&gt;. I&amp;rsquo;m still using it full-time and loving it. However, I&amp;rsquo;m no
longer using it to save pages for reading later, the mobile app is just too
flaky and often just doesn&amp;rsquo;t work, which is a real shame.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Amsterdam trip next week for Rails World. Two day week ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No mention of weight loss or side project? Both fucked.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 117: Nae good, pal</title>
      <link>https://elver.me/weeknotes/117-nae-good-pal/</link>
      <pubDate>Sun, 24 Sep 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/117-nae-good-pal/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theguardian.com/commentisfree/2023/sep/14/behaviour-music-gigs-live-shows&#34;&gt;People’s behaviour at music gigs is getting worse. I have three rules to
solve that | Simon Price&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hard to argue with this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1. Shut Up. 2. Put Your Phone Away. 3. Don’t Be a Dick.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This applies to the cinema too, unfortunately.&lt;/p&gt;
&lt;p&gt;My only weapon against these selfish people is, as bourgeois as it may sound,
going to the £18 a ticket cinema where the ratio of poorly behaved people
&lt;em&gt;tends&lt;/em&gt; to be better, but is still not certain. I&amp;rsquo;m guessing because £18 is a
lot more money to waste than the fiver you spend in some cinemas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://witchhazel.thea.codes/&#34;&gt;Witchhazel is a nice colourscheme&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A dark &amp;amp; feminine color scheme for Sublime, VS Code, JetBrains, Pygments,
Atom, and Vim.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theguardian.com/business/2023/sep/18/post-office-horizon-scandal-victims-compensation&#34;&gt;&amp;ldquo;Post Office: Horizon scandal victims to receive £600,000 compensation each&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not enough.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;After the scandal, it emerged that about £1.6m in bonus payments had been
made to executives. The progress of the Horizon inquiry was one of four
metrics on which bonus payments were awarded.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Disgraceful. People died.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Shopify/pitchfork/commit/38c0a16e45b92372b304893d857604f3984fb1af&#34;&gt;&amp;ldquo;Pitchfork is no longer experimental&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It has been running Shopify&amp;rsquo;s monolith for over 3 months now
it is safe to assume major issues have been ironed out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can now &lt;a href=&#34;https://tailscale.com/blog/apple-tv/&#34;&gt;run Tailscale on your Apple TV&lt;/a&gt;. Presumably using this in
conjunction with their &lt;a href=&#34;https://tailscale.com/kb/1218/nextdns/&#34;&gt;NextDNS&lt;/a&gt; and &lt;a href=&#34;https://tailscale.com/kb/1258/mullvad-exit-nodes/&#34;&gt;Mullvad&lt;/a&gt; integrations opens up many
viewing possibilities?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://signal.org/blog/pqxdh/&#34;&gt;Signal are rolling out a new version of their protocol, PQXDH&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The timeline for when a sufficiently powerful quantum computer may be
created is a matter of great debate. On the low end, some argue it is only a
couple of years away. On the high end some say 30+ years, and there are even
those who assert that we may never solve the challenges necessary to make a
quantum computer with enough coherent qubits to break the current public key
cryptosystems. The middle ground seems to be around the 5 to 10 year time
horizon.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tako8ki/frum&#34;&gt;frum, a new Ruby version manager&lt;/a&gt; written in, wait for it&amp;hellip;Rust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hachyderm.io/@tcook/111089002676039010&#34;&gt;iOS 17 can strip tracking params from URLs&lt;/a&gt; 👏&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;URLs in iOS 17 can be stripped of all tracking information appended to the
end of the URL so that websites cannot track your browsing using URL
identifiers. This function is enabled auto-magically for private browsing in
iOS 17, but it can be turned on for all browsing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=1u08QZyjguo&#34;&gt;Gitlab DELETING Production Databases&lt;/a&gt; &amp;ndash; This made me feel physically sick.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.youtube.com/watch?v=1u08QZyjguo&amp;amp;t=54s&#34;&gt;point about reviewing your PR inside the web browser&lt;/a&gt; is very true in my
experience. Something about seeing the code in a different context makes
mistakes far more obvious. I nearly always publish PRs as soon as I can for
this reason.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dnsimple.com/r/d7a9918c2a5dd7&#34;&gt;DNSimple, whom I use for DNS&lt;/a&gt;, have launched new pricing which works out at
$2 per month for me, instead of the $6 I&amp;rsquo;ve been paying. A compelling reason
to stay as a customer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Weight loss progress &amp;ndash; nae good, pal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 116: Consumer whore</title>
      <link>https://elver.me/weeknotes/116-consumer-whore/</link>
      <pubDate>Sun, 17 Sep 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/116-consumer-whore/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Four days of this week were spent in Wrocław, Poland. It&amp;rsquo;s a pretty place with
an interesting history. I would recommend it. Back to work on Friday.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From &lt;a href=&#34;https://hachyderm.io/@zcutlip/111059359380216265&#34;&gt;this thread on Mastodon about toggling hidden files in Finder&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But did you know you can use shift-command-. (dot or period) in Finder to
toggle hidden file visibility?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;kbd&gt;Shift&lt;/kbd&gt; + &lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;.&lt;/kbd&gt; &amp;ndash; I did not know that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can now &lt;a href=&#34;https://tailscale.com/blog/mullvad-integration/&#34;&gt;set a Mullvad VPN location as your Exit Node&lt;/a&gt; when connected to
your tailnet. I already use Mullvad and have paid up for a year so I won&amp;rsquo;t be
switching just yet, but I like the integration.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tailscale has partnered with Mullvad to make its global network of VPN
servers available for our customers. You can now easily browse the web using
any one of Mullvad’s available servers as a Tailscale exit node while
maintaining the user privacy that’s synonymous with Mullvad.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When someone asks a question but they&amp;rsquo;re not getting an answer, offer a
suggestion even if you know it’s incorrect. Others will jump in to tell you
you’re wrong and the original poster will get their answer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fractaledmind.github.io/about/&#34;&gt;Stephen Margheim&lt;/a&gt; has written a &lt;a href=&#34;https://fractaledmind.github.io/2023/09/06/enhancing-rails-sqlite-branch-databases/#all-posts-in-this-series&#34;&gt;series of blog posts about using SQLite&lt;/a&gt;
with Rails. Very informative. He&amp;rsquo;s also working on adding various improvements
to Rails&amp;rsquo; SQLite adaptor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I pre-ordered an iPhone 15 Pro because &lt;a href=&#34;https://www.youtube.com/watch?v=OjFxc75zuUE&#34;&gt;I&amp;rsquo;m a consumer whore&lt;/a&gt; (a process which
was incredibly bad).&lt;/p&gt;
&lt;p&gt;Now I embark on an epic journey into the confusing world of USB-C cables &amp;ndash; a
cable which often &lt;em&gt;looks&lt;/em&gt; the same but can have a myriad of different
abilities. To aid in that quest, I also bought a &lt;a href=&#34;https://www.tindie.com/products/petl/usb-c-cable-tester-c2c-caberqu/&#34;&gt;USB-C cable tester&lt;/a&gt; so I can
check what existing cables I have (but mostly because I like buying weird
circuit boards on the Internet).&lt;/p&gt;
&lt;p&gt;It’s already proving quite difficult to buy a suitable USB-A to USB-C cable
that is both short and &lt;a href=&#34;https://en.wikipedia.org/wiki/USB_Implementers_Forum&#34;&gt;USB-IF&lt;/a&gt; approved (I don&amp;rsquo;t want a cable to melt into my
new phone).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://retool.com/blog/mfa-isnt-mfa/&#34;&gt;When MFA isn&amp;rsquo;t actually MFA&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The caller claimed to be one of the members of the IT team, and deepfaked
our employee’s actual voice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This tale of social engineering is scary. Even when you think you&amp;rsquo;re doing
everything right you can still get caught out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mastodon.social/@Elucidating/111065473508584712&#34;&gt;&amp;ldquo;Airbus open sourced their new cockpit font&amp;rdquo;&lt;/a&gt; &amp;ndash; &lt;a href=&#34;https://b612-font.com/&#34;&gt;B612 FONT FAMILY&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;B612 is an highly legible open source font family designed and tested to be
used on aircraft cockpit screens.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/115-uncaught-typeerror-undefined-is-not-a-function/#:~:text=The%20trap%20of%20constantly%20tinkering%20config%20is%20a%20real%20problem%20and%20something%20i%E2%80%99ve%20fallen%20into&#34;&gt;I&amp;rsquo;m still not tinkering with my Neovim config&lt;/a&gt; by &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/e8c806356d71986662cda8510e68cccb3f2a1801&#34;&gt;installing lualine.nvim&lt;/a&gt;
as a fancy &lt;a href=&#34;https://neovim.io/doc/user/options.html#&#39;statusline&#39;&#34;&gt;statusline&lt;/a&gt; replacement. A very good use of time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The weight loss is more of a &amp;ldquo;gain&amp;rdquo; at the moment :-/&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 115: Uncaught TypeError undefined is not a function</title>
      <link>https://elver.me/weeknotes/115-uncaught-typeerror-undefined-is-not-a-function/</link>
      <pubDate>Sun, 10 Sep 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/115-uncaught-typeerror-undefined-is-not-a-function/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I wasn&amp;rsquo;t entirely correct about &lt;a href=&#34;/weeknotes/110-cowabunga/#:~:text=this%20week%20i%20discovered%20that%20you%20can%20move%20the%20macos%20picture%20in%20picture%20window%20(of%20whatever%20is%20currently%20playing)%20to%20any%20corner%20of%20the%20screen%20with%20a%20quick%20two%20finger%20flick%20gesture%20%E2%9C%8C%EF%B8%8F%20nice.&#34;&gt;being able to move the PiP window&lt;/a&gt; in macOS.
It turns out that it&amp;rsquo;s the Arc PiP window which can be moved easily. The one
Safari doesn&amp;rsquo;t allow it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Zero side project progress. Not even Figma-ing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gomakethings.com/how-to-autocomplete-two-factor-authentication-codes-with-a-single-html-attribute/&#34;&gt;How to autocomplete two-factor authentication codes with a single HTML attribute&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you manage an app that supports two-factor authentication, either through
an app or SMS, you can make it easy for users to autocomplete their unique
code. The trick is a single HTML attribute: [autocomplete=&amp;ldquo;one-time-code&amp;rdquo;].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Easy peasy.&lt;/p&gt;
&lt;p&gt;There are &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#values&#34;&gt;many other values available&lt;/a&gt; to &lt;code&gt;autocomplete&lt;/code&gt; worth checking out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I discovered a misspelt word in a codebase recently. There is a surprisingly
amount of faff involved in fixing this in a Ruby on Rails project. In some
programming environments this problem is a right click, rename, done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=Ric2wHzPfcM&#34;&gt;The Primeagean reacted&lt;/a&gt; to &lt;a href=&#34;https://twitter.com/nexxeln&#34;&gt;nexxel&lt;/a&gt;&amp;rsquo;s article &lt;a href=&#34;https://www.nexxel.dev/blog/neovim-to-vscode&#34;&gt;Why I Switched From Neovim To
VSCode&lt;/a&gt; and I agree with all of his points. The trap of constantly tinkering
config is a real problem and something I&amp;rsquo;ve fallen into. I need to focus on
fixing real issues with my workflow rather than nice-to-haves. For example, I
don&amp;rsquo;t use any kind of folding at the moment, and that would be a basic, and
nice thing to have worked out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So, I&amp;rsquo;ve been tinkering with my Neovim config&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/c244539d785e30d149bb93566c1a0be17c286a63&#34;&gt;I&amp;rsquo;ve added the which-key plugin&lt;/a&gt; which helps with remembering keymaps. I&amp;rsquo;ve
found a lot of the friction in using new plugins comes from learning what the
keymaps are. I think this will help.&lt;/p&gt;
&lt;p&gt;Another improvement I&amp;rsquo;ve been wanting to make for ages (literally years) is
easy access to a &lt;code&gt;rails console&lt;/code&gt;. I use &lt;code&gt;tmux&lt;/code&gt; so it makes sense to &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/4e8cec96f5b85ed298f24f4590daa26f9b63cf1a&#34;&gt;open the
REPL in a new &lt;code&gt;tmux&lt;/code&gt; split&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I thought this was going to be really tricky for some reason, but &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt;
figured it out in no time. Whilst I was at it I &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/8c5fa8c17a0513cca6425a2d1ec1305a6c6e9514&#34;&gt;added quick access to &lt;code&gt;rails routes | fzf&lt;/code&gt; too&lt;/a&gt; in the same vein.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.newyorker.com/magazine/2023/08/21/the-hidden-cost-of-free-returns&#34;&gt;What Happens to All the Stuff We Return?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s probably not a coincidence that the world’s two biggest
retailers—Walmart, with revenues of five hundred and seventy-three billion
dollars in 2022, and Amazon, with four hundred and sixty-nine billion—also
offer some of the easiest returns.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Really interesting look into what happens with returns.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://interaktiv.morgenpost.de/klimawandel-hitze-meeresspiegel-wassermangel-stuerme-unbewohnbar/en.html&#34;&gt;Mapping in 3D where the earth will become uninhabitable&lt;/a&gt;. Very cool
visualisation of where we won&amp;rsquo;t be able to live one day. Good times.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Neovim tips are back, baby!&lt;/p&gt;
&lt;p&gt;You can link a highlight group to another like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.api.nvim_set_hl(&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;NewGroup&amp;#34;&lt;/span&gt;, { link &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;ExistingGroup&amp;#34;&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example, I wanted the &lt;code&gt;WhichKeyDesc&lt;/code&gt; group to be the same colour as
Strings in my code, so I did this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.api.nvim_set_hl(&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;WhichKeyDesc&amp;#34;&lt;/span&gt;, { link &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;String&amp;#34;&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you want to browse all highlight groups and have &lt;a href=&#34;https://github.com/nvim-telescope/telescope.nvim&#34;&gt;Telescope&lt;/a&gt; you can use
&lt;code&gt;:Telescope highlights&lt;/code&gt; which lets you fuzzily search groups and shows them in
the colours/style defined within the group. Neat.&lt;/p&gt;
&lt;p&gt;You can also see which highlight groups apply to the word under the cursor by
issuing &lt;code&gt;:Inspect&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for running Rails &lt;a href=&#34;https://github.com/rails/rails/pull/48950&#34;&gt;system tests using Playwright was merged&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I enjoyed &lt;a href=&#34;https://www.youtube.com/watch?v=wIzwyyHolRs&#34;&gt;this commentary&lt;/a&gt; on &lt;a href=&#34;https://htmx.org/essays/a-real-world-react-to-htmx-port/&#34;&gt;David Guillot&amp;rsquo;s 2022 Djangocon.eu talk on htmx&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Server-side rendering, the one true way, seems to be gaining ground again and
the Reacters are unhappy. You can see the push back in the comments of the
stream against a &amp;ldquo;non-JavaScript&amp;rdquo; approach. They know no better.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m glad to see some people realising how far off the path we&amp;rsquo;ve gone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=Bv3YhGku92w&#34;&gt;Removing TypeScript - Prime Reacts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From the comments:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DHH saying that Javascript is his second favorite programming language
throws up major red flags. This guy is nuts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I paid for YouTube Premium for the first time. I am unhappy with how much it
costs, but it is very nice to not have any adverts. It&amp;rsquo;s a shame that that&amp;rsquo;s
the only benefit for me personally. If I used YouTube Music it would be better
value.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 114: Shadow rule</title>
      <link>https://elver.me/weeknotes/114-shadow-rule/</link>
      <pubDate>Sun, 03 Sep 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/114-shadow-rule/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.newyorker.com/magazine/2023/08/28/elon-musks-shadow-rule&#34;&gt;Elon Musk’s Shadow Rule | The New Yorker&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How the U.S. government came to rely on the tech billionaire—and is now
struggling to rein him in.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I &lt;a href=&#34;/weeknotes/111-stealin-yo-keystrokes/#:~:text=I%E2%80%99ve%20noticed%20certain,generate%20anchor%20links&#34;&gt;mentioned text linking to text fragments&lt;/a&gt; as few weeks ago. The only issue
I&amp;rsquo;ve found is that creating the correct syntax for the links is fiddly and
error prone, but no more! &lt;a href=&#34;https://chaos.social/@rixx/110967103559545798&#34;&gt;@rixx found&lt;/a&gt; a &lt;a href=&#34;https://chrome.google.com/webstore/detail/link-to-text-fragment/pbcodcjpfjdpcineamnnmbkkmkdpajjg/&#34;&gt;Chrome extension&lt;/a&gt; to help.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=Whqs8v1svyo&#34;&gt;Why British cities make no sense&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I relate to &lt;a href=&#34;https://mastodon.social/@PadraigOCinneide/110974029153865780&#34;&gt;this toot from Padraig&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;m in the early stages of a solo project where sustaining my own enthusiasm
over a few months is the main challenge&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My enthusiasm has gone for the side project. But it was only ever supposed to
be about &lt;em&gt;finishing&lt;/em&gt; something. I&amp;rsquo;m not particularly in love with the idea, it
was only ever a clone with extra features.&lt;/p&gt;
&lt;p&gt;One of his ideas to keep moving is to keep a development journal. I think I&amp;rsquo;ll
try that. Writing things down often helps.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/wesbos/status/1696201171587809761&#34;&gt;&amp;ldquo;CSS Nesting just landed in Firefox 117 which puts it at 100% browser support!&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Good news?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The weight loss has stalled somewhat. I haven&amp;rsquo;t been eating as well (some
indulgences were planned) and I&amp;rsquo;ve struggled to get back on the straight and
narrow.&lt;/p&gt;
&lt;p&gt;However, my weight has remained stable, so that&amp;rsquo;s a good indicator that some
slips ups can be weathered. Again, trying to drop the perfectionism. One cake
does not have to ruin everything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I didn&amp;rsquo;t know that Rails&amp;rsquo; &lt;a href=&#34;https://ruby.social/@ste/110991109737184792&#34;&gt;&lt;code&gt;scope&lt;/code&gt; can accept a class&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you don&amp;rsquo;t know &lt;code&gt;scope&lt;/code&gt; accepts classes in place of blocks. so you can
organize complex queries logic in their own class files.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Very nice. I suppose it makes sense when you think about it. I would imagine
anything &lt;code&gt;call&lt;/code&gt;-able would work?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://arstechnica.com/security/2023/09/pii-leaked-after-sourcegraph-an-ai-driven-service-for-code-development-is-hacked/&#34;&gt;Hacker gains admin control of Sourcegraph and gives free access to the
masses&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The hacker gained administrative access by obtaining an authentication key a
Sourcegraph developer accidentally included in a code published to a public
Sourcegraph instance hosted on Sourcegraph.com&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ldquo;hacker&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 113: Figma procrastination</title>
      <link>https://elver.me/weeknotes/113-figma-procrastination/</link>
      <pubDate>Sun, 27 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/113-figma-procrastination/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://wavesurfer-js.org/&#34;&gt;Wavesurfer.js&lt;/a&gt; &amp;ndash; very nice.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wavesurfer.js is an open-source audio visualization library for creating
interactive, customizable waveforms.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another UTF-8 related question cropped up at work this week and yet again I
seem to have completely forgotten anything I knew about file encoding.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=gmNSFqyg_Z8&#34;&gt;The Beach Boys sing &amp;ldquo;Hurt&amp;rdquo; (AI)&lt;/a&gt; by There I Ruined It &amp;ndash; lovely stuff 👏&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Before COVID I was travelling quite a bit, which was great. More recently
though the habit has fallen away, so I&amp;rsquo;m happy to be getting back on the
travel-horse (🤔) by having three trips planned between September and October.
I&amp;rsquo;ll be visiting Wroclaw, Amsterdam, and Chicago. A travel heavy couple of
months. I&amp;rsquo;m really looking forward to it!&lt;/p&gt;
&lt;p&gt;Yet more reason to lose the weight. Travelling as a tall overweight person is
not fun in my experience. Transatlantic flights can be very unpleasant
generally, but worse when you&amp;rsquo;re completely wedged into a plane seat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ijmacd.github.io/rfc3339-iso8601/&#34;&gt;RFC 3339 vs ISO 8601&lt;/a&gt; - Time. Is. Fun.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the course of working on the side project I decided to learn how to use
Figma. Years ago I was more into the design and frontend side of web
development but then focussed on the backend for years.&lt;/p&gt;
&lt;p&gt;Is this procrastination from actually getting the thing done? Yes,
undoubtedly. But I&amp;rsquo;m also enjoying learning something that is outside of my
normal wheelhouse, and is also useful for my future endeavours. Better to do
something than nothing, even if it isn&amp;rsquo;t &lt;em&gt;technically&lt;/em&gt; necessary.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Talking of the side project, I seem to be extremely motivated exclusively
after 10pm, but zero motivation during the day. So that&amp;rsquo;s really great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.letsjumpship.com/theres-work-for-you/&#34;&gt;There&amp;rsquo;s work for you&lt;/a&gt; by Greg Story from Jump Ship!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have zero trust that accepting a role provides any more security than
doing the same work as a consultant. Job security only exists as a facade.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Truth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/martinvonz/jj&#34;&gt;Jujutsu is a Git-compatible DVCS&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It combines features from Git (data model, speed), Mercurial (anonymous
branching, simple CLI free from &amp;ldquo;the index&amp;rdquo;, revsets, powerful
history-rewriting), and Pijul/Darcs (first-class conflicts), with features
not found in most of them (working-copy-as-a-commit, undo functionality,
automatic rebase, safe replication via rsync, Dropbox, or distributed file
system).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ffmpeg.lav.io/&#34;&gt;FFmpeg Explorer&lt;/a&gt; &amp;ndash; very useful for figuring out FFmpeg filters.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A tool to help you explore FFmpeg filters.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Turns out there are &lt;em&gt;a lot&lt;/em&gt; filters built-in to FFmpeg.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 112: Phone box for a pound</title>
      <link>https://elver.me/weeknotes/112-phone-box-for-a-pound/</link>
      <pubDate>Sun, 20 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/112-phone-box-for-a-pound/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I learnt this week that you can &lt;a href=&#34;https://business.bt.com/public-sector/street-hubs/adopt-a-kiosk-scheme/&#34;&gt;adopt a phone box from BT for a £1&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://wiki.alopex.li/ElixirForCynicalCurmudgeons&#34;&gt;ElixirForCynicalCurmudgeons&lt;/a&gt; is a bit of a rollercoaster. But in the end:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s been a long time since a programming language made me this happy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some really interesting explanations of how Elixir works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A useful tool to show how colour contract can affect different visual
impairments &amp;ndash; &lt;a href=&#34;https://www.whocanuse.com/&#34;&gt;whocanuse.com&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It&amp;rsquo;s a tool that brings attention and understanding to how color contrast
can affect different people with visual impairments.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As part of my &lt;a href=&#34;/weeknotes/111-stealin-yo-keystrokes/#:~:text=This%20week%20I&#39;ve,cool&#34;&gt;Tailscale experiments&lt;/a&gt; I&amp;rsquo;ve been slowly (really slowly) moving
various Docker configuration into git as a &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When making any configuration changes in a work environment I would make
changes locally, push them to test environments, and then push them to
production once ready.&lt;/p&gt;
&lt;p&gt;However, when fiddling with my local server it&amp;rsquo;s often quicker and easier to
change the config directly on the server. The git repo is cloned to the server
itself and changes are pushed back to the repo on GitHub.&lt;/p&gt;
&lt;p&gt;How to authenticate with GitHub from the server? I don&amp;rsquo;t want any keys sitting
on my server. Sure, it&amp;rsquo;s inside my internal network, but it&amp;rsquo;s also available
to the Internet.&lt;/p&gt;
&lt;p&gt;I chose SSH Agent forwarding. This basically means that when you connect to
another machine, you can &lt;em&gt;forward&lt;/em&gt; your SSH agent so that your local keys work
from the remote machine.&lt;/p&gt;
&lt;p&gt;In your local &lt;code&gt;.ssh/config&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host &amp;lt;hostname&amp;gt;
  HostName &amp;lt;hostname&amp;gt;
  User &amp;lt;username&amp;gt;
  IdentityFile ~/.ssh/&amp;lt;keyname&amp;gt;
  ForwardAgent yes
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve also been trying out &lt;a href=&#34;https://tailscale.com/blog/sending-files-with-taildrop/&#34;&gt;Tailscale&amp;rsquo;s Taildrop&lt;/a&gt; feature. It&amp;rsquo;s like Apple&amp;rsquo;s
&lt;a href=&#34;https://en.wikipedia.org/wiki/AirDrop&#34;&gt;AirDrop&lt;/a&gt; but works across your whole tailnet. Pretty cool.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Taildrop is a feature that makes it easy to send files between your personal
devices on a Tailscale network. Unlike cloud-based file transfer services,
Taildrop’s peer-to-peer design makes it well-suited for lots of kinds of
files you might want to send:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unfortunately, it doesn&amp;rsquo;t seem to work with URL sharing. I often AirDrop
myself URLs from my iPhone so that&amp;rsquo;s a shame.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is a &lt;a href=&#34;https://twitter.com/royalicing/status/1687271985548820480&#34;&gt;nice tip from Patrick Smith&lt;/a&gt;: &amp;ldquo;write a test that ensures the
version in mix.exs matches the one in the readme’s installation instructions&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I spotted an interesting question on the software engineering Stack Exchange
this week: &lt;a href=&#34;https://softwareengineering.stackexchange.com/questions/376535/whats-the-phone-number-equivalent-of-example-org&#34;&gt;&amp;ldquo;What&amp;rsquo;s the phone number equivalent of example.org?&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jarvispowered.com/you-dont-hate-jira-you-hate-your-manager/&#34;&gt;You don&amp;rsquo;t hate JIRA, you hate your manager&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is an interesting take with some real home truths mingled in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;JIRA does not replace the need for skilled managers and team leads that
actually know what&amp;rsquo;s going on.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Truth. But&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let&amp;rsquo;s be honest; it might not be your manager, it might be you. In some
projects I&amp;rsquo;ve worked on, no amount of tracking is welcomed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve seen this. Hell, I&amp;rsquo;ve &lt;em&gt;been&lt;/em&gt; this too. Some people absolutely &lt;em&gt;hate&lt;/em&gt; the
whole premise of communicating their work: describing the problem, updating
ticket statuses, writing comments; they &lt;em&gt;hate&lt;/em&gt; it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Debian Linux turned 30 years old this week. Wow. It feels to me like Debian
has been around forever. Have a look at the &lt;a href=&#34;https://wiki.debian.org/DebianHistory?action=AttachFile&amp;amp;do=get&amp;amp;target=Debian-announcement-1993.txt&#34;&gt;announcement email from 1993&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://mastodon.social/@film_girl/110901180972880241&#34;&gt;Christina Warren&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rails tip: If you want to make a copy of an ActiveRecord model to be saved as
a separate row in the database, you can use &lt;code&gt;#dup&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; foo &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;find(&lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; new_foo &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; foo&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;dup
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; new_foo&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;save
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; new_foo&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;id
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#099&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;#dup&lt;/code&gt; will return an exact copy but with no &lt;code&gt;#id&lt;/code&gt; set so if can be saved as
new.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not a great week weightloss wise. I lost weight again, but I had a few slip
ups and didn&amp;rsquo;t always feel in control. We go again.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 111: Stealin&#39; yo keystrokes</title>
      <link>https://elver.me/weeknotes/111-stealin-yo-keystrokes/</link>
      <pubDate>Sun, 13 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/111-stealin-yo-keystrokes/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Id_Software&#34;&gt;id Software&lt;/a&gt; released the &lt;a href=&#34;https://github.com/id-Software/quake2-rerelease-dll/tree/main&#34;&gt;Quake II rerelease game source&lt;/a&gt; 🔥&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This repository contains the game code for the 2023 rerelease of Quake II&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I tried to load some MP3s onto my iPhone this week. What a fiasco. You&amp;rsquo;d think
that the settings would be in the Apple Music app, right? No, they&amp;rsquo;re in
Finder :-/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve noticed certain websites highlighting text when you click through to them
from search results but assumed that some weird Javascript was at play, but
no! It&amp;rsquo;s &lt;a href=&#34;https://wicg.github.io/scroll-to-text-fragment/&#34;&gt;URL Fragment Text Directives&lt;/a&gt; as Simon Willison explains in &lt;a href=&#34;https://til.simonwillison.net/html/scroll-to-text&#34;&gt;Scroll
to text fragments&lt;/a&gt;. I&amp;rsquo;m hoping to take advantage of this new standard here as
I often want to link to previous pages but have struggled with Hugo&amp;rsquo;s
inability to generate anchor links.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bleepingcomputer.com/news/security/new-acoustic-attack-steals-data-from-keystrokes-with-95-percent-accuracy/&#34;&gt;New acoustic attack steals data from keystrokes with 95% accuracy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Stealing keystrokes by recording the sound they make.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Such an attack severely affects the target&amp;rsquo;s data security, as it could leak
people&amp;rsquo;s passwords, discussions, messages, or other sensitive information to
malicious third parties.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Make sure to hum loudly whilst typing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Weight loss update. I&amp;rsquo;ve lost 11.3kg (24lbs) since 4th July. Not bad
considering I&amp;rsquo;ve visited the curry house twice and Burger King once in that
time 😉&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I&amp;rsquo;ve been experimenting with &lt;a href=&#34;https://tailscale.com/&#34;&gt;Tailscale&lt;/a&gt; on my home network. It&amp;rsquo;s
been on my radar for a while but I never got around to trying it &amp;ndash; it&amp;rsquo;s very
cool.&lt;/p&gt;
&lt;p&gt;Every device that you install Tailscale onto becomes part of a virtual private
network (courtesy of WireGuard) where each device can talk to one another like
they are local to each other. Tailscale is zero config. So far, everything
just works. No forwarding ports on your router necessary.&lt;/p&gt;
&lt;p&gt;This is really nice if you run services within your network which you&amp;rsquo;d like
to access remotely but you&amp;rsquo;d rather not expose those services to the Internet.&lt;/p&gt;
&lt;p&gt;You can also designate Tailscale nodes as being an &lt;a href=&#34;https://tailscale.com/kb/1103/exit-nodes/&#34;&gt;&amp;ldquo;Exit Node&amp;rdquo;&lt;/a&gt; which means
that when you&amp;rsquo;re connected to your tailnet you can choose to route all
internet traffic through your chosen Exit Node. If you have an Exit Node
inside your home, and connected to your tailnet, you can use this as a
replacement for traditional VPN offerings but instead of connecting through
your VPN provider&amp;rsquo;s servers you route traffic through your home internet
connection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://namechecker.vercel.app/&#34;&gt;Name Checker&lt;/a&gt; is a cool little project if you&amp;rsquo;re thinking of starting
something and want to know if the name is already taken.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://downfall.page/&#34;&gt;Downfall Attacks&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Downfall attacks targets a critical weakness found in billions of modern
processors used in personal and cloud computers. This vulnerability,
identified as CVE-2022-40982, enables a user to access and steal data from
other users who share the same computer.&lt;/p&gt;
&lt;p&gt;For instance, a malicious app obtained from an app store could use the
Downfall attack to steal sensitive information like passwords, encryption
keys, and private data such as banking details, personal emails, and
messages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I find vulnerabilities in CPUs fascinating. The fact that this is in
&lt;em&gt;hardware&lt;/em&gt; is scary. No rolling out patches for this software. I guess you can
workaround it in userspace? I don&amp;rsquo;t know.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://zfs.rent/&#34;&gt;zfs.rent&lt;/a&gt; is neat. An online backup service where you can send zfs snapshots.
I love the website. This is the web I want.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I usually use &lt;a href=&#34;https://fast.com&#34;&gt;fast.com from Netflix&lt;/a&gt; to test Internet speeds but I became
aware of &lt;a href=&#34;https://speed.cloudflare.com/&#34;&gt;Cloudflare&amp;rsquo;s Speed Test&lt;/a&gt; this week and it&amp;rsquo;s much more comprehensive.
Not necessarily better, but it has more information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supabase are working on a &lt;a href=&#34;https://github.com/supabase/postgres_lsp&#34;&gt;LSP for Postgres&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The side project has seen some action. I&amp;rsquo;m trying to let perfection go in the
name of progress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The way that IRB&amp;rsquo;s configuration files do not stack is annoying. Sometimes a
project I&amp;rsquo;m working on will have project specific irb file in order to provide
domain specific helpers etc, but if you have an &lt;code&gt;~/.irbrc&lt;/code&gt; like I do it will
be ignored.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;IRB reads a personal initialization file when it’s invoked. IRB
searches a file in the following order and loads the first one
found.

- $IRBRC (if $IRBRC is set)
- $XDG_CONFIG_HOME/irb/irbrc (if $XDG_CONFIG_HOME is set)
- ~/.irbrc
- .config/irb/irbrc
- .irbrc
- irb.rc
- _irbrc
- $irbrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I realised this week that I can export a &lt;code&gt;IRBRC&lt;/code&gt; environment variable pointing
to the &lt;code&gt;irbrc&lt;/code&gt; file I want, but I still can&amp;rsquo;t stack them, which is a shame.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What if you need to know what your external IP address?
&lt;a href=&#34;https://icanhazip.com/&#34;&gt;https://icanhazip.com/&lt;/a&gt; is a &lt;code&gt;curl&lt;/code&gt; away. There&amp;rsquo;s a &lt;a href=&#34;https://major.io/p/a-new-future-for-icanhazip/&#34;&gt;nice write up of it&amp;rsquo;s
history by it&amp;rsquo;s creator Major Hayden&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In 2021, the traffic I once received in a month started arriving in 24
hours. The site went from a billion requests per day to 30-35 billion
requests per day over a weekend.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a crazy amount of traffic from something that return an IP address as
text.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 110: Cowabunga</title>
      <link>https://elver.me/weeknotes/110-cowabunga/</link>
      <pubDate>Sun, 06 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/110-cowabunga/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The side project has fallen off a cliff. I&amp;rsquo;ve lost interest. I will try and
progress it next week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.zzzuckerberg.com/&#34;&gt;Legal Lullabies&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lull yourself to sleep with the soothing white noise of your favorite tech
giant’s terms of service. Close your eyes, drift away, or scroll down to
join the 1% of technology users that claim to have read em’ from beginning
to end.*&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;POST&lt;/code&gt; data to a URL using &lt;code&gt;curl&lt;/code&gt; and &lt;a href=&#34;https://catonmat.net/cookbooks/curl/make-curl-silent&#34;&gt;stay completely silent &lt;em&gt;except&lt;/em&gt; when
there are errors&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -S -s -o /dev/null -d &amp;quot;Some data&amp;quot; https://example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As you know, &lt;a href=&#34;/weeknotes/5-professional-bash-programmer/&#34;&gt;I&amp;rsquo;m a professional Bash programmer&lt;/a&gt;, so I was updating a script
this week to notify me (using &lt;a href=&#34;https://ntfy.sh/&#34;&gt;&lt;code&gt;ntfy&lt;/code&gt;&lt;/a&gt;) when it finishes doing work. This
allows me to have notifications going to my Apple devices via a simple &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I found myself once again asking &amp;ldquo;Why am I doing this?&amp;rdquo;. I have Ruby at my
disposal and it can do the basic things in a much saner way than Bash. But
here I am.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://computer.rip/2023-07-29-Free-Public-WiFi.html&#34;&gt;Remember Free Public Wi-Fi?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Once, many years ago, I stayed on the 62nd floor of the Westin Peachtree
Plaza in Atlanta, Georgia. This was in the age when the price of a hotel
room was directly correlated with the price of the Wi-Fi service, and as a
high school student I was not prepared to pay in excess of $15 a day for the
internet. As I remember, a Motel 6 that was not blocks away but within line
of sight ended up filling the role. But even up there, 62 floors from the
ground, there was false promise: Free Public Wi-Fi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I discovered that you can move the macOS Picture in Picture window
(of whatever is currently playing) to any corner of the screen with a quick
two finger flick gesture ✌️ Nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bbc.co.uk/programmes/m001mssm&#34;&gt;Marianna in Conspiracyland&lt;/a&gt;. I enjoyed this recommendation by &lt;a href=&#34;https://discoliam.com&#34;&gt;Discoliam&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What happened to the people who fell down the rabbit hole into a world of
conspiracy theories during the pandemic?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s very scary how quickly people can persuaded to believe utter nonsense.
The episodes are 15 minutes so you can zip through them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jvns.ca/blog/2023/08/03/behind--hello-world/&#34;&gt;Behind &amp;ldquo;Hello World&amp;rdquo; on Linux&lt;/a&gt; from Julia Evans is very interesting. It&amp;rsquo;s
amazing that anything works at all really. Apart from the great explanation of
what is going on technically, I love the way Julia is not afraid to say when
she doesn&amp;rsquo;t know something (which is not often!).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I watched the first episode of &lt;a href=&#34;https://en.wikipedia.org/wiki/Bridget_Christie&#34;&gt;Bridget Christie&lt;/a&gt;&amp;rsquo;s new comedic drama &lt;a href=&#34;https://www.channel4.com/programmes/the-change&#34;&gt;The
Change&lt;/a&gt; after hearing about it &lt;a href=&#34;https://www.youtube.com/watch?v=P10FB8LAbec&#34;&gt;Richard Herrings&amp;rsquo;s podcast RHLSTP (rhlstp)&lt;/a&gt;
and thought it was great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://justin.searls.co/&#34;&gt;Justin Searls&lt;/a&gt; on &lt;a href=&#34;https://buttondown.email/searls/archive/where-did-july-go-heres-where/&#34;&gt;his creative process&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A lot of people I run into—even people of similar privilege—have their own
interesting things to say but nevertheless seem to be waiting around for
permission to say them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m not sure I qualify as &amp;ldquo;interesting things to say&amp;rdquo; but these week notes
definitely provide me with an outlet for expression which I&amp;rsquo;ve been missing up
to now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://groups.google.com/g/vim_announce/c/tWahca9zkt4&#34;&gt;Bram Moolenaar has passed away&lt;/a&gt; 😢 Vim has been a major apart of my daily
life since 2011. I still use Neovim today. Bram had a massive impact on
software, there&amp;rsquo;s no doubt about that. RIP.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve seen &lt;a href=&#34;https://www.imdb.com/title/tt1517268/&#34;&gt;Barbie&lt;/a&gt;, &lt;a href=&#34;https://www.imdb.com/title/tt15398776/&#34;&gt;Oppenheimer&lt;/a&gt;, and &lt;a href=&#34;https://www.imdb.com/title/tt8589698/&#34;&gt;Teenage Mutant Ninja Turtles: Mutant
Mayhem&lt;/a&gt; in the last two weeks and all I have to say is TURTLE POWER! 🐢🔌&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 109: PAYG eSIM</title>
      <link>https://elver.me/weeknotes/109-payg-esim/</link>
      <pubDate>Sun, 30 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/109-payg-esim/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been watching &lt;a href=&#34;https://en.wikipedia.org/wiki/Steven_Soderbergh&#34;&gt;Steven Soderbergh&lt;/a&gt;&amp;rsquo;s new sci-fi comedy series &lt;a href=&#34;https://commandzseries.com/&#34;&gt;Command Z&lt;/a&gt;.
Directly supporting something feels nice, and it&amp;rsquo;s thought provoking and well
acted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Weight loss update: It continues. The body works in mysterious ways insofar as
eating little does not always correlate with loss, but eating Curry and Naan
bread does. Staying straight and true in the face of that is the hard part.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been using a couple of apps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://crouton.app/&#34;&gt;Crouton&lt;/a&gt; for meal planning. Being organised with &lt;em&gt;what&lt;/em&gt; and &lt;em&gt;when&lt;/em&gt; is a
big help and Crouton is excellent at this. I wish I&amp;rsquo;d had this years ago.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.foodnoms.com/&#34;&gt;FoodNoms&lt;/a&gt; for calorie tracking, because let&amp;rsquo;s be honest, MyFitnessPal is
&lt;em&gt;awful&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://arc.net/&#34;&gt;Arc&lt;/a&gt; &lt;a href=&#34;https://arc.net/e/D25B2EEA-7506-4850-A169-3B2A00802889&#34;&gt;continues to improve&lt;/a&gt;. You can now &lt;kbd&gt;Option&lt;/kbd&gt; click a link or
tab and it will open in a vertical split which is something I want to do
frequently, so that&amp;rsquo;s nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://garagehq.deuxfleurs.fr/&#34;&gt;Garage&lt;/a&gt; &amp;ndash; another S3-compatible object storage server.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An open-source distributed object storage service tailored for self-hosting&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve had brief success using &lt;a href=&#34;https://en.wikipedia.org/wiki/MinIO&#34;&gt;MinIO&lt;/a&gt; for local development, so it&amp;rsquo;s nice to
have options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you like being angry and disappointed? I recommend the &lt;a href=&#34;https://www.private-eye.co.uk/podcast&#34;&gt;Private Eye
podcast, Page 94&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fancy &lt;a href=&#34;https://build-your-own.org/redis/&#34;&gt;building your own Redis with C/C++&lt;/a&gt;? Not right now, but one day.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://community.influxdata.com/t/getting-weird-results-from-gcp-europe-west1/30615&#34;&gt;&amp;ldquo;Getting weird results from GCP europe-west1&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;File under &amp;ldquo;How not to discontinue a service&amp;rdquo;. It seems InfluxData
&amp;ldquo;discontinued&amp;rdquo; a.k.a. deleted a whole region and a lot of customers didn&amp;rsquo;t get
a notification it was going to happen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit MP3 tags (ask your parents) in the browser with &lt;a href=&#34;https://mp3tag.js.org/editor/&#34;&gt;mp3tag.js&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As &lt;a href=&#34;/weeknotes/91-internet-frustration/&#34;&gt;you may remember&lt;/a&gt; I was considering getting a backup mobile network
provider to help me stay online.&lt;/p&gt;
&lt;p&gt;My phone supports multiple SIMs using &lt;a href=&#34;https://en.wikipedia.org/wiki/ESIM&#34;&gt;eSIMs&lt;/a&gt; which means you don&amp;rsquo;t need
multiple physical SIM cards. Unfortunately not many UK networks support eSIM,
and if they do, not in Pay As You Go format (I don&amp;rsquo;t want to be tied into a
monthly contract for a backup).&lt;/p&gt;
&lt;p&gt;Fortunately, my friend Karl introduced me to Lyca Mobile, who piggyback on EE
and offer PAYG with an eSIM.&lt;/p&gt;
&lt;p&gt;The good:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s &lt;em&gt;currently&lt;/em&gt; super cheap - 89p per month for 6 months. I mean, that is
&lt;em&gt;cheap&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The performance is anecdotally better than my current network, Three, in
&lt;em&gt;most&lt;/em&gt; places I have checked. Signal and download speeds are impressive.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The bad:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For reasons, I had to buy a physical SIM and then transfer my number (and
bundle) over to the eSIM &amp;ndash; it wasn&amp;rsquo;t clear how to do this, and an email to
Lyca Mobile support took 10 days to respond.&lt;/p&gt;
&lt;p&gt;Once I had a response it was easy to setup the eSIM on the iPhone - scan a
QR code and away you go&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Lyca Mobile website is genuinely one of the worst I&amp;rsquo;ve ever used.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve had some weird shit happen with random numbers texting and calling me.
I guess the number&amp;rsquo;s are recycled on a regular basis whereas I&amp;rsquo;ve had my
number for years. It feels scummy, and it probably is, but it&amp;rsquo;s 89p.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The interesting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The iOS network signal icon shows a split view for each network when you
have more than one SIM (physical or eSIM) installed. It&amp;rsquo;s both cool and
slightly confusing. I wonder how this copes with more than 2 networks?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m not sure what I&amp;rsquo;m going to do longer term, but I will trial these for a
bit.&lt;/p&gt;
&lt;p&gt;I really hope more networks start using eSIM and especially in combination
with PAYG deals so that it&amp;rsquo;s easy to have multiple options. For example, I&amp;rsquo;d
be keen to give Vodafone a go as I haven&amp;rsquo;t used them in years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flat White or Cortado? Lance Hedrick helps explain in &lt;a href=&#34;https://www.youtube.com/watch?v=M--Pj9jMXEM&#34;&gt;CAFE DRINKS EXPLAINED&lt;/a&gt;.
Basically you get what the barista fancies making you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.allthingsdistributed.com/2023/07/building-and-operating-a-pretty-big-storage-system.html&#34;&gt;Building and operating a pretty big storage system called S3&lt;/a&gt; &amp;ndash; a really
interesting talk on the scale that comes with building and operating Amazon
S3.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Amazon S3 holds more than 280 trillion objects and averages over 100 million
requests per second&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;🤯 Ok then&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://adrianroselli.com/2023/07/blockquotes-in-screen-readers.html&#34;&gt;Blockquotes in Screen Readers&lt;/a&gt; &amp;ndash; How? Inconclusive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://dockyard.com/blog/2023/07/27/implementing-multiple-submit-buttons-with-liveview&#34;&gt;Implementing Multiple Submit Buttons with LiveView&lt;/a&gt; &amp;ndash; This is what I really
love about Elixir. Pattern matching allows separate implementations for each
action in a really readable way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My latest side project is on-going but with slightly less progress this week.
I need to remind myself that even though &amp;ldquo;weeks have passed&amp;rdquo; I haven&amp;rsquo;t been
constantly working on it, so that&amp;rsquo;s not weeks of effort. And I&amp;rsquo;m finding my
way with &amp;ldquo;best practices&amp;rdquo; in Elixir/Phoenix.&lt;/p&gt;
&lt;p&gt;I have a situation where I enforce duplicate records at the database level
with a unique index &amp;ndash; good.&lt;/p&gt;
&lt;p&gt;Ecto has two options for this dealing with constraints as far as I know 1) you
can add a &lt;a href=&#34;https://hexdocs.pm/ecto/3.10.3/Ecto.Changeset.html#unique_constraint/2&#34;&gt;&lt;code&gt;unique_constraint/2&lt;/code&gt;&lt;/a&gt; to your changeset and it will become an
error which you can deal with manually; or 2) you can leave that out and it
will be raised as an exception.&lt;/p&gt;
&lt;p&gt;In this case, you shouldn&amp;rsquo;t be able to perform this action through the UI, so
it seems appropriate to let it raise and instead return the relevant HTTP
status code.&lt;/p&gt;
&lt;p&gt;The second option lets us catch the constraint error raised by Ecto
(&lt;code&gt;Ecto.ConstraintError&lt;/code&gt;) and raise a custom exception we have defined. We can
then handle that exception as we like.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; create_rating(user, attrs \\ %{}) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;try&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    %&lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Rating&lt;/span&gt;{&lt;span style=&#34;color:#990073&#34;&gt;user_id&lt;/span&gt;: user&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;id}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Rating&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;changeset(attrs)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Repo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;insert()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;rescue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Ecto.ConstraintError&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      reraise &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Errors.DuplicateRatingError&lt;/span&gt;, __STACKTRACE__
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using &lt;a href=&#34;https://hexdocs.pm/elixir/Kernel.html#reraise/2&#34;&gt;&lt;code&gt;reraise/2&lt;/code&gt;&lt;/a&gt; means we don&amp;rsquo;t lose any stacktrace as we would with
&lt;code&gt;raise&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We can define a custom exception and tell it what HTTP status to return when
this exception is raised within the plug pipeline.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defmodule&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Errors&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defmodule&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;DuplicateRatingError&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;defexception&lt;/span&gt; [&lt;span style=&#34;color:#990073&#34;&gt;:message&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;plug_status&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;400&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Time and time again, Elixir and Phoenix provide a great solution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Are you old or just cool? You might like &lt;a href=&#34;https://www.bbc.co.uk/iplayer/episode/m001p94d/radio-2-in-concert-blur-radio-2-in-concert&#34;&gt;Blur: Radio 2 In Concert&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 108: Unauthorized device</title>
      <link>https://elver.me/weeknotes/108-unauthorized-device/</link>
      <pubDate>Sun, 23 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/108-unauthorized-device/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;TIL you can turn off IRB autocompletion for the Rails console like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bin/rails console -- --noautocomplete
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A lot of effort seems to be going into IRB improvements in recent years, but I
still find that the completions always seems to get in the way.&lt;/p&gt;
&lt;p&gt;You can make it permanent by putting &lt;code&gt;IRB.conf[:USE_AUTOCOMPLETE] = false&lt;/code&gt; in
your &lt;code&gt;~/.irbrc&lt;/code&gt; config too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://floor796.com&#34;&gt;Floor796&lt;/a&gt; &amp;ndash; Mind-blowing 🤯&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Floor796 is an ever-expanding animation scene showing the life of the 796th
floor of the huge space station! The goal of the project is to create as
huge animation as possible, with many references to movies, games, anime and
memes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you run &amp;ldquo;data fixes&amp;rdquo; in production? Most places I&amp;rsquo;ve worked have a very
lax attitude to changing data in production.&lt;/p&gt;
&lt;p&gt;Programmers spend ages diligently writing automated tests for code, and
following a strict code reviews process, but then just start issuing &lt;code&gt;UPDATE&lt;/code&gt;
statements willy nilly directly against production databases.&lt;/p&gt;
&lt;p&gt;I was reminded of the &lt;a href=&#34;https://github.com/Shopify/maintenance_tasks&#34;&gt;&lt;code&gt;maintenance_tasks&lt;/code&gt;&lt;/a&gt; gem by Shopify by &lt;a href=&#34;https://harry.dev/&#34;&gt;Harry&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Rails engine for queuing and managing maintenance tasks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It has loads of nice features, but most importantly, you can write tests for
the changes you are making.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://identity.sweden.se/en/design-elements/typography&#34;&gt;Sweden Sans&lt;/a&gt; typeface.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Heroku has been a constant presence during my time as a user of Rails and yet
I never knew that the format of it&amp;rsquo;s log messages had a specific name,
&lt;a href=&#34;https://brandur.org/logfmt&#34;&gt;logfmt&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;at=info method=GET path=/ host=mutelight.org fwd=&amp;quot;124.133.52.161&amp;quot;
dyno=web.2 connect=4ms service=8ms status=200 bytes=1653
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer&#34;&gt;The looming demise of the 10x developer&lt;/a&gt; &amp;ndash; Very interesting take.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At the slightest discomfort when struggling to understand something, I’ll
grasp for any distraction that might offer me a momentary escape. When I do
manage to get traction, I inevitably find myself disagreeing with the
premise or subversively trying to prove the authors wrong.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I feel seen&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://infosec.exchange/@letsencrypt/110724329057657300&#34;&gt;Crazy stat from Let&amp;rsquo;s Encrypt&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Today we&amp;rsquo;ll likely issue 3+ million certs.&lt;br&gt;
That&amp;rsquo;s 125,000 per hour.&lt;br&gt;
2,083 per minute.&lt;br&gt;
34 👏 every 👏 second 👏&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had a pretty scary experience today when I woke to find a &amp;ldquo;Device Added to
Your Account&amp;rdquo; message on my phone and Mac. I have no real idea how this
happened, but it caused immediate panic.&lt;/p&gt;
&lt;p&gt;The new device was an Apple TV. I have &lt;em&gt;an&lt;/em&gt; Apple TV. Not &lt;em&gt;two&lt;/em&gt; Apple TVs. I
was ruminating on it all day. I have sold an older Apple TV in the past but I
can&amp;rsquo;t quite remember to whom. I usually go down the eBay route, but I have
also traded hardware directly to Apple.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m wondering whether the &amp;ldquo;new&amp;rdquo; Apple TV was an old one of mine that has been
further recycled somehow? I looked up the serial number from an old invoice
and it &lt;em&gt;could&lt;/em&gt; be the one, but of course, in the panic I didn&amp;rsquo;t properly
record what was what.&lt;/p&gt;
&lt;p&gt;So far there is no sign so far of anything untoward having happened such as
login attempts, or unauthorised purchases, but I&amp;rsquo;m still in a heightened state
of anxiety over it. I won&amp;rsquo;t relax yet.&lt;/p&gt;
&lt;p&gt;I have, of course, reset my Apple ID password and signed out of all active
sessions. Other than that, I&amp;rsquo;m not sure what else I can do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Progress on my side project has been slow, but importantly, continuing. I
managed to get a pretty big task completed this week, and two smaller tasks
followed quickly in it&amp;rsquo;s wake.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 107: Internet cafes and dependencies</title>
      <link>https://elver.me/weeknotes/107-internet-cafes-and-dependencies/</link>
      <pubDate>Sun, 16 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/107-internet-cafes-and-dependencies/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Stick this in your &lt;code&gt;~/.irbrc&lt;/code&gt; 😎&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;pbcopy&lt;/span&gt;(data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008080&#34;&gt;IO&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;popen(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;pbcopy&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;w&amp;#34;&lt;/span&gt;) { _1&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;write(data) }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;say you have a bunch of data in your ruby console and you want to get it
to your clipboard. I used to always write it to a file, and then cat the
file to pbcopy, but then it occurred to me - ruby can pipe too&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://apenwarr.ca/log/20230605&#34;&gt;Tech debt metaphor maximalism&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you take a single pull request (PR) that adds a new feature, and launch
it without tests or documentation, you will definitely get the benefits of
that PR sooner.&lt;/p&gt;
&lt;p&gt;Every PR you try to write after that, before adding the tests and docs (ie.
repaying the debt) will be slower because you risk creating undetected bugs
or running into undocumented edge cases.&lt;/p&gt;
&lt;p&gt;If you take a long time to pay off the debt, the slowdown in future launches
will outweigh the speedup from the first launch.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Worth the read.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Credit where it&amp;rsquo;s due. I reported my &lt;a href=&#34;/weeknotes/106-why-we-all-need-subtitles-now/&#34;&gt;broadband issues&lt;/a&gt; to my ISP and they
sorted the problem within the day. Everything seems much better now.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/images/bqm.png&#34; alt=&#34;Graph showing packet loss reducing over time&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Holy shit! Weeknotes with images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JavaScript dependencies &amp;ndash; how does anyone confidently upgrade them? It was my
job to bump some packages due to security vulnerabilities this week and trying
to do this with any sort of confidence is &lt;em&gt;very&lt;/em&gt; difficult.&lt;/p&gt;
&lt;p&gt;The sheer amount of dependencies changed when upgrading a package is really
scary. What do other people do? Upgrade the world and hope that the tests you
have catch any problems?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/dogsheep/pocket-to-sqlite&#34;&gt;&lt;code&gt;pocket-to-sqlite&lt;/code&gt;&lt;/a&gt; is a nice tool from Simon Willison to export the data
from your Pocket account into a SQLite database.&lt;/p&gt;
&lt;p&gt;A couple of teething troubles authenticating, but once I got over those it
downloaded everything with ease.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pocket-to-sqlite fetch pocket.db
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&amp;rsquo;ve been a Pocket user for some time but recently stopped my subscription for
various reasons. It started when they rewrote the site as an SPA (why?! 🤢)
and continued with their unwillingness to fix an issue I had with the web UI
in Safari which made it unusable for me (I&amp;rsquo;ve since moved on from Safari, but
come on, Safari is not some unknown browser).&lt;/p&gt;
&lt;p&gt;Still, if you wanna export your data into a database, this is the way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I sort of knew so called &amp;ldquo;Rightward Assignment&amp;rdquo; was a thing in Ruby, but
&lt;a href=&#34;https://til.hashrocket.com/posts/8lykl50rsp-ruby-rightward-assignment-js-like-destructuring&#34;&gt;HashRocket reminded me&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irb(main):&lt;span style=&#34;color:#099&#34;&gt;001&lt;/span&gt;:&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; hsh &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#990073&#34;&gt;a&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;b&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;c&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;d&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;4&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; {&lt;span style=&#34;color:#990073&#34;&gt;:a&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:b&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:c&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:d&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;4&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irb(main):&lt;span style=&#34;color:#099&#34;&gt;002&lt;/span&gt;:&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; hsh &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#990073&#34;&gt;a&lt;/span&gt;:, &lt;span style=&#34;color:#990073&#34;&gt;b&lt;/span&gt;:, &lt;span style=&#34;color:#990073&#34;&gt;d&lt;/span&gt;: new_name }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irb(main):&lt;span style=&#34;color:#099&#34;&gt;003&lt;/span&gt;:&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#0086b3&#34;&gt;puts&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;a, b, new_name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#099&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#099&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are more examples at &lt;a href=&#34;https://rubyreferences.github.io/rubychanges/3.0.html#one-line-pattern-matching-with-&#34;&gt;Ruby Changes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The syntax is just a bit weird to me. I&amp;rsquo;ll look for opportunities to use it I
guess, but it doesn&amp;rsquo;t feel intuitive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.blog/2023-07-12-github-merge-queue-is-generally-available/&#34;&gt;GitHub merge queue is generally available&lt;/a&gt; &amp;ndash; this is very nice if you work
in an environment with lots of merge activity. I&amp;rsquo;ve encountered this problem
before and the constant tending of branches into production was exhausting so
this seems like a great thing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=k8gbDNGpv-I&#34;&gt;Inside the secret world of NYC&amp;rsquo;s last internet cafes&lt;/a&gt; from The Browser
Company.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL that you can &lt;a href=&#34;https://github.blog/changelog/2022-08-23-ssh-commit-verification-now-supported/&#34;&gt;sign git commits with SSH keys&lt;/a&gt;. I&amp;rsquo;ve been signing commits
with GPG for years, but it &lt;em&gt;is&lt;/em&gt; fiddly to setup.&lt;/p&gt;
&lt;p&gt;However, it does sound like GPG still has more features.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Generating a GPG signing key is more involved than generating an SSH key,
but GPG has features that SSH does not. A GPG key can expire or be revoked
when no longer used. GitHub shows commits that were signed with such a key
as &amp;ldquo;Verified&amp;rdquo; unless the key was marked as compromised. SSH keys don&amp;rsquo;t have
this capability.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I will stick with GPG I think, but it&amp;rsquo;s nice to have another option.&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&#34;https://blog.1password.com/git-commit-signing/&#34;&gt;Sign your Git commits with 1Password&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I&amp;rsquo;ve been writing some background jobs for my side project using
&lt;a href=&#34;https://github.com/sorentwo/oban&#34;&gt;Oban&lt;/a&gt;. Oban has some really nice testing capabilities built-in. My jobs are
fairly basic so far, but the experience has been great. And, most of all, I&amp;rsquo;m
learning new things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rixx/git-backdate&#34;&gt;&lt;code&gt;git-backdate&lt;/code&gt;&lt;/a&gt; &amp;ndash; you know, for reasons.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;git-backdate helps you to change the date of one or multiple commits to a
new date or a range of dates.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;git backdate origin/main &amp;quot;3 days ago..today&amp;quot; --business-hours
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Similar to the &lt;a href=&#34;/weeknotes/103-woefully-inadequate-standard-library/&#34;&gt;Object IDs I recently posted about&lt;/a&gt;, &lt;a href=&#34;https://github.com/jetpack-io/typeid&#34;&gt;TypeIDs are a similar
idea&lt;/a&gt; with Stripe-like resource prefixes and you &lt;a href=&#34;https://github.com/sloanelybutsurely/typeid-elixir&#34;&gt;can use them with Elixir&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;user_2x4y6z8a0b1c2d3e4f5g6h7j8k
└──┘ └────────────────────────┘
type    uuid suffix (base32)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I can see the benefit of prefixing with the resource type for debugging, sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/106-why-we-all-need-subtitles-now/&#34;&gt;The weight loss&lt;/a&gt; is going well, &lt;em&gt;but&lt;/em&gt; the first week is usually the easiest
for me &amp;ndash; full of enthusiasm for a new me, and the results are always
encouraging from a body that is suddenly in a big calorie deficit.&lt;/p&gt;
&lt;p&gt;No graphs yet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 106: Why we all need subtitles now</title>
      <link>https://elver.me/weeknotes/106-why-we-all-need-subtitles-now/</link>
      <pubDate>Sun, 09 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/106-why-we-all-need-subtitles-now/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.newyorker.com/news/a-reporter-at-large/the-titan-submersible-was-an-accident-waiting-to-happen&#34;&gt;&amp;ldquo;The Titan Submersible Was &amp;lsquo;an Accident Waiting to Happen&amp;rsquo;&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Soon afterward, Rush asked OceanGate’s director of finance and
administration whether she’d like to take over as chief submersible pilot.&lt;/p&gt;
&lt;p&gt;&amp;lsquo;It freaked me out that he would want me to be head pilot, since my
background is in accounting&amp;rsquo; she told me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;wtf?!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;I hereby &lt;a href=&#34;https://twitter.com/josevalim/status/1675900744954785796&#34;&gt;officially announce&lt;/a&gt; the &lt;a href=&#34;https://elixir-lang.org/blog/2023/06/22/type-system-updates-research-dev/&#34;&gt;Elixir type system effort is transitioning
from research into development&lt;/a&gt;&amp;rdquo;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;While we have introduced a new syntax capable of expressing the semantics of
the new set-theoretic type system, the syntax is not final as there are
still no concrete plans for user-facing changes to the language.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s reassuring that user-facing changes are still up for discussion at this
time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m attempting to lose some weight again. I wasn&amp;rsquo;t sure whether to talk about
it here &amp;ndash; does acknowledging the attempt publicly make it more or less likely
to be successful?&lt;/p&gt;
&lt;p&gt;I know what to do. I just need to do it. I&amp;rsquo;m focussing on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Not being perfect&lt;/li&gt;
&lt;li&gt;Being more organised with&lt;/li&gt;
&lt;li&gt;Relying less on &amp;ldquo;will power&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I stop talking about it you know what happened ;) If I&amp;rsquo;m &amp;ldquo;successful&amp;rdquo; there
will be self-congratulatory graphs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fly.io/blog/litefs-cloud/&#34;&gt;LiteFS Cloud: Distributed SQLite with Managed Backups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Fly are adding a managed backup service for SQLite.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Well, that&amp;rsquo;s why we&amp;rsquo;re launching, in preview, LiteFS Cloud: backups and
restores for LiteFS, managed by Fly.io. It gives you painless and reliable
backups, with the equivalent of a snapshot every five minutes (8760
snapshots per month!), whether your database is hosted with us, or anywhere
else.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We&amp;rsquo;ll introduce pricing in the coming months, but for now LiteFS Cloud is in
preview and is free to use. Please go check it out, and let us know how it
goes!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Worth a try for free.&lt;/p&gt;
&lt;p&gt;This is very exciting and &lt;em&gt;just in time&lt;/em&gt; for a side project I&amp;rsquo;m working on.
I&amp;rsquo;m interested in trying this very soon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A GitHub UI discovery this week: If you mention a CVE identifier (common
vulnerabilities and exposures), which looks something like this &amp;ndash;
&lt;code&gt;CVE-2023-26115&lt;/code&gt; &amp;ndash; in a Git commit message it will link to the GitHub
Advisory Database automatically 👌&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The tests for my aforementioned side project run in 0.6 seconds and almost all
of them hit the database.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Finished in 0.6 seconds (0.00s async, 0.6s sync)
151 tests, 0 failures
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not Ruby, of course &amp;ndash; I&amp;rsquo;m using Elixir and Phoenix. But the main benefit
doesn&amp;rsquo;t seem to step from those so much as using SQLite instead of Postgres so
there is no &amp;ldquo;setup Postgres&amp;rdquo; step during CI.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s early days, but the difference this makes is hard to put into words.
Using other languages really makes you aware of the issues with your everyday
tools. Speed dictates how you test. I expect to do less mocking in Elixir
because hitting the database and doing &amp;ldquo;real work&amp;rdquo; is less costly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After years of a rock-solid internet connection in the last 6 weeks or so it
has become unreliable, so I wanted to setup some sort of monitoring.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve used &lt;a href=&#34;https://www.thinkbroadband.com/&#34;&gt;thinkbroadband&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;https://www.thinkbroadband.com/broadband/monitoring/quality&#34;&gt;Broadband Quality Meter (BQM)&lt;/a&gt; in the past, so
it seemed to be the logical (only service I could find) choice. However, it
was tricky to setup and the tool was reporting 100% packet loss indicating
that I was not allowing ICMP on my internet router (a &lt;a href=&#34;https://uk.store.ui.com/uk/en/pro/category/all-cloud-keys-gateways/products/usg&#34;&gt;UniFi USG&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Thankfully, I found a blog post detailing how to set it up (&lt;a href=&#34;https://www.eddgrant.com/blog/2020/10/01/enabling-wan-icmp-ping-on-a-unifi-security-gateway.html&#34;&gt;How to allow ICMP
ping on a Unifi Security Gateway WAN Interface&lt;/a&gt;) and I&amp;rsquo;m now happily
monitoring how poor my internet connection is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.anildash.com/2023/07/07/vc-qanon/&#34;&gt;&amp;ldquo;VC qanon&amp;rdquo; and the radicalization of the tech tycoons&lt;/a&gt; by Anil Dash.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;so they push each other further and further into extreme ideas because their
entire careers have been predicated on the idea that they&amp;rsquo;re genius outliers
who can see things others can&amp;rsquo;t, and that their wealth is a reward for that
imagined merit. &amp;lsquo;I must be smart, look how rich I am.&amp;rsquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=VYJtb2YXae8&#34;&gt;Why we all need subtitles now&lt;/a&gt; &amp;ndash; Dammit downmixing, &lt;em&gt;shakes fist&lt;/em&gt; ✊&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 105: Back under the Dome</title>
      <link>https://elver.me/weeknotes/105-back-under-the-dome/</link>
      <pubDate>Sun, 02 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/105-back-under-the-dome/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mdn/yari/issues/9208&#34;&gt;&amp;ldquo;MDN can now automatically lie to people seeking technical information&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MDN&amp;rsquo;s new &amp;lsquo;ai explain&amp;rsquo; button on code blocks generates human-like text that
may be correct by happenstance, or may contain convincing falsehoods. this
is a strange decision for a technical reference.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It does seem like a very odd thing to do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A delightfully short work week so that I could attend &lt;a href=&#34;https://brightonruby.com/&#34;&gt;Brighton Ruby&lt;/a&gt; on
Friday. Including this year I&amp;rsquo;ve attended all 8 times since the very
beginning. Time flies. Anecdotally, there seemed to be a more diverse
spectrum of attendees this year too, which is encouraging.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m glad that it was back in the Brighton Dome. Last year&amp;rsquo;s was held elsewhere
as it was the first one post COVID and I&amp;rsquo;m assuming there was some trepidation
about the appetite for in-person conferences. The Dome is just so much nicer
and more spacious. It was well attended &amp;ndash; Ruby and Rails apparently still has
some life left after all these years being dead.&lt;/p&gt;
&lt;p&gt;For me, it was all about meeting up with friends and colleagues rather than
the talks themselves. It was great to see old and new work colleagues
in-person after years of remote working through the pandemic.&lt;/p&gt;
&lt;p&gt;Saying that, I really enjoyed &lt;a href=&#34;https://po-ru.com/&#34;&gt;Paul Battley&amp;rsquo;s&lt;/a&gt; &lt;a href=&#34;https://github.com/threedaymonk/back-in-my-day&#34;&gt;“Back in my day …”&lt;/a&gt; lightning
talk which was very well delivered and interesting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This describes the modification of a program while travelling back in time
from Ruby 3.2.2 (2023) to Ruby 1.6.8&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The lightning talks are always the best talks.&lt;/p&gt;
&lt;p&gt;Oh, and there were socks!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wanted to create a database diagram this week so I went Googling for tools.
I don&amp;rsquo;t create them very often so I don&amp;rsquo;t have a go-to tool for the job, but I
did remember using &lt;a href=&#34;https://dbdiagram.io/&#34;&gt;dbdiagram.io&lt;/a&gt; before when it appeared in my searches.&lt;/p&gt;
&lt;p&gt;It uses an easily learnt special syntax to define your diagram instead of
being GUI-driven so you don&amp;rsquo;t get side-tracked lining up boxes, changing
colours, and generally not thinking about your database design.&lt;/p&gt;
&lt;p&gt;I like it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I heard about &lt;a href=&#34;https://kagi.com/&#34;&gt;Kagi&lt;/a&gt; this week so started using it to see what it&amp;rsquo;s like. I
set it as default in Arc and Safari on iOS. Too early to comment on how
effective it is yet, but first impressions are good. I would pay for search.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apollo is finally a goner. It&amp;rsquo;s too early to tell exactly how this will affect
my Reddit usage. However, I won&amp;rsquo;t be able to supply the Neovim content &lt;em&gt;you
crave&lt;/em&gt; without &lt;code&gt;/r/neovim&lt;/code&gt; so I&amp;rsquo;ve subscribed to that Subreddit using RSS.&lt;/p&gt;
&lt;p&gt;I think pushing ALL TEH THINGS to RSS is the way forward.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mastodon.social/@Migueldeicaza/110639808642224606&#34;&gt;Miguel de Icaza tooted this from @antirez&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Twitter is in desperate decline. And social media, in general, is in
terrible shape. That&amp;rsquo;s our fault, dear friends. To exchange messages and
pictures is a trivial internet function, not unicorn worth: we killed IRC
and NNTP, dismissed RSS, and now that&amp;rsquo;s the world we get.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have &lt;em&gt;some&lt;/em&gt; sympathy for this argument. But consider IRC, the reason we have
Slack and Discord is because IRC is a cryptic magic box that is hard to use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My iOS Home Screen needs some re-organisation, but I genuinely can&amp;rsquo;t face the
massively frustrating hold-wiggle-drag dance that is still, somehow, required
in 2023.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 104: Reboot my remote</title>
      <link>https://elver.me/weeknotes/104-reboot-my-remote/</link>
      <pubDate>Sun, 25 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/104-reboot-my-remote/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Quite a good week in terms of work. I made some changes that I was happy with.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had no idea &lt;a href=&#34;https://daringfireball.net/linked/2023/06/19/qr-codes-iphone&#34;&gt;there is a built-in QR Code Scanner in iOS&lt;/a&gt;. I usually fumble
for the Camera app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I couldn&amp;rsquo;t agree more with &lt;a href=&#34;https://hachyderm.io/@tom@ruby.social/110558830545193648&#34;&gt;Tom Stuart&amp;rsquo;s toot about Conventional Commits&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the past I’ve peacefully ignored Conventional Commits on the assumption
that it’s a harmless nuisance, but now that I’ve worked on projects that use
it, I realise it’s a genuinely terrible idea which must be stopped at all
costs&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One of the major features of a commit is to communicate the change being made.
Does prefixing your commit subject with something a computer is going to use
benefit the humans involved?&lt;/p&gt;
&lt;p&gt;I have a suspicion that those who like conventional commits are the same
people who fail to write decent commit messages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My car has been making a weird noise which eventually turned out to be the
engine cover under the car flapping about. It&amp;rsquo;s quite likely that when it was
last serviced the garage left out three bolts when putting things back
together. Good times.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Brighton Ruby is next week; it should be nice to catch up with some people I
haven&amp;rsquo;t seen in a while. Hoping it&amp;rsquo;s not as sweaty as previous years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;macOS Sonoma was announced, so I decided it was time to upgrade to Ventura. I
feared that everything would stop working but it was surprisingly
straight-forward with the small exception of my Studio Display becoming
unresponsive until I power cycled it 😬&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;new&amp;rdquo; System Settings really is as bad as everyone has been saying this
last year. Genuinely awful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My Apple TV remote volume control buttons stopped working. I had to &lt;a href=&#34;https://support.apple.com/en-us/HT213437&#34;&gt;reboot it
to fix the issue&lt;/a&gt;. I had to &lt;em&gt;reboot&lt;/em&gt; my TV remote.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 103: Woefully inadequate standard library</title>
      <link>https://elver.me/weeknotes/103-woefully-inadequate-standard-library/</link>
      <pubDate>Sun, 18 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/103-woefully-inadequate-standard-library/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://eev.ee/blog/2017/10/07/javascript-got-better-while-i-wasnt-looking/&#34;&gt;JavaScript got better while I wasn’t looking&lt;/a&gt; &amp;ndash; another great article from
Eevee.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;woefully inadequate standard library&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Coming from Ruby, this is one of my biggest issues with JavaScript &amp;ndash; doing
&lt;em&gt;anything&lt;/em&gt; seems to require a library.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Someone is working on &lt;a href=&#34;https://github.com/elixir-lang/elixir/issues/12644&#34;&gt;improvements to how Elixir outputs compiler diagnostics&lt;/a&gt;.
It looks very nice!&lt;/p&gt;
&lt;p&gt;Side note: Look at how José Valim interacts with other people in his open
source projects. Compare this to, I don&amp;rsquo;t know&amp;hellip;some other well known web
frameworks&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve become increasingly aware that I&amp;rsquo;m bad at asking for help. I feel I
should be able to do everything on my own.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;a href=&#34;/weeknotes/20-whiteboards-and-css/&#34;&gt;issue 20&lt;/a&gt; I said that I need to learn Flexbox and generally get up to
speed with more modern CSS. I did some learning then, but if I don&amp;rsquo;t use it, I
forget it. This week I&amp;rsquo;ve been Flexbox-ing again but via Tailwind.&lt;/p&gt;
&lt;p&gt;The time it took me to figure out how to right align two &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;s out of a
&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; was frustrating. And it didn&amp;rsquo;t involve Flexbox directly. Of course, I
will remember this &amp;ldquo;trick&amp;rdquo; next time, but should it need tricks?&lt;/p&gt;
&lt;p&gt;I find modern CSS equal parts amazing and disappointing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://danschultzer.com/posts/prefixed-base62-uuidv7-object-ids-with-ecto&#34;&gt;Prefixed base62 UUIDv7 Object IDs with Ecto&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nice walkthrough about how to add support for UUIDv7 to Ecto.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Object IDs should carry context so we will add prefixes to the IDs:
/accounts/acct_02tRrww6GFm4urcMhyQpAS.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The benefits of prefixing the ID with the resource type are clear, but they
sure do look fugly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Google have decided to start &lt;a href=&#34;https://developer.chrome.com/blog/chrome-for-testing/&#34;&gt;offering a Chrome version just for testing&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You want consistent, reproducible results across repeated test runs—but this
may not happen if the browser executable or binary decides to update itself
in between two runs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.val.town/&#34;&gt;val town&lt;/a&gt; &amp;ndash; cool idea.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If GitHub Gists could run
And AWS Lambda were fun&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Reddit guy doesn&amp;rsquo;t seem to understand Reddit &lt;em&gt;at all&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I got a personal best on my bench press this week. A number I&amp;rsquo;ve wanted to get
for a while now. Most people would feel great having achieved this goal. I
felt nothing really. Slightly pleased was the most I could muster.&lt;/p&gt;
&lt;p&gt;Some fellow gym goers encouraged me to go for it. And I made it. But I was
annoyed. Annoyed that I achieved it with relative ease and that it took other
people pushing me to try at all. Could I have done this months ago if I&amp;rsquo;d just
tried?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m really struggling to get back on track with things at the moment. I feel
like I have so much time and opportunity for betterment but I&amp;rsquo;m not taking
advantage of that. I want to learn x, and y, but I don&amp;rsquo;t start. Or start and
stop when it gets hard.&lt;/p&gt;
&lt;p&gt;I have projects that I was enthusiastic about when I started them but as soon
as they got hard my brain says &amp;ldquo;What&amp;rsquo;s the point in this anyway?&amp;rdquo;. I try
telling it to shut up, &amp;ldquo;there&amp;rsquo;s no point in anything, idiot&amp;rdquo;, but he always
wins.&lt;/p&gt;
&lt;p&gt;What is important? What &lt;em&gt;should&lt;/em&gt; I be doing? And where do I start? Fucking
tedious beyond measure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I bought 3kg of frozen gooseberries online this week.&lt;/p&gt;
&lt;p&gt;Shut up. I like gooseberries.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 102: Disappointing behaviour by Reddit</title>
      <link>https://elver.me/weeknotes/102-disappointing-behaviour-by-reddit/</link>
      <pubDate>Sun, 11 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/102-disappointing-behaviour-by-reddit/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I was excited (and surprised, because I believed that Oban&amp;rsquo;s design relied
heavily on Postgres-specific features) to see that &lt;a href=&#34;https://github.com/sorentwo/oban#running-with-sqlite3&#34;&gt;it gained SQLite support&lt;/a&gt;
since I last used it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Oban ships with engines for PostgreSQL and SQLite3. Both engines support the
same core functionality for a single node, while the Postgres engine is more
advanced and designed to run in a distributed environment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m keen on using Oban in smaller projects and it&amp;rsquo;s great that you can start
with SQLite and migrate to Postgres later if you need or want to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/ruby/comments/142b07v/cookpad_to_discontinue_ruby_interpreter/&#34;&gt;&amp;ldquo;Cookpad to discontinue Ruby interpreter development&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sad to see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/samselikoff/status/1666098717458583556&#34;&gt;Here&amp;rsquo;s a great UI tip&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here&amp;rsquo;s a button everyone&amp;rsquo;s made: flashing loading state that depends on
latency of operation, layout shift, and ambiguity about whether operation
was successful&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ruby.social/@getajobmike/110508928399299518&#34;&gt;&amp;ldquo;We should stop using JavaScript&amp;rdquo; &amp;ndash; Douglas Crockford&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or maybe we shouldn&amp;rsquo;t have started at all&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/apolloapp/comments/144f6xm/apollo_will_close_down_on_june_30th_reddits/&#34;&gt;Apollo will close down on June 30th&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Reddit’s recent decisions and actions have unfortunately made it impossible
for Apollo to continue.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There has been &lt;a href=&#34;https://www.theverge.com/2023/6/9/23755640/reddit-api-changes-apps-apollo-shut-down-ama-spez-steve-huffman&#34;&gt;much commentary&lt;/a&gt; on how awful Reddit have been, especially Steve
Huffman (&lt;code&gt;/u/spez&lt;/code&gt;) to Christian Selig. If you&amp;rsquo;re gonna lie perhaps make sure
there isn&amp;rsquo;t a full audio recording and transcript out in public beforehand.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t realise how much some users with different needs rely on the
accessibility features of third-party apps to access Reddit at all. A big
issue for those people.&lt;/p&gt;
&lt;p&gt;Very disappointing behaviour by Reddit. Will I continue using Reddit? I dunno,
the addiction is real, but I still have LinkedIn.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daringfireball.net/2023/06/first_impressions_of_vision_pro_and_visionos&#34;&gt;First Impressions of Vision Pro and VisionOS&lt;/a&gt; &amp;ndash; I&amp;rsquo;m keen to try it out but I
don&amp;rsquo;t currently see why I would want or need this, with the exception of
watching films on a plane 😄&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An &lt;a href=&#34;https://twitter.com/pjullrich/status/1636275674779467776&#34;&gt;example of migrating &lt;code&gt;Phoenix.View&lt;/code&gt; to &lt;code&gt;Phoenix.Component&lt;/code&gt;&lt;/a&gt;. I love the
way everything is just functions. The magic is minimal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve lost interest in &lt;a href=&#34;https://www.imdb.com/title/tt14688458/&#34;&gt;Silo&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was mucking about with Tailwind CSS animations a bit this week and found the
four built-in ones a bit lacking, so went looking for how to add more. I
discovered that you can add your own re-usable animations through the
&lt;code&gt;tailwind.config.js&lt;/code&gt; config file.&lt;/p&gt;
&lt;p&gt;I grabbed a pre-defined animation from the &lt;a href=&#34;https://github.com/animate-css/animate.css&#34;&gt;Animate.css&lt;/a&gt; project and munged it
into the Tailwind format.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.logrocket.com/creating-custom-animations-tailwind-css/&#34;&gt;LogRocket has written a blog post on the subject&lt;/a&gt; which I found very useful.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 101: Ruby itself</title>
      <link>https://elver.me/weeknotes/101-ruby-itself/</link>
      <pubDate>Sun, 04 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/101-ruby-itself/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ruby apparently &lt;a href=&#34;https://twitter.com/alexandre_ruban/status/1663090551606988800&#34;&gt;has an &lt;code&gt;itself&lt;/code&gt; method&lt;/a&gt;. Ruby has a lot of methods.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;%&lt;/span&gt;i&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;foo bar baz&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;].&lt;/span&gt;index_by(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#990073&#34;&gt;:itself&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:foo&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#990073&#34;&gt;:foo&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:bar&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#990073&#34;&gt;:bar&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:baz&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#990073&#34;&gt;:baz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href=&#34;https://twitter.com/ozziexsh/status/1662961744212561921&#34;&gt;cool thing about LiveBook&lt;/a&gt; which I knew but forgot.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;keeping @livebookdev connected to your local phoenix app while developing is
a huge time saver&lt;/p&gt;
&lt;p&gt;it&amp;rsquo;s so nice to quickly inspect ecto results and prototype modules without
refreshing your web app or going into iex&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m going to try this out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://phoenixframework.org/blog/phoenix-liveview-0.19-released&#34;&gt;Phoenix LiveView 0.19 released&lt;/a&gt; &amp;ndash; Lots of nice improvements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think we can agree that &lt;a href=&#34;https://www.businessinsider.com/credit-card-phone-theft-sim-swap-identity-theft-investigation-2023-4&#34;&gt;this is terrifying&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;After gaining control of my phone, a hacker ripped me off for $10,000. The
scam turned out to be brilliant — and terrifying.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wanted to get &lt;code&gt;:AV&lt;/code&gt; from Rails.vim in Neovim for Elixir projects so I looked
at adding the relevant &lt;a href=&#34;https://github.com/tpope/vim-projectionist&#34;&gt;projectionist&lt;/a&gt; config. However, it turned out that I
should maybe be using &lt;a href=&#34;https://github.com/elixir-tools/elixir-tools.nvim&#34;&gt;elixir-tools.nvim&lt;/a&gt; instead which has projectionist
support, but also many other things including ElixirLS which I hadn&amp;rsquo;t setup
yet.&lt;/p&gt;
&lt;p&gt;A note about setting up Elixir LS though: &lt;a href=&#34;https://github.com/elixir-lsp/elixir-ls/issues/886&#34;&gt;it does not currently work with
the recently released OTP 26&lt;/a&gt;, so I downgraded my project in the meantime
until this is fixed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Christian Selig of &lt;a href=&#34;https://apolloapp.io/&#34;&gt;Apollo&lt;/a&gt; was &lt;a href=&#34;https://www.reddit.com/r/apolloapp/comments/13ws4w3/had_a_call_with_reddit_to_discuss_pricing_bad/&#34;&gt;unfortunately wrong&lt;/a&gt; to be hopeful about
Reddit&amp;rsquo;s new API pricing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Had a call with Reddit to discuss pricing. Bad news for third-party apps,
their announced pricing is close to Twitter&amp;rsquo;s pricing, and Apollo would have
to pay Reddit $20 million per year to keep running as-is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A shame for both Apollo and him personally. Companies build their userbase on
the back of third-party clients and inevitably screw them over once they&amp;rsquo;ve
done their job. See also Twitter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Livebook development continues at pace &amp;ndash; &lt;a href=&#34;https://github.com/livebook-dev/livebook/pull/1936&#34;&gt;Overlay doctest results&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We now show doctests results directly in the editor in @livebookdev!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Via &lt;a href=&#34;https://twitter.com/josevalim/status/1663316201584443394&#34;&gt;José Valim&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.visionarycto.com/p/my-20-year-career-is-technical-debt&#34;&gt;My 20 Year Career is Technical Debt or Deprecated&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t agree with a lot of the points in this article, but something stood
out that is important.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is no such thing as perfect. Over time what was perfect today won’t be
perfect in the future. Learn to live with less than perfect.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This, so much. I am &lt;em&gt;terrible&lt;/em&gt; at this. Perfectionism is a curse.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In my ever present quest to use non-mainstream tools and technologies I
started looking at &lt;a href=&#34;https://wezfurlong.org/wezterm/&#34;&gt;WezTerm&lt;/a&gt; this week as a possible replacement for iTerm,
which I&amp;rsquo;ve been happily using for years.&lt;/p&gt;
&lt;p&gt;Initial thought, the the colours in WezTerm are not the same as in iTerm. Can
I be bothered to start investigating that? I&amp;rsquo;m not sure I have the energy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=cG8iwK_6KIg&#34;&gt;Doomguy visits the BEAM: lightning talk&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A really fun talk by André Albuquerque at ElixirConf EU 2023 that demonstrates
the various supervisor restart strategies available on the BEAM via Doom.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 100: One hundred</title>
      <link>https://elver.me/weeknotes/100-one-hundred/</link>
      <pubDate>Sun, 28 May 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/100-one-hundred/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Well, well. Here we are. 100 weeknotes published. I&amp;rsquo;ve really enjoyed the
process of writing these. Mostly a link blog, occasionally something more
personal. But importantly, always once a week.&lt;/p&gt;
&lt;p&gt;It might not sound like much of an achievement to some, but for me, 100
instances of consistent effort is a pretty big deal. What is it about this
activity that has meant I&amp;rsquo;ve stuck with it?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Really tempted to order an &lt;a href=&#34;https://retro.remysharp.com/tag/ips/&#34;&gt;original Gameboy from Remy&lt;/a&gt; 😬&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/television/comments/13ik0zn/david_simon_breaks_down_the_writers_strike_with/&#34;&gt;David Simon the writer&amp;rsquo;s strike&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;David Simon breaks down the Writers Strike with the same elite storytelling
as each season of The Wire&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m still getting used to &lt;a href=&#34;https://hexdocs.pm/phoenix_live_view/assigns-eex.html&#34;&gt;HEEx&lt;/a&gt; templates, and I was trying to add a
&lt;code&gt;disabled&lt;/code&gt; attribute to a &lt;code&gt;&amp;lt;.button&amp;gt;&lt;/code&gt; component.&lt;/p&gt;
&lt;p&gt;If you return a string like this the value is interpolated.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;.button type=&amp;quot;submit&amp;quot; disabled={&amp;quot;true&amp;quot;}&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;button type=&amp;quot;submit&amp;quot; disabled=&amp;quot;true&amp;quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, it you return a boolean like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;.button type=&amp;quot;submit&amp;quot; disabled={true}&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You get a valueless attribute.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;button type=&amp;quot;submit&amp;quot; disabled&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is what I normally want.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/simeji/jid&#34;&gt;json incremental digger&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can drill down JSON interactively by using filtering queries like jq.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/96-compilation-problems/&#34;&gt;Erlang woes&lt;/a&gt; definitely seem over with as I easily installed the latest
Erlang 26.0 and Elixir 1.14.4 released this week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m writing this from Copenhagen where we&amp;rsquo;re spending a long weekend. So now
you know why this week&amp;rsquo;s notes are shorter than usual 😉&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Here&amp;rsquo;s to one hundred more 🎉&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 99: CSS nostalgia</title>
      <link>https://elver.me/weeknotes/99-css-nostalgia/</link>
      <pubDate>Sun, 21 May 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/99-css-nostalgia/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://eev.ee/blog/2020/02/01/old-css-new-css/&#34;&gt;Old CSS, new CSS&lt;/a&gt; &amp;ndash; the nostalgia absolutely drips off this.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s pretty much as I remember it and a nice reminder.&lt;/p&gt;
&lt;p&gt;(I should stop self-closing tags &lt;code&gt;&amp;lt;br /&amp;gt;&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Relevant content: &lt;a href=&#34;https://moderncss.dev/&#34;&gt;Modern CSS Solutions for Old CSS Problems&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://testing.googleblog.com/2010/12/test-sizes.html?m=1&#34;&gt;Test Sizes&lt;/a&gt; &amp;ndash; Test types are indeed a difficult topic and poorly understood.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What do you call a test that tests your application through its UI? An
end-to-end test? A functional test? A system test? A selenium test?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I forgot to mention last week, I&amp;rsquo;m really enjoying &lt;a href=&#34;https://www.imdb.com/title/tt14688458/&#34;&gt;Silo&lt;/a&gt; from Apple TV+!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In Vim, you can replace the last search you made without retyping the word by
doing &lt;code&gt;%s//replacement/&lt;/code&gt; 😮 This is useful when you&amp;rsquo;ve searched for the word
under the cursor with &lt;code&gt;*&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Everyone is making fonts these days &amp;ndash; &lt;a href=&#34;https://github.com/intel/intel-one-mono&#34;&gt;Intel One Mono Typeface&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I learnt how to ignore a capture group this week. Sometimes you need to
&amp;ldquo;capture&amp;rdquo; something but you&amp;rsquo;re not actually interested in using the value. It
may be necessary in order to make the regular expression match.&lt;/p&gt;
&lt;p&gt;Take the string &lt;code&gt;1.2.3-p123&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(\d+\.\d+\.\d+(-.+)?)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This regex will match the string and make &lt;code&gt;-p123&lt;/code&gt; optional. But if the string
you&amp;rsquo;re matching doesn&amp;rsquo;t include &lt;code&gt;-p123&lt;/code&gt; you will get an empty match group,
which may be undesirable.&lt;/p&gt;
&lt;p&gt;However, if you add &lt;code&gt;?:&lt;/code&gt; like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(\d+\.\d+\.\d+(?:-.+)?)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The last capture group the optional capture will be omitted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Did you know about the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/webkitdirectory&#34;&gt;&lt;code&gt;webkitdirectory&lt;/code&gt; HTML attribute&lt;/a&gt; for inputs?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;..indicates that the &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; element should let the user select
directories instead of files. When a directory is selected, the directory
and its entire hierarchy of contents are included in the set of selected
items.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.audible.co.uk/pd/The-Debutante-Audiobook/B0BV18S28C&#34;&gt;The Debutante&lt;/a&gt; by Jon Ronson was a crazy, and good, listen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.destroyallsoftware.com/compendium/types?share_key=baf6b67369843fa2&#34;&gt;&amp;ldquo;Types. For anyone who knows a programming language.&amp;rdquo;&lt;/a&gt; by Gary Bernhardt, is,
as you&amp;rsquo;d expect, excellent. If you want to know about types, read this. As
Gary explains the terms used often means different things to different people.
I will refer to this in the future, for sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was messing around with Tailwind CSS this week so decided to setup LSP
support for it in Neovim. I&amp;rsquo;ve been putting this off for a while because I
thought it was going to be difficult, but it was actually fairly easy.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;https://github.com/jordelver/dotfiles/commit/bbca0f9e521ee246d6fa6ec861483177c1a763b1&#34;&gt;the commit in my dotfiles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lesson: stop putting things off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=NhHi0OjHUMQ&#34;&gt;Tech CEOs Rank Web Browsers (AI Tier List)&lt;/a&gt; by The Browser Company.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ldpreload.com/blog/names-to-reserve&#34;&gt;Hostnames and usernames to reserve&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you&amp;rsquo;re setting up a service where people can register their own usernames
to be used as a hostname (username.example.com), email address
(&lt;a href=&#34;mailto:username@example.com&#34;&gt;username@example.com&lt;/a&gt;), or URL path (example.com/username) within your
domain, there are some common names you should avoid letting the general
public register.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This never has never occurred to me, but spelt out, it makes sense.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=KrjL_TSOFrI&#34;&gt;Lord of the Rings by Wes Anderson Trailer | The Whimsical Fellowship&lt;/a&gt; &amp;ndash;
Bravo!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 98: Trauma is trauma</title>
      <link>https://elver.me/weeknotes/98-trauma-is-trauma/</link>
      <pubDate>Sun, 14 May 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/98-trauma-is-trauma/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can &lt;a href=&#34;https://www.akshaykhot.com/rails-inline-routes/&#34;&gt;specify inline routes&lt;/a&gt; inside your Rails &lt;code&gt;config/routes.rb&lt;/code&gt;. Handy
for those times when you don&amp;rsquo;t want a full controller.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;get &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;test&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;to&lt;/span&gt;: &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;(env) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;200&lt;/span&gt;, {}, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;hello world&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chris McCord&amp;rsquo;s gives an nice overview of where LiveView has been and is going
in his keynote at ElixirConf EU 2023 &amp;ndash; &lt;a href=&#34;https://www.youtube.com/watch?v=FADQAnq0RpA&#34;&gt;The Road To LiveView 1.0&lt;/a&gt;. Solving
the nested form inputs issue is music to my ears. I&amp;rsquo;ve written this from
scratch before and it was very not fun.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://attachment.zip&#34;&gt;attachment.zip&lt;/a&gt; (Via &lt;a href=&#34;https://phpc.social/@davidbisset/110362507505753653&#34;&gt;@davidbisset@phpc.social&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://kevinlang.me/phoenix-liveview-navigation-regressions/&#34;&gt;Phoenix LiveView Navigation Regressions&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;LiveView excels for complex UI logic, or things like live updates. For
back-office applications it is hard to be beat. In other words, proper
applications that would’ve otherwise needed an SPA to implement. But for
basic blogs or documentation sites, I recommend instead to continue to use
normal views.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yep. I personally think using it for anything that would be an SPA is a valid
choice, but for normal web pages? No.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.reddit.com/r/ruby/comments/13evzry/chrome_considers_gems_to_be_dangerous/&#34;&gt;Rubygems website was blocked by Firefox and Chrome this week&lt;/a&gt; by being
included in the Google Safe Browsing database.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/hopsoft/model_probe&#34;&gt;ModelProbe&lt;/a&gt; for ActiveRecord looks neat.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Colorized table info for columns, types, nullables, indexes&amp;hellip; and the
actual DDL used by the database to create the table. All this and more with
ModelProbe!&lt;/p&gt;
&lt;p&gt;Get a clear picture of your model&amp;rsquo;s underlying schema with beautiful and
informative schema introspection.
Generate model class definitions with a well organized, logical structure.
Create sensible text fixture stubs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next time I have the need for anything Docker I&amp;rsquo;m going to check out
&lt;a href=&#34;https://orbstack.dev/&#34;&gt;OrbStack&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Run Docker and Linux on your Mac seamlessly and efficiently. Docker Desktop
alternative that helps you work faster.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://grayduck.mn/2023/04/17/refresh-vs-long-lived-access-tokens/&#34;&gt;Refresh vs. Long-lived Access Tokens&lt;/a&gt; &amp;ndash; This is a really good read on why we
have moved towards a refresh token world. Refresh tokens are annoying, for
sure, but there are reasons.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why would you want to use long-lived refresh tokens that generate
short-lived access tokens as commonly seen in OAuth 2.0, versus long-lived
access tokens? Aren’t you simply replacing one long-lived token with
another?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rubyatscale/singed&#34;&gt;Singed&lt;/a&gt; seems like an easy way to get hold of a flamegraph. I&amp;rsquo;ve briefly used
stackprof and speedscope recently and it was a bit of faff getting going.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Singed makes it easy to get a flamegraph anywhere in your code base. It
wraps profiling your code with stackprof or rbspy, and then launching
speedscope to view it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This certainly looks easier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=JBvc7Ny4iUk&#34;&gt;Trauma is Trauma by Kevin Smith&lt;/a&gt; hit me hard. Worth watching.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 97: Resolved issues</title>
      <link>https://elver.me/weeknotes/97-resolved-issues/</link>
      <pubDate>Sun, 07 May 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/97-resolved-issues/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add translations to your app with ChatGPT with &lt;a href=&#34;https://github.com/obie/instant18n/&#34;&gt;instant18n&lt;/a&gt;?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Uses the power of OpenAI&amp;rsquo;s GPT large language AI models to generate
translations for your application.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rubycentral.org/#/portal/signup&#34;&gt;Ruby Central are launching memberships&lt;/a&gt;. I think most Ruby developers would
say that supporting Ruby Central is a good idea &amp;ndash; support the work that
enables your work. It makes sense.&lt;/p&gt;
&lt;p&gt;Perhaps I&amp;rsquo;m cheap, but to me the membership prices seem to be set at what
someone &lt;em&gt;should&lt;/em&gt; pay rather than what they &lt;em&gt;will&lt;/em&gt; pay. The starting membership
is $25. Surely making the first tier $10 a month moves it into cup of coffee,
signup without thinking, no-brainer territory? Chuck in a couple of stickers
when you sign-up (like the EFF do) and you get more people involved overall?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/96-compilation-problems/&#34;&gt;compilation issues I mentioned last week&lt;/a&gt; are thankfully now resolved
after re-installing all the things including &lt;a href=&#34;https://brew.sh/&#34;&gt;Homebrew&lt;/a&gt; and &lt;a href=&#34;https://asdf-vm.com/&#34;&gt;asdf&lt;/a&gt; managed
tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://justsimply.dev/&#34;&gt;JustSimply.dev&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Scan your technical writing for words such as easy, painless,
straightforward, trivial, simple and just. Chances are your writing will be
clearer as a result of removing them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Chris_Lattner&#34;&gt;Chris Lattner&lt;/a&gt;&amp;rsquo;s (of &lt;a href=&#34;https://en.wikipedia.org/wiki/LLVM&#34;&gt;LLVM&lt;/a&gt; fame) startup, &lt;a href=&#34;https://www.modular.com/&#34;&gt;Modular&lt;/a&gt;, are working on a new
Python compatible programming language called &lt;a href=&#34;https://docs.modular.com/mojo/&#34;&gt;Mojo&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mojo is a new programming language that bridges the gap between research and
production by combining the best of Python syntax with systems programming
and metaprogramming.&lt;/p&gt;
&lt;p&gt;With Mojo, you can write portable code that’s faster than C and seamlessly
inter-op with the Python ecosystem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I found some debugging helpers in depths of the current codebase I&amp;rsquo;m working
on at the moment. One of them was using &lt;a href=&#34;https://github.com/sonota88/anbt-sql-formatter&#34;&gt;sonota88/anbt-sql-formatter&lt;/a&gt; to show
the SQL of a query. It makes it so much easier to see what&amp;rsquo;s going on than a
super long hundred character string.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jakeworth.com/frozen-string-comment-yagni/&#34;&gt;Ruby&amp;rsquo;s Frozen String Comment: YAGNI&lt;/a&gt; &amp;ndash; I have to admit that I was once that
guy who threw  &lt;code&gt;frozen_string_literal: true&lt;/code&gt; magic comments into codebases
with gay abandon. There is certainly confusion about it. Perhaps now is the
time to stop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ntfy.sh/&#34;&gt;ntfy&lt;/a&gt; looks great! I was up-and-running in no time. There are a few different
services that use, &lt;a href=&#34;https://pushover.net/&#34;&gt;pushover&lt;/a&gt; is one I&amp;rsquo;m most familiar with, but the design of
ntfy is very nice. Worth a look if you want to send yourself notifications
from scripts and the like.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://justingarrison.com/blog/2023-04-24-mastodon-is-doomed/&#34;&gt;The Mastodon people hoped for is doomed&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mastodon.social/@gruber/110314445390262849&#34;&gt;Gruber on Mastodon and Bluesky&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I like Mastodon, especially using @ivory, and I love the community I’m in
here. And maybe our community will stay here. What makes Mastodon good for
us nerds is that all the non-nerds aren’t here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is what I realised recently. The Twitter of 2007 was a place full of
interesting tech stuff, and then everyone else joined and it slowly devolved
into the mess we have now. If Mastodon stays nerd-only I will be happy with
that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shopify, after bragging about hiring 2000 developers in 2022, have cut their
workforce by 20%. I&amp;rsquo;m sad for the people who work there 😢&lt;/p&gt;
&lt;p&gt;Their stock price shot up in response&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://livebook.dev/&#34;&gt;Livebook&lt;/a&gt; has been on my radar for a while, but I hadn&amp;rsquo;t been following along
very closely. When it was first released I thought it was cool, but I didn&amp;rsquo;t
really feel like I needed it. Well, I watched the videos Jose Valim put
together for &lt;a href=&#34;https://news.livebook.dev/deploy-notebooks-as-apps-quality-of-life-upgrades---launch-week-1---day-1-2OTEWI&#34;&gt;Livebook Launch Week&lt;/a&gt;, and wow, this thing is off the hook.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 96: Compilation problems</title>
      <link>https://elver.me/weeknotes/96-compilation-problems/</link>
      <pubDate>Sun, 30 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/96-compilation-problems/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://betterprogramming.pub/why-chatgpt-wont-replace-coders-just-yet-87487a9dda4e&#34;&gt;&amp;ldquo;Why ChatGPT Won’t Replace Coders Just Yet&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The “bullshit” problem turns up in code, too&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For a while now I&amp;rsquo;ve experienced compilation issues when installing new Erlang
versions with &lt;a href=&#34;https://github.com/asdf-vm/asdf&#34;&gt;asdf&lt;/a&gt;. Which is annoying because I often want to quickly try
out some of the new improvements to the Elixir ecosystem and ending up in a
&lt;code&gt;./configure&lt;/code&gt; debugging session is no fun.&lt;/p&gt;
&lt;p&gt;After digging in &lt;em&gt;a bit&lt;/em&gt; it seems that the Erlang &lt;code&gt;configure&lt;/code&gt; step thinks that
this machine is &lt;code&gt;x86_64&lt;/code&gt;, which it isn&amp;rsquo;t. I&amp;rsquo;m fairly sure this is down to me
using Rosetta 2 (&lt;code&gt;x86&lt;/code&gt; emulation) when I set everything up. Back when I got
this machine there were various teething issues, also compilation related,
with getting my Ruby projects up and running, so I setup iTerm is be run under
Rosetta and everything started working.&lt;/p&gt;
&lt;p&gt;However, I think now is the time to start anew and remove any emulation. A lot
of Ruby issues have been ironed out, and it might just fix my Erlang problems
too. Watch this space.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Did you know you can find out whether a file starts with a &lt;a href=&#34;https://en.wikipedia.org/wiki/Byte_order_mark&#34;&gt;BOM&lt;/a&gt; by using
&lt;code&gt;xxd&lt;/code&gt; and seeing what the first three bytes are?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xxd -l 3 -p path/to/file
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If they are &lt;code&gt;efbbbf&lt;/code&gt; then you have found a BOM.&lt;/p&gt;
&lt;p&gt;Why, yes. I have been reading &lt;a href=&#34;https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/&#34;&gt;The Absolute Minimum Every Software Developer
Absolutely, Positively Must Know About Unicode and Character Sets (No
Excuses!)&lt;/a&gt;. Again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I listened to &lt;a href=&#34;https://www.thefp.com/witchtrials&#34;&gt;The Witch Trials of J.K. Rowling&lt;/a&gt; audio documentary. The fact
that I hesitated to even include that fact here should give you an idea of
just how contentious the issue is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some feedback on a recent PR of mine prompted a small investigation into how
the default ordering of records works with ActiveRecord. So a reminder.&lt;/p&gt;
&lt;p&gt;A standard &lt;code&gt;order(name: :asc)&lt;/code&gt; is going to order like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Annabel
Barry
Christoph
annabel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using SQL with &lt;code&gt;LOWER&lt;/code&gt; like &lt;code&gt;order(&amp;quot;LOWER(name) ASC&amp;quot;)&lt;/code&gt; is going to get you
something more sensible in &lt;em&gt;most&lt;/em&gt; cases.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Annabel
annabel
Barry
Christoph
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you change the column datatype to &lt;a href=&#34;https://www.postgresql.org/docs/current/citext.html&#34;&gt;&lt;code&gt;citext&lt;/code&gt;&lt;/a&gt; you get something different
again.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;annabel
Annabel
Barry
Christoph
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which is correct depends on you 😉&lt;/p&gt;
&lt;p&gt;I know a previous colleague, and current friend, suggested in the past that
all email columns, in particular, should be &lt;code&gt;citext&lt;/code&gt; to save the constant
calls to &lt;code&gt;String#downcase&lt;/code&gt; or &lt;code&gt;LOWER(field)&lt;/code&gt; before comparison. I think
there&amp;rsquo;s something in that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.nitrokey.com/news/2023/smartphones-popular-qualcomm-chip-secretly-share-private-information-us-chip-maker&#34;&gt;Smartphones With Popular Qualcomm Chip Secretly Share Private
Information With US Chip-Maker&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is possible because the Qualcomm chipset itself sends the data,
circumventing any potential Android operating system setting and protection
mechanisms.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;🔥 This is fine 🔥&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 95: Pragmatic conclusion</title>
      <link>https://elver.me/weeknotes/95-pragmatic-conclusion/</link>
      <pubDate>Sun, 23 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/95-pragmatic-conclusion/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The task I was stressing about is now done and dusted so I can put that behind
me, and I worked four days this week 👌&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reddit are going to &lt;a href=&#34;https://www.reddit.com/r/programming/comments/12r0xyz/reddit_will_begin_charging_for_access_to_its_api/&#34;&gt;start charging for their API&lt;/a&gt;. The beginning of the end?
What will I do with all my time? The &lt;a href=&#34;https://www.reddit.com/r/apolloapp/comments/12ram0f/had_a_few_calls_with_reddit_today_about_the/&#34;&gt;author of Apollo seems cautiously
optimistic&lt;/a&gt; that this change might be a good thing 🤞&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://betterprogramming.pub/why-i-stopped-using-sorbet-in-all-my-ruby-projects-9366bf6dd116&#34;&gt;Why I Stopped Using Sorbet in All My Ruby Projects&lt;/a&gt; &amp;ndash; An interesting take on
using Sorbet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mullvad were &lt;a href=&#34;https://mullvad.net/en/blog/2023/4/20/mullvad-vpn-was-subject-to-a-search-warrant-customer-data-not-compromised/&#34;&gt;visited by the Swedish Police&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mullvad have been operating our VPN service for over 14 years. This is the
first time our offices have been visited with a search warrant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you remember how &lt;a href=&#34;https://lodash.com/&#34;&gt;lodash&lt;/a&gt; made JavaScript bearable back in the day? You
might be interested in &lt;a href=&#34;https://thescottyjam.github.io/snap.js/&#34;&gt;Vanilla JavaScript replacements&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;(Via &lt;a href=&#34;https://twitter.com/nghuuphuoc/status/1637242613366501376&#34;&gt;Phuoc Nguyen&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My Gandi to &lt;a href=&#34;https://porkbun.com/&#34;&gt;Porkbun&lt;/a&gt; migration is complete. I transferred 4 domains this week
and it was a straight forward process. I slightly concerned as I haven&amp;rsquo;t
transferred a domain for years, but the instructions on Porkbun&amp;rsquo;s website were
helpful.&lt;/p&gt;
&lt;p&gt;I had a small support query and it took literally 2 minutes to get a response
via online chat. Extremely impressive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This blog post from GitHub &amp;ndash; &lt;a href=&#34;https://github.blog/2023-04-06-building-github-with-ruby-and-rails/&#34;&gt;Building GitHub with Ruby and Rails&lt;/a&gt; &amp;ndash; shows
how they keep on top of Rails and Ruby upgrades. Chipping away, rather than
big bang upgrades is the way.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every Monday a scheduled GitHub Action workflow triggers an automated pull
request, which bumps our Rails version to the latest commit on the Rails
main branch for that day.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After nearly 10 years of Vim usage I&amp;rsquo;ve only recently started using tabs and
I&amp;rsquo;m still not sure I&amp;rsquo;m doing it right since reading &lt;a href=&#34;https://joshldavis.com/2014/04/05/vim-tab-madness-buffers-vs-tabs/&#34;&gt;Vim Tab Madness. Buffers
vs Tabs&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jemma.dev/about-me/&#34;&gt;Jemma Issroff&amp;rsquo;s&lt;/a&gt; blog post &amp;ndash; &lt;a href=&#34;https://jemma.dev/blog/irb-measure&#34;&gt;IRB&amp;rsquo;s Built-in Measure&lt;/a&gt; &amp;ndash; shows off the
profiling capabilities now built-in to Ruby 3. A really nice feature. Be sure
to check out &lt;a href=&#34;https://jemma.dev/blog/irb-custom-measure-procedures&#34;&gt;part 2&lt;/a&gt; as well where she shows how to add a custom measurement
for &lt;a href=&#34;https://www.speedscope.app/&#34;&gt;Speedscope&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thoughtbot&amp;rsquo;s &lt;a href=&#34;https://github.com/thoughtbot/hotwire-example-template&#34;&gt;Hotwire Example Template&lt;/a&gt; repo looks like a great resource for
figuring out how to use Hotwire. Loads of easy to follow examples. One to
bookmark for later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fly.io/phoenix-files/can-phoenix-safely-use-the-zip-module/&#34;&gt;Can Phoenix Safely Use the Zip Module?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This post explores the OTP :zip module and tests it against two different
types of zip attacks so we can learn how to safely use zip in our Elixir
applications.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conclusion: Be careful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As someone who once really enjoyed cycling, and is thinking of getting back
into it, I was intrigued by &lt;a href=&#34;https://www.youtube.com/watch?v=rhzH6mEpIps&#34;&gt;I don&amp;rsquo;t usually wear a bike helmet. Does that
make me an idiot?&lt;/a&gt;. I thought it reached a pragmatic conclusion.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 94: Work related anguish</title>
      <link>https://elver.me/weeknotes/94-work-related-anguish/</link>
      <pubDate>Sun, 16 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/94-work-related-anguish/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://flowbite.com/&#34;&gt;Flowbite&lt;/a&gt; is a component framework for Tailwind CSS. Some components are
free, whilst others are available at a cost. Seems like a nice toolkit to keep
in mind.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had cause to work with some CSV files in Neovim this week. I don&amp;rsquo;t do that
very often but I remembered that I&amp;rsquo;d installed a plugin &amp;ndash;
&lt;a href=&#34;https://github.com/mechatroner/rainbow_csv&#34;&gt;mechatroner/rainbow_csv&lt;/a&gt; &amp;ndash; to help with this before.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rainbow CSV - Vim plugin: Highlight columns in CSV and TSV files and run
queries in SQL-like language&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It can do various clever things, but I mainly used &lt;code&gt;:RainbowAlign&lt;/code&gt; and
&lt;code&gt;:RainbowShrink&lt;/code&gt; to try and make sense of the files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was wrong about the &lt;code&gt;Model.none&lt;/code&gt; method from Rails that &lt;a href=&#34;/weeknotes/93-autonomy-is-good/&#34;&gt;I wrote about last
week&lt;/a&gt;. It doesn&amp;rsquo;t do what I thought. Carry on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The work issue that was causing me anguish should hopefully be nearly over.
I&amp;rsquo;m now in the hands of the PR reviewer once again. I need to stop beating
myself up. It&amp;rsquo;s only ever counter-productive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.akshaykhot.com/accessing-hash-values-like-methods/&#34;&gt;How to Access Hash Values with Methods Using OrderedOptions&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;ActiveSupport&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;OrderedOptions&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;new
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# set the values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;api_key &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;my-api-key&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;api_secret &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;my-api-secret&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# access the values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;api_key  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# =&amp;gt; &amp;#39;my-api-key&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;api_secret &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# =&amp;gt; &amp;#39;my-api-secret&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A neat API which I always forget about. I&amp;rsquo;ve avoided Rails specific additions
like this in the past, and I think that has been a mistake.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Arc is &lt;a href=&#34;/weeknotes/93-autonomy-is-good/&#34;&gt;not yet replacing my Pocket use&lt;/a&gt; due to a bug in Arc on iOS 🥲 I&amp;rsquo;m
still loving it on desktop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another shorter week next week 👌&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 93: Autonomy is good</title>
      <link>https://elver.me/weeknotes/93-autonomy-is-good/</link>
      <pubDate>Sun, 09 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/93-autonomy-is-good/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://programmingisterrible.com/post/176657481103/repeat-yourself-do-more-than-one-thing-and&#34;&gt;Repeat yourself, do more than one thing, and rewrite everything&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No-one enjoys writing boilerplate. The more straightforward it is to write,
the duller it is to summon into a text editor.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is great; I found myself nodding my way through it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Phone doesn&amp;rsquo;t have signal after travelling in a car. Toggle &amp;ldquo;Airplane Mode&amp;rdquo; in
a vain attempt to gain a signal. If it&amp;rsquo;s really stubborn, turn the &lt;em&gt;whole&lt;/em&gt;
phone off and on again. Is it the phone? Is it the network carrier?&lt;/p&gt;
&lt;p&gt;Computer won&amp;rsquo;t connect to WiFi. Disconnect the VPN so the captive portal can
ask for my personal information. Type &amp;ldquo;google.com&amp;rdquo; into a browser to see if
it&amp;rsquo;s &lt;em&gt;actually&lt;/em&gt; connected. The VPN has done something awful to the networking
stack. Disconnect, reconnect, toggle Wi-Fi on and off.&lt;/p&gt;
&lt;p&gt;Is it now normal to have to turn anything wireless on and off again to make
them work?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I found myself wanting to conditionally build a query this week. When I&amp;rsquo;m
normally building this sort of thing it&amp;rsquo;s to filter a large collection by
adding a serious of &lt;code&gt;where&lt;/code&gt; clauses,&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;query &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Model&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;all
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;query &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; query&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;where(&lt;span style=&#34;color:#990073&#34;&gt;some&lt;/span&gt;: condition) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; condition&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;present?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;query &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; query&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;where(&lt;span style=&#34;color:#990073&#34;&gt;other&lt;/span&gt;: thing) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; thing&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;present?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;query
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this case I was trying to find a single record. Because of that I didn&amp;rsquo;t
want to start with &lt;code&gt;Model.all&lt;/code&gt; because I risked returning a random record from
the collection. I wanted a &lt;code&gt;Model&lt;/code&gt; or &lt;code&gt;nil&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Model&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;none
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;query &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; query&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;where(&lt;span style=&#34;color:#990073&#34;&gt;some&lt;/span&gt;: condition) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; condition&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;present?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;query &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; query&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;where(&lt;span style=&#34;color:#990073&#34;&gt;other&lt;/span&gt;: thing) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; thing&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;present?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;query&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;first
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m doing some work on my &amp;ldquo;homelab&amp;rdquo; moving quite a lot of software to Docker
containers &amp;ndash; for which Docker is &lt;em&gt;ideal&lt;/em&gt; &amp;ndash; and it prompted me to investigate
how Docker networking works. I knew you could route traffic for one container
through another, but I didn&amp;rsquo;t know that a container can have more than one
network attached.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Arc is the new Neovim &amp;ndash; I think there&amp;rsquo;s a possibility that Arc might end up
replacing my Pocket use. Because of the organisational tools Arc has, and the
new mobile app, I&amp;rsquo;m finding myself just sending/moving/sharing a page into
certain spaces.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Autonomy is good, but it leaves a space that my brain wants to fill with
anxiety, worry, imposter syndrome. Sometimes feels like you can&amp;rsquo;t win 😅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My bathroom renovation is complete ✅ Another thing ticked off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://waxy.org/2023/04/the-bitcoin-whitepaper-is-hidden-in-every-modern-copy-of-macos/&#34;&gt;The Bitcoin Whitepaper Is Hidden in Every Modern Copy of macOS&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;While trying to fix my printer today, I discovered that a PDF copy of
Satoshi Nakamoto’s Bitcoin whitepaper apparently shipped with every copy of
macOS since Mojave in 2018.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Have you ever been working on something for a period of time and then realise,
towards the end, that the approach is incorrect? Yeah, that. This is the
reality of software development sometimes, but it doesn&amp;rsquo;t stop it stoking the
fire of imposter syndrome. It also ruined the long bank holiday for me a bit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://kentindell.github.io/2023/04/03/can-injection/&#34;&gt;CAN Injection: keyless car theft&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a detective story about how a car was stolen - and how it uncovered
an epidemic of high-tech car theft.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I got a new PB on my trap bar deadlift and bench press this week, so that&amp;rsquo;s
something to be pleased about 💪 Small wins.&lt;/p&gt;
&lt;p&gt;If only I could stop eating myself to death.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 92: Trillions of messages</title>
      <link>https://elver.me/weeknotes/92-trillions-of-messages/</link>
      <pubDate>Sun, 02 Apr 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/92-trillions-of-messages/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://vimtricks.com/p/quickly-access-project-notes/&#34;&gt;TIL about Vim&amp;rsquo;s &lt;code&gt;:drop&lt;/code&gt; command&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vim will open the file if it’s not already open, or jump to the open buffer
if it is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is useful for my new note taking config.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m trying to train myself to use &lt;code&gt;:AV&lt;/code&gt; from Rails.vim. &lt;code&gt;:AV&lt;/code&gt; will open the
&amp;ldquo;alternative&amp;rdquo; file for the current file in a vertical split &amp;ndash; that usually
means the matching test file.&lt;/p&gt;
&lt;p&gt;I realised that those new splits open to the left of the current one. I would
prefer it on the right. I &lt;code&gt;set splitright&lt;/code&gt; and hey presto! I &lt;a href=&#34;https://github.com/jordelver/dotfiles/blob/07faadeb78f8eaa365c7571ee3300a15ed5d52e3/config/nvim/lua/options.lua#L64-L65&#34;&gt;already have
splitbelow set&lt;/a&gt;, so I&amp;rsquo;m not sure why I didn&amp;rsquo;t already have &lt;code&gt;splitright&lt;/code&gt; too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://nohello.net/&#34;&gt;&amp;ldquo;please don&amp;rsquo;t say just hello in chat&amp;rdquo;&lt;/a&gt; 😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Playwright has a &lt;a href=&#34;https://github.com/microsoft/playwright/releases/tag/v1.32.0&#34;&gt;new &amp;ldquo;UI Mode&amp;rdquo; in version 1.32.0&lt;/a&gt;, which I&amp;rsquo;m assuming makes it
much more attractive to people migrating from Cypress, which has had this for
a long time.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve only briefly used Playwright to compare it to an existing Cypress test
suite and I liked it. The API seemed more straight forward and it was faster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://discord.com/blog/how-discord-stores-trillions-of-messages&#34;&gt;&amp;ldquo;How Discord stores trillions of messages&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In 2017, we ran 12 Cassandra nodes, storing billions of messages.&lt;/p&gt;
&lt;p&gt;At the beginning of 2022, it had 177 nodes with trillions of messages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Woah.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Most importantly, however, it lets us say we rewrote it in Rust (meme cred
is very important).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;🤣&lt;/p&gt;
&lt;p&gt;Really interesting write-up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for &lt;a href=&#34;https://blog.saeloun.com/2023/03/28/improve-support-for-namespaces&#34;&gt;namespaces will be much improved in Rails 7.1&lt;/a&gt; thanks to
&lt;a href=&#34;https://github.com/fxn/zeitwerk&#34;&gt;Zeitwerk&lt;/a&gt;. Auto-loading behaviour has been confusing me over the years, so
this is great news.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Internal tools &amp;ndash; who has time for them? Most places I&amp;rsquo;ve worked have been on
the smaller side and building internal tools was never something that time
could be spent on. The team I&amp;rsquo;m currently working with have clearly spent a
lot of time working on tools for all parts of the business.&lt;/p&gt;
&lt;p&gt;Giving developers the tools to easily investigate bugs is saving a lot of time
and money in the long run, but they are a hard sell in most businesses due to
their benefits being hard to quantify.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tailscale.com/blog/tailscale-funnel-beta/&#34;&gt;Tailscale Funnel now available in beta&lt;/a&gt; &amp;ndash; A replacement for &lt;a href=&#34;https://ngrok.com/&#34;&gt;&lt;code&gt;ngrok&lt;/code&gt;&lt;/a&gt; if
you&amp;rsquo;re using Tailscale already.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://cabel.com/2023/03/27/apple-passwords-deserve-an-app/&#34;&gt;&amp;ldquo;Apple Passwords Deserve An App&amp;rdquo;&lt;/a&gt; &amp;ndash; honestly, I kinda knew some of this was
built-in, but I have literally no idea where to start. 1Password still works
for me, but I share the same fears that others do about their VC money. As a
result I&amp;rsquo;m still on 1Password 7.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(Bonus Panic UI Tip: people can’t/won’t read more than three (3) lines of
static descriptive text.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve been saying this for years. No one is reading your text, sorry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve started using &lt;a href=&#34;https://noiz.io/&#34;&gt;Noizio&lt;/a&gt; again to try and get me into a focus mode more
quickly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Try macOS Noizio app for better productivity. Ease of choosing and blending
the ambient sounds into a mixture that will perfectly fit your mood.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The way you can mix and match sounds is great.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 91: Internet frustration</title>
      <link>https://elver.me/weeknotes/91-internet-frustration/</link>
      <pubDate>Sun, 26 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/91-internet-frustration/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/&#34;&gt;&amp;ldquo;We updated our RSA SSH host key&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At approximately 05:00 UTC on March 24, out of an abundance of caution, we
replaced our RSA SSH host key used to secure Git operations for GitHub.com.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://martinheinz.dev/blog/92&#34;&gt;&amp;ldquo;Why I Will Never Use Alpine Linux Ever Again&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, the little differences can cause all the grief. Some of it stems
from how musl (and therefore also Alpine) handles DNS (it&amp;rsquo;s always DNS),
more specifically, musl (by design) doesn&amp;rsquo;t support DNS-over-TCP.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Very interesting write up of potential issues with Alpine Linux because
they use musl instead of glibc. This sounds like the sort of issue that
wouldn&amp;rsquo;t be a problem until everything was on fire 🔥&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Gordon_Moore&#34;&gt;Gordon Moore&lt;/a&gt;, Intel Co-Founder, and originator of &lt;a href=&#34;https://en.wikipedia.org/wiki/Moore%27s_law&#34;&gt;Moore&amp;rsquo;s Law&lt;/a&gt;, has died.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My bathroom is being renovated at the moment so I&amp;rsquo;ve been spending a lot of
time out of the house in cafes. This means internet frustration: captive
portals, bad signal, tethering dropouts. You name it. To try and stay online I
wondered whether it&amp;rsquo;s worth getting some sort of backup SIM on another
network. I don&amp;rsquo;t even know if this makes sense or not?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The more I see &lt;code&gt;# rubocop:disable&lt;/code&gt; comments in a codebase the more I dislike
them. When you can ignore the complexity of your code by wrapping it in a &lt;code&gt;# rubocop:disable&lt;/code&gt; then what have you achieved other than littering the codebase
with ugly comments?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From &lt;a href=&#34;https://mastodon.social/@sstephenson/110078920824980379&#34;&gt;Sam Stephenson&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;still processing the impossibly good news that the NLRB has ruled
non-disparagement clauses in separation agreements to be illegal and
&lt;em&gt;retroactively void&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;👀&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Did you know that Rails includes &lt;a href=&#34;https://github.com/rails/rails/blob/main/activestorage/lib/active_storage/analyzer/image_analyzer.rb&#34;&gt;image&lt;/a&gt;, &lt;a href=&#34;https://github.com/rails/rails/blob/main/activestorage/lib/active_storage/analyzer/audio_analyzer.rb&#34;&gt;audio&lt;/a&gt;, and &lt;a href=&#34;https://github.com/rails/rails/blob/main/activestorage/lib/active_storage/analyzer/video_analyzer.rb&#34;&gt;video&lt;/a&gt; analyzers
built-in?! I don&amp;rsquo;t know why I was so surprised at this. Probably because I&amp;rsquo;ve
seen it re-implemented in a few codebases?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hachyderm.io/@mononcqc/110073337791217700&#34;&gt;Fred Hebert&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We are releasing the well-poisoning machine, because if we don&amp;rsquo;t do it
first, someone else with even worse morals might do it faster.&lt;/p&gt;
&lt;p&gt;By being the first people to poison the well, we can know exactly what kind
of toxins will be in the water such that we understand the symptoms when we
inevitably make the whole village sick from it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mastodon.social/@searls/110067742412968330&#34;&gt;Great point from @searls&lt;/a&gt;. I have been guilty of this 🙈&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;if it&amp;rsquo;s a pain to set up a development environment, then you SHOULD blow it
up more often as feedback to force you to make it easier.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/neovim/comments/121otka/a_nice_telescope_surprise/&#34;&gt;Telescope tip&lt;/a&gt; &amp;ndash; when using &lt;a href=&#34;https://github.com/nvim-telescope/telescope.nvim#file-pickers&#34;&gt;Live Grep&lt;/a&gt; you can fuzzily refine the results
by typing the path/filename. Whilst the Live Grep picker is already open hit
&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;Space&lt;/kbd&gt; to show the prompt.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 90: Collect your Internet</title>
      <link>https://elver.me/weeknotes/90-collect-your-internet/</link>
      <pubDate>Sun, 19 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/90-collect-your-internet/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://arc.net/&#34;&gt;Arc&lt;/a&gt; from &lt;a href=&#34;https://thebrowser.company/&#34;&gt;The Browser Company&lt;/a&gt; continues to impress and I&amp;rsquo;m now using it
full time. Organisation-wise, it&amp;rsquo;s a game changer - a single window for
&lt;em&gt;everything&lt;/em&gt;. The muscle memory developed from years of other browsers is hard
to beat though, so I&amp;rsquo;m occasionally tripping myself up.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m excited to see what their mobile browser might look. Also, Easel is cool,
see &lt;a href=&#34;https://youtu.be/ukquBSOpmTk&#34;&gt;Collect Your Internet with Easel&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.phoenixframework.org/blog/whisper-speech-to-text-phoenix&#34;&gt;Embed and broadcast Whisper speech-to-text in your Phoenix app in 15 minutes&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In this screencast, I show just how quickly we can add audio transcription
to the open-source LiveBeats application we saw in a previous video. There’s
no third-party APIs to call out to, no background jobs to kick off, and no
JavaScript to write. The only external dependency is ffmpeg.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pretty incredible&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://sive.rs/slow&#34;&gt;I’m a very slow thinker&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m a disappointing person to try to debate or attack. I just have nothing
to say in the moment, except maybe, “Good point.” Then a few days later,
after thinking about it a lot, I have a response.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Anxious first week of work, but mostly self-induced. I was happy with how it
went, and with what I contributed given it was my first week. My brain has me
thinking this was a fluke, but I&amp;rsquo;m hoping to prove it wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=QHi479xN_po&#34;&gt;Bobby Fingers&amp;rsquo; Michael Jackson on Fire Diorama&lt;/a&gt; (via &lt;a href=&#34;https://tomstu.art/weeknotes-167-good-pencils&#34;&gt;Tom Stuart&lt;/a&gt;) &amp;ndash; I don&amp;rsquo;t
know what to say about this other than it&amp;rsquo;s &lt;em&gt;well&lt;/em&gt; worth your time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 89: Massive disappointment</title>
      <link>https://elver.me/weeknotes/89-massive-disappointment/</link>
      <pubDate>Sun, 12 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/89-massive-disappointment/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s cool that &lt;a href=&#34;https://www.brompton.com/&#34;&gt;Brompton&lt;/a&gt; are &lt;a href=&#34;https://www.youtube.com/watch?v=MBXYZ7vHmXw&#34;&gt;using Raspberry Pis and Python to power the
production stations in their factory&lt;/a&gt;. I do agree with a couple of the
comments on the video though, they gloss over the software aspects massively
(the video is only 3 minutes tbf!) and it would be interesting to know more
details.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://williamkennedy.ninja/javascript/2022/05/03/in-defence-of-the-single-page-application/&#34;&gt;&amp;ldquo;In defence of the Single Page Application&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;😆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Further to my &lt;a href=&#34;/weeknotes/88-hardcoded-strings/&#34;&gt;post last week regarding Gandi being bought/sold&lt;/a&gt;, there were a
couple of threads on &lt;a href=&#34;https://lobste.rs/s/flcpop/what_domain_registrar_is_worth_using&#34;&gt;lobste.rs&lt;/a&gt; and the &lt;a href=&#34;https://news.ycombinator.com/item?id=35080777&#34;&gt;orange site&lt;/a&gt; which are worth a look.&lt;/p&gt;
&lt;p&gt;In particular, I thought about adding &lt;a href=&#34;https://aws.amazon.com/route53/pricing/#Domain_Names&#34;&gt;AWS&amp;rsquo; Route 53&lt;/a&gt; to my list of
alternatives, but &lt;a href=&#34;https://news.ycombinator.com/item?id=35082232&#34;&gt;Route 53 actually use Gandi for domain registration&lt;/a&gt; (&lt;a href=&#34;https://aws.amazon.com/route53/domain-registration-agreement/#2._Registrar_and_Registry_Operator.&#34;&gt;AWS
Registration Agreement&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another managed PostgreSQL provider to consider &amp;ndash; &lt;a href=&#34;https://aiven.io/postgresql&#34;&gt;Aiven&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://community.fly.io/t/reliability-its-not-great/11253&#34;&gt;Fly&amp;rsquo;s transparency in the growing pains they are experiencing&lt;/a&gt; is admirable,
and makes me trust them even more. I might not feel that way if I had an
important application deployed there. But I don&amp;rsquo;t.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I published my &lt;a href=&#34;https://github.com/hrsh7th/nvim-cmp&#34;&gt;&lt;code&gt;nvim-cmp&lt;/code&gt;&lt;/a&gt; Jira source, &lt;a href=&#34;https://github.com/jordelver/cmp-jira&#34;&gt;&lt;code&gt;cmp-jira&lt;/code&gt;&lt;/a&gt;, after a bit of tidying.
I hope to iron out any issues when I start using it in anger.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://webstack.dancroak.com/&#34;&gt;webstack &amp;ndash; A project to prototype web stacks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;An interesting comparison of &lt;a href=&#34;https://www.heroku.com/&#34;&gt;Heroku&lt;/a&gt;, &lt;a href=&#34;https://fly.io/&#34;&gt;Fly.io&lt;/a&gt;, &lt;a href=&#34;https://northflank.com/&#34;&gt;Northflank&lt;/a&gt;, &lt;a href=&#34;https://railway.app/&#34;&gt;Railway&lt;/a&gt;,
&lt;a href=&#34;https://render.com/&#34;&gt;Render&lt;/a&gt;, and &lt;a href=&#34;https://vercel.com/&#34;&gt;Vercel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Something that surprised me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Multi-region Postgres read replicas performs even better than multi-region
SQLite.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://better-mobile-inputs.netlify.app/&#34;&gt;Build a Better Mobile Input&lt;/a&gt; (&lt;a href=&#34;https://remysharp.com/links/2023-03-01-3bff24a5&#34;&gt;Via Remy Sharp&lt;/a&gt;). A nice interactive view of
how the &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;inputmode&lt;/code&gt;, and &lt;code&gt;autocomplete&lt;/code&gt; attributes can affect a web
form.&lt;/p&gt;
&lt;p&gt;The lack of care regarding this is a personal bug bear of mine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I thought it was about time I learnt how &lt;a href=&#34;https://github.com/hotwired/turbo-rails&#34;&gt;Turbo&lt;/a&gt; works so I&amp;rsquo;ve been working
through &lt;a href=&#34;https://www.hotrails.dev/&#34;&gt;the Hotrails Turbo Rails tutorial&lt;/a&gt;. I already understand a lot of the concepts
but found reading the text tiring and I&amp;rsquo;m not sure how much I&amp;rsquo;m taking in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/color&#34;&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;color&amp;quot;&amp;gt;&lt;/code&gt;&lt;/a&gt; &lt;a href=&#34;https://friend.camp/@darius/109939932494486502&#34;&gt;is a thing&lt;/a&gt;. And it&amp;rsquo;s a &lt;a href=&#34;https://caniuse.com/input-color&#34;&gt;thing that works&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you need something a bit more, there is &lt;a href=&#34;https://github.com/web-padawan/vanilla-colorful&#34;&gt;web-padawan/vanilla-colorful&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From &lt;a href=&#34;https://ruby.social/@iainbeeston/109978483279539154&#34;&gt;Iain Beeston&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In Ruby on Rails 7+ you can set &lt;code&gt;config.server_timing = true&lt;/code&gt; in
&lt;code&gt;config/environments/development.rb&lt;/code&gt; and Google Chrome will show the time
taken for rendering and database queries in the networking tab of the Chrome
devtools&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pretty neat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I am starting a new contract tomorrow. I&amp;rsquo;ve been trying to not let the anxiety
take over too much. Can I do this? Am I actually a computer programmer? Will I
be a massive disappointment? I guess we&amp;rsquo;ll see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In preparation for said new contract, note taking has once again reared it&amp;rsquo;s
head so I&amp;rsquo;ve been hacking together some Lua helpers for my Neovim config to
help with that. My general motivation is single keybinding access to my most
used notes. Quite basic at the moment, but working-ish.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 88: Hardcoded strings</title>
      <link>https://elver.me/weeknotes/88-hardcoded-strings/</link>
      <pubDate>Sun, 05 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/88-hardcoded-strings/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://cabel.com/2023/02/25/the-courtyard/&#34;&gt;The Courtyard&lt;/a&gt; by Cabel Sasser&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Whatever you’re working on right now, whatever it might be, I ask: try to
leave a little space for a courtyard.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/ruby/power_assert&#34;&gt;power_assert&lt;/a&gt; is interesting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Power Assert shows each value of variables and method calls in the
expression. It is useful for testing, providing which value wasn&amp;rsquo;t correct
when the condition is not satisfied.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;Failure:
   assert { 3.times.to_a.include?(3) }
              |     |    |
              |     |    false
              |     [0, 1, 2]
              #&amp;lt;Enumerator: 3:times&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Host your own Mastodon server with &lt;a href=&#34;https://github.com/cloudflare/wildebeest&#34;&gt;Wildebeest&lt;/a&gt; &lt;a href=&#34;https://blog.cloudflare.com/welcome-to-wildebeest-the-fediverse-on-cloudflare/&#34;&gt;from Cloudflare&lt;/a&gt;, I suppose.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I heard that &lt;a href=&#34;https://www.gandi.net/&#34;&gt;Gandi&lt;/a&gt;, my domain registrar of choice &lt;a href=&#34;https://exquisite.social/@h3artbl33d/109927449357481623&#34;&gt;have been bought&lt;/a&gt; by some
less that great guys.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The TL;DR: if you have any trust or whatsoever in Gandi, you should
seriously reconsider.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I decided to compile a list of alternatives for the TLDs I own.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Provider&lt;/th&gt;
          &lt;th&gt;.co.uk&lt;/th&gt;
          &lt;th&gt;.me&lt;/th&gt;
          &lt;th&gt;.com&lt;/th&gt;
          &lt;th&gt;.co&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://www.cloudflare.com/products/registrar/&#34;&gt;Cloudflare&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;$4.76&lt;/td&gt;
          &lt;td&gt;$12.55&lt;/td&gt;
          &lt;td&gt;$9.15&lt;/td&gt;
          &lt;td&gt;$22.00&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://porkbun.com/&#34;&gt;Porkbun&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;$5.96&lt;/td&gt;
          &lt;td&gt;$14.85&lt;/td&gt;
          &lt;td&gt;$9.73&lt;/td&gt;
          &lt;td&gt;$22.97&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://aws.amazon.com/route53/pricing/#Domain_Names&#34;&gt;AWS&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;$9.00&lt;/td&gt;
          &lt;td&gt;$25.00&lt;/td&gt;
          &lt;td&gt;$13.00&lt;/td&gt;
          &lt;td&gt;$25.00&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://dnsimple.com/tlds&#34;&gt;DNSimple&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;$10.00&lt;/td&gt;
          &lt;td&gt;$25.00&lt;/td&gt;
          &lt;td&gt;$14.50&lt;/td&gt;
          &lt;td&gt;$30.00&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;a href=&#34;https://www.gandi.net/&#34;&gt;Gandi&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;$11.36&lt;/td&gt;
          &lt;td&gt;$22.20&lt;/td&gt;
          &lt;td&gt;$19.87&lt;/td&gt;
          &lt;td&gt;$42.08&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Clearly, Cloudflare come out on top in terms of price, but Porkbun are only
very slightly more expensive &lt;em&gt;and&lt;/em&gt; are called Porkbun.&lt;/p&gt;
&lt;p&gt;The main thing I&amp;rsquo;ve learnt is that I&amp;rsquo;ve been overpaying for domain renewals.
Get in touch if any have other decent options. I&amp;rsquo;m not moving anything just
yet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My experiment with using &lt;a href=&#34;https://arc.net/&#34;&gt;Arc&lt;/a&gt; is paying off. I really like it, although there
was/is a learning curve. More or less every other browser I&amp;rsquo;ve used is tabs
along the top, web page below. It&amp;rsquo;s been that way for a long time. Arc is not
like that so breaking the muscle memory is hard.&lt;/p&gt;
&lt;p&gt;Some thoughts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Splits are really great &amp;ndash; horizontal or vertical. If you have a tiling
window manager (or something like one) you can achieve a similar result,
but having it all inside Arc makes managing multiple windows easier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Font rendering is not as nice as Safari.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatic Picture-in-Picture when watching YouTube is brilliant. When you
navigate away from a playing YouTube video it will pop out to PiP
automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copying the page URL with &lt;kbd&gt;Shift&lt;/kbd&gt; + &lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt;
removes any tracking querystring 👌&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://phoenixframework.org/blog/phoenix-1.7-final-released&#34;&gt;Phoenix 1.7.0 released was released&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Verified Routes are more exciting to me than maybe they should be. I&amp;rsquo;ve never
liked route helpers (and this applies to Rails too). I can&amp;rsquo;t remember what the
function is called or what arguments it takes.&lt;/p&gt;
&lt;p&gt;Perhaps I&amp;rsquo;m old school, but I want to &lt;em&gt;see&lt;/em&gt; the URL, and helpers obfuscate my
view of it. Instead constant running of &lt;code&gt;rake routes | fzf&lt;/code&gt; is necessary (and
slow) to figure out what I need.&lt;/p&gt;
&lt;p&gt;Verified Routes are the best of both worlds: hardcoded string URLs but with
compile time checks so you don&amp;rsquo;t get them wrong.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://fly.io/phoenix-files/phoenix-dev-blog-streams/&#34;&gt;Streams are cool&lt;/a&gt; and obviously a big deal too ;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about Ruby&amp;rsquo;s &lt;a href=&#34;https://rubyapi.org/3.2/o/kernel#method-i-j&#34;&gt;&lt;code&gt;Kernel#j&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;https://rubyapi.org/3.2/o/kernel#method-i-jj&#34;&gt;&lt;code&gt;Kernel#jj&lt;/code&gt;&lt;/a&gt; methods. (Via &lt;a href=&#34;https://til.hashrocket.com/posts/kfys8edbgn-pretty-print-json-in-ruby&#34;&gt;Haskrocket&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Easily pretty print hashes are JSON.&lt;/p&gt;
&lt;p&gt;I initially couldn&amp;rsquo;t get this working until I realised that you need to
require &amp;ldquo;json&amp;rdquo; to make the methods available.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irb(main):&lt;span style=&#34;color:#099&#34;&gt;001&lt;/span&gt;:&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#0086b3&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irb(main):&lt;span style=&#34;color:#099&#34;&gt;002&lt;/span&gt;:&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; j({&lt;span style=&#34;color:#990073&#34;&gt;foo&lt;/span&gt;: &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#990073&#34;&gt;:&amp;#34;bar&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irb(main):&lt;span style=&#34;color:#099&#34;&gt;003&lt;/span&gt;:&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; jj({&lt;span style=&#34;color:#990073&#34;&gt;foo&lt;/span&gt;: &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;foo&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;bar&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL that PostgreSQL is named so because it was a successor to the &lt;a href=&#34;https://en.wikipedia.org/wiki/Ingres_(database)&#34;&gt;Ingres
database&lt;/a&gt;, so was &lt;em&gt;post&lt;/em&gt; Ingres.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It was originally named POSTGRES, referring to its origins as a successor to
the Ingres database developed at the University of California, Berkeley. In
1996, the project was renamed to PostgreSQL to reflect its support for SQL.
After a review in 2007, the development team decided to keep the name
PostgreSQL and the alias Postgres.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 87: Verified links</title>
      <link>https://elver.me/weeknotes/87-verified-links/</link>
      <pubDate>Sun, 26 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/87-verified-links/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Development environment improvements were on the agenda this week. Mainly
setting up LSP, and various completions using &lt;a href=&#34;https://github.com/hrsh7th/nvim-cmp&#34;&gt;&lt;code&gt;nvim-cmp&lt;/code&gt;&lt;/a&gt;. This has been on
my TODO list for a &lt;em&gt;long&lt;/em&gt; time but I think I have the basics configured now:
Ruby completions using &lt;a href=&#34;https://solargraph.org/&#34;&gt;solargraph&lt;/a&gt;, and &lt;a href=&#34;https://github.com/petertriho/cmp-git&#34;&gt;git&lt;/a&gt; with commit, PR, and issues
refs.&lt;/p&gt;
&lt;p&gt;I even started hacking on my own &lt;a href=&#34;https://github.com/hrsh7th/nvim-cmp/wiki/List-of-sources&#34;&gt;&lt;code&gt;nvim-cmp&lt;/code&gt; source&lt;/a&gt; for Jira tickets and have
it mostly working with the exception of not fully understanding how the
triggering of the source works. I plan on adding other ticketing systems as
and when the need arises.&lt;/p&gt;
&lt;p&gt;Over time, with some &lt;em&gt;real&lt;/em&gt; work, I&amp;rsquo;m sure it will need tweaking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/86-lurking-in-your-phone-and-car/&#34;&gt;Last week I wrote mentioned Twitter discontinuing 2FA by SMS&lt;/a&gt;, and cited a
blog post by Ricky Mondello. In that article they mention that &lt;a href=&#34;https://developer.apple.com/passkeys/&#34;&gt;Passkeys&lt;/a&gt; are
where we want to be eventually. If, like me, you didn&amp;rsquo;t understand how they
work take a &lt;a href=&#34;https://developer.apple.com/videos/play/wwdc2022/102/?time=2638&#34;&gt;look at this short video Ricky presented&lt;/a&gt; as part of a WWDC
session.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I verified the links on my Mastodon profile. There are &lt;a href=&#34;https://docs.joinmastodon.org/user/profile/#verification&#34;&gt;two methods to chose
from&lt;/a&gt;. I went with adding a &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; element like this to various websites of
mine:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&amp;quot;me&amp;quot; href=&amp;quot;https://hachyderm.io/@jordelver&amp;quot; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Easy peasy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/39-burning-bridges/&#34;&gt;After&lt;/a&gt; &lt;a href=&#34;/weeknotes/53-continuously-stream/&#34;&gt;talking&lt;/a&gt; &lt;a href=&#34;/weeknotes/86-lurking-in-your-phone-and-car/&#34;&gt;about&lt;/a&gt; &lt;a href=&#34;https://www.sqlite.org/&#34;&gt;SQLite&lt;/a&gt; &lt;a href=&#34;/weeknotes/87-verified-links/&#34;&gt;quite a bit&lt;/a&gt; I decided to try out a Rails
app with SQLite in &amp;ldquo;production&amp;rdquo;. And Fly is the obvious choice given their
&lt;a href=&#34;https://fly.io/blog/all-in-on-sqlite-litestream/&#34;&gt;interest in pushing SQLite to the edges&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Firing up a new Rails app, something I hardly ever do, was surprisingly
delightful. (Perhaps it&amp;rsquo;s all those creaky old codebases I&amp;rsquo;m sick of rather
than Rails after all 😉).&lt;/p&gt;
&lt;p&gt;A few niggles, but getting a brand-new-does-nothing app running on Fly was a
nice experience. The problem with this default approach is that database will
be wiped on each deploy as the VM is pulled and replaced. What you need is a
persistent volume where you can put the db file and mount in each app when
started. This too, was easy by &lt;a href=&#34;https://fly.io/docs/rails/advanced-guides/sqlite3/&#34;&gt;following the Fly docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So there it is. SQLite running in production. True, it&amp;rsquo;s no real test, but I
think it might be the start of something.&lt;/p&gt;
&lt;p&gt;Backups and restores are the missing piece at the moment. &lt;a href=&#34;https://litestream.io/getting-started/&#34;&gt;Litestream streaming
to S3 seems to be the way&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;How I use ChatGPT to improve my executive functioning and productivity&amp;rdquo; &amp;ndash;
seems to me that ChatGPT has many benefits if you understand the limitations.
For someone like me, who often struggles with starting, I can see a
conversation with ChatGPT being a great help. Even if it lies and talks shit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 86: Lurking in your phone and car</title>
      <link>https://elver.me/weeknotes/86-lurking-in-your-phone-and-car/</link>
      <pubDate>Sun, 19 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/86-lurking-in-your-phone-and-car/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=c4OyfL5o7DU&#34;&gt;Neovim in 100 Seconds&lt;/a&gt; &amp;ndash; A nice intro into what Neovim actually is in only
100 seconds. Via &lt;a href=&#34;https://www.reddit.com/r/neovim/comments/1134xcz/neovim_in_100_seconds/&#34;&gt;r/neovim&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Useful tool for testing webhooks &amp;ndash; &lt;a href=&#34;https://webhook.site/&#34;&gt;Webhook.site&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Webhook.site lets you easily inspect, test and automate (with the visual
Custom Actions builder, or WebhookScript) any incoming HTTP request or
e-mail.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From &lt;a href=&#34;https://twitter.com/karrisaarinen/status/1623857893090152448&#34;&gt;Karri Saarinen&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When Microsoft leadership feels like GitHub layoffs are not bad enough, they
have to increase the pain by forcing people to use MS Teams on their 4y old
laptops.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Haven&amp;rsquo;t they suffered enough?&lt;/p&gt;
&lt;p&gt;I only recently used Teams for the first time. Verdict: Not good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/zcutlip/prefsniff&#34;&gt;Prefsniff&lt;/a&gt; from &lt;a href=&#34;https://hachyderm.io/@zcutlip/109835828713687560&#34;&gt;Zachary Cutlip&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;prefsniff is a utility to watch macOS plist files for changes, and then
autogenerate the defaults command to apply those changes. Its intended use
is to have prefsniff watch a plist file while setting a system or
application preference. The resulting defaults command can then be added to
a shell script or incorporated into a configuration management system such
as Ansible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Very nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Need to left pad a string in Lua? &lt;a href=&#34;https://github.com/tjdevries/leftpad.nvim&#34;&gt;leftpad.nvim&lt;/a&gt; to the rescue. 👀&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.unixsheikh.com/articles/sqlite-the-only-database-you-will-ever-need-in-most-cases.html&#34;&gt;&amp;ldquo;SQLite the only database you will ever need in most cases&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SQLite is probably lurking in your mobile phone and your car.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is a popular choice as embedded database software for storage in
application software, such as web browsers and mobile phones, and it is the
most widely deployed database engine in the world.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve &lt;a href=&#34;/weeknotes/39-burning-bridges/&#34;&gt;written about&lt;/a&gt; &lt;a href=&#34;/weeknotes/53-continuously-stream/&#34;&gt;SQLite before&lt;/a&gt;, and the renaissance around it&amp;rsquo;s use with
web applications. I&amp;rsquo;ve never questioned the client/server architecture of
popular database software, I just assumed &amp;ldquo;that&amp;rsquo;s the way it has to be&amp;rdquo;, but
for 99% of apps it sounds viable.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have run SQLite as a web application database with thousands concurrent
writes every second, coming from different HTTP requests, without any delays
or issues. This is because even on a very busy site, the hardware is
extremely fast and fully capable of handling that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m seriously considering trying this out for any web side projects. The cost
of database hosting is often an issue for side projects. Web hosting can be
had for peanuts.&lt;/p&gt;
&lt;p&gt;When using Rails (or any ORM, probably), moving to a client-server database
like Postgres later, as needed, should be trivial for &lt;em&gt;most&lt;/em&gt; applications.&lt;/p&gt;
&lt;p&gt;Saying all of that, I think convincing most teams that SQLite is a viable
alternative would be very difficult.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://brightonruby.com&#34;&gt;Brighton Ruby 2023&lt;/a&gt; is ON. Ticket purchased (I think maybe last week, but
who&amp;rsquo;s checking).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/53-continuously-stream/&#34;&gt;I do hope it returns to the Dome next year&lt;/a&gt;&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It is. Nice 👌&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://matklad.github.io/2023/02/12/a-love-letter-to-deno.html&#34;&gt;&amp;quot;&amp;lt;3 Deno&amp;quot;&lt;/a&gt; by &lt;a href=&#34;https://matklad.github.io&#34;&gt;matklad&lt;/a&gt; is interesting read on Deno, which I&amp;rsquo;ve tried and
failed to see the point of.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The only big drawback of Deno is the language — all this runtime awesomeness
is tied to TypeScript.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Twitter are planning to &lt;a href=&#34;https://blog.twitter.com/en_us/topics/product/2023/an-update-on-two-factor-authentication-using-sms-on-twitter&#34;&gt;restrict 2FA (Two Factor Authentication) using SMS to
Twitter Blue subscribers only&lt;/a&gt;. It&amp;rsquo;s important to note that it is only SMS at
this time, not authenticator apps.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://rmondello.com/2023/02/18/twitter-sms-2fa/&#34;&gt;Ricky Mondello has a very written piece on why it&amp;rsquo;s dangerous&lt;/a&gt;. In
particular, I like Ricky&amp;rsquo;s point about how people often say that SMS 2FA
should not be used, but like everything in security its a trade-off.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;we should not and cannot consider the effectiveness of a security
mitigation without also considering its usability and its effectiveness. The
“most secure” authentication scheme in the world will be limited in its
impact by how accessible and user-friendly it is.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://localghost.dev/blog/painting-the-whole-beetle-an-adventure-in-learning-to-learn/&#34;&gt;Painting the whole beetle: an adventure in learning to learn&lt;/a&gt; &amp;ndash; I feel
personally attacked.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;https://github.com/joemasilotti/railsdevs.com/pull/778#issuecomment-1433389625&#34;&gt;small contribution to RailsDevs was merged&lt;/a&gt; this week after a couple of
changes. Pleased about that.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 85: Frontend drama</title>
      <link>https://elver.me/weeknotes/85-frontend-drama/</link>
      <pubDate>Sun, 12 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/85-frontend-drama/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Consider writing your &lt;a href=&#34;https://github.com/orgs/community/discussions/8518#discussioncomment-4867611&#34;&gt;feature request as a poem&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not a lot of work on &lt;code&gt;receiptgo&lt;/code&gt;, &lt;em&gt;shock&lt;/em&gt;. I have a list of features I want to
build, but not a great deal of motivation. Saying that, I might have figured
out how to move it forward, and I did do a bit of code reorganisation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/evilmartians/evil-seed&#34;&gt;EvilSeed&lt;/a&gt; looks potentially useful.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Gem for creating partial anonymized dumps of your database using your app
model relations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finally setup a Mastodon alias using &lt;a href=&#34;https://webfinger.net&#34;&gt;webfinger&lt;/a&gt;. This has been a barrier to
using Mastodon as I don&amp;rsquo;t want to be tied to a single instance. But an alias
allows more flexibility.&lt;/p&gt;
&lt;p&gt;There are many blog posts giving advice on how to implement webfinger, but
eventually followed &lt;a href=&#34;https://blog.netnerds.net/2022/11/alias-mastodon-github-pages/&#34;&gt;this guide&lt;/a&gt; for the simplicity of the solution.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;elver.me&lt;/code&gt; is hosted on GitHub Pages, so I just needed to add a JSON file with
the correct contents in &lt;code&gt;.well-known/webfinger/index.json&lt;/code&gt; and that should be
enough.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  {
      &amp;quot;subject&amp;quot;:&amp;quot;acct:jordelver@hachyderm.io&amp;quot;,
      &amp;quot;aliases&amp;quot;:
      [
          &amp;quot;https://hachyderm.io/@jordelver&amp;quot;,
          &amp;quot;https://hachyderm.io/users/jordelver&amp;quot;,
          &amp;quot;jordelver@hachyderm.io&amp;quot;
      ],
      &amp;quot;links&amp;quot;:
      [
          {
              &amp;quot;rel&amp;quot;:&amp;quot;http://webfinger.net/rel/profile-page&amp;quot;,
              &amp;quot;type&amp;quot;:&amp;quot;text/html&amp;quot;,
              &amp;quot;href&amp;quot;:&amp;quot;https://hachyderm.io/@jordelver&amp;quot;
          },
          {
              &amp;quot;rel&amp;quot;:&amp;quot;self&amp;quot;,
              &amp;quot;type&amp;quot;:&amp;quot;application/activity+json&amp;quot;,
              &amp;quot;href&amp;quot;:&amp;quot;https://hachyderm.io/users/jordelver&amp;quot;
          },
          {
              &amp;quot;rel&amp;quot;:&amp;quot;http://ostatus.org/schema/1.0/subscribe&amp;quot;,
              &amp;quot;template&amp;quot;:&amp;quot;https://hachyderm.io/authorize_interaction?uri={uri}&amp;quot;
          }
      ]
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you feel about your standard library shelling out to Perl?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;c is nice because there&amp;rsquo;s no hidden costs, you see every malloc and free,
and know that the standard library doesn&amp;rsquo;t do shenanigans behind your back&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;char *cmd = &amp;quot;/usr/bin/perl -e &#39;print join(chr(0), @ARGV), chr(0)&#39; -- &amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/steveklabnik/status/1622307745138446337&#34;&gt;https://twitter.com/steveklabnik/status/1622307745138446337&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I decided to sign up for &lt;a href=&#34;https://railsdevs.com&#34;&gt;RailsDevs&lt;/a&gt; account. I have no idea on whether it
will be effective. We&amp;rsquo;ll see. I noticed that there was nowhere to enter my
Mastodon handle, so I &lt;a href=&#34;https://github.com/joemasilotti/railsdevs.com/pull/778&#34;&gt;submitted a PR&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/siaw23/status/1623053158774611991&#34;&gt;Explain your queries with Rails 7.1&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Frontend drama, &lt;a href=&#34;https://infrequently.org/2023/02/the-market-for-lemons/&#34;&gt;Alex Russell&amp;rsquo;s The Market for Lemons&lt;/a&gt;, a scathing evaluation
of frontend frameworks (&lt;em&gt;ahem&lt;/em&gt;, React), and Seldo&amp;rsquo;s rebuttal, &lt;a href=&#34;https://seldo.com/posts/the_case_for_frameworks&#34;&gt;The case for
frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 84: Rewrite it in Rust</title>
      <link>https://elver.me/weeknotes/84-rewrite-it-in-rust/</link>
      <pubDate>Sun, 05 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/84-rewrite-it-in-rust/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Last two working days this week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fish, my shell of choice, is being &lt;a href=&#34;https://github.com/fish-shell/fish-shell/pull/9512&#34;&gt;re-written in Rust&lt;/a&gt;. I think it&amp;rsquo;s hard to
argue with &lt;a href=&#34;https://github.com/fish-shell/fish-shell/pull/9512#issuecomment-1410820102&#34;&gt;their reasoning&lt;/a&gt; as popular as it is to complain about &amp;ldquo;everything
being re-written in Rust&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was an interesting discussion about USB-C power delivery standards on
&lt;a href=&#34;https://atp.fm/520&#34;&gt;ATP this week&lt;/a&gt;. Specifically why USB-C charging does and does not work in
different scenarios.&lt;/p&gt;
&lt;p&gt;Worth a listen if, like me, you find the various peculiarities confusing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.akshaykhot.com/ruby-difference-nested-modules-syntax/&#34;&gt;Nested Modules in Ruby&lt;/a&gt; &amp;ndash; Ruby modules defined in two different ways do
&lt;em&gt;not&lt;/em&gt; have identical behaviour. In my experience Rubyists often don&amp;rsquo;t know
this, which is bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Neovim content you crave is back!&lt;/p&gt;
&lt;p&gt;Bind &lt;code&gt;&amp;lt;leader&amp;gt;fmc&lt;/code&gt; (find my commits) to fuzzily find &lt;em&gt;my&lt;/em&gt; Git commits only.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;n&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;lt;Leader&amp;gt;fmc&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    require(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;telescope.builtin&amp;#34;&lt;/span&gt;).git_commits({ git_command &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; { &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;git&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;--pretty=oneline&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;--abbrev-commit&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;--author=Joe Blogs&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;--&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt; }})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;, { noremap &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve been using this to figure out wtf I&amp;rsquo;ve been doing for the last two years.
Yes, updating my CV.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My car was not content with the thousands of pounds spent on it recently. It
decided to develop the most annoying rattle under the glovebox which was
extremely annoying, and also difficult to pinpoint. It was seriously driving
me nuts. Just when I thought it was gone it would come back.&lt;/p&gt;
&lt;p&gt;I decided to start taking small parts of car apart myself to try and fix it
after completely losing faith in the &amp;ldquo;professionals&amp;rdquo; who I&amp;rsquo;ve been dealing
with recently.&lt;/p&gt;
&lt;p&gt;Well, would you believe it, I think it&amp;rsquo;s fixed.&lt;/p&gt;
&lt;p&gt;The culprit was a bolt not done up tight enough behind the glovebox. Probably
left slack by the aforementioned pros. I pray it stays fixed.&lt;/p&gt;
&lt;p&gt;The greatest achievement of the week. By far.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The macOS WhatsApp I &lt;a href=&#34;/weeknotes/83-rusty-programmer/&#34;&gt;mentioned recently&lt;/a&gt; is working well for me. A few
features missing, but does almost everything I need and hovers around 90MB.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SPOILER&lt;/strong&gt; The &lt;a href=&#34;https://www.imdb.com/title/tt3581920/&#34;&gt;most recent&lt;/a&gt; &lt;a href=&#34;https://www.imdb.com/title/tt3581920/&#34;&gt;The Last Of Us&lt;/a&gt; episode has really cemented how
great the show is. The acting performances were something else. I&amp;rsquo;ve seen
nothing but praise for this episode, and yet it only garners a 7.9 on IMDB
whilst the previous two episodes both get 9.2. I think we know why.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new &lt;a href=&#34;https://www.youtube.com/watch?v=GOjV01brFQg&#34;&gt;Background Tool in CleanShot 4.5&lt;/a&gt; looks great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kdeldycke/awesome-falsehood&#34;&gt;Awesome Falsehood&lt;/a&gt; &amp;ndash; I&amp;rsquo;m linking this to hopefully remember it!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A curated list of falsehoods programmers believe in.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This should be mandatory reading for every programmer who says they can
validate an email address &amp;ndash; I&amp;rsquo;m so sick of having that conversation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://zverok.space&#34;&gt;Victor Shepelev&lt;/a&gt; continues to do great work maintaining &lt;a href=&#34;https://rubyreferences.github.io/rubychanges/&#34;&gt;Ruby Changes&lt;/a&gt; by
writing up the &lt;a href=&#34;https://rubyreferences.github.io/rubychanges/3.2.html&#34;&gt;changes for Ruby 3.2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are a tons of changes listed, and they don&amp;rsquo;t even include the big YJIT
stuff that&amp;rsquo;s been happening recently, but the change that stood out for me was
the addition &lt;a href=&#34;https://bugs.ruby-lang.org/issues/18822&#34;&gt;&lt;code&gt;CGI.escapeURIComponent&lt;/code&gt; to the standard library&lt;/a&gt; which is very
welcome, but baffling.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 83: Rusty programmer</title>
      <link>https://elver.me/weeknotes/83-rusty-programmer/</link>
      <pubDate>Sun, 29 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/83-rusty-programmer/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I took myself to see &lt;a href=&#34;https://www.imdb.com/title/tt14402146/&#34;&gt;Empire of Light&lt;/a&gt; on Thursday. I thought it was
absolutely wonderful and really enjoyed it. I&amp;rsquo;m surprised it didn&amp;rsquo;t get a
higher rating on IMDB. Olivia Coleman was great as always but everyone put in
a great performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been enjoying &lt;a href=&#34;https://www.imdb.com/title/tt3581920/&#34;&gt;The Last Of Us&lt;/a&gt; TV adaption.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tapbots.com/&#34;&gt;Tapbots&lt;/a&gt; have released their much anticipated &lt;a href=&#34;https://tapbots.com/ivory/&#34;&gt;Mastodon client Ivory&lt;/a&gt;. This
might actually finally get me using Mastodon. Twitter has been all kinds of
broken for me the last few weeks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The new &lt;a href=&#34;https://faq.whatsapp.com/451924530376167/&#34;&gt;WhatsApp for macOS&lt;/a&gt; is &lt;a href=&#34;https://www.theverge.com/2023/1/24/23568872/whatsapp-macos-catalyst-app-ipad&#34;&gt;available in beta&lt;/a&gt;. I gave up on their
horrendous Electron app some time ago so I hope this is better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spent a while trying to justify the purchase of a rice cooker. It pays for
itself in under a year!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/82-man-in-the-middle/&#34;&gt;Last week I set myself a challenge&lt;/a&gt; to complete the MVP of a side project in
one week. Because of the condensed time frame I needed to be quite strict on
what was achievable. Mostly to not overwhelm myself, which is a problem.&lt;/p&gt;
&lt;p&gt;I use the RingGo parking mobile app regularly and often need to download the
receipts afterwards. Their app only lets you download a single receipt at a
time. This is tedious and time-consuming. So I wanted to build something that
could download more than one receipt at a time.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href=&#34;https://github.com/jordelver/receiptgo&#34;&gt;receiptgo&lt;/a&gt;, a command line app written in Rust.&lt;/p&gt;
&lt;p&gt;In it&amp;rsquo;s current state you can authenticate with RingGo and download the latest
5 receipts in one go. The basics are in place.&lt;/p&gt;
&lt;p&gt;I remembered more Rust than I anticipated I would, but I&amp;rsquo;m sure an experienced
Rust programmer would shudder at some of the code.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not quite at the usable stage for me at the moment. That&amp;rsquo;s mostly because
I&amp;rsquo;m not really sure how I want to use it. Do I want it to be fully automatic
or more manual and interactive?&lt;/p&gt;
&lt;p&gt;Regardless, I plan on improving it, and I&amp;rsquo;m pretty happy that I mostly
achieved my aim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://brightonruby.com/&#34;&gt;Brighton Ruby&lt;/a&gt; conference are already selling tickets! I go every year so I
went ahead and bought one. June 30th 2023 &amp;ndash; save the date. Something to look
forward to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Two more days of work next week&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 82: Man In The Middle</title>
      <link>https://elver.me/weeknotes/82-man-in-the-middle/</link>
      <pubDate>Sun, 22 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/82-man-in-the-middle/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jessitron.com/2022/12/19/import-utility-from-stackoverflow/&#34;&gt;import { utility} from StackOverflow&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you want a simple utility function that isn’t part of the standard
library, what do you do?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Practical, pragmatic, advice from Jessitron.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theredhandfiles.com/chat-gpt-what-do-you-think/&#34;&gt;Nick Cave is not a fan of&lt;/a&gt; &lt;a href=&#34;https://openai.com/blog/chatgpt/&#34;&gt;ChatGPT&lt;/a&gt; for songwriting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;with all the love and respect in the world, this song is bullshit, a
grotesque mockery of what it is to be human&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m feeling increasingly overwhelmed with pretty much everything at the
moment. The car troubles that seem to have been dominating my life recently
&lt;em&gt;seem&lt;/em&gt; to be fixed, but even typing that feels like tempting fate.&lt;/p&gt;
&lt;p&gt;The week started badly, but did get gradually better, and ended well. So
there&amp;rsquo;s that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My podcast listening library is expanding again. It&amp;rsquo;s not sustainable&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bbc.co.uk/programmes/b07ktd2g/episodes/downloads&#34;&gt;David Baddiel Tries To Understand&lt;/a&gt; is lighthearted and interesting listen.
But most importantly, usually around 15 minutes. A breath of fresh air in a
sea of 2+ hour podcasts I&amp;rsquo;m already subscribed to.&lt;/p&gt;
&lt;p&gt;A reincarnation of their Fan Club podcast, &lt;a href=&#34;https://twitter.com/TheNickHelm&#34;&gt;Nick Helm&lt;/a&gt; and &lt;a href=&#34;https://twitter.com/NatMetcalfe&#34;&gt;Nathanial
Metcalfe&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;https://shows.acast.com/the-jcas-present-nick-nat-consume-and-obey&#34;&gt;Consume and Obey&lt;/a&gt; launched over Christmas. I&amp;rsquo;m glad to have them
back. It&amp;rsquo;s as chaotic and rambling as ever. And I love it for that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theregister.com/2023/01/16/basecamp_37signals_cloud_bill/&#34;&gt;&amp;ldquo;Basecamp details &amp;lsquo;obscene&amp;rsquo; $3.2 million bill that caused it to quit the cloud&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/dhh/status/1613508201953038337&#34;&gt;DHH on Basecamp&amp;rsquo;s AWS spend&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We spent $3,201,564.24 on cloud in 2022 at @37signals , mostly AWS.
$907,837.83 on S3. $473,196.30 on RDS. $519,959.60 on OpenSearch.
$123,852.30 on Elasticache.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And, &lt;a href=&#34;https://twitter.com/dhh/status/1613558939760689153&#34;&gt;he compares it to buying their own hardware&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Contrast that with just this one example of insanely powerful iron you can
buy from Dell.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Not really comparing apples with apples though, is it. And conveniently leaves
out the cost of the people.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;With the way Twitter&amp;rsquo;s going I&amp;rsquo;m really starting to regret linking to it so
often.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My open source &lt;a href=&#34;https://github.com/nvim-telescope/telescope.nvim/pull/2341&#34;&gt;contributions&lt;/a&gt; continue to impress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mitmproxy.org&#34;&gt;&lt;code&gt;mitmproxy&lt;/code&gt;&lt;/a&gt; is &lt;em&gt;very&lt;/em&gt; cool. I had it setup and inspecting traffic coming
from my iPhone in minutes. It&amp;rsquo;s capable of much more but the basics were great
for me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Which brings me to my latest side project. Will I complete this one? I&amp;rsquo;m
&lt;em&gt;really&lt;/em&gt; going to try to complete the MVP &lt;em&gt;this week&lt;/em&gt;. I believe the scope is
small enough, but I&amp;rsquo;m probably already hampering my ability to do so by
deciding to write it in Rust. I will just have to accept working over good.&lt;/p&gt;
&lt;p&gt;Ask me next Sunday whether I have achieved my goal.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 81: Platform douchery</title>
      <link>https://elver.me/weeknotes/81-platform-douchery/</link>
      <pubDate>Sun, 15 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/81-platform-douchery/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;From &lt;a href=&#34;https://twitter.com/kddnewton/status/1613225554236551168&#34;&gt;Kevin Newton&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In Ruby, the expression in the rescue clause that captures a variable can be
a method call. That method call doesn&amp;rsquo;t actually need to exist though,
because it automatically has = appended to it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you rebase a lot, like I do, then it worth reminding ourselves that you
don&amp;rsquo;t need to constantly change branch. I am in the habit of changing to
&lt;code&gt;main&lt;/code&gt;, getting all the new changes, then changing back, and finally rebasing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt; (from branch &lt;code&gt;feature_a&lt;/code&gt;)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git stash
git checkout main
git pull
git checkout feature_a
git rebase main
git stash pop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This isn&amp;rsquo;t necessary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;After&lt;/strong&gt; (from branch &lt;code&gt;feature_a&lt;/code&gt;)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git fetch origin main
git stash
git rebase origin/main
git stash pop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You don&amp;rsquo;t need to change branch to rebase.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was working on direct-to-S3 uploads this week, something I&amp;rsquo;ve never done
before. I didn&amp;rsquo;t want to touch the production Amazon AWS account whilst doing
so because these things often require a lot of tweaking, and then you don&amp;rsquo;t
have the correct permissions&amp;hellip;blah.&lt;/p&gt;
&lt;p&gt;Instead, I installed &lt;a href=&#34;https://en.wikipedia.org/wiki/MinIO&#34;&gt;MinIO&lt;/a&gt;, an S3 API compatible storage server and pointed
my app at that. It was up and running in no time using a simple &lt;code&gt;brew install minio/stable/minio&lt;/code&gt; and comes with an easy-to-use web console. I&amp;rsquo;m going to
keep it in-mind for future testing, perhaps including automated tests that
need to hit a real server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In yet another of douchery Musk seems to have &lt;a href=&#34;https://daringfireball.net/linked/2023/01/14/information-twitter-slack-confirmation&#34;&gt;stopped third party clients
working with the platform&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But pulling the plug on these clients and ghosting everyone on
communications about it is so absurdly disrespectful. Zero respect for the
users for those apps, zero respect for the developers behind them — many of
whom had been building on the Twitter platform for 10-15 years&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But, Tapbots are working on a Mastodon client called &lt;a href=&#34;https://tapbots.com/ivory/&#34;&gt;Ivory&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Kevin Chen wrote a &lt;a href=&#34;https://kevinchen.co/blog/rewind-ai-app-teardown/&#34;&gt;very thorough breakdown of how Rewind works&lt;/a&gt;. Apple have
done a &lt;em&gt;lot&lt;/em&gt; of the heavy lifting with their clever built-in APIs. Interesting
how a statically linked &lt;code&gt;ffmpeg&lt;/code&gt; is included. &lt;code&gt;ffmpeg&lt;/code&gt; is everywhere. The
amount of businesses built on Bash scripts calling &lt;code&gt;ffmpeg&lt;/code&gt; is far greater
than you&amp;rsquo;d imagine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/programming/comments/10asxy6/comment/j476ike/&#34;&gt;Programming Interviews Turn Normal People into A-Holes&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The problem with programming interviews is every asshole programmer thinks
they know how to conduct one well with no training or forethought.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We were away in Madrid in the later part of the week. In fact, I&amp;rsquo;m writing
this in the airport waiting to fly home.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 80: if err != nil</title>
      <link>https://elver.me/weeknotes/80-if-err-nil/</link>
      <pubDate>Sun, 08 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/80-if-err-nil/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This was the best &amp;ldquo;back to work&amp;rdquo; after Christmas that I&amp;rsquo;ve had in a while.
Chiefly because I was only working 3 days. What a difference. Two days a week
for the rest of January, I could get used to this. But it can&amp;rsquo;t last,  I&amp;rsquo;ll be
looking to start something new in February or March. Spread the word!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL You can subscribe to Google Alerts using RSS 👌&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go has never appealed to me. All that &lt;code&gt;if err != nil&lt;/code&gt; business in a supposedly
modern language. However, it is very popular and I have considered learning it
for that reason.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://fasterthanli.me/about&#34;&gt;Amos&lt;/a&gt; has written an interesting follow up, &lt;a href=&#34;https://fasterthanli.me/articles/lies-we-tell-ourselves-to-keep-using-golang&#34;&gt;Lies we tell ourselves to keep
using Golang&lt;/a&gt;, to &lt;a href=&#34;https://fasterthanli.me/articles/i-want-off-mr-golangs-wild-ride&#34;&gt;I want off Mr. Golang&amp;rsquo;s Wild Ride&lt;/a&gt; and it is very
compelling. I don&amp;rsquo;t understand all of the technical details, but his
observations on the arguments people make to dismiss any criticism of Go are
right on.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When you don&amp;rsquo;t want to hear something, one easy way to not have to think
about it at all is to convince yourself that whoever is saying it is
incompetent, or that they have ulterior motives.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I copied a lot of the &lt;a href=&#34;https://github.com/nvim-lua/kickstart.nvim/&#34;&gt;kickstart.nvim config&lt;/a&gt; that I &lt;a href=&#34;/weeknotes/78-ho-ho-ho/&#34;&gt;found the other day&lt;/a&gt;. It
was fairly straight forward to setup, but if I&amp;rsquo;m honest I&amp;rsquo;m now left with
quite an overwhelming learning curve. I will need to learn and tweak to get
the most out of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://apps.apple.com/app/apple-store/id1504940162&#34;&gt;RocketSim for Xcode Simulator&lt;/a&gt; &amp;ndash; this is interesting, a third party iOS
simulator. I don&amp;rsquo;t have the need for the simulator an awful lot but I was
intrigued at this being offered outside of Apple. Might be worth a look if you
use the Simulator a lot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I know WhatsApp is not most secure messaging app, but I still find it the best
app to &lt;em&gt;use&lt;/em&gt;, and the majority of people I message still favour it. It can
only be positive that Meta have &lt;a href=&#34;https://blog.whatsapp.com/connecting-to-whatsapp-by-proxy&#34;&gt;introduced proxy support&lt;/a&gt; for people who live
under oppressive regimes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For those who want an Apple Display but can&amp;rsquo;t stomach Apple&amp;rsquo;s pricing take a
look at these two serious alternatives from &lt;a href=&#34;https://www.macrumors.com/2023/01/02/ces-2023-samsung-monitors/&#34;&gt;Samsung with their ViewFinity S9&lt;/a&gt;
and &lt;a href=&#34;https://www.macrumors.com/2023/01/04/dell-6k-inch-take-on-pro-display-xdr/&#34;&gt;Dell&lt;/a&gt; with the &lt;a href=&#34;https://www.dell.com/en-us/blog/dell-technologies-introduces-more-world-s-first-s-collaboration-tools/&#34;&gt;UltraSharp 32 6K&lt;/a&gt;. Pricing has not yet been announced,
but they surely can&amp;rsquo;t be more than Apple&amp;rsquo;s offerings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theverge.com/23543094/creative-sim-wong-hoo-sound-blaster-obituary-death&#34;&gt;Creative founder Sim Wong Hoo, the man behind Sound Blaster, has died&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It might seem hard for younger readers to believe, but there was a time that
computer sound wasn’t guaranteed. If you wanted to plug in headphones or
speakers that could do more than bloops or bleeps, you probably needed a
sound card.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Sound Blaster was a big deal back in the day.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daringfireball.net/linked/2023/01/06/swedish-car-button-study&#34;&gt;Study suggests that hardware buttons in cars are safer and quicker to use
than touchscreens&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am nearly certain that everyone knows this is true, especially the
designers at car companies. The reason that cars are largely switching to
mostly touchscreen controls is the same reason phones switched — software is
more flexible than hardware. Cars today do more than cars from 2005 did. But
in the same way that all phones still have some hardware buttons (volume,
power, mute), cars should too. The trick is getting the balance right. &lt;strong&gt;A
couple of recent cars I’ve driven have definitely gotten that balance
wrong.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Would you like to read a long and interesting thread about &lt;a href=&#34;https://www.imdb.com/title/tt0082198/&#34;&gt;Conan The
Barbarian&lt;/a&gt;? &lt;a href=&#34;https://twitter.com/hradzka/status/1611489902570639361&#34;&gt;Well, you&amp;rsquo;re in luck.&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 79: Nothing much going on</title>
      <link>https://elver.me/weeknotes/79-nothing-much-going-on/</link>
      <pubDate>Sun, 01 Jan 2023 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/79-nothing-much-going-on/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.karlsutt.com/articles/communicating-effectively-as-a-developer/&#34;&gt;How to communicate effectively as a developer&lt;/a&gt; is really great (via &lt;a href=&#34;https://chriscoyier.net/2022/12/28/watch-out-for-low-resolution-writing/&#34;&gt;Chris
Coyier&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Communicating effectively as an engineer means empathically increasing the
resolution of your writing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Empathy is often lacking in the workplace.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I saw &lt;a href=&#34;https://www.imdb.com/title/tt1630029/&#34;&gt;Avatar: The Way of Water&lt;/a&gt; on Boxing Day, which was visually stunning
but ultimately a bit boring. I fell asleep.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tenderlove wrote a &lt;a href=&#34;https://shopify.engineering/ruby-rails-year-in-review-2022&#34;&gt;Year in Review 2022&lt;/a&gt; for Ruby and Rails. Lots of
interesting improvements have made their way into Ruby this year. I&amp;rsquo;m
particularly interested to see the various developer experience improvements
like &lt;a href=&#34;https://github.com/ruby/error_highlight&#34;&gt;&lt;code&gt;error_highlight&lt;/code&gt;&lt;/a&gt; (and &lt;a href=&#34;https://github.com/rails/rails/pull/45818/&#34;&gt;integration with Rails&lt;/a&gt;) and &lt;a href=&#34;https://github.com/shopify/ruby-lsp&#34;&gt;Ruby LSP&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theguardian.com/commentisfree/2022/dec/27/wood-burning-stove-environment-home-toxins&#34;&gt;My burning shame: I fitted my house with three wood-burning stoves&lt;/a&gt; &amp;ndash; You
might want to reconsider that wood burning stove.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nothing much going on between Christmas and New Year as you&amp;rsquo;d expect. In the
lead up to 10 days off I had many ideas about all the productive things I
would do. Instead, I sat and watched telly, doomscrolled, and worried. Good
times.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bring on 2023, I suppose.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 78: Ho, Ho, Ho</title>
      <link>https://elver.me/weeknotes/78-ho-ho-ho/</link>
      <pubDate>Sun, 25 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/78-ho-ho-ho/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;TIL about &lt;a href=&#34;https://dhall-lang.org/&#34;&gt;the Dhall configuration language&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &amp;ldquo;that&amp;rsquo;s a lot of data&amp;rdquo; &lt;a href=&#34;https://www.thinkbroadband.com/news/9404-new-record-for-traffic-over-openreach-network-on-sunday-11th-december-2022&#34;&gt;news&lt;/a&gt;&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The new record of 229 PetaBytes of data transferred during the day is 7
PetaBytes higher than the previous record set on Sunday 5th December 2021,
so a year and a week ago.&lt;/p&gt;
&lt;p&gt;This is traffic across the Openreach network so includes a mixture of
technologies such as VDSL2, G.fast and FTTP and a large group of ISP the
largest of which are BT, Sky, TalkTalk, Vodafone and Zen Internet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Ruby and Rails world is heavily library-focussed via Rubygems. That is, we
have a requirement, and we tend to reach for a library which meets it and
everything is handled &lt;em&gt;within&lt;/em&gt; the library.&lt;/p&gt;
&lt;p&gt;Other ecosystems, like Elixir, are less focussed on libraries to do everything
often just providing generators to get your started. Once you&amp;rsquo;ve generated the
code it&amp;rsquo;s up to you to maintain it, but in exchange you deal with less magic
and version upgrade problems.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s why &lt;a href=&#34;https://codewithrails.com/rails-authentication&#34;&gt;A better way to handle user authentication in Rails&lt;/a&gt; is
interesting. It too follows the &amp;ldquo;we&amp;rsquo;ll generate it for you&amp;rdquo; approach and
relies upon a lot of the build-in Rails helpers to do so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/garybernhardt/status/1605634916653289472&#34;&gt;&amp;ldquo;Caching is frequently a lie&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Incidentally, we recently stopped caching node_modules in Heroku. That sped
deploys up by a full minute. On Heroku, saving/restoring node_modules
to/from cache takes 2-3x as long as just installing everything from scratch.
Caching is frequently a lie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s often assumed that caching will automatically makes things faster but
that is not always the case.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TJ Devries made &lt;a href=&#34;https://www.youtube.com/watch?v=stqUbv-5u2s&#34;&gt;Effective Neovim: Instant IDE&lt;/a&gt; which introduces
&lt;a href=&#34;https://github.com/nvim-lua/kickstart.nvim&#34;&gt;kickstart.nvim&lt;/a&gt;, a &amp;ldquo;A starting point for Neovim&amp;rdquo;. A lot of good stuff to
learn from.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ruby 3.2, &lt;a href=&#34;https://www.ruby-lang.org/en/news/2022/12/25/ruby-3-2-0-released/&#34;&gt;released today&lt;/a&gt;, &lt;a href=&#34;https://twitter.com/paracycle/status/1605706226007941122&#34;&gt;has been running at Shopify&lt;/a&gt; and the performance
improvements are impressive.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The headline feature that we&amp;rsquo;re all very excited about is YJIT. The YJIT
version in Ruby 3.2 is now labeled as production-ready, since we&amp;rsquo;ve been
able to solve the biggest production drawback, which was the large memory
overhead of the previous YJIT release.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Merry Christmas!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 77: Compiler collaboration</title>
      <link>https://elver.me/weeknotes/77-compiler-collaboration/</link>
      <pubDate>Sun, 18 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/77-compiler-collaboration/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This video - &lt;a href=&#34;https://www.youtube.com/watch?v=CJtvnepMVAU&#34;&gt;Rust Is Easy (The COMPILER teaches you!)&lt;/a&gt; - makes a
good point about just how good the Rust compiler is. Saying that, I still
don&amp;rsquo;t know what to do most of the time!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://til.hashrocket.com/posts/aoulxej8zd-ruby-memoization-with-nil-values&#34;&gt;Ruby memoization with nil values&lt;/a&gt;. Sprinkling &lt;code&gt;||=&lt;/code&gt; around your codebase with
wild abandon might not be doing what you think.&lt;/p&gt;
&lt;p&gt;For my own benefit, I&amp;rsquo;ll copy the example here.&lt;/p&gt;
&lt;p&gt;Instead of.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;ticket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008080&#34;&gt;@ticket&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;||=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Ticket&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;find_by(&lt;span style=&#34;color:#990073&#34;&gt;owner&lt;/span&gt;:)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You might need.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;ticket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;@ticket&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; defined?(&lt;span style=&#34;color:#008080&#34;&gt;@ticket&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008080&#34;&gt;@ticket&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Ticket&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;find_by(&lt;span style=&#34;color:#990073&#34;&gt;owner&lt;/span&gt;:)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://kobrakai.de/kolumne/one-to-many-liveview-form&#34;&gt;One-to-Many LiveView Form&lt;/a&gt; &amp;ndash; great tips on implementing dynamic one-to-many
forms with LiveView. Unfortunately a bit late for me as I&amp;rsquo;ve been doing
something similar, but some useful tips nonetheless.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.jim-nielsen.com/2022/what-work-looks-like/&#34;&gt;What “Work” Looks Like&lt;/a&gt; and &lt;a href=&#34;https://paulitaylor.com/2022/05/06/the-case-against-collaboration/&#34;&gt;The Case Against Collaboration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The idea that collaboration is the absolute best way to work is pervasive. You
can understand why, it just &lt;em&gt;sounds&lt;/em&gt; like the right thing to do. But not
always. Agreeing with &lt;em&gt;any&lt;/em&gt; of this article feels like heresy. Should it?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Introverts have some of the best ideas but often don’t feel very comfortable
talking openly about them in a group setting.&lt;/p&gt;
&lt;p&gt;Extroverts are only too willing to share their ideas (in fact they rarely
shut up about them) but are sometimes reluctant to listen to good ideas
proposed by others.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Many thoughtful points on what &amp;ldquo;collaboration&amp;rdquo; is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s not been a great week to be honest. Car repair-related stress, general
low mood, and work anxiety all culminating in catching a cold (I think?!)
which took me out of action for most of the week. Motivation is also an issue
in this run up to Christmas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 76: A Heart That Works</title>
      <link>https://elver.me/weeknotes/76-a-heart-that-works/</link>
      <pubDate>Sun, 11 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/76-a-heart-that-works/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A slightly shorter week again. Away at the weekend visiting family.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I watched my first two Christmas films of year &amp;ndash; &lt;a href=&#34;https://www.imdb.com/title/tt12003946/&#34;&gt;Violent Night&lt;/a&gt;, and &lt;a href=&#34;https://www.imdb.com/title/tt13623136/&#34;&gt;The
Guardians of the Galaxy: Holiday Special&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I enjoyed them both, but David Harbour in Violent Night does a great job of
being a jaded Santa Claus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s that time of year again &amp;ndash; &lt;a href=&#34;https://adventofcode.com&#34;&gt;Advent of Code&lt;/a&gt;. The code required for Advent
of Code is so far removed from the code I write daily. I don&amp;rsquo;t know what that
says. Nothing I write at &amp;ldquo;work&amp;rdquo; approaches &amp;ldquo;algorithm&amp;rdquo;. Maybe it should.&lt;/p&gt;
&lt;p&gt;I have enjoyed attempting Advent of Code in the past, but not sure I&amp;rsquo;m up for
it this year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I enjoyed &lt;a href=&#34;https://www.goodreads.com/book/show/61295403-a-heart-that-works&#34;&gt;A Heart That Works&lt;/a&gt; by Rob Delaney. It was brave, and funny, and
tragic. I can&amp;rsquo;t even begin to imagine their pain.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a parent, I would give it a miss.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I re-mapped the &lt;a href=&#34;https://twitter.com/raycastapp/status/1599433373042155520&#34;&gt;Raycast Emoji picker to the macOS default&lt;/a&gt; which is
&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;Space&lt;/kbd&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A reminder that there are &lt;a href=&#34;https://twitter.com/tobias_petry/status/1599656866392715265&#34;&gt;data types available&lt;/a&gt; specifically for &lt;a href=&#34;https://www.postgresql.org/docs/current/datatype-net-types.html&#34;&gt;storing IP
and Mac addresses&lt;/a&gt; in Postgres (and other databases).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Terrible news this week that &lt;a href=&#34;https://chrisseaton.com&#34;&gt;Chris Seaton&lt;/a&gt;, of &lt;a href=&#34;https://github.com/oracle/truffleruby&#34;&gt;TruffleRuby&lt;/a&gt; fame, has died.
&lt;a href=&#34;http://tenderlovemaking.com/2022/12/07/in-memory-of-a-giant.html&#34;&gt;Tenderlove&lt;/a&gt; and &lt;a href=&#34;https://blog.testdouble.com/posts/2022-12-07-the-best-kind-of-brilliant/&#34;&gt;Searls&lt;/a&gt; both wrote nice tributes. Such a shame.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://openai.com/blog/chatgpt/&#34;&gt;ChatGPT&lt;/a&gt; is genuinely amazing. Yes, it probably can&amp;rsquo;t be trusted to be 100%
correct, especially in terms of code correctness, but for generating ideas, or
jumping off points, it seems incredibly valuable.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 75: Court et doux</title>
      <link>https://elver.me/weeknotes/75-court-et-doux/</link>
      <pubDate>Sun, 04 Dec 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/75-court-et-doux/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I still haven&amp;rsquo;t embraced Mastodon, but I do plan to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://ooh.directory/&#34;&gt;Ooh.directory&lt;/a&gt; &amp;ndash; so delightfully old-school.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For years I’ve seen people moan that “nobody blogs any more”, all while my
feed reader was overflowing with new blogposts I never had time to read. I
want to demonstrate that there are lots and lots of people blogging, about
all kinds of subjects!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Via &lt;a href=&#34;https://daringfireball.net/linked/2022/12/01/ooh-directory&#34;&gt;Daring Fireball&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wish you could comment directly on Git commit messages in GitHub. In fact, I
wish you could comment on code that hasn&amp;rsquo;t changed too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A short 3 day working week culminating in 4 days in Paris. Very nice. I
haven&amp;rsquo;t been to France in 20+ years, which is a bit weird when you think about
it, given how close it is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ll be changing my working pattern to part-time in January, so that should
ease me into the new year nicely.&lt;/p&gt;
&lt;p&gt;Things to do: rest, focus on personal development, attend to my health.&lt;/p&gt;
&lt;p&gt;Things &lt;em&gt;not&lt;/em&gt; to do: worry incessantly about never working again.&lt;/p&gt;
&lt;p&gt;If you need Ruby/Rails help from February let me know.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/&#34;&gt;My blog post on replacing a failed drive in a ZFS storage pool&lt;/a&gt; helped out
&lt;a href=&#34;https://twitter.com/Chris_0606/status/1597676742134890497&#34;&gt;someone else&lt;/a&gt;. It&amp;rsquo;s nice when something you wrote down for yourself helps
others.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/neovim/comments/zb6lhb/highlighted_vimdoc_codeblocks_now_in_master/&#34;&gt;Syntax highlighting in vimdoc codeblocks&lt;/a&gt; in Neovim is cool.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 74: Burnout lag</title>
      <link>https://elver.me/weeknotes/74-burnout-lag/</link>
      <pubDate>Sun, 27 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/74-burnout-lag/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=ZBduBppB8r0&#34;&gt;An Antidote to Burnout&lt;/a&gt; - be thankful. It&amp;rsquo;s so hard to remember this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have been using Vim (and now Neovim) for Ruby on Rails development for many
years but I&amp;rsquo;ve never taken full advantage of &lt;a href=&#34;https://github.com/tpope/vim-rails&#34;&gt;&lt;code&gt;rails.vim&lt;/code&gt;&lt;/a&gt; even though it was
installed the whole time.&lt;/p&gt;
&lt;p&gt;The concept of &lt;a href=&#34;https://github.com/tpope/vim-rails/blob/a6d2bac95b446a5c23eff4638eca164b0d77454a/doc/rails.txt#L93&#34;&gt;alternative and related files&lt;/a&gt; is very nice. Since having found
fuzzy finders I&amp;rsquo;ve always relied upon them to open files, but actually, in a lot
of cases files can be opened more easily using &lt;code&gt;rails.vim&lt;/code&gt; supplied functions
like &lt;code&gt;:A&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The canonical example is opening a test related to the current file. This is
something I do constantly, and that can now be replaced with &lt;code&gt;:AV&lt;/code&gt; - open
alternative file, the RSpec spec, in a vertical split - rather than opening
the fuzzer finder.&lt;/p&gt;
&lt;p&gt;The support it adds to &lt;code&gt;gf&lt;/code&gt; is also amazing. You can go from &lt;code&gt;has_many :items&lt;/code&gt;
to &lt;code&gt;app/models/item.rb&lt;/code&gt; in two characters.&lt;/p&gt;
&lt;p&gt;I plan to continue trying these out as I think they can improve my workflow a
lot. Perhaps some new keybindings are in order once I get used to them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.postgresqltutorial.com/postgresql-window-function/postgresql-lag-function/&#34;&gt;&lt;code&gt;LAG&lt;/code&gt;&lt;/a&gt; Postgres function seems useful.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PostgreSQL LAG() function provides access to a row that comes before the
current row at a specified physical offset. In other words, from the current
row the LAG() function can access data of the previous row, or the row
before the previous row, and so on.&lt;/p&gt;
&lt;p&gt;The LAG() function will be very useful for comparing the values of the
current and the previous row.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Via &lt;a href=&#34;https://twitter.com/jnunemaker/status/1594683289498968068&#34;&gt;John Nunemaker&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/terrastruct/d2&#34;&gt;D2&lt;/a&gt; - A diagrams as text tool like &lt;a href=&#34;https://github.com/mermaid-js/mermaid&#34;&gt;Mermaid&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;D2 is a modern diagram scripting language that turns text to diagrams.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The syntax is more pleasing to me than Mermaid. Something to try the next time
I need to draw a diagram.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An &lt;a href=&#34;https://medium.com/@kris-nova/hachyderm-infrastructure-74f518bc7472&#34;&gt;interesting post about the infrastructure required to keep the popular
Hachyderm&lt;/a&gt; &lt;a href=&#34;https://hachyderm.io/&#34;&gt;Mastodon instance&lt;/a&gt; running.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m watching the progress of the &lt;a href=&#34;https://developer.chrome.com/docs/web-platform/view-transitions/&#34;&gt;View Transition API&lt;/a&gt; with interest.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The View Transition API makes it easy to change the DOM in a single step,
while creating an animated transition between the two states.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I hope that this will make &lt;em&gt;many&lt;/em&gt; &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Glossary/SPA&#34;&gt;SPAs&lt;/a&gt; pointless.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theregister.com/2022/10/29/kathleen_booth_obit/&#34;&gt;Kathleen Booth, the inventor of assembly language has died&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Professor Kathleen Booth, one of the last of the early British computing
pioneers, has died. She was 100.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had shamefully never heard of her until now, another in a long list of
forgotten women.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I noticed that my &lt;a href=&#34;https://www.raycast.com/jordelver/search-hex&#34;&gt;Search Hex Raycast extension&lt;/a&gt; &lt;a href=&#34;https://twitter.com/naetnums/status/1595511815160664089&#34;&gt;got mentioned on Twitter&lt;/a&gt;
this week. It&amp;rsquo;s nice to know that something I built has at &lt;em&gt;least&lt;/em&gt; one user 😆
That tiny feeling of validation makes it worth making.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/styrmis/status/1595908400747286528&#34;&gt;Stefan Magnuson&lt;/a&gt; recorded a &lt;a href=&#34;https://www.youtube.com/watch?v=syQ_hN6_K1o&#34;&gt;great video&lt;/a&gt; on using &lt;a href=&#34;https://github.com/vim-test/vim-test&#34;&gt;vim-test&lt;/a&gt;. I have
&lt;a href=&#34;https://github.com/jordelver/dotfiles/blob/master/config/nvim/lua/plugins.lua#L74-L81&#34;&gt;experience with vim-test&lt;/a&gt;, but stopped using it. I can&amp;rsquo;t remember why so I&amp;rsquo;m
going to give it another go, I think I might need to tweak my setup slightly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://sqlfordevs.com/ghost-conditions-for-unindexed-columns&#34;&gt;This is an interesting database tip&lt;/a&gt; about how to coax the database to use an
index by adding extra conditions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perfect indexes can not be created for every query because of their
overhead. Adding ghost conditions to those queries may lead to the database
using better indexes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A slightly less good week than last. A lot less code written, but many
production deployments without incident. I&amp;rsquo;m always surprised when things go
well. In fact, I feel like the karma police will come and brake something to
punish me for admitting this! 😆&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 73: Poorly batched RPCs</title>
      <link>https://elver.me/weeknotes/73-poorly-batched-rpcs/</link>
      <pubDate>Sun, 20 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/73-poorly-batched-rpcs/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.reddit.com/r/neovim/comments/yzfpx3/til_you_can_type_lua_code_instead_of_lua/?utm_source=pocket_saves&#34;&gt;Nice trick to show the result of a Lua expression in Neovim&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;:lua = 1 + 1&lt;/code&gt; instead of &lt;code&gt;:lua print(vim.inspect(1 + 1))&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had a very productive, and satisfying week 😮 I have a task to figure out
why this happened and how to replicate it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://priceops.org&#34;&gt;The 5 Pillars of PriceOps&lt;/a&gt; found via &lt;a href=&#34;https://www.tier.run&#34;&gt;tier&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The 5 Pillars of PriceOps define a methodology for pricing model definition
and implementation that supports iteration, safety, and organizational
alignment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve seen startups struggle with this conundrum before so it&amp;rsquo;s really nice to
see something like this formalised and written down. &lt;code&gt;tier&lt;/code&gt; itself looks neat
for managing everything.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A single tool to configure, orchestrate and manage your entire billing
stack.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL that &lt;code&gt;exrc&lt;/code&gt; is a feature of Neovim that allows have project specific
configuration. &lt;a href=&#34;https://github.com/neovim/neovim/pull/10177&#34;&gt;It &lt;em&gt;was&lt;/em&gt; deprecated&lt;/a&gt; but brought back to life in PR &lt;a href=&#34;https://github.com/neovim/neovim/pull/20956&#34;&gt;#20956&lt;/a&gt;
🙌 It doesn&amp;rsquo;t work with &lt;code&gt;init.lua&lt;/code&gt; though at the moment 😥 But there might be
work to make this work in &lt;a href=&#34;https://github.com/neovim/neovim/pull/13503&#34;&gt;#13503&lt;/a&gt; 🙌 🎢&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Fred_Brooks&#34;&gt;Fred Brooks&lt;/a&gt; of &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Mythical_Man-Month&#34;&gt;The Mythical Man-Month&lt;/a&gt; &lt;a href=&#34;https://inuh.net/@robpike/109362926916656811&#34;&gt;died&lt;/a&gt; on the 17th November 2022 😢&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update on the &lt;a href=&#34;/weeknotes/71-absolute-fire/&#34;&gt;JPEG XL debacle from a couple of weeks ago&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/jonsneyers/status/1592797329773694976&#34;&gt;Jon Sneyers&lt;/a&gt; explains (&lt;a href=&#34;https://discoliam.com&#34;&gt;via Discoliam&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fundamentally, the reason why Chrome decided to remove JPEG XL is that
there&amp;rsquo;s a conflict of interest.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The problem is that several people in the Chrome team — including some at
high-ranking gatekeeper positions — are also AVIF contributors/proponents.
This clouds their judgement since they are basically prosecutor, judge and
executioner at the same time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pixel art as &lt;a href=&#34;https://twitter.com/poof_eth/status/1590932197644865537&#34;&gt;&amp;ldquo;false nostalgia&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Last week&amp;rsquo;s listen to Adam Wiggins&amp;rsquo; Changelog episodes rekindled my interest
in &lt;a href=&#34;https://museapp.com&#34;&gt;Muse&lt;/a&gt;, his latest project. I&amp;rsquo;d heard of it before but never really used
it for whatever reason.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/19-burn-brightly/&#34;&gt;I bought an iPad Mini and Apple Pencil a while ago&lt;/a&gt; to help with learning,
thinking, planning, that sort of thing, but it&amp;rsquo;s mainly sat unused because I
couldn&amp;rsquo;t find a workflow that clicked for me.&lt;/p&gt;
&lt;p&gt;So I gave Muse is a go and I really like it. I used it in a planning session
for the first time and found it useful considering that I didn&amp;rsquo;t really know
what I was doing, and was learning as I went. That&amp;rsquo;s a good result.&lt;/p&gt;
&lt;p&gt;I would like better drawing tools, but that&amp;rsquo;s not yet been a hindrance for me.
I hope progress continues and I am going to move to a paid plan to get access
to a larger drawing canvas.&lt;/p&gt;
&lt;p&gt;Apple is also about to release &lt;a href=&#34;https://www.macrumors.com/guide/freeform-app-features/&#34;&gt;Freeform with iPadOS 16.2&lt;/a&gt; (Thanks, &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt;!)
so that is another interesting contender. I expect Apple will do the bear
minimum with it though, as they tend to, but I will try it when it comes out.&lt;/p&gt;
&lt;p&gt;The iPad Mini screen is a bit too small though, so watch this space for an
extravagant larger screen iPad purchase in the near future 😬&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I really wish &lt;a href=&#34;https://www.notion.so&#34;&gt;Notion&lt;/a&gt; would stay logged in for more than 5 minutes, it&amp;rsquo;s very
annoying, especially since they don&amp;rsquo;t have username/password login which my
password manager could easily fill in for me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let&amp;rsquo;s talk about Acast. Who, in their right mind, is listening to a podcast,
and then sitting through TWO MINUTES of adverts at the end?!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=0Cu6EbELZ6I&#34;&gt;Why There&amp;rsquo;s No Such Thing as a Good Billionaire&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/designcoursecom/status/1592979755686825984&#34;&gt;The Math Behind Nesting Rounded Corners&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Math Behind Nesting Rounded Corners is the math behind nesting rounded
corners. To nest one circle inside of another, the inner circle needs a
smaller radius than the outer circle.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rubyonrails.org/foundation&#34;&gt;The Rails Foundation&lt;/a&gt; seems like a good thing to me. I&amp;rsquo;ve noticed a few
skeptics online, we will see I guess.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To improve the documentation, education, marketing, and events of our
framework to the benefit of all new and existing Rails developers, and to
ensure a prosperous ecosystem that continues to improve for decades to come.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 72: Disco Safari</title>
      <link>https://elver.me/weeknotes/72-disco-safari/</link>
      <pubDate>Sun, 13 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/72-disco-safari/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://discoliam.com&#34;&gt;Discoliam&lt;/a&gt; educated me in the ways of smooth-scrolling using only CSS.
&lt;a href=&#34;https://caniuse.com/css-scroll-behavior&#34;&gt;Browser support is good&lt;/a&gt; with the &lt;a href=&#34;https://bugs.webkit.org/show_bug.cgi?id=179379&#34;&gt;exception of an annoying bug in mobile
Safari&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scrolling-behaviour: smooth;
scrolling-padding-top: 100px;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Smooth scrolling without JavaScript. Yes, please.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.rewind.ai&#34;&gt;Rewind&lt;/a&gt; - Equal parts terrifying and really cool.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Find anything you’ve seen, said, or heard&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There was a good discussion about it on &lt;a href=&#34;https://atp.fm/507&#34;&gt;ATP 507&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/adamlyttleapps/status/1589228855738486785&#34;&gt;&amp;ldquo;What framework do you use for building cross-platform apps?&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was surprised at how many mentions of &lt;a href=&#34;https://flutter.dev&#34;&gt;Flutter&lt;/a&gt; there were vs &lt;a href=&#34;https://reactnative.dev&#34;&gt;React
Native&lt;/a&gt;. I&amp;rsquo;ve never heard anyone say they were building anything with Flutter,
but several companies I know are using React Native. I would&amp;rsquo;ve expected
&lt;a href=&#34;https://dart.dev&#34;&gt;Dart&lt;/a&gt; to be a bigger barrier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://phoenixframework.org/blog/phoenix-1.7-released&#34;&gt;The release of Phoenix 1.7 is close&lt;/a&gt;. The &lt;a href=&#34;https://gist.github.com/chrismccord/00a6ea2a96bc57df0cce526bd20af8a7&#34;&gt;upgrade guide&lt;/a&gt; is available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been working on my side project a bit. Slow going. Every problem is 100%
my fault. Every solution is luck.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/searls/status/1590113592438726656&#34;&gt;Justin Searls on his guidance counsellor&lt;/a&gt; 😁&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mass layoffs at huge tech firms reminds me of my guidance counselor&amp;rsquo;s advice
during the dot-com bust: &amp;ldquo;whatever you do, don&amp;rsquo;t major in computers&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Nothing could make me surer there would be a shortage. 4 years later I
graduated in CS with ~16 classmates and endless opportunity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I got access to &lt;a href=&#34;https://arc.net&#34;&gt;Arc&lt;/a&gt;. It&amp;rsquo;s interesting so far. I&amp;rsquo;m going to try it out this
week coming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I do have &lt;em&gt;some&lt;/em&gt; sympathy for &lt;a href=&#34;https://twitter.com/textfiles/status/1590399315289444353&#34;&gt;this argument&lt;/a&gt; (although I probably wouldn&amp;rsquo;t
have communicated it &lt;em&gt;quite&lt;/em&gt; like this).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I have a very special message to the 11,000 Facebook people being laid off:
You absolutely deserve it. Facebook was, and is, one of the most profoundly
evil companies in the world, certainly one of the most specifically evil
because it frames itself as a simple social app.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Working at Facebook, especially as a programmer, is a hugely privileged
position to be in. Getting a job at Facebook is not easy. You&amp;rsquo;re probably a
very smart person, who has many options available to you. You&amp;rsquo;ll be paid huge
amounts of money. I find it hard to believe that you couldn&amp;rsquo;t get a job almost
&lt;em&gt;anywhere&lt;/em&gt; else. But you chose Facebook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://po-ru.com/2022/11/09/the-mirror-of-perseus&#34;&gt;More reasons to not use MySQL&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On closer inspection, the database record had the date set to an impossible
0000-00-00. Gee, thanks, MySQL.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another option for managed Postgres - &lt;a href=&#34;https://neon.tech&#34;&gt;Neon&lt;/a&gt;. I&amp;rsquo;ve requested early access to
give it a go. It sounds like it has similar features to &lt;a href=&#34;https://planetscale.com&#34;&gt;PlanetScale&lt;/a&gt; but
Postgres instead of MySQL.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://adamwiggins.com&#34;&gt;Adam Wiggins&lt;/a&gt; (co-founder and former CTO of Heroku) was on &lt;a href=&#34;https://changelog.com&#34;&gt;The Changelog&lt;/a&gt;
for a two-part interview (&lt;a href=&#34;https://changelog.com/podcast/513&#34;&gt;one&lt;/a&gt; / &lt;a href=&#34;https://changelog.com/podcast/514&#34;&gt;two&lt;/a&gt;). I still use &lt;a href=&#34;https://www.heroku.com&#34;&gt;Heroku&lt;/a&gt; to this day,
and it remains the best-in-class developer experience for deploying Ruby on
Rails apps. I found both parts of the interview really interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 71: Absolute Fire</title>
      <link>https://elver.me/weeknotes/71-absolute-fire/</link>
      <pubDate>Sun, 06 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/71-absolute-fire/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theverge.com/2022/10/28/23428132/elon-musk-twitter-acquisition-problems-speech-moderation&#34;&gt;&amp;ldquo;Welcome to hell, Elon&amp;rdquo;&lt;/a&gt; is absolute fire 🔥&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So you can make all the promises about “free speech” you want, but the dull
reality is that you still have to ban a bunch of legal speech if you want to
make money. And when you start doing that, your creepy new right-wing
fanboys are going to viciously turn on you, just like they turn on every
other social network that realizes the same essential truth.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VPN update: I &lt;a href=&#34;/weeknotes/51-inevitable-and-immortal/&#34;&gt;mentioned a while ago&lt;/a&gt; that I would be trying out some
different VPNs, one of which was &lt;a href=&#34;https://mullvad.net/en/&#34;&gt;Mullvad VPN&lt;/a&gt; and I&amp;rsquo;m currently three weeks
into trying it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; it connects &lt;em&gt;really&lt;/em&gt; quickly and seems fast - NordVPN and ProtonVPN
would often take a while to connect. &lt;strong&gt;Bad:&lt;/strong&gt; I don&amp;rsquo;t love the app design, I
wish it were a bit more Mac-like. It&amp;rsquo;s the most expensive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wrote a &lt;em&gt;tiny&lt;/em&gt; bit of CSS is week and was both surprised at how far it&amp;rsquo;s
come whilst also being astounded at how the simplest of things are still
difficult.&lt;/p&gt;
&lt;p&gt;This is cool, but still not universally supported.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;body:has(&amp;gt; .foo) {
  # Apply rule to body if it has a direct descendant .foo
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I used to really like doing frontend work earlier in my career, but it has
rather taken a back seat in recent years with most of my work being purely
backend. It&amp;rsquo;s something I&amp;rsquo;d like to do more of, but it getting back into it is
overwhelming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s really important that everyone on a team feels like have input into
making a difference. Without that, no matter how conscientious the developer,
they will eventually get sick feeling ignored, and, if not careful, a culture
of not caring can develop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Google Chrome team decided, for some unfathomable reason, to remove
support for the new JPEG XL format.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is not enough interest from the entire ecosystem to continue
experimenting with JPEG XL&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can see from the &lt;a href=&#34;https://bugs.chromium.org/p/chromium/issues/detail?id=1178058#c84&#34;&gt;Chromium bug thread&lt;/a&gt; that this decision is crazy.
Support from other browser vendors is also incomplete, but when you have most
of the market it does send the wrong signal.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All that overtime you&amp;rsquo;re doing for free isn&amp;rsquo;t doing your colleagues any
favours 😉&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I consumed a couple interesting takes on Git commit messages recently.&lt;/p&gt;
&lt;p&gt;Firstly, a new podcast, &lt;a href=&#34;https://yagni.fm/episodes/detailed-commit-messages-chris-toomey&#34;&gt;YAGNI&lt;/a&gt;, hosted by &lt;a href=&#34;https://twitter.com/_swanson&#34;&gt;Matt Swanson&lt;/a&gt; with guest &lt;a href=&#34;https://twitter.com/christoomey&#34;&gt;Chris
Toomey&lt;/a&gt;. Chris mentioned that you might as well note down all the context
which you built whilst working on a problem, or it&amp;rsquo;s lost. A great point.&lt;/p&gt;
&lt;p&gt;Secondly, &lt;a href=&#34;https://simonwillison.net/2022/Oct/29/the-perfect-commit/&#34;&gt;The Perfect Commit&lt;/a&gt; by Simon Willison. He talks about keeping the
documentation in the same repo, which I think is a great idea, but I&amp;rsquo;m not
sure how actionable it is for most teams.&lt;/p&gt;
&lt;p&gt;Both had interesting points even though I didn&amp;rsquo;t agree with all.&lt;/p&gt;
&lt;p&gt;Most people are not even writing decent commit subjects, never mind the whole
message, which is my experience tends to be empty almost all of the time. We
can do better.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 70: Crunchy Slump</title>
      <link>https://elver.me/weeknotes/70-crunchy-slump/</link>
      <pubDate>Sun, 30 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/70-crunchy-slump/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.crunchydata.com/blog/making-postgres-more-afforable-new-low-cost-plans-on-crunchy-bridge&#34;&gt;Crunchy Data launched cheaper Postgres plans recently&lt;/a&gt;. Better still, not
only are their cheap plan a reasonable cost, you can suspend your databases
and you don&amp;rsquo;t pay whilst they are suspended. And, if you don&amp;rsquo;t spend over $5
you don&amp;rsquo;t pay anything at all! It definitely removes a barrier to starting a
new project.&lt;/p&gt;
&lt;p&gt;I did experience some on-boarding issues, but support were very responsive and
pleasant to deal with, and seems receptive to feedback.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The project I was working on is now complete, so on to something new. Time for
the anxiety to change direction 😅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the Elixir inclined, &lt;a href=&#34;https://github.com/Shimmur/checker_cab&#34;&gt;&lt;code&gt;checker_cab&lt;/code&gt;&lt;/a&gt; looks to be a useful addition to
&lt;code&gt;ex_unit&lt;/code&gt; test suites.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Checker Cab facilitates deep map comparisons within unit tests.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It adds a &lt;code&gt;assert_values_for&lt;/code&gt; function which can be used to assert against
maps in a cleaner way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://imgproxy.net/&#34;&gt;imgproxy&lt;/a&gt; from &lt;a href=&#34;https://evilmartians.com&#34;&gt;Evil Martians&lt;/a&gt; looks great.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;imgproxy is a fast and secure standalone server for resizing and converting
remote images. The guiding principles behind imgproxy are security, speed,
and simplicity.&lt;/p&gt;
&lt;p&gt;imgproxy is able to quickly and easily resize images on the fly, and it&amp;rsquo;s
well-equipped to handle a large amount of image resizing. imgproxy is a
fast, secure replacement for all the image resizing code inside your web
application (such as resizing libraries, or code that calls ImageMagick or
GraphicsMagic).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There&amp;rsquo;s also a Ruby library, &lt;a href=&#34;https://github.com/imgproxy/imgproxy.rb&#34;&gt;imgproxy.rb&lt;/a&gt;, to help with generating the URLs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;Motivation Slumps&amp;rdquo; on &lt;a href=&#34;https://www.relay.fm/radar/253&#34;&gt;Under the Radar #253&lt;/a&gt; was a reassuring listen.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Feeling unmotivated, inspiration vs. motivation, and techniques to get
moving again.&lt;/p&gt;
&lt;p&gt;Be kind to yourself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To hear that Marco and David suffer from the same lack of motivation even with
very successful, visible, apps on a major platform was encouraging.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://world.hey.com/dhh/why-we-re-leaving-the-cloud-654b47e0&#34;&gt;&amp;ldquo;Why we&amp;rsquo;re leaving the cloud&amp;rdquo;&lt;/a&gt; - DHH again.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anyone who thinks running a major service like HEY or Basecamp in the cloud
is &amp;ldquo;simple&amp;rdquo; has clearly never tried. Some things are simpler, others more
complex, but on the whole, I&amp;rsquo;ve yet to hear of organizations at our scale
being able to materially shrink their operations team, just because they
moved to the cloud.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He has a point here I think. The cloud has many benefits, and you might take
advantage of those, but saving money on staff won&amp;rsquo;t be one of them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fly.io/phoenix-files/shut-down-idle-phoenix-app/&#34;&gt;A nice trick to shutdown a Phoenix app when it&amp;rsquo;s not being used&lt;/a&gt; by Chris
McCord.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/defrag_fable/status/1584594934006681600&#34;&gt;A considerable milestone&lt;/a&gt; for &lt;a href=&#34;https://github.com/penelopezone/rubyfmt&#34;&gt;&lt;code&gt;rubyfmt&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;100% of Stripe&amp;rsquo;s Ruby codebase, which is the largest single Ruby codebase in
the world, is now autoformatted with Rubyfmt. We&amp;rsquo;ll be upstreaming the
changes we made soon. I&amp;rsquo;m very excited.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://getoban.pro/articles/oban-starts-where-tasks-end&#34;&gt;Parker Selbert wrote &amp;ldquo;Oban Starts Where Tasks End&amp;rdquo;&lt;/a&gt; that details &lt;em&gt;why&lt;/em&gt; we
need a background job tool when Elixir has an excellent concurrency story.
I have struggled to fully understand/explain this to myself and others.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Burgeoning Elixirists frequently ask, “Who needs background jobs in Elixir?
Isn’t that what Task.start/1 is for?” Not quite. Let’s examine why a Task is
the wrong level of abstraction for critical background work.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He explains when &lt;a href=&#34;https://hexdocs.pm/elixir/Task.html&#34;&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/a&gt; or lower level functions are appropriate, and when a
full background job processing system is a better choice.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 69: Gotta catch &#39;em all</title>
      <link>https://elver.me/weeknotes/69-gotta-catch-em-all/</link>
      <pubDate>Sun, 23 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/69-gotta-catch-em-all/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Very good point by &lt;a href=&#34;https://twitter.com/chriskottom/status/1581979176315523073&#34;&gt;Chris Kottom&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anytime you introduce a network boundary anywhere in your stack, you raise
complexity 3x.  They&amp;rsquo;re harder to develop, harder to test, harder to deploy,
and harder to support.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When someone in a meeting says &amp;ldquo;we&amp;rsquo;ll just make a request to the API&amp;rdquo; increase
your time estimate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dogmatic &lt;a href=&#34;https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it&#34;&gt;YAGNI&lt;/a&gt; is bad. Some things are worth doing before you need them, and
&lt;a href=&#34;https://lukeplant.me.uk/blog/posts/yagni-exceptions/&#34;&gt;Luke Plant has a good list in &amp;ldquo;YAGNI exceptions&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been pillow shopping. I bought three of various types to try them out,
knowing that I could lean on the supplier&amp;rsquo;s 30-day refund policy to return the
ones I didn&amp;rsquo;t like.&lt;/p&gt;
&lt;p&gt;Then the supplier went into administration.&lt;/p&gt;
&lt;p&gt;So now I have three pillows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Want to generate a CSS gradient? Try &lt;a href=&#34;https://csshero.org/mesher/&#34;&gt;Mesher by CSS Hero&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daringfireball.net/linked/2022/10/21/dhh-twitter-headcount&#34;&gt;DHH might have a point&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When WhatsApp was sold to Facebook in 2014, it had almost half a billion
monthly users, but a team of just 50 people running everything. Compare this
to Twitter, which today has a staff of 7,500 to manage half the number of
users. Yet Musk is the crazy one here for suggesting that maybe Twitter
could operate with a mere TWO THOUSAND employees? Please.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regular reminder.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Work relationships can be cordial! Your peers are in the same boat, you owe
them solidarity. Your manager can like you, and you can like them, connect
as humans. But at no point should you lose sight that the second having you
in is no longer profitable, you&amp;rsquo;re out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/fasterthanlime/status/1581650396002783234&#34;&gt;https://twitter.com/fasterthanlime/status/1581650396002783234&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recently I setup a Neovim key mapping to grep for the word under the cursor
using &lt;code&gt;Telescope grep_string&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;n&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;lt;Leader&amp;gt;fw&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;lt;cmd&amp;gt;Telescope grep_string&amp;lt;cr&amp;gt;&amp;#39;&lt;/span&gt;, { noremap &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;leader&amp;gt;fw&lt;/code&gt; will grep for the word, show the results, and allow filtering.&lt;/p&gt;
&lt;p&gt;With the recent change in Neovim 0.8 to allow using &lt;code&gt;*&lt;/code&gt; with visual
selections (as I wrote about &lt;a href=&#34;/weeknotes/68-disclosure-widget/&#34;&gt;last week&lt;/a&gt;) I thought it would be nice to allow
visual selections with &lt;code&gt;Telescope grep_string&lt;/code&gt; too.&lt;/p&gt;
&lt;p&gt;This is easily accomplished by mapping the same command in &lt;code&gt;Visual&lt;/code&gt; mode.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim.keymap.set(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;v&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;lt;Leader&amp;gt;fw&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;lt;cmd&amp;gt;Telescope grep_string&amp;lt;cr&amp;gt;&amp;#39;&lt;/span&gt;, { noremap &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://wix-ux.com/when-life-gives-you-lemons-write-better-error-messages-46c5223e1a2f&#34;&gt;&amp;ldquo;When life gives you lemons, write better error messages&amp;rdquo;&lt;/a&gt; from Wix is a great
reminder of how important error messages are, and they provide some great
examples of &amp;ldquo;good&amp;rdquo; and &amp;ldquo;bad&amp;rdquo; messages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/dylanatsmith/status/1582112625479286784&#34;&gt;Dylan Smith from GitHub is looking to fix the wonky yellow progress spinner&lt;/a&gt;
you see in the GitHub UI. I wish I&amp;rsquo;d never noticed this because now I can&amp;rsquo;t
unsee it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Who’s the expert I should talk to about browser rendering, SVG, and CSS
animation? I’m weeks and weeks down the rabbit hole on a visual bug in
@GitHub and I’m dying to know &lt;em&gt;why&lt;/em&gt; it happens.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are some interesting replies in the Twitter thread and the &lt;a href=&#34;https://codepen.io/dylanatsmith/pen/MWQNvmw&#34;&gt;comparisons
CodePen&lt;/a&gt; is worth a look. It seems like it was fixed by breaking the single
SVG into pieces and only animating one of them.&lt;/p&gt;
&lt;p&gt;Web browsers are weird.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://deck-24abcd.netlify.app&#34;&gt;Gotta catch &amp;rsquo;em all&lt;/a&gt; &amp;ndash; Be &lt;a href=&#34;https://github.com/simeydotme/pokemon-cards-css/blob/main/static/cards.css&#34;&gt;scared&lt;/a&gt; of the CSS.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 68: Disclosure widget</title>
      <link>https://elver.me/weeknotes/68-disclosure-widget/</link>
      <pubDate>Sun, 16 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/68-disclosure-widget/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Neovim 0.8 was released recently and includes a new option called &lt;code&gt;cmdheight&lt;/code&gt;,
which, if set to &lt;code&gt;0&lt;/code&gt;, hides the command-line unless in-use. A nice way to
free up some vertical space.&lt;/p&gt;
&lt;p&gt;(Via &lt;a href=&#34;https://www.reddit.com/r/neovim/comments/xsstqk/neovim_08_whats_new/&#34;&gt;Neovim 0.8: What&amp;rsquo;s new?&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt; told me about the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details#browser_compatibility&#34;&gt;&lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; HTML element&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; HTML element creates a disclosure widget in which information
is visible only when the widget is toggled into an &amp;ldquo;open&amp;rdquo; state. A summary
or label must be provided using the &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; element.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pretty handy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;*&lt;/code&gt; key in Neovim is used for searching the word under the cursor. Since
Neovim 0.8 it now works with visual selections too, which comes in handy when
you want to search for more complex strings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://playwright.dev&#34;&gt;Playwright&lt;/a&gt; is an end-to-end testing tool ala &lt;a href=&#34;https://www.cypress.io&#34;&gt;Cypress&lt;/a&gt;. We&amp;rsquo;ve been thinking
about moving to it for it&amp;rsquo;s speed, and ability to run tests in different
browsers in parallel. From my limited experience I&amp;rsquo;m a fan.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On the subject of testing. I&amp;rsquo;ve decided that flake-free end-to-end tests
(that are actually useful) are more or less impossible to create.
Retry-ability is key.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/_byroot/status/1577647475686514689&#34;&gt;Jean Boussier doesn&amp;rsquo;t seem to sleep&lt;/a&gt;. &lt;a href=&#34;https://github.com/Shopify/pitchfork&#34;&gt;pitchfork&lt;/a&gt;, a new Ruby HTTP server
option is now in pre-release.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I finally released the first (pre)version of pitchfork.&lt;/p&gt;
&lt;p&gt;A new Ruby HTTP Server optimized for latency and memory usage&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The memory savings sound impressive!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git 2.38 introduced a new &lt;code&gt;--update-refs&lt;/code&gt; feature which I learnt about from
&lt;a href=&#34;https://github.blog/2022-10-03-highlights-from-git-2-38/&#34;&gt;GitHub&amp;rsquo;s blog&lt;/a&gt;. If you find yourself following a workflow where you have
branches that branch from each other in order to incrementally ship a feature
you might find that &lt;code&gt;--update-refs&lt;/code&gt; makes your life easier.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;main -&amp;gt; feature_a -&amp;gt; feature_b -&amp;gt; feature_c
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Say you have a commit that exists on all feature branches and it needs to
change. If you make the change on &lt;code&gt;feature_a&lt;/code&gt; you need to manually rebase each
branch based on &lt;code&gt;feature_a&lt;/code&gt; because the commit sha will have changed.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;-update-refs&lt;/code&gt; you can make the change on &lt;code&gt;feature_c&lt;/code&gt; and have the
changes propagated down to &lt;code&gt;feature_a&lt;/code&gt; and &lt;code&gt;feature_b&lt;/code&gt; automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://thebrowser.company&#34;&gt;The Browser Company&lt;/a&gt; are building a new web browser called &lt;a href=&#34;https://arc.net&#34;&gt;Arc&lt;/a&gt;. We
definitely need competition in the web browser market, so it will be
interesting to see what comes of this. Will it use an existing rendering
engine or something completely new? I&amp;rsquo;m interested to see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;https://www.raycast.com/jordelver/search-hex&#34;&gt;Raycast extension to search Hex&lt;/a&gt; that I &lt;a href=&#34;/weeknotes/67-set-theoretic-types/&#34;&gt;mentioned last week&lt;/a&gt; was accepted
into the Raycast Store, so that&amp;rsquo;s cool 🥳&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 67: Set-Theoretic types</title>
      <link>https://elver.me/weeknotes/67-set-theoretic-types/</link>
      <pubDate>Sun, 09 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/67-set-theoretic-types/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I was &lt;a href=&#34;/weeknotes/47-arbitrary-commands/&#34;&gt;excited back in May&lt;/a&gt; that &lt;a href=&#34;https://github.com/rails/rails/pull/45035&#34;&gt;initial support for pattern matching against
Active Models was merged into Rails&lt;/a&gt;, but it seems that &lt;a href=&#34;https://github.com/rails/rails/pull/45553&#34;&gt;it was later
reverted&lt;/a&gt; &lt;a href=&#34;https://twitter.com/kddnewton/status/1577244992720240641&#34;&gt;due to concerns over whether the interface was correct&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hope is not lost though, &lt;a href=&#34;https://github.com/rails/rails/pull/45070&#34;&gt;another PR is in progress&lt;/a&gt;, although discussion
stalled back in August.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I attended a children&amp;rsquo;s dance show which included the opening monologue of
&lt;a href=&#34;https://www.imdb.com/title/tt2184339/&#34;&gt;The Purge&lt;/a&gt;. Yeah, bit weird.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;José Valim&amp;rsquo;s article on the possible introduction of types into Elixir is an
interesting read &amp;ndash; &lt;a href=&#34;https://elixir-lang.org/blog/2022/10/05/my-future-with-elixir-set-theoretic-types/&#34;&gt;My Future with Elixir: set-theoretic types&lt;/a&gt;. The approach
seems pragmatic, and it will be interesting to see where it goes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;The problem is that arrogance and shyness look exactly the same.&amp;rdquo; &amp;ndash; Russell
Howard on the &lt;a href=&#34;https://castro.fm/episode/vSUySf&#34;&gt;Moon Under Water podcast&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I am looking for a decent visual diffing tool on macOS. Years ago I used
&lt;a href=&#34;https://kaleidoscope.app&#34;&gt;Kaleidoscope&lt;/a&gt; as a paid user but I believe it was sold and now costs $149! I
have no problem paying for software, but I don&amp;rsquo;t use a visual diffing tool
very often so it&amp;rsquo;s quite a lot to pay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;https://jordanelver.co.uk&#34;&gt;personal website blog&lt;/a&gt; has been somewhat neglected of late, partly due to
&lt;em&gt;these here&lt;/em&gt; weeknotes, but also because it used an old version of &lt;a href=&#34;http://middlemanapp.com&#34;&gt;Middleman&lt;/a&gt;
which I hadn&amp;rsquo;t kept up-to-date, and it became difficult to work with. Well, I
managed to breath new life into it this week after upgrading various gems and
fighting with native extensions. Great success!&lt;/p&gt;
&lt;p&gt;At some point it needs redesigning, organising, amalgamating (with this site
perhaps?) but I will continue to publish over there for now despite its flaws.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I learnt about rfc5785 &amp;ndash; &lt;a href=&#34;https://www.rfc-editor.org/rfc/rfc5785&#34;&gt;Defining Well-Known Uniform Resource
Identifiers (URIs)&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is increasingly common for Web-based protocols to require the discovery
of policy or other information about a host (&amp;ldquo;site-wide metadata&amp;rdquo;) before
making a request.&lt;/p&gt;
&lt;p&gt;When this happens, it is common to designate a &amp;ldquo;well-known location&amp;rdquo; for
such data, so that it can be easily located.  However, this approach has the
drawback of risking collisions, both with other such designated &amp;ldquo;well-known
locations&amp;rdquo; and with pre-existing resources.&lt;/p&gt;
&lt;p&gt;To address this, this memo defines a path prefix in HTTP(S) URIs for these
&amp;ldquo;well-known locations&amp;rdquo;, &amp;ldquo;/.well-known/&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some interesting perspectives in &lt;a href=&#34;https://apibakery.com/blog/tech/no-jwt/&#34;&gt;&amp;ldquo;Why you should not use JWT&amp;rdquo;&lt;/a&gt;. I can&amp;rsquo;t help
but feel that JWTs are overkill in most situations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tobias Petry&amp;rsquo;s database tips continue to be great. &lt;a href=&#34;https://twitter.com/tobias_petry/status/1577609056797204482&#34;&gt;You can define date ranges
that don&amp;rsquo;t overlap through database constraints&lt;/a&gt; &amp;ndash; neat! I&amp;rsquo;ll try and
remember that one. No MySQL support though but Postgres has you covered.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wrote a &lt;a href=&#34;https://github.com/raycast/extensions/pull/3149&#34;&gt;Raycast extension for searching for Hex packages&lt;/a&gt; this week. Bit of
a side tangent from the other side projects I &lt;em&gt;should&amp;rsquo;ve&lt;/em&gt; been working on, but
I&amp;rsquo;m pretty pleased with it. I took the existing Rubygems extension and munged
it about. Using another extension as a basis is a big leg up. I learn far
better from examples so the tons of &lt;a href=&#34;https://github.com/raycast/extensions&#34;&gt;existing extensions in Raycast&amp;rsquo;s repo&lt;/a&gt;
are a great help.&lt;/p&gt;
&lt;p&gt;It hasn&amp;rsquo;t been reviewed or accepted into the Raycast Store yet so 🤞&lt;/p&gt;
&lt;p&gt;I also used Figma for the first time because I&amp;rsquo;m young, and relevant. I guess
Adobe will be ruining it soon so it&amp;rsquo;s nice to give a try before that happens.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Adds TypeScript, React, and Figma to CV&lt;/em&gt; 😉&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 66: Quick look, Dynamic Island</title>
      <link>https://elver.me/weeknotes/66-quick-look-dynamic-island/</link>
      <pubDate>Sun, 02 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/66-quick-look-dynamic-island/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m still not taking notes. Let&amp;rsquo;s never speak of it again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, I have found a solution to the majority of my Quick Look plugins
being broken since moving to an M1 Mac &amp;ndash; &lt;a href=&#34;https://github.com/sbarex/SourceCodeSyntaxHighlight&#34;&gt;Syntax Highlight&lt;/a&gt;. This is really
well done, supporting loads of languages and is very configurable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can tell Active Record to not lazily load associations by default using
strict loading (since Rails 6).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sets the record to strict_loading mode. This will raise an error if the
record tries to lazily load an association.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Via &lt;a href=&#34;https://twitter.com/th1agofm/status/1574709902517440512&#34;&gt;Thiago Massa&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/hellojctoon/status/1573348473176723456&#34;&gt;The best use of the Dynamic Island&lt;/a&gt; so far.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been trying to revive a side project written in Elixir and Phoenix that I
started two and a half years ago 😅 How time flies. It was barely an
experiment but now I&amp;rsquo;m looking to actually make it work.&lt;/p&gt;
&lt;p&gt;I decided to update Phoenix. A lot has changed, in particular with &lt;a href=&#34;https://github.com/phoenixframework/phoenix_live_view&#34;&gt;LiveView&lt;/a&gt;.
The upgrade itself was easy, and everything was working afterwards with
minimal changes, but I decided to try and bring all the defaults up-to-date
too.&lt;/p&gt;
&lt;p&gt;The best way I could think to do that was to install the latest Phoenix
generator and generate a new application with the same name in a different
directory. That let me diff the two directories to see what has changed in the
code that the generator&amp;hellip;generates. Porting the changes over then became
fairly straight forward.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fourble.co.uk&#34;&gt;Fourble&lt;/a&gt; is a cool idea.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fourble turns lists of .mp3 files into podcasts. Point it at some audio
files hosted anywhere online, and it&amp;rsquo;ll turn them into a podcast feed which
you can subscribe to and share.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/ruby/ruby/pull/6353&#34;&gt;Ruby just had a native immutable value object implementation merged&lt;/a&gt; 🥳&lt;/p&gt;
&lt;p&gt;I &lt;a href=&#34;https://github.com/ruby/ruby/blob/master/doc/contributing/building_ruby.md&#34;&gt;downloaded and built Ruby &lt;code&gt;master&lt;/code&gt;&lt;/a&gt; to have a play (which wasn&amp;rsquo;t as
difficult as I had imagined after a small hiccup with needing to install
&lt;code&gt;libyaml&lt;/code&gt;).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irb(main):&lt;span style=&#34;color:#099&#34;&gt;001&lt;/span&gt;:&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Person&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Data&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;define(&lt;span style=&#34;color:#990073&#34;&gt;:firstname&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:lastname&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Person&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;irb(main):&lt;span style=&#34;color:#099&#34;&gt;002&lt;/span&gt;:&lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Person&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;new
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(irb):&lt;span style=&#34;color:#099&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#990073&#34;&gt;:in&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;`initialize&amp;#39;: missing keywords: :firstname, :lastname (ArgumentError)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;irb(main):003:0&amp;gt; person = Person.new(firstname: &amp;#34;Frodo&amp;#34;, lastname: &amp;#34;Baggins&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;=&amp;gt; #&amp;lt;data Person:...&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;irb(main):004:0&amp;gt; person.inspect
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;=&amp;gt; &amp;#34;#&amp;lt;data Person firstname=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;Frodo&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;, lastname=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;Baggins&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;irb(main):005:0&amp;gt; person.firstname
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;=&amp;gt; &amp;#34;Frodo&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;irb(main):006:0&amp;gt; person.firstname = &amp;#34;Bob&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;(irb):6:in `&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;main&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;: undefined method `firstname=&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;#&amp;lt;data Person firstname=&amp;#34;Frodo&amp;#34;, lastname=&amp;#34;Baggins&amp;#34;&amp;gt; (NoMethodError)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There have been various third party libraries to fulfill this need in past
years, but I hope having something built-in will mean value objects are
adopted more. Installing a third party gem will always have more resistance to
use.&lt;/p&gt;
&lt;p&gt;It looks like &lt;a href=&#34;https://twitter.com/zverok&#34;&gt;zverok&lt;/a&gt; has been &lt;a href=&#34;https://bugs.ruby-lang.org/issues/16122&#34;&gt;working on this for 3 years&lt;/a&gt; 😮&lt;/p&gt;
&lt;p&gt;I guess this will be in Ruby 3.2.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🔥&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If I could only copy one feature of an existing language when creating a new
one, I would copy Javascript&amp;rsquo;s ability to have its users completely ignore
all of its flaws.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/teej_dv/status/1576296405945094147&#34;&gt;https://twitter.com/teej_dv/status/1576296405945094147&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 65: Verified debugging schedule</title>
      <link>https://elver.me/weeknotes/65-verified-debugging-schedule/</link>
      <pubDate>Sun, 25 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/65-verified-debugging-schedule/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/petergyang/status/1573489316147306496&#34;&gt;&amp;ldquo;Kids are using AI to write essays and get straight As&amp;rdquo;&lt;/a&gt;. I&amp;rsquo;m not even mad. I
don&amp;rsquo;t know which service/AI is being used, but &lt;a href=&#34;https://jenni.ai&#34;&gt;I tried out Jenni&lt;/a&gt; and was
impressed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m not very good at SQL. I just don&amp;rsquo;t use it enough in its raw form due to
ORM usage. However, I used a &lt;code&gt;HAVING&lt;/code&gt; clause this week, and it&amp;rsquo;s handy so
I&amp;rsquo;m documenting it here.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;owner_id,&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;COUNT&lt;/span&gt;(owner_id)&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;events&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;GROUP&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;BY&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;owner_id&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;HAVING&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;COUNT&lt;/span&gt;(owner_id)&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Find all events with more than 1 row. I used this to diagnose a duplicate data
issue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is very nice feature in iOS 16 (via &lt;a href=&#34;https://twitter.com/rvroo/status/1571415269817335808&#34;&gt;@RvRoo&lt;/a&gt;)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just discovered that the iOS 16 edit menu for text includes conversions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you select a unit amount such as 1/4 inch the popover menu will show the
conversation to metric automatically. It also works with currencies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/chris_mccord/status/1554478915477028864&#34;&gt;Chris McCord announced&lt;/a&gt; that &lt;a href=&#34;https://github.com/phoenixframework/phoenix/blob/master/CHANGELOG.md#introduction-of-verified-routes&#34;&gt;Phoenix 1.7 will include a new Verified Routes
feature&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Phoenix 1.7 includes a new Phoenix.VerifiedRoutes feature which provides ~p
for route generation with compile-time verification.&lt;/p&gt;
&lt;p&gt;Use of the sigil_p macro allows paths and URLs throughout your application
to be compile-time verified against your Phoenix router(s). For example the
following path and URL usages:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve often found using path helpers troublesome, both in Phoenix and Rails. I
often forget the names, arity, and argument order. &lt;a href=&#34;https://github.com/phoenixframework/phoenix/blob/master/guides/routing.md#verified-routes&#34;&gt;Verified Routes&lt;/a&gt; look very
much to be the best of both worlds &amp;ndash; build routes as strings, but
compile-time checks to make sure the path exists.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yet another interesting video from &lt;a href=&#34;https://www.youtube.com/watch?v=GMS0JvS7W1Y&#34;&gt;TJ Devries on &lt;code&gt;vim.schedule&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Neovim is not multi-threaded, but has an event loop. &lt;code&gt;vim.schedule&lt;/code&gt; allows you
to schedule a function to be run at the next opportunity. But as TJ explains,
it is deterministic &amp;ndash; you can work out when it will be run.&lt;/p&gt;
&lt;p&gt;It seems that some Neovim APIs can&amp;rsquo;t be accessed in certain situations, and
that is when you might use &lt;code&gt;vim.schedule&lt;/code&gt;. TJ explains it better than I.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.meetup.com/south-west-ruby/&#34;&gt;South West Ruby&lt;/a&gt; took place this week. It was a great turn out, with two
great talks by Ksenija Vasjko and &lt;a href=&#34;https://twitter.com/_st0012&#34;&gt;Stan Lo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sonja spoke about various Rails tips, of which one was the new &lt;code&gt;load_async&lt;/code&gt;
feature coming in Rails 7 &amp;ndash; I&amp;rsquo;m keen to see what sort of impact that can have
on loading times.&lt;/p&gt;
&lt;p&gt;Stan spoke about &lt;a href=&#34;https://github.com/ruby/debug&#34;&gt;ruby/debug&lt;/a&gt;, the newest Ruby debugger. Historically I&amp;rsquo;ve
been very poor at adopting and using debuggers. &lt;a href=&#34;https://tenderlovemaking.com/2016/02/05/i-am-a-puts-debuggerer.html&#34;&gt;I have been a &lt;code&gt;puts&lt;/code&gt;
debugger&lt;/a&gt;. Early on in my Ruby career the focus on testing was so great that I
only ever used them in a very basic way, but Stan&amp;rsquo;s talk has me interested in
learning more.&lt;/p&gt;
&lt;p&gt;Stan has written a blog post on &lt;a href=&#34;https://st0012.dev/from-byebug-to-ruby-debug&#34;&gt;migrating from ByeBug&lt;/a&gt; and a &lt;a href=&#34;https://st0012.dev/ruby-debug-cheatsheet&#34;&gt;useful
cheatsheet&lt;/a&gt; too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://phoenixframework.org/blog/phoenix-liveview-0.18-released&#34;&gt;LiveView 0.18 was released&lt;/a&gt;. Some nice new features &amp;ndash; Declarative Assigns
and Slots, HEEx HTML Formatter, and Accessibility improvements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/isainstars/status/1573361835893751808&#34;&gt;Debug with Mario sounds in Visual Studio&lt;/a&gt; &amp;ndash; lovely work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 64: Handy functions</title>
      <link>https://elver.me/weeknotes/64-handy-functions/</link>
      <pubDate>Sun, 18 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/64-handy-functions/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Moving around in Vim is one of its great strengths. Except for command line
mode, which I&amp;rsquo;ve always struggled with &amp;ndash; it doesn&amp;rsquo;t seem to allow normal Vim
movements. You can, however, move the cursor left and right with your normal
arrow keys, but you can move one word at a time by adding &lt;code&gt;&amp;lt;shift&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wrote my first ever &lt;a href=&#34;https://en.wikipedia.org/wiki/List_of_macOS_components#Automator&#34;&gt;Automator Quick Action&lt;/a&gt; 🤯 When I&amp;rsquo;m filing away
paperwork I always manually prepend the filename with the date. For example
&lt;code&gt;filename.pdf&lt;/code&gt; would become &lt;code&gt;2022-09-18-filename.pdf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I thought there must be a better way than manually adding the date, and there
is, the &amp;ldquo;Rename Finder Items: Add Date or Time&amp;rdquo; Action hooked up as a &amp;ldquo;Quick
Action&amp;rdquo; in Finder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Notetaking, the forever project, is still on-going. I&amp;rsquo;m lost in the woods with
it right now, but I have learnt a few new things about Lua which I will share
here.&lt;/p&gt;
&lt;p&gt;Check a file exists using in Neovim&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; vim.loop.fs_stat(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;path/to/file&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;-- it exists&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here is a handy function to get the current git branch&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;-- https://www.reddit.com/r/neovim/comments/uz3ofs/heres_a_function_to_grab_the_name_of_the_current/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;current_branch_name&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;local&lt;/span&gt; git &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; vim.fn.system(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;git rev-parse --is-inside-work-tree 2&amp;gt; /dev/null&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; git &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;~=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;local&lt;/span&gt; branch &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; vim.fn.system(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;git branch --show-current | tr -d &amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;return&lt;/span&gt; branch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Get the length of a string by prepending a &lt;code&gt;#&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;local&lt;/span&gt; name &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Dave&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;#&lt;/span&gt;name &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#099&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  print(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Hello, Dave&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve started reading &lt;a href=&#34;https://pragprog.com/titles/btlang/seven-languages-in-seven-weeks/&#34;&gt;Seven Languages in Seven Weeks&lt;/a&gt;, too, of which the first
chapter is about Lua, so I hope to pick up some new tricks in the coming
weeks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PlanetScale are offering a &lt;a href=&#34;https://planetscale.com/mysql-for-developers&#34;&gt;free MySQL database course for developers&lt;/a&gt;. I
haven&amp;rsquo;t used MySQL for a long time, but the reference to &lt;a href=&#34;https://xkcd.com/327/&#34;&gt;Little Bobby Tables&lt;/a&gt;
nearly made me sign up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Talking of MySQL&amp;hellip;this is the first time in a long time that MySQL has had
a feature that I wish Postgres did &amp;ndash; &lt;a href=&#34;https://twitter.com/tobias_petry/status/1569957951238017024&#34;&gt;making an index invisible before
deletion&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Deleting an unused index is still a risky operation: If you are wrong (and
it is still needed) the database will become slow. Before deleting it, you
can make the index invisible first and make it visible again instantly if
you still need it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I agree with &lt;a href=&#34;https://twitter.com/strzibnyj&#34;&gt;Josef Strzibny&lt;/a&gt; on all points in &lt;a href=&#34;https://nts.strzibny.name/why-not-rspec/&#34;&gt;&amp;ldquo;Why I don&amp;rsquo;t enjoy RSpec all that
much&amp;rdquo;&lt;/a&gt;, especially the parts about &amp;ldquo;Indirect references&amp;rdquo;. RSpec tests always
start off looking great, DRY, neat, tidy. Until they grow and grow as they
tend to at which point you have slow, difficult to grok, tests.&lt;/p&gt;
&lt;p&gt;I almost exclusively use RSpec. And I know it better than minitest. Why?
Because it&amp;rsquo;s the default in 99% of projects I work on. I think Rails shipping
with minitest tests is the right thing to do, but I would bet one of the first
thing most developers do is install RSpec.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, &lt;a href=&#34;https://twitter.com/searls/status/1570471265944866816&#34;&gt;@searls describes everything wrong with RSpec&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The DSL provides numerous ways to structure tests and everyone has a
different opinion (subject is great, subject is evil, let is good/bad,
nesting is good/bad), leading to terrific inconsistency on projects as
individuals express their own favorite way on the specs they write unless
you dictate a style in a really authoritarian way&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And, &lt;a href=&#34;https://twitter.com/searls/status/1570509265101791232&#34;&gt;he continues (this is like a greatest hits) regarding Rails and OOP&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As soon as anything resembling feature behavior or &amp;ldquo;business logic&amp;rdquo; or real
work, I get the hell out of dodge and into a PORO that I control and that
lives in a namespace in app/lib.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Honestly, I don&amp;rsquo;t do this. But I wish I could.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I accidentally came across Live Text on macOS Monterey this week. I reading
some text from a screenshot and realised I could select it with my mouse. A
very nice feature and complementary to &lt;a href=&#34;/weeknotes/32-what-a-pushover/&#34;&gt;Cleanshot&amp;rsquo;s OCRing capability&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another project milestone passed by this week. The end is in sight.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 63: Line up with mathematical precision</title>
      <link>https://elver.me/weeknotes/63-line-up-with-mathematical-precision/</link>
      <pubDate>Sun, 11 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/63-line-up-with-mathematical-precision/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Please, I beg you &amp;ndash; &lt;code&gt;s/Github/GitHub/&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I found a use for &lt;a href=&#34;https://api.rubyonrails.org/v7.0.3/classes/ActiveRecord/Batches.html#method-i-find_in_batches&#34;&gt;ActiveRecord&amp;rsquo;s &lt;code&gt;find_in_batches&lt;/code&gt;&lt;/a&gt; this week. I started off
with &lt;code&gt;find_each&lt;/code&gt; to run a backfill over thousands of records, but ended up
wanting to splay the jobs out so ended up using &lt;code&gt;find_in_batches&lt;/code&gt; which will
return the records you need and the batch number.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;find_in_batches&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;with_index &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;group, batch&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#0086b3&#34;&gt;puts&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Processing group &lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;#{&lt;/span&gt;batch&lt;span style=&#34;color:#d14&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  group&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;each &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;foo&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# do something with `foo`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A would hazard a guess that a lot of Heroku customers take advantage of Review
Apps, and Review Apps are configured using &lt;code&gt;app.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Somewhat confusingly they don&amp;rsquo;t respect the plan you specify in your
&lt;code&gt;app.json&lt;/code&gt;. The addons configured default to whatever the free plan is. If you
want something other than the default you need to contact Heroku support who
can enable that for you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you&amp;rsquo;re into Elixir, or curious, you should definitely take a look at this
&lt;a href=&#34;https://www.humblebundle.com/books/elixir-programming-pragmatic-programmers-books&#34;&gt;Humble Bundle of Elixir Books&lt;/a&gt;. I already own quite of few of these books,
but even so, it&amp;rsquo;s still a bargain and you&amp;rsquo;re also donating to charity, which
is nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had need to start auditing our &lt;code&gt;rails console&lt;/code&gt; activity this week. It&amp;rsquo;s
crazy how many companies won&amp;rsquo;t give you access to a database but are happy to
give you unfettered access to &lt;code&gt;rails console&lt;/code&gt;. There are a couple of gems from
&lt;a href=&#34;https://github.com/basecamp/&#34;&gt;Basecamp&lt;/a&gt; that we hope can help: &lt;a href=&#34;https://github.com/basecamp/console1984&#34;&gt;&lt;code&gt;console1984&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;https://github.com/basecamp/audits1984&#34;&gt;&lt;code&gt;audits1984&lt;/code&gt;&lt;/a&gt;. We&amp;rsquo;ve
yet to install them, but they look promising.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not more Neovim plugins! Yes, always.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/nvim-treesitter/nvim-treesitter-context&#34;&gt;&lt;code&gt;nvim-treesitter-context&lt;/code&gt;&lt;/a&gt; is nice. It shows you the context of current
class, method, whatever that you&amp;rsquo;re in as you navigate the file. So, say you
have a method that takes up more than the available screen real estate, it
will show the first line of the method at the top of the screen so you know
which method you&amp;rsquo;re in as the buffer scrolls.&lt;/p&gt;
&lt;p&gt;Hat tip to &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt; for clueing me in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;git commit -m&lt;/code&gt; should be banned. Yeah, I said it. And &lt;code&gt;git commit -a&lt;/code&gt; whilst
you&amp;rsquo;re at it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I learnt that you can add and commit a file in one go using &lt;code&gt;git commit path/to/file&lt;/code&gt; &amp;ndash; add that to the ban list too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/tobias_petry/status/1567445606586621953&#34;&gt;Tobias Petry tweeted&lt;/a&gt; about a Postgres extension I hadn&amp;rsquo;t heard of &amp;ndash; &lt;a href=&#34;https://www.postgresql.org/docs/current/ltree.html&#34;&gt;ltree&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Did you know there are alternative ways of storing trees in a database
without a parent_id and many queries to get all ancestors/children or the
complex nested set concept?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The extension is available on Heroku in case you were wondering. They have &lt;a href=&#34;https://devcenter.heroku.com/articles/heroku-postgres-extensions-postgis-full-text-search&#34;&gt;a
surprising amount of extensions available&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://patshaughnessy.net/2017/12/11/trying-to-represent-a-tree-structure-using-postgres&#34;&gt;Pat Shaughnessy has a series of blog posts on ltree&lt;/a&gt; which look very in-depth
but I&amp;rsquo;ve only had time to give them a cursory look.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.raycast.com/MisakiCoca/link-cleaner&#34;&gt;Link Cleaner extension for Raycast&lt;/a&gt; has been making my life easier when
preparing links for these weeknotes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was under the mistaken impression that the &lt;code&gt;arch&lt;/code&gt; utility on macOS was for
running programs under different architectures on an Apple Silicon CPU. But,
no. It&amp;rsquo;s slightly more subtle than that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If Rosetta is installed, the system will run x64 binaries automatically, you
don’t need arch&lt;/p&gt;
&lt;p&gt;arch is only required if you want to force the use of a specific version in
an &lt;strong&gt;universal binary&lt;/strong&gt; (containing both x64 and arm code), e.g. to run the
x64 version of a binary if it relies on plugins only available in x64.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(From: &lt;a href=&#34;https://apple.stackexchange.com/a/423917&#34;&gt;How am I running x86_64 programs without arch on Apple Silicon?&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A colleague set the env var &lt;code&gt;DISABLE_DATABASE_ENVIRONMENT_CHECK&lt;/code&gt;
this week. I&amp;rsquo;ve never seen it used before so my interest was peaked.
Apparently, it &lt;a href=&#34;https://www.bigbinary.com/blog/rails-5-prevents-destructive-action-on-production-db&#34;&gt;disables Rails&amp;rsquo; built-in environment checking&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When you first migrate your database the environment is written to a row in
the &lt;code&gt;ar_internal_metadata&lt;/code&gt; database table. If that value is &lt;code&gt;&amp;quot;production&amp;quot;&lt;/code&gt; and
you try and run a destructive action like &lt;code&gt;db:schema:load&lt;/code&gt; Rails will raise an
exception preventing you from destroying your database &amp;ndash; nice feature.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/lilykonings/status/1567317037126680576&#34;&gt;Lily Konings is right on&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tiny design detail: nested border radii look really funky if they&amp;rsquo;re the
same. To maintain the same curvature, the outer radius = inner radius +
padding.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I see this a lot and it drives me mad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Related, the new &lt;a href=&#34;https://twitter.com/sdw/status/1568056259060047873&#34;&gt;iPhone 14 Dynamic Island doesn&amp;rsquo;t quite line up&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;you’ll never be able to unsee this, enjoy your new iPhone folks, I will be
in the corner screaming into a pillow&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, this take is wrong imo. Lining things up with mathematical precision
is not always what looks best.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finished &lt;a href=&#34;https://www.imdb.com/title/tt14452776/&#34;&gt;The Bear&lt;/a&gt; this week &amp;ndash; loved it! It&amp;rsquo;s a good job the episodes are
short as it&amp;rsquo;s a pretty intense watch for a show about a sandwich shop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Charles Petzold on &lt;a href=&#34;http://www.charlespetzold.com/blog/2022/09/The-Changes-for-the-2nd-Edition-of-Code.html&#34;&gt;The Changes for the 2nd Edition of “Code”&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So it goes. The only consolation is that I’m not the only person in the
world forced into using JavaScript. There are literally millions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://shapeof.com/archives/2022/9/changes_for_the_2nd_edition_of_code.html&#34;&gt;Gus Mueller&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This made me laugh.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;😅&lt;/p&gt;
&lt;p&gt;(Via &lt;a href=&#34;https://shapeof.com/archives/2022/9/changes_for_the_2nd_edition_of_code.html&#34;&gt;The Shape of Everything&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 62: Rockstar Developer</title>
      <link>https://elver.me/weeknotes/62-rockstar-developer/</link>
      <pubDate>Sun, 04 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/62-rockstar-developer/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://elixir-lang.org/blog/2022/09/01/elixir-v1-14-0-released/&#34;&gt;Elixir v1.14 was released&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://2022.elixirconf.com&#34;&gt;ElixirConf 2022&lt;/a&gt; took place Aug 30 - Sep 2 and &lt;a href=&#34;https://dockyard.com&#34;&gt;DockYard&lt;/a&gt; announced various
new initiatives, but two caught my eye. &lt;a href=&#34;https://github.com/BeaconCMS/beacon&#34;&gt;Beacon&lt;/a&gt;, a new CMS built using
&lt;a href=&#34;https://github.com/phoenixframework/phoenix_live_view&#34;&gt;LiveView&lt;/a&gt;, and &lt;a href=&#34;https://native.live&#34;&gt;LiveView Native&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;LiveView Native empowers developers to build native and web applications
seamlessly with Phoenix&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m keen to seen how both of these develop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GOOD NEWS&lt;/strong&gt; The painting has finally been finished! &lt;strong&gt;BAD NEWS&lt;/strong&gt; We spent
the bank holiday weekend painting. &lt;strong&gt;GOOD NEWS&lt;/strong&gt; It&amp;rsquo;s a four days week!&lt;/p&gt;
&lt;p&gt;Overall, good news.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/riverscuomo&#34;&gt;Rivers Cuomo has a GitHub profile&lt;/a&gt;. The only valid use of Rockstar Developer.&lt;/p&gt;
&lt;p&gt;(Via &lt;a href=&#34;https://twitter.com/_davideast/status/1565872899029979137&#34;&gt;David East&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The fallout from Heroku&amp;rsquo;s canning of their free tier is somewhat predictable
&amp;ndash; lots of people trying to find new homes for their apps. We are spoilt for
choice in some ways, but I&amp;rsquo;m not sure that any of the available options have
the ease of Heroku (I have yet to try them though, so take that as you will).&lt;/p&gt;
&lt;p&gt;The amount of people espousing &amp;ldquo;just get a $5 VPS&amp;rdquo; are completely missing the
point, as usual. These options have always been available, and are a great
choice for many people, but they &lt;em&gt;are not&lt;/em&gt; what Heroku offers. In particular,
Heroku Postgres is something not easily replicated on a &amp;ldquo;$5 VPS&amp;rdquo;. I would be
keen to know about options in that area.&lt;/p&gt;
&lt;p&gt;Both &lt;a href=&#34;https://twitter.com/nicalpi/status/1564283776674537472&#34;&gt;Nic Alpi&lt;/a&gt; and &lt;a href=&#34;https://twitter.com/purpleriver_dev/status/1565324010136690689&#34;&gt;Phil Reynolds&lt;/a&gt; tweeted about their experiences trying out
different providers &amp;ndash; worth a read if you&amp;rsquo;re planning a move.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I found out about &lt;a href=&#34;https://www.postgresql.org/docs/current/rangetypes.html&#34;&gt;PostgreSQL range types&lt;/a&gt; this week.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Range types are data types representing a range of values of some element
type (called the range&amp;rsquo;s subtype). For instance, ranges of timestamp might
be used to represent the ranges of time that a meeting room is reserved.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pretty neat. Even better, &lt;a href=&#34;https://guides.rubyonrails.org/active_record_postgresql.html#range-types&#34;&gt;Rails has support for them&lt;/a&gt;, and maps the values to
&lt;a href=&#34;https://rubyapi.org/3.1/o/range&#34;&gt;&lt;code&gt;Range&lt;/code&gt;&lt;/a&gt; objects in Ruby-land.&lt;/p&gt;
&lt;p&gt;I think years of Rails has held back the use of great database features. This
is definitely changing though with Rails supporting a lot of new cool new
stuff.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.getrevue.co/profile/vim_tricks/issues/search-in-visual-selection-1332992&#34;&gt;Search without a visual selection&lt;/a&gt; using &lt;code&gt;/\%V&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think I&amp;rsquo;ll ever &lt;em&gt;know&lt;/em&gt; Vim&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just as I realised we can use &lt;a href=&#34;https://en.wikipedia.org/wiki/WebP&#34;&gt;WebP&lt;/a&gt; &lt;a href=&#34;https://caniuse.com/?search=webp&#34;&gt;now&lt;/a&gt; I hear about &lt;a href=&#34;https://en.wikipedia.org/wiki/AVIF&#34;&gt;AVIF&lt;/a&gt; 😅&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 61: Data breach</title>
      <link>https://elver.me/weeknotes/61-data-breach/</link>
      <pubDate>Sun, 28 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/61-data-breach/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/rayredacted/status/1562914396732801025&#34;&gt;30TB SSD for $29?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Have you ever heard the expression “if it sounds too good to be true, it
probably is”?  Well AliExpress is currently advertising a 30 Terabyte SSD
for $29&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theverge.com/2022/8/24/23319570/plex-security-breach-exposes-usernames-emails-passwords&#34;&gt;Plex had a data breach&lt;/a&gt; this week which prompted me to reset my password.
Nothing too concerning as I have unique passwords for everything. However,
resetting my password led to me being unable to connect my local Plex server.
Pretty soon I was editing XML on the server to &amp;ldquo;reclaim&amp;rdquo; it 😬&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I don&amp;rsquo;t advocate working weekends or in the evenings. However, I think each
person needs to decide what is best for them, where possible. And I sometimes
get blocked and work better outside of the working week, so last Sunday I did
some preparatory work for the following day. This made my Monday
immeasurably better than a normal Monday.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/junegunn&#34;&gt;junegunn&lt;/a&gt; recently released &lt;a href=&#34;https://github.com/junegunn/fzf-git.sh&#34;&gt;fzf-git.sh&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;bash and zsh key bindings for Git objects, powered by fzf.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Being a big fan of &lt;a href=&#34;https://github.com/junegunn/fzf&#34;&gt;&lt;code&gt;fzf&lt;/code&gt;&lt;/a&gt; I was intrigued, but soon discovered only bash and
zsh were supported 😢 But I then realised that, presumably, the reason for no
fish support is that it &lt;em&gt;already&lt;/em&gt; has amazing built-in completion that shows
commit objects.&lt;/p&gt;
&lt;p&gt;Like most of the tools I use regularly I feel like I&amp;rsquo;m not using them to their
fullest, so I took some time to refresh my memory with some fish things&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A few of fish tips:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;When you&amp;rsquo;re paging a set of completion results you can trigger a search
field by typing &lt;code&gt;CTRL-s&lt;/code&gt;. This lets you further filter down what is
returned.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can eschew &lt;code&gt;cd&lt;/code&gt; by just typing a path and hitting enter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fishshell.com/docs/current/cmds/fish_config.html&#34;&gt;&lt;code&gt;fish_config&lt;/code&gt;&lt;/a&gt; is very cool. A web interface for configuring fish. I don&amp;rsquo;t
use this much directly, but it&amp;rsquo;s very useful for playing around.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I used &lt;a href=&#34;https://blog.saeloun.com/2019/12/04/ruby-2-7-adds-new-operator-for-arguments-forwarding.html&#34;&gt;Ruby&amp;rsquo;s argument forwarding syntax&lt;/a&gt; this week. Introduced in Ruby 2.7
(!).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;foo&lt;/span&gt;(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  bar(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is very handy for lowering cognitive load when all you want to do is pass
through arguments. Especially keyword arguments which are visually wordy.&lt;/p&gt;
&lt;p&gt;When new Ruby features come out I often can&amp;rsquo;t use them because my projects
will be on an older Ruby. Then I forget for years. And then I write an entry
in my weeknotes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/aristocratos/btop&#34;&gt;&lt;code&gt;btop++&lt;/code&gt;&lt;/a&gt; is a very cool system resources monitor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TJ Devries explains how to write basic queries for Treesitter in &lt;a href=&#34;https://www.youtube.com/watch?v=v3o9YaHBM4Q&#34;&gt;&amp;ldquo;Magically
format embedded languages in Neovim&amp;rdquo;&lt;/a&gt;. He makes it looks easy, of course, but
it also looks very achievable to do something like this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coincidently, I came across the &lt;a href=&#34;https://github.com/nvim-treesitter/playground&#34;&gt;Treesitter Playground plugin&lt;/a&gt; for neovim,
which TJ demonstrates in the aforementioned video. It&amp;rsquo;s very cool. It shows
the live Treesitter generated AST for the current document. The visual nature
has helped me understand Treesitter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A fairly big milestone was reached on a project I&amp;rsquo;m working on this week. I
was really pleased, not only for the progress that has been made, but for how
smoothly it has gone. (Oh course, I don&amp;rsquo;t like to celebrate too much for
fear of everything going wrong.)&lt;/p&gt;
&lt;p&gt;It didn&amp;rsquo;t get the reception I was hoping for. So it goes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Heroku are discontinuing their free plans &amp;ndash; a sad day. I guess we knew this
day would come eventually. This seems like a self-own by Salesforce but I
suspect they just don&amp;rsquo;t care about the little guy anymore. As &lt;a href=&#34;https://twitter.com/getajobmike/status/1562827836096126977&#34;&gt;Mike Perham
pointed out&lt;/a&gt;, most projects start small on free Dynos and end up paying
considerable amounts to Heroku later, it seems very short-sighted to me.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/film_girl/status/1562842159027744774&#34;&gt;Christina Warren won the Internet with her tweet&lt;/a&gt; 🤣&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Heroku. More like Seppuku, am I right?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL Rails models can be made read only by implementing &lt;code&gt;#readonly?&lt;/code&gt;. This
stops them being updated.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;FooBar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;readonly?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Previously you could bypass this restriction using &lt;a href=&#34;https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-touch&#34;&gt;&lt;code&gt;#touch&lt;/code&gt;&lt;/a&gt; or
&lt;a href=&#34;https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_columns&#34;&gt;&lt;code&gt;#update_columns&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://blog.saeloun.com/2022/08/24/readonly-touch-update-attr-fix.html&#34;&gt;but not any more&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 60: Massive savings</title>
      <link>https://elver.me/weeknotes/60-massive-savings/</link>
      <pubDate>Sun, 21 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/60-massive-savings/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A much better week than last. Surprising how a few days off and some good
chats with a trusted colleague can improve things. Still, I&amp;rsquo;m very keen to get
off of my current project and onto something new. I need a change.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about the &lt;a href=&#34;https://github.com/facebook/zstd&#34;&gt;&lt;code&gt;ZStandard&lt;/code&gt;&lt;/a&gt; (also known as &lt;code&gt;zstd&lt;/code&gt;) compression algorithm from
Facebook (via &lt;a href=&#34;https://twitter.com/danluu/status/1560831128914649088&#34;&gt;Dan Luu&lt;/a&gt;). The savings to be had seem impressive.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/adrianco/status/1560854827810361345&#34;&gt;Adrian Cockcroft&lt;/a&gt; replied saying Amazon saved 30% at S3, which was later
clarified by &lt;a href=&#34;https://www.reddit.com/r/programming/comments/wtd61q/comment/il4uu67/&#34;&gt;someone else on Reddit&lt;/a&gt; that the savings were on internal
logs rather than data stored. I don&amp;rsquo;t know who is correct, but the savings
are impressive nonetheless.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve started taking my USB-chargeable desk fan to coffee shops. I don&amp;rsquo;t know
why I didn&amp;rsquo;t think of this before. Easily transportable, and takes the edge
off stuffy buildings. I&amp;rsquo;m cool (literally).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I switched over to &lt;a href=&#34;https://github.com/lewis6991/gitsigns.nvim&#34;&gt;Gitsigns&lt;/a&gt; from &lt;a href=&#34;https://github.com/airblade/vim-gitgutter&#34;&gt;git-gutter&lt;/a&gt;. I prefer the visual style of
Gitsigns, but it does seem buggier for me so far &amp;ndash; not updating when it
should etc. I will persevere for a while to see if things work out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/axelvc/template-string.nvim&#34;&gt;Template String Converter&lt;/a&gt; is a simple Neovim plugin which converts regular
quotes in JavaScript to backtick template strings when you interpolate values
&amp;ndash; a nice little feature if you write JavaScript or TypeScript.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think I&amp;rsquo;ll get around to using this any time soon, I&amp;rsquo;m not currently
writing much JavaScript, but &lt;a href=&#34;/weeknotes/57-crimping-automatically/&#34;&gt;as I&amp;rsquo;ve said before&lt;/a&gt; the really cool thing is
how easily this seems to have been achieved with relatively little code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I installed &lt;a href=&#34;https://github.com/stevearc/aerial.nvim&#34;&gt;Aerial&lt;/a&gt; in order to get an overview of RSpec test files (which
often get long and unwieldy). There are so many interesting plugins these
days that it can be overwhelming as nearly every plugin comes with some amount
of learning required.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been hearing about &lt;a href=&#34;https://github.com/tree-sitter/tree-sitter&#34;&gt;Treesitter&lt;/a&gt; for a long time but never really grokked
why it was important. Many plugins are now taking advantage of Treesitter to
get a better understanding of the code they might be operating on.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tree-sitter is a parser generator tool and an incremental parsing library.
It can build a concrete syntax tree for a source file and efficiently update
the syntax tree as the source file is edited.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Neovim integrates this library using &lt;a href=&#34;https://github.com/nvim-treesitter/nvim-treesitter&#34;&gt;nvim-treesitter&lt;/a&gt; and you can install
support for your favourite programming language using &lt;code&gt;:TSInstall&lt;/code&gt;.  For
example, &lt;code&gt;:TSInstall ruby&lt;/code&gt;. I will be trying to take advantage more in the
future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Talking of installing plugins and playing around with Treesitter. I am
currently experiencing a weird issue when editing files where I suddenly
can&amp;rsquo;t navigate within the file &amp;ndash; very strange.&lt;/p&gt;
&lt;p&gt;Current potential suspects are: Aerial, installing the Ruby treesitter module
using &lt;code&gt;:TSInstall ruby&lt;/code&gt;, or Gitsigns. These are all things I recently changed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/stefanjudis/status/1558824620039585795&#34;&gt;&amp;ldquo;TIL you can force push git branches with &lt;code&gt;+&lt;/code&gt;.&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At first, I was like &amp;ldquo;this is cool&amp;rdquo;, but now I&amp;rsquo;ve decided this is a pretty
terrible idea to save a few characters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/farazamiruddin/status/1553184620472156160&#34;&gt;faraz on Twitter&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Since joining Netflix, it&amp;rsquo;s been an adjustment not following a software
development process.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Part of me thinks this sounds great. The other part thinks it would lead to
utter chaos. However, I do sometimes wonder whether we&amp;rsquo;re all just &lt;a href=&#34;https://en.wikipedia.org/wiki/Cargo_cult_programming&#34;&gt;cargo
culting&lt;/a&gt; the least worst process we could come up with&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It looks like Autumn outside with trees already losing their leaves. This is
unfortunate since it&amp;rsquo;s August, and apparently caused by the tree going into
shock 😟&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 59: The Llama&#39;s ass etc</title>
      <link>https://elver.me/weeknotes/59-the-llama-s-ass-etc/</link>
      <pubDate>Sun, 14 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/59-the-llama-s-ass-etc/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bleepingcomputer.com/news/software/winamp-releases-new-version-after-four-years-in-development/&#34;&gt;Winamp is back?!&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://api.rubyonrails.org/classes/ActiveRecord/SignedId.html&#34;&gt;&lt;code&gt;ActiveRecord::SignedId&lt;/code&gt;&lt;/a&gt; seems neat (via &lt;a href=&#34;https://twitter.com/afomera/status/1557033868372324353&#34;&gt;Andrea Fomera&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Making a signed id with a purpose and expiration is the feature from Rails
more people should know about.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Indeed, I didn&amp;rsquo;t know Rails had this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I got access to &lt;a href=&#34;https://openai.com/dall-e-2/&#34;&gt;DALL-E 2&lt;/a&gt; this week. I&amp;rsquo;ve been fairly uninterested in &amp;ldquo;A.I.&amp;rdquo;
up until now but I have to say I was impressed by what it can produce. I could
see it being really useful for generating ideas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;DALL-E 2 is a new AI system that can create realistic images and art from
description in natural language.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I briefly moved web browser to Firefox this week. Safari has been slow for me
for quite a while, and it was becoming untenable. That was until I found the
&amp;ldquo;Limit IP Address Tracking&amp;rdquo; checkbox in the Network System Preferences.
Unchecking that option &lt;em&gt;seems&lt;/em&gt; to have revived Safari 🤞&lt;/p&gt;
&lt;p&gt;People are often surprised that I&amp;rsquo;m a Safari user, but it&amp;rsquo;s is so much more
Mac-like than Chrome or Firefox. And both of those browsers lack the &amp;ldquo;Look Up&amp;rdquo;
feature that I constantly use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wasn&amp;rsquo;t feeling very well this week so I decided to take Wednesday to Friday
off. I spent those days worrying, so that was a good use of time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been refactoring my Neovim config to make it more modular. I have several
things that I want to add which will require a lot of config, and the current
config is already a bit of a mess.&lt;/p&gt;
&lt;p&gt;I decided to move to &lt;a href=&#34;https://github.com/wbthomason/packer.nvim&#34;&gt;Packer&lt;/a&gt; from &lt;a href=&#34;https://github.com/junegunn/vim-plug&#34;&gt;vim-plug&lt;/a&gt; first, as is seemed more
extensible and has a more flexible configuration, which I hoped would allow me
to split things up a bit. I think I&amp;rsquo;ve succeeded in cleaning my plugin
definitions, so that&amp;rsquo;s a good start.&lt;/p&gt;
&lt;p&gt;I plan on splitting out the remaining config next.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 58: Unproductive content scroller</title>
      <link>https://elver.me/weeknotes/58-unproductive-content-scroller/</link>
      <pubDate>Sun, 07 Aug 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/58-unproductive-content-scroller/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;More amazing CSS from &lt;a href=&#34;https://twitter.com/jh3yy&#34;&gt;Jhey&lt;/a&gt; in &lt;a href=&#34;https://codepen.io/jh3y/pen/gOeXgXv&#34;&gt;these&lt;/a&gt; &lt;a href=&#34;https://codepen.io/jh3y/pen/KKoRXbV&#34;&gt;two&lt;/a&gt; CSS-only content scrollers 🤩&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I updated my &lt;a href=&#34;https://elver.me/uses/&#34;&gt;/uses&lt;/a&gt; page with details of my home server setup.&lt;/p&gt;
&lt;p&gt;The old school &amp;ldquo;design&amp;rdquo; of the page was bit &lt;em&gt;too&lt;/em&gt; old skool, so I made a small
tweak to give the page a maximum width specified with &lt;code&gt;ch&lt;/code&gt; units. How modern.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hugo introduced a feature called &amp;ldquo;Render Hooks&amp;rdquo; in &lt;a href=&#34;https://github.com/gohugoio/hugo/releases/tag/v0.62.0&#34;&gt;version 0.62.0&lt;/a&gt;. I&amp;rsquo;ve been
looking for a way to output anchor IDs for list items allowing me to link
directly to them and being able to hook into the rendering lifecycle sounded
promising. The bad news is that there is no support for list items 😢&lt;/p&gt;
&lt;p&gt;Which is why I&amp;rsquo;m interested in this PR: &lt;a href=&#34;https://github.com/gohugoio/hugo/pull/9858&#34;&gt;Listitem render hook #9858&lt;/a&gt;. So now I
wait to see if it makes any progress towards being merged.&lt;/p&gt;
&lt;p&gt;There doesn&amp;rsquo;t seem to be any way, save for forking the whole of Hugo, to
create a plugin, so I will just have to wait.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another great video from TJ DeVries this week &amp;ndash; &lt;a href=&#34;https://www.youtube.com/watch?v=HlfjpstqXwE&#34;&gt;Execute &lt;strong&gt;anything&lt;/strong&gt; in
neovim (now customizable)&lt;/a&gt;. I learnt how to pass callback functions as local
functions, how to accept user input, and how to create user commands that can
be called like other &lt;code&gt;Ex&lt;/code&gt; commands. Like and subscribe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was an &lt;a href=&#34;https://elixirforum.com/t/phx-long-term-project-updates/49228&#34;&gt;interesting question asked on the Elixir Forum recently&lt;/a&gt; about
how to keep generated Phoenix applications up-to-date.&lt;/p&gt;
&lt;p&gt;Several tools were suggested that I&amp;rsquo;d not heard of before &amp;ndash; &lt;a href=&#34;https://www.phoenixdiff.org/&#34;&gt;phoenixdiff.org&lt;/a&gt;
and &lt;a href=&#34;https://utils.zest.dev/gendiff&#34;&gt;gendiff&lt;/a&gt;. Very useful when you need them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It hasn&amp;rsquo;t been a massively productive week. Some weeks are like that, but I
had the day off on Wednesday, and travel either side, which certainly didn&amp;rsquo;t
help. However, I think project fatigue and lack of any break are the more
likely culprits.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You know in macOS when you drag something onto top of something else it does
that little cool animation which takes far too long? Well, &lt;a href=&#34;https://www.reddit.com/r/MacOS/comments/wg6p2t/is_there_a_way_to_increase_the_speed_of_this/&#34;&gt;you can change the
speed of that animation&lt;/a&gt; &amp;ndash; nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/shuding_/status/1552438750470340610&#34;&gt;Shu on Twitter demonstrates some cool fade-in animations&lt;/a&gt;. I made my &lt;a href=&#34;https://codepen.io/jordelver/pen/XWEqKjZ&#34;&gt;own
example to refer to&lt;/a&gt; in the future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We setup scheduled Slack reminders for the team last week and they are very
useful. Stop answering the same team questions all the time &amp;ndash; schedule a
reminder instead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rails/rails/commits?author=jordelver&#34;&gt;I&amp;rsquo;m a Rails contributor now&lt;/a&gt;. You. Are. Welcome.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 57: Crimping automatically</title>
      <link>https://elver.me/weeknotes/57-crimping-automatically/</link>
      <pubDate>Sun, 31 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/57-crimping-automatically/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;code&gt;git switch --orphan &amp;lt;new branch&amp;gt;&lt;/code&gt; to create a new empty branch which
shares no history with the parent branch.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://stackoverflow.com/a/34100189/120615&#34;&gt;https://stackoverflow.com/a/34100189/120615&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you&amp;rsquo;re using &lt;a href=&#34;https://viewcomponent.org&#34;&gt;ViewComponents&lt;/a&gt; you might find &lt;a href=&#34;https://github.com/allmarkedup/lookbook&#34;&gt;Lookbook&lt;/a&gt; useful.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lookbook gives ViewComponent-based projects a ready-to-go development UI for
navigating, inspecting and interacting with component previews.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I needed to re-locate my wifi access point after moving some furniture around.
I&amp;rsquo;ve wanted to ceiling mount it for a while so this was a good opportunity.
But how to run a cable? Luckily it&amp;rsquo;s &lt;a href=&#34;https://en.wikipedia.org/wiki/Power_over_Ethernet&#34;&gt;PoE&lt;/a&gt; so I only needed to run a network
cable via the loft, but pretty soon I was chasing out the wall to install a
network socket too!&lt;/p&gt;
&lt;p&gt;All of this means that I&amp;rsquo;m now the proud owner of a &lt;em&gt;second&lt;/em&gt; &lt;a href=&#34;https://www.amazon.co.uk/gp/product/B07VZTN6YK/&#34;&gt;RJ-45 crimping
tool&lt;/a&gt; (I already have one, but this one does &lt;a href=&#34;https://www.amazon.co.uk/gp/product/B07W4V6W6W/&#34;&gt;pass-through RJ-45 plugs&lt;/a&gt;, which
are far easier to deal with).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I recently discovered &lt;a href=&#34;https://www.youtube.com/watch?v=utMD5GDkLk8&#34;&gt;Nineteen Hundred And Eighty Five&lt;/a&gt; by &lt;a href=&#34;https://en.wikipedia.org/wiki/Paul_McCartney_and_Wings&#34;&gt;Wings&lt;/a&gt;. What a
tune!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/teej_dv&#34;&gt;TJ DeVries&lt;/a&gt; published a great video on how to &lt;a href=&#34;https://www.youtube.com/watch?v=9gUatBHuXE0&#34;&gt;Run Code Automatically in
Neovim&lt;/a&gt;. I found the content itself really useful, but the thing that really
stood out to me was how great the Lua APIs are.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Append to the bottom of a buffer using &lt;code&gt;nvim_buf_set_lines&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vim.api.nvim_buf_set_lines(bufnr, -1, -1, false, { &amp;quot;foo&amp;quot;, &amp;quot;bar&amp;quot; })
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Will write&amp;hellip;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;foo
bar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;hellip;to the bottom of the buffer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The posts on this website are written in Markdown, using reference-style
links which means I can wrap the link text in square brackets and then list
the URLs at the bottom of the page. I really like this as it stops the main
text getting cluttered up with URLs.&lt;/p&gt;
&lt;p&gt;Unfortunately, I left a broken link in last week&amp;rsquo;s entry and only noticed days
later. This led me to have a think of how I can prevent this in the future &amp;ndash;
I came up with two approaches.&lt;/p&gt;
&lt;p&gt;1) I wrote &lt;a href=&#34;https://github.com/jordelver/weeknotes/commit/90f86a9b87951bf323a832a06d5f61c49c5fbd62&#34;&gt;some JavaScript to highlight links without a URL&lt;/a&gt; in bright
yellow. The JavaScript is only executed during development.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{{ if .Site.IsServer }}
&amp;lt;script&amp;gt;
  function highlightMissingLinks() {
    const article = document.querySelector(&amp;quot;article&amp;quot;);
    const text = article.innerHTML;
    article.innerHTML = text.replace(/\[(.*?)\]/g, &amp;quot;&amp;lt;span style=&#39;background: yellow;&#39;&amp;gt;[$1]&amp;lt;/span&amp;gt;&amp;quot;);
  };

  window.addEventListener(&amp;quot;load&amp;quot;, highlightMissingLinks);
&amp;lt;/script&amp;gt;
{{ end }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2) I setup a GitHub Action that runs &lt;a href=&#34;https://github.com/igorshubovych/markdownlint-cli&#34;&gt;&lt;code&gt;markdownlint&lt;/code&gt;&lt;/a&gt; against changed
Markdown files. &lt;code&gt;markdownlint&lt;/code&gt; will check a whole host of violations, one of
which is broken links. I&amp;rsquo;m leaving all rules enabled for now and will see it
they need tweaking over time.&lt;/p&gt;
&lt;p&gt;I started off using &lt;a href=&#34;https://github.com/marketplace/actions/super-linter&#34;&gt;&lt;code&gt;super-linter&lt;/code&gt; from GitHub&lt;/a&gt;, but it took over 2 minutes
to run even though I only enabled Markdown linting, which I guess is fair
enough given that &lt;a href=&#34;https://github.com/marketplace/actions/super-linter#supported-linters&#34;&gt;it has ALL TEH LINTERS&lt;/a&gt; pre-installed.&lt;/p&gt;
&lt;p&gt;Then I changed to a slightly more home-grown solution using a
&lt;a href=&#34;https://github.com/marketplace/actions/markdownlint-cli&#34;&gt;&lt;code&gt;markdownlint&lt;/code&gt;-only action&lt;/a&gt; in combination with the &lt;a href=&#34;https://github.com/marketplace/actions/changed-files&#34;&gt;&lt;code&gt;changed-files&lt;/code&gt; action&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Lint

on:
  pull_request:
    branches: [main]

jobs:
  build:
    name: Markdown
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Get changed files
        id: changed-files
        uses: tj-actions/changed-files@v24
        with:
          files: content/*.md

      - name: Lint Markdown
        if: steps.changed-files.outputs.any_changed == &#39;true&#39;
        uses: nosborn/github-action-markdown-cli@v3.1.0
        with:
          files: ${{ steps.changed-files.outputs.all_changed_files }}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This post will be the first to be checked, so I will see how it goes!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been working on the TIL (Today I Learned) site that I said I was making
in &lt;a href=&#34;/weeknotes/5-professional-bash-programmer/&#34;&gt;Weeknotes 5&lt;/a&gt; 😄 Watch this space!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recently it occurred to me that I&amp;rsquo;d never seen a &lt;a href=&#34;https://en.wikipedia.org/wiki/5G&#34;&gt;5G&lt;/a&gt; symbol on my iPhone even
though my carrier added support earlier this year and I am often in 5G
coverage areas.&lt;/p&gt;
&lt;p&gt;Well, it turns out that you have to enable it in the iOS Settings under
&lt;code&gt;Mobile Data -&amp;gt; Mobile Data Options -&amp;gt; Voice &amp;amp; Data -&amp;gt; 5G On&lt;/code&gt;. The first test
I did at &lt;a href=&#34;https://fast.com&#34;&gt;fast.com&lt;/a&gt;, whilst travelling in a car, resulted in an average of
690Mbps 😮&lt;/p&gt;
&lt;p&gt;It really is quite astonishing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 56: Performance improvements</title>
      <link>https://elver.me/weeknotes/56-performance-improvements/</link>
      <pubDate>Sun, 24 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/56-performance-improvements/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The leaks are fixed. Bathroom still in pieces.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I setup the air conditioner. It was a bit &lt;em&gt;too&lt;/em&gt; cold if anything. Sorry,
Planet. I&amp;rsquo;ve never said the phrase &amp;ldquo;Oh, there&amp;rsquo;s a nice breeze&amp;rdquo; as much as this
week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After &lt;a href=&#34;/weeknotes/53-continuously-stream/&#34;&gt;complaining recently&lt;/a&gt; about the poor Ruby docs experience I found &lt;a href=&#34;https://rubyapi.org/&#34;&gt;Ruby
API&lt;/a&gt; this week by &lt;a href=&#34;https://twitter.com/oceanicpanda&#34;&gt;Colby Swandale&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ruby API makes it easy and fast to search or browse the Ruby language API
docs&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I haven&amp;rsquo;t had a lot of time to use it so far but I&amp;rsquo;ve very interested in
seeing where it goes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/51-inevitable-and-immortal/&#34;&gt;experiments with different VPN providers&lt;/a&gt; continues. &lt;a href=&#34;https://protonvpn.com&#34;&gt;ProtonVPN&lt;/a&gt; is very
fast to connect and I&amp;rsquo;m pretty happen with it so far. I would still like to
try out &lt;a href=&#34;https://mullvad.net/en/&#34;&gt;Mullvad&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clean up your branch remotes with &lt;code&gt;git remote prune origin&lt;/code&gt;. Use &lt;code&gt;--dry-run&lt;/code&gt;
first to double check what will be removed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/blog/fixing-commits-with-git-commit-fixup-and-git-rebase-autosquash/&#34;&gt;My article on using Git fixup commits&lt;/a&gt; got linked to from the &lt;a href=&#34;https://github.blog/2022-06-30-write-better-commits-build-better-projects/&#34;&gt;GitHub blog&lt;/a&gt;
&amp;ndash; pretty exciting. I only noticed because I happened to log into my analytics
(which I never do) and noticed a spike. It is encouraging to actually think
that someone is reading what I wrote (however shoddy that writing is).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/_byroot&#34;&gt;Jean Boussier&lt;/a&gt; wrote that he&amp;rsquo;d &lt;a href=&#34;https://twitter.com/_byroot/status/1549329642095579138&#34;&gt;improved Ruby &lt;code&gt;String#&amp;lt;&amp;lt;&lt;/code&gt; performance by 30%&lt;/a&gt;
and brought that improvement over to Rails with &lt;a href=&#34;https://github.com/rails/rails/pull/45614&#34;&gt;&amp;ldquo;Speedup
ActionView::OutputBuffer&amp;rdquo;&lt;/a&gt; too 🔥&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All this to say that Rails apps using ERB views should hopefully notice a
nice perf improvement with Rails 7.1 and Ruby 3.2. I&amp;rsquo;d love to give an
actual figure but thats&amp;rsquo; heavily dependent on the templates, so your mileage
may vary.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He then &lt;a href=&#34;https://twitter.com/_byroot/status/1550119824524599298&#34;&gt;followed up with&lt;/a&gt; a further improvement!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I merged a third String#&amp;laquo; optimization. Overall it&amp;rsquo;s now 65% faster for
UTF-8.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Great work! It always surprises me when someone manages to squeeze out these
performance gains like this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another &lt;a href=&#34;https://twitter.com/whatyouhide/status/1549295894721445888&#34;&gt;new feature in Elixir &lt;code&gt;main&lt;/code&gt; &amp;ndash; &lt;code&gt;dbg&lt;/code&gt;&lt;/a&gt;. A macro that you can use on
the end of a pipeline and it will output each value in turn &amp;ndash; very cool.
Lovely work by &lt;a href=&#34;https://twitter.com/whatyouhide/status/1549295894721445888&#34;&gt;Andrea Leopardi&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;__ENV__&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;trim&lt;/span&gt;: &lt;span style=&#34;color:#008080&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;List&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;last()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;File&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;exists?()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&amp;gt;&lt;/span&gt; dbg()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check out the examples in the Twitter thread.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For a unit test I needed a value from a predefined list, but it could only be
used once as the database column had a unique constraint. We&amp;rsquo;re using
&lt;a href=&#34;https://github.com/ffaker/ffaker&#34;&gt;&lt;code&gt;FFaker&lt;/code&gt;&lt;/a&gt; in this project and it was surprisingly easy to create my own
&lt;code&gt;FFaker&lt;/code&gt; module.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;module&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;FFaker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;module&lt;/span&gt; &lt;span style=&#34;color:#555&#34;&gt;Foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;extend&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;ModuleUtils&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;extend&lt;/span&gt; &lt;span style=&#34;color:#0086b3&#34;&gt;self&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008080&#34;&gt;DATA&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Foo&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Bar&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Baz&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;foo_bar_or_baz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      fetch_sample(&lt;span style=&#34;color:#008080&#34;&gt;DATA&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Calling &lt;code&gt;FFaker::Foo.foo_bar_or_baz&lt;/code&gt; will return a value on each invocation.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; pry(main)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;FFaker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;unique&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;foo_bar_or_baz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Bar&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; pry(main)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;FFaker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;unique&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;foo_bar_or_baz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Foo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; pry(main)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;FFaker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;unique&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;foo_bar_or_baz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Baz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; pry(main)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;FFaker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;unique&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;foo_bar_or_baz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Bar&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adding &lt;code&gt;unique&lt;/code&gt; to &lt;code&gt;FFaker::Foo.unique.foo_bar_or_baz&lt;/code&gt; will fail after it has
run out of values.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; pry(main)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;FFaker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;unique&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;foo_bar_or_baz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Bar&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; pry(main)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;FFaker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;unique&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;foo_bar_or_baz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Baz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; pry(main)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;FFaker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;unique&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;foo_bar_or_baz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Foo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;4&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; pry(main)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;FFaker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;unique&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;foo_bar_or_baz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;FFaker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;UniqueUtils&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#990073&#34;&gt;RetryLimitExceeded&lt;/span&gt;: &lt;span style=&#34;color:#008080&#34;&gt;FFaker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;UniqueUtils&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;RetryLimitExceeded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/53-continuously-stream/&#34;&gt;experiment with difftastic&lt;/a&gt; is over.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Looking for better Internets? &lt;a href=&#34;https://bidb.uk/&#34;&gt;Better Internet Dashboard&lt;/a&gt; does a nice job of
showing the various developments happening in your local area.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/avdi/status/1550575149363220480&#34;&gt;Thoughts on YAML by Avdi Grimm&lt;/a&gt; (found via &lt;a href=&#34;https://twitter.com/geeksam/status/1550610569543254017&#34;&gt;Sam Livingston-Gray&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;YAML is a wonderful serialization for computers to &lt;em&gt;write&lt;/em&gt; and humans to
&lt;em&gt;read&lt;/em&gt;. And maybe, occasionally, with great trepidation&amp;hellip; to &lt;em&gt;tweak&lt;/em&gt;. E.g.
Ruby&amp;rsquo;s YAML::Store is a terrific, under-appreciated tool for small-scale
persistence.&lt;/p&gt;
&lt;p&gt;YAML should not be composed by humans.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;People love to hate on YAML. I&amp;rsquo;ve never had any particular problem with it,
but then again I&amp;rsquo;ve only used it in fairly primitive ways. I&amp;rsquo;m sure the
problems with YAML exist, but for me it&amp;rsquo;s a good choice a lot of the time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 55: Leaking</title>
      <link>https://elver.me/weeknotes/55-leaking/</link>
      <pubDate>Sun, 17 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/55-leaking/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Water leak. Bathroom partially destroyed during investigation. Gas leak.
Heating engineer can&amp;rsquo;t find leak. Madness/olfactory failure? Cold shower. It&amp;rsquo;s
been a lot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/josevalim/status/1546880156177932289&#34;&gt;Elixir v1.14 will have line-by-line breakpoints!&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://news.ycombinator.com/item?id=32028511&#34;&gt;Can I suggest you check the firmware on your SSD&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let me narrow my guess: They hit 4 years, 206 days and 16 hours . . . or 40,000 hours.&lt;br&gt;
And that they were sold by HP or Dell, and manufactured by SanDisk.&lt;br&gt;
Do I win a prize?&lt;br&gt;
(None of us win prizes on this one).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/zverok&#34;&gt;@zverok&lt;/a&gt; is maintaining &lt;a href=&#34;https://rubyreferences.github.io/rubychanges/&#34;&gt;this really nice overview of changes to the Ruby
language over time&lt;/a&gt;. I didn&amp;rsquo;t know about a lot of the things I read here.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A very brief list of new significant features that emerged in Ruby
programming language since version 2.0 (2013).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/robzolkos/status/1546580353418248193&#34;&gt;Nice tip from Rob Zolkos&lt;/a&gt; to check that all Ruby classes will be found and
loaded in production.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I recommend running &lt;code&gt;bin/rails zeitwerk:check&lt;/code&gt; in your CI environment.  Just
a good sanity check that all classes will load ok once deployed to
production.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/ekuber/status/1547763625057591296&#34;&gt;Interesting replies to this&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you tried Rust and stopped using it, why did you stop and what would make
you try again?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git has been improving it&amp;rsquo;s UX in recent years. This still catches me out
often so is a welcome change.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With the newest version of Git 2.37.0, you can run just &amp;ldquo;git push&amp;rdquo; to push
new branches. No more &amp;ldquo;&amp;ndash;set-upstream origin&amp;rdquo;. Enable with:&lt;/p&gt;
&lt;p&gt;git config &amp;ndash;global &amp;ndash;add &amp;ndash;bool push.autoSetupRemote true&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/ji/status/1546948817462800384&#34;&gt;https://twitter.com/ji/status/1546948817462800384&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve started writing a simple Neovim plugin so I&amp;rsquo;ve been learning a bit about
Lua and the Neovim API. Take all this with a pinch of salt as I am probably
wrong about a lot of this 😁&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;There seems to be a common pattern used to implement &amp;ldquo;modules&amp;rdquo; as Lua
doesn&amp;rsquo;t have them built-in.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;local&lt;/span&gt; M &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;M.foo &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt;(opts)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;-- do something&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;return&lt;/span&gt; M
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lua code for a plugin goes into &lt;code&gt;lua/&lt;/code&gt;. You can reference other files using
a dot &lt;code&gt;.&lt;/code&gt; or slash &lt;code&gt;/&lt;/code&gt;, but the dot seems more common.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lua/foo.lua
lua/bar/init.lua
lua/bar/baz.lua
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Can be required like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;require(&amp;quot;foo&amp;quot;)
require(&amp;quot;bar&amp;quot;)
require(&amp;quot;bar.baz&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can use &lt;code&gt;:lua&lt;/code&gt; to run Lua code directly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lua doesn&amp;rsquo;t have regexes in the stdlib, but has &amp;ldquo;patterns&amp;rdquo; which can get you
most of the way. I&amp;rsquo;ve been using &lt;a href=&#34;https://gitspartv.github.io/lua-patterns/&#34;&gt;Lua Patterns Viewer&lt;/a&gt; to help get to grips
with them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can use &lt;a href=&#34;https://github.com/nvim-lua/plenary.nvim#plenarytest_harness&#34;&gt;&lt;code&gt;plenary.test_harness&lt;/code&gt;&lt;/a&gt; to &lt;a href=&#34;https://github.com/nvim-lua/plenary.nvim/blob/master/TESTS_README.md&#34;&gt;write tests&lt;/a&gt;!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Want to make a HTTP request from your plugin? &lt;a href=&#34;https://github.com/nvim-lua/plenary.nvim/blob/master/lua/plenary/curl.lua&#34;&gt;&lt;code&gt;plenary.curl&lt;/code&gt;&lt;/a&gt; is a &lt;code&gt;curl&lt;/code&gt;
wrapper that is surprisingly easy to use, so far.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/nvim-lua/plenary.nvim&#34;&gt;plenary.nvim&lt;/a&gt; is great in general. Thank you &lt;a href=&#34;https://github.com/tjdevries&#34;&gt;@tjdevries&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lua is slightly weird, but feels more like a programming language that I can
actually use, which I can&amp;rsquo;t say for Vimscript. Ask me again in a few weeks!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I use GitHub-style Markdown for keeping notes and heavily use the checkbox
notation like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;- [ ] Do something
- [x] Something I&amp;#39;ve done
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Which is why I was excited to find &lt;a href=&#34;https://github.com/jkramer/vim-checkbox&#34;&gt;&lt;code&gt;vim-checkbox&lt;/code&gt;&lt;/a&gt; via &lt;a href=&#34;https://newsletters.feedbinusercontent.com/a10/a106cfb9b682b00d98130faa8d57944967ddb1d2.html&#34;&gt;VimTricks&lt;/a&gt; this week.
It lets you type &lt;code&gt;&amp;lt;leader&amp;gt;tt&lt;/code&gt; to toggle checkboxes from anywhere on the
current line.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The heat this week has not be conducive to getting work done. I can&amp;rsquo;t wait for
it to be over.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 54: Launch week</title>
      <link>https://elver.me/weeknotes/54-launch-week/</link>
      <pubDate>Sun, 10 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/54-launch-week/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The project I&amp;rsquo;ve been working on for many weeks launched and went well. There
are some things that can be tweaked and improved upon, but I was pretty happy
for the most part.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://modalzmodalzmodalz.com&#34;&gt;modalzmodalzmodalz.com&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All the reasons you might not need to use a modal!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s hard to disagree with these points &amp;ndash; modals are often awful. I think the
message is somewhat lost by the barely readable typeface&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have &lt;a href=&#34;https://devcenter.heroku.com/articles/preboot&#34;&gt;Preboot&lt;/a&gt; turned on which means deployments can take a few minutes to
switch over to new dynos, and you it can be tricky to know which version of
the code is live. In order to help with knowing what is live, I made a change
to include the deployed Git SHA in both a metatag in the HTML and as a HTTP
header for non-HTML requests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of which, I then wrote a &lt;a href=&#34;https://fishshell.com&#34;&gt;fish&lt;/a&gt; &lt;a href=&#34;https://gist.github.com/jordelver/c628243c51eafddc0e2f2b98de42d3e3&#34;&gt;shell script&lt;/a&gt; to poll the website
and check for a version change. This means I can make a deployment, run the
script in the background, and it will speak &amp;ldquo;New version deployed&amp;rdquo; (using
&lt;code&gt;say&lt;/code&gt;) once it has rolled out.&lt;/p&gt;
&lt;p&gt;I decided to use &lt;code&gt;fish&lt;/code&gt; for this one as it&amp;rsquo;s the shell I use interactively. It
works well, and the code is readable enough, but it does make distributing to
the team more difficult. I have considered that maybe I should brush up on
Bash for scripts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.meetup.com/south-west-ruby/events/286689720/&#34;&gt;South West Ruby&lt;/a&gt; continues to run a more regular schedule after the pandemic.
This one included a great talk on &lt;a href=&#34;https://en.wikipedia.org/wiki/Domain-driven_design&#34;&gt;Domain Driven Design&lt;/a&gt; by &lt;a href=&#34;https://twitter.com/morricegavin&#34;&gt;Gavin Morrice&lt;/a&gt;.
It turns out that I&amp;rsquo;ve been doing a lot of DDD things already, but I wasn&amp;rsquo;t
necessarily aware of it!&lt;/p&gt;
&lt;p&gt;There was also another opportunity to see &amp;ldquo;Even Fuller Stack Ruby&amp;rdquo; by
&lt;a href=&#34;https://twitter.com/mckelvaney&#34;&gt;Michael McKelvaney&lt;/a&gt; where he showed all the interesting ways in which he has
used Ruby in a non-Rails context &amp;ndash; quite unusual these days as Ruby has
become a synonym for Rails.&lt;/p&gt;
&lt;p&gt;It was heartening to meet and speak with &lt;em&gt;several&lt;/em&gt; people who were brand new
to Ruby. Some having come from other languages, and some via bootcamps. So
much for Ruby being dead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I really like Elixir but I&amp;rsquo;ve found testing it difficult in some ways. Not
because something is wrong with Elixir (in fact, &lt;a href=&#34;https://hexdocs.pm/ex_unit/ExUnit.html&#34;&gt;ExUnit&lt;/a&gt; is &lt;em&gt;excellent&lt;/em&gt;, and
Elixir is mostly just functions and immutable state so testing is very easy in
most cases) but because I bring my Ruby testing baggage to it and things are
different. I bought &lt;a href=&#34;https://pragprog.com/titles/lmelixir/testing-elixir/&#34;&gt;Testing Elixir&lt;/a&gt; this week to do some learnin&#39;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rubycentral.org/ruby-shield&#34;&gt;Ruby Central announces Ruby Shield, a partnership between Ruby Central and Shopify&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Shopify is committing $1 million USD to Ruby Central over four years, in
addition to committing dedicated Engineering effort from Shopify’s Ruby and
Rails Infrastructure team.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This seems like good news to me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The folks at &lt;a href=&#34;https://swmansion.com/&#34;&gt;Software Mansion&lt;/a&gt; have released a new &lt;a href=&#34;https://github.com/membraneframework/membrane_rtmp_plugin/&#34;&gt;RTMP plugin&lt;/a&gt; for the
&lt;a href=&#34;https://membrane.stream&#34;&gt;Membrane Multimedia Framework&lt;/a&gt; which is pretty exciting to me. It means you
can receive an RTMP stream and have it processed by Membrane. I want to spend
some time experimenting with it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now we&amp;rsquo;re painting.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 53: Continuously stream</title>
      <link>https://elver.me/weeknotes/53-continuously-stream/</link>
      <pubDate>Sun, 03 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/53-continuously-stream/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m trying out &lt;a href=&#34;https://github.com/Wilfred/difftastic&#34;&gt;difftastic&lt;/a&gt; on the recommendation of a colleague.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Difftastic is a structural diff tool that understands syntax. It supports
over 20 programming languages and when it works, it&amp;rsquo;s fantastic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Still evaluating/getting used to it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We started watching Strangers Things and have made it through 2 series so far.
I like it. I &lt;em&gt;think&lt;/em&gt; I&amp;rsquo;ve seen Series 1 before but have absolutely no
recollection of it so it has been brand new to me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://brightonruby.com&#34;&gt;Brighton Ruby&lt;/a&gt; was this week and I had forgotten how to conference. The last
one was in 2019.&lt;/p&gt;
&lt;p&gt;Andy asked everyone how many Brighton Ruby&amp;rsquo;s they&amp;rsquo;d been to, and I had no idea
at the time, so when I got home I double checked. Turns out, &lt;em&gt;all seven&lt;/em&gt; of
them 😮. The first one being in 2014 &amp;ndash; doesn&amp;rsquo;t time fly. Stop it, Time.&lt;/p&gt;
&lt;p&gt;I managed to catch a cold just &lt;em&gt;before&lt;/em&gt; the conference so that I was at peak
cold during the day itself. Well done, me. Still, it was nice to be back and
it&amp;rsquo;s clear that the appetite for a Ruby conference in the UK is still going
strong.&lt;/p&gt;
&lt;p&gt;Highlights for me were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://hawksley.org&#34;&gt;Joel Hawksley&lt;/a&gt; from GitHub spoke about design systems and CSS in &lt;a href=&#34;https://hawksley.org/2022/03/01/conference-proposal-breaking-up-with-the-bundle.html&#34;&gt;Breaking
up with the bundle&lt;/a&gt;. As you&amp;rsquo;d expect GitHub has a lot of CSS, and managing
it is quite a task.&lt;/p&gt;
&lt;p&gt;CSS at scale is a hard problem, and one technique they used was to write
tests that outputted the computed styles for a component, and wrote
assertions against them &amp;ndash; neat stuff.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Instance variables by &lt;a href=&#34;https://jemma.dev&#34;&gt;Jemma Issroff&lt;/a&gt; was very interesting. It’s good to
know there is still a lot of work, using decade-old ideas, going on to
improve Ruby at the levels which I hardly ever see or deal with.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/has_many_books&#34;&gt;Emma Barnes&lt;/a&gt; gave a great talk with a key message that working code is the
best code, and that you never know the context under which it was written.
Very well delivered.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/jcinnamond&#34;&gt;John Cinnamond&lt;/a&gt; gave a talk with some examples of the &lt;a href=&#34;https://en.wikipedia.org/wiki/Monad_(functional_programming)#An_example:_Maybe&#34;&gt;&lt;code&gt;Maybe&lt;/code&gt; monad&lt;/a&gt; using
Haskell code. It reminded of my recent exposure to Rust with it&amp;rsquo;s &lt;a href=&#34;https://doc.rust-lang.org/std/option/&#34;&gt;Option&lt;/a&gt;
and &lt;a href=&#34;https://doc.rust-lang.org/std/result/&#34;&gt;Result&lt;/a&gt; types, and that I should try out some Haskell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tomstu.art/&#34;&gt;Tom Stuart&lt;/a&gt;’s talk on Ruby pattern matching has definitely made me want to
start using it in my own code. I was never compelled to try it before.
Having used Elixir&amp;rsquo;s pattern matching a bit it was not very exciting in
comparison. But it&amp;rsquo;s what we have, and Tom convinced me I should try it out.
I’m pretty sure the “experimental” warnings that Ruby emits will have put an
awful lot of people off, including me.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall a great conference. I do hope it returns to the &lt;a href=&#34;https://brightondome.org&#34;&gt;Dome&lt;/a&gt; next year if
there is enough interest, but I totally understand why the venue was different
this year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;First weeknotes with nested bullets &amp;ndash; that&amp;rsquo;s exciting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I only worked 2 days this week, but it sure didn&amp;rsquo;t feel like it. Conference
going is tiring, so I don&amp;rsquo;t feel like I&amp;rsquo;ve had 3 days off work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I keep hearing interesting things about &lt;a href=&#34;https://www.sqlite.org/index.html&#34;&gt;SQLite&lt;/a&gt;. One of those things was the
&lt;a href=&#34;https://litestream.io&#34;&gt;Litestream&lt;/a&gt; project by &lt;a href=&#34;https://twitter.com/benbjohnson&#34;&gt;Ben Johnson&lt;/a&gt; on &lt;a href=&#34;https://podcast.thinkingelixir.com/101&#34;&gt;Thinking Elixir episode 101&lt;/a&gt;, which
allows SQLite to be replicated across servers, and can continuously stream
backups to cloud storage.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Continuously stream SQLite changes to AWS S3, Azure Blob Storage, Google
Cloud Storage, SFTP, or NFS. Quickly recover to the point of failure if your
server goes down.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://fly.io/blog/all-in-on-sqlite-litestream/&#34;&gt;Litestream was recently acquired by Fly.io&lt;/a&gt;, who are seemingly keen to deploy
SQLite closer to users. Seems like a very good fit.&lt;/p&gt;
&lt;p&gt;Given the right use-case, I would definitely consider SQLite in the future. I
wonder how many Rails apps &lt;em&gt;really need&lt;/em&gt; Postgres or MySQL and if they could
be quite happy using SQLite?&lt;/p&gt;
&lt;p&gt;I suspect SQLite powers a lot of things we use every day that are
unacknowledged.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I forgot that I bought a &lt;a href=&#34;https://kbdfans.com/products/rgb-knob&#34;&gt;RGB Knob&lt;/a&gt; in a group buy so it was a nice surprise
when I got a shipping notification for it! It arrived early this week. As a
piece of hardware, it&amp;rsquo;s a lovely thing. As a useful device, I&amp;rsquo;m not so sure,
but I&amp;rsquo;m still playing around with it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sadly, I have to agree with a lot of these &lt;a href=&#34;https://www.reddit.com/r/ruby/comments/viadq5/stack_overflow_developer_survey_2022_results_bad/idtyko3/&#34;&gt;points&lt;/a&gt;, &lt;a href=&#34;https://twitter.com/solnic29a/status/1541698292110819334&#34;&gt;via Peter Solnica&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ruby&amp;rsquo;s documentation is &lt;em&gt;so&lt;/em&gt; far behind Elixir and Rust. It&amp;rsquo;s actively bad in
a lot of cases, and, of course, any criticism is met with the usual &amp;ldquo;open a
PR&amp;rdquo; response.&lt;/p&gt;
&lt;p&gt;I still like Ruby a lot, but there are other things out there, and some of
them are &lt;em&gt;better&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This might be handy if you need to match UUIDs in tests &amp;ndash; &lt;a href=&#34;https://github.com/dpep/rspec-uuid&#34;&gt;RSpec matcher for
UUIDs&lt;/a&gt;. Saves reinventing the wheel each time.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;it { is_expected.to be_a_uuid }
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript&#34;&gt;The Birth &amp;amp; Death of JavaScript&lt;/a&gt; by Gary Bernhardt &amp;ndash; I will never get tired
of this talk. I should re-watch every year.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 52: Low latency co-pilot</title>
      <link>https://elver.me/weeknotes/52-low-latency-co-pilot/</link>
      <pubDate>Sun, 26 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/52-low-latency-co-pilot/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A whole year of weeknotes! They said it couldn&amp;rsquo;t be done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/schneems/status/1540319786474823680&#34;&gt;Schneems asking some interesting questions&lt;/a&gt; about the future of Ruby. First
we couldn&amp;rsquo;t scale, now we&amp;rsquo;re dead &amp;ndash; shame, really.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub released &lt;a href=&#34;https://github.com/features/copilot/&#34;&gt;Co-Pilot&lt;/a&gt; this week. Maybe I&amp;rsquo;m naive, but I didn&amp;rsquo;t realise it
would be a paid-for service. And that does change my feelings about it
somewhat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice post from &lt;a href=&#34;https://www.bannerbear.com/blog/technical-mistakes-i-made-growing-a-saas-to-k-mrr/&#34;&gt;Bannerbear about the technical mistakes they&amp;rsquo;ve made&lt;/a&gt; along the
way to a successful business.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For example, I didn&amp;rsquo;t lean on any shiny new technology, I just used the tech
that I know best: Ruby on Rails.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I agree with this point, if you want to build a business you should probably
use the technology you know really well. For side projects I&amp;rsquo;ve often decided
to use technology that I &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; know well, and then get frustrated when I
can&amp;rsquo;t do something simple.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do. It. Yourself. My powers (and confidence) grows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I don&amp;rsquo;t totally understand this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/benj_fry/status/1538257150631235584&#34;&gt;Omg, is this for real??? Apple dropped the bitcode requirement for iOS!&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But, it seems that &lt;a href=&#34;https://github.com/rust-lang/rust/issues/35968#issuecomment-1148183215&#34;&gt;Apple&amp;rsquo;s decision to change their policy&lt;/a&gt; will allow software
written in Rust to be distributed on the App Store, and run on Apple devices
&amp;ndash; which is cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice to see the &lt;a href=&#34;https://blog.rubygems.org/2022/06/13/making-packages-more-secure.html&#34;&gt;Rubygems team tackling software supply chain security&lt;/a&gt; with
MFA. The approach is pragmatic too &amp;ndash; starting with the packages most likely
to be attacked.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Starting today (June 13, 2022), the maintainers of at least the top 100
RubyGems packages will begin to see warnings on the RubyGems command-line
tool and website if MFA is not enabled on their accounts. Anybody who
maintains a gem with more than 165 million downloads will see this
recommendation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This week I learnt that you can supply a block to RSpec&amp;rsquo;s &lt;code&gt;raise_error&lt;/code&gt; which
allows you to set expectations on the error raised. I used this to test a
custom exception class.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;expect {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Bar&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;call
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;to raise_error { &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;error&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  expect(error)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;to be_a(&lt;span style=&#34;color:#008080&#34;&gt;SomeErrorClass&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  expect(error&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;message)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;to match(&lt;span style=&#34;color:#009926&#34;&gt;/some message/&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  expect(error&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;context)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;to &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;include&lt;/span&gt;(&lt;span style=&#34;color:#009926&#34;&gt;/some context/&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been using &lt;a href=&#34;https://pop.com&#34;&gt;Pop&lt;/a&gt; for pairing this week. It works pretty well. Low
latency, and very responsive. But it would be better if the UI would stay out
of the way a bit more. That&amp;rsquo;s something I like about &lt;a href=&#34;https://tuple.app&#34;&gt;Tuple&lt;/a&gt;, it just sits in
the macOS menu bar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://brightonruby.com&#34;&gt;Brighton Ruby&lt;/a&gt; is back next week &amp;ndash; it feels like a long time since I was
last in Brighton for the conference. Like pretty much everything I ever book,
I can&amp;rsquo;t really be bothered to go, but I suspect I will have a good time once I
get there. Hopefully the trains run!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 51: Inevitable and immortal</title>
      <link>https://elver.me/weeknotes/51-inevitable-and-immortal/</link>
      <pubDate>Sun, 19 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/51-inevitable-and-immortal/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;TIL You can get the number of &lt;a href=&#34;https://ruby-doc.org/core-3.1.2/Proc.html#method-i-arity&#34;&gt;arguments supplied to a block in Ruby&lt;/a&gt;. Via
&lt;a href=&#34;https://twitter.com/kaspth/status/1537932553218236419&#34;&gt;Kasper Timm Hansen&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;https://nordvpn.com&#34;&gt;NordVPN&lt;/a&gt; subscription expired and I decided to try out other options. The
current short list includes &lt;a href=&#34;https://mullvad.net/en/&#34;&gt;Mullvad&lt;/a&gt; and &lt;a href=&#34;https://protonvpn.com&#34;&gt;ProtonVPN&lt;/a&gt; &amp;ndash; ProtonVPN have a free
plan so I&amp;rsquo;m trying that first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Useful &lt;code&gt;bundler&lt;/code&gt; &lt;a href=&#34;https://twitter.com/getajobmike/status/1536394614256504832&#34;&gt;debugging tip from Mike Perham&lt;/a&gt;. Use &lt;code&gt;DEBUG=1&lt;/code&gt; to get more
information when bundling goes wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Someone recommended &lt;a href=&#34;https://diabloimmortal.blizzard.com/en-gb/&#34;&gt;Diablo Immortal&lt;/a&gt; to me and I&amp;rsquo;ve been enjoying playing it
this week - I hardly play games any more so it was nice to get back into it.
The Internet is unhappy about &amp;ldquo;micro transactions&amp;rdquo; within the game, but I&amp;rsquo;ve
managed to play without spending any money.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I got access to &lt;a href=&#34;https://github.blog/2021-12-08-improving-github-code-search/&#34;&gt;GitHub code search&lt;/a&gt; this week.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Initially, we’re creating a separate interface for the new code search as we
build it out, but once we’re happy with the feedback and are ready for wider
adoption, we will integrate it into the main github.com experience.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I totally understand why it&amp;rsquo;s not built into the main GitHub interface at the
moment, but it does mean that I forget about it. Hence why I&amp;rsquo;ve barely used it
so far.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New editor alert &amp;ndash; &lt;a href=&#34;https://zed.dev/&#34;&gt;Zed&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A lightning-fast, collaborative code editor written in Rust.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I &lt;a href=&#34;https://www.youtube.com/watch?v=Uo08uS904Rg&#34;&gt;watched a couple of ADHD videos&lt;/a&gt; this week. I&amp;rsquo;ve gotta say, they really
resonated with me. The perfectionism. The all or nothing approach. The guilt.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.youtube.com/watch?v=hlObsAeFNVk&#34;&gt;second video&lt;/a&gt; describes some coping strategies. I&amp;rsquo;ve inadvertently learnt
some of these I think. Changing my environment is something I&amp;rsquo;ve started doing
&amp;ndash; if I&amp;rsquo;m struggling to get something done I will travel to a local coffee
shop, this removes me from my current, unproductive environment, and I get the
added bonus of thinking time whilst I travel. Of course, this comes with
guilt. Pointless guilt.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know whether I have some form of ADHD, but I certainly have a lot of
the symptoms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rubyonrails.org/2022/6/13/rails-discord-server-is-now-open-to-the-public&#34;&gt;Rails Discord server is now open to the public&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Today, we are opening a Discord server to allow contributors to help each
other and lower the overhead of communicating with new contributors.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I never thought I&amp;rsquo;d see this, but I welcome it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub are &lt;a href=&#34;https://github.blog/2022-06-08-sunsetting-atom/&#34;&gt;sunsetting Atom&lt;/a&gt;. I suppose this was inevitable given the
popularity of VS Code. Perhaps we should be surprised it didn&amp;rsquo;t happen sooner?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 50: Circuit board coaster</title>
      <link>https://elver.me/weeknotes/50-circuit-board-coaster/</link>
      <pubDate>Sun, 12 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/50-circuit-board-coaster/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been doing DIY this week. I hate DIY.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://appleinsider.com/articles/22/06/09/apples-2023-carplay-is-an-apple-car-preview---and-is-scaring-detroit&#34;&gt;Apple announcing that they plan to extend CarPlay&lt;/a&gt; so that it can take over
the entire instrument cluster is interesting, and not surprising.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not sure how I feel about &lt;a href=&#34;https://en.wikipedia.org/wiki/CarPlay&#34;&gt;CarPlay&lt;/a&gt; for all teh things, but I would
certainly like it to extend further than it currently does. It would be great
if the &amp;ldquo;virtual cockpit&amp;rdquo; in my car could show Google or Apple maps instead of
just the built-in sat nav, for example.&lt;/p&gt;
&lt;p&gt;We will have to wait until 2023 to see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.etsy.com/uk/listing/1221694261/vim-cheat-sheet-on-a-high-quality-board&#34;&gt;Vim cheat sheet circuit board coasters?&lt;/a&gt; Yes, please!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/josevalim/status/1535008937640181760&#34;&gt;Exciting times for Elixir ahead&lt;/a&gt;. After doing a bit of Rust, the benefit of
types has become more apparent to me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Today during my @ElixirConfEU keynote I announced there is an ongoing PhD
scholarship for researching and developing a type system powered by
set-theoretic types for Elixir.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://getoban.pro/articles/one-million-jobs-a-minute-with-oban&#34;&gt;&amp;ldquo;One Million Jobs a Minute with Oban&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The total time to complete 1m jobs decreases steadily until it bottoms out
at around 2,000 concurrently. After that point fetching slows down, the BEAM
gets overloaded, and overall processing time starts to rise. But, when
concurrency is set to 2,000 it completes in 30 seconds—that’s two million
jobs a minute.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I was told for years how slow the database is, and that every query is a
crime, but these sort of numbers put that to bed. Turns out modern databases
are really fast, and Oban makes really good use of that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.blog/changelog/2022-05-31-improved-verification-of-historic-git-commit-signatures/&#34;&gt;GitHub are changing the way they verify signed commits&lt;/a&gt;. I&amp;rsquo;ve been signing
commits for a while, but I haven&amp;rsquo;t yet had to revoke a key so I wasn&amp;rsquo;t
entirely sure what would happen 😬&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GitHub will now verify Git commit signatures and show commits as &amp;ldquo;Verified&amp;rdquo;
even if their public GPG signing keys are expired or revoked (but not
compromised).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This clears things up. Via &lt;a href=&#34;https://tomstu.art/weeknotes-126-normal-and-convenient&#34;&gt;Tom Stuart&amp;rsquo;s weeknotes&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/padolsey&#34;&gt;James Padolsey&lt;/a&gt; discovered that &lt;a href=&#34;https://twitter.com/padolsey/status/1533509877666140160&#34;&gt;iOS has a built-in background sound feature&lt;/a&gt;
that can play various whitenoise and nature sounds.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had a Spotify playlist like this for ages, but it&amp;rsquo;s nice to have
something to fallback on that&amp;rsquo;s always available. It would be nice if Apple
increased the amount of sounds available.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://trunk.io&#34;&gt;Trunk&lt;/a&gt; runs all the linters.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Trunk simplifies checking, testing, and merging your code, allowing you to
focus on writing features instead of babysitting PRs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Setting up linting is tedious, maybe this makes it less so?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 49: Short week</title>
      <link>https://elver.me/weeknotes/49-short-week/</link>
      <pubDate>Sun, 05 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/49-short-week/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A short, but tiring, week.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://fullstaqruby.org/&#34;&gt;Fullstaq Ruby&lt;/a&gt; &amp;ndash; a new Ruby edition focussed on lowering memory usage and
improving performance by &lt;a href=&#34;https://twitter.com/honglilai&#34;&gt;Hongli Lai&lt;/a&gt; of &lt;a href=&#34;https://www.phusionpassenger.com&#34;&gt;Phusion Passenger&lt;/a&gt; fame.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fullstaq Ruby is an MRI-based Ruby distribution that&amp;rsquo;s optimized for server
production use cases. It is compiled with the Jemalloc and malloc_trim
patches, allowing lower memory usage and higher performance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An interesting write up of the &lt;a href=&#34;https://www.craigkerstiens.com/2022/05/18/unfinished-business-with-postgres/&#34;&gt;history of Postgres at Heroku by Craig
Kerstiens&lt;/a&gt;. I think a lot of people take the achievements of Heroku for
granted.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;&lt;a href=&#34;https://astrid.tech/2022/04/05/1/dead-tlds/&#34;&gt;What happens to TLDs when their country stops existing?&lt;/a&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;IP addresses only from now on?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I came across neat CSS tips via Twitter this week: &lt;a href=&#34;https://twitter.com/steve8708/status/1531388545960583168&#34;&gt;smooth, snapping,
carousels&lt;/a&gt; by &lt;a href=&#34;https://twitter.com/steve8708&#34;&gt;Steve Sewell&lt;/a&gt;, &lt;a href=&#34;https://twitter.com/jh3yy/status/1532145806278533120&#34;&gt;pure CSS image zooming&lt;/a&gt; by &lt;a href=&#34;https://twitter.com/jh3yy&#34;&gt;Jhey Tompkins&lt;/a&gt;, and
this lovely &lt;a href=&#34;https://twitter.com/ChallengesCss/status/1533032841029763072&#34;&gt;image-less background using conic-gradient&lt;/a&gt; by &lt;a href=&#34;https://twitter.com/ChallengesCss&#34;&gt;Temani Afif&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://greg.molnar.io/blog/rails-magic-breakdown-1-day-ago/&#34;&gt;Rails magic breakdown: 1.day.ago&lt;/a&gt; &amp;ndash; Nice explanation of how code such as
&lt;code&gt;1.day.ago&lt;/code&gt; actually works.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/antumbral/status/1533262803489783810&#34;&gt;lol computers&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Someone tagged literally every person with access to the Unreal Engine
github repo in a spam PR and it&amp;rsquo;s generating so many emails per comment
(upwards of 380k) that the notification emails are like 15 minutes behind&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I installed a neat &lt;a href=&#34;https://www.raycast.com/aleks/search-rubygems&#34;&gt;Rubygems Raycast extension&lt;/a&gt; this week. Handy!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/andrewculver/status/1529516497919365120&#34;&gt;A question by Andrew Culver&lt;/a&gt; on Twitter.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What&amp;rsquo;s the best vanilla JS alternative to Select2? No jQuery, no React, no
nothing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some nice responses in the thread &amp;ndash; worth remembering, but is this something
we can more easily build ourselves these days without relying on libraries?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 48: Bad actor</title>
      <link>https://elver.me/weeknotes/48-bad-actor/</link>
      <pubDate>Sun, 29 May 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/48-bad-actor/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://bugs.ruby-lang.org/issues/14602&#34;&gt;&amp;ldquo;Version of dig that raises error if a key is not present&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Naming things is hard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The security &lt;a href=&#34;https://github.blog/2022-04-15-security-alert-stolen-oauth-user-tokens/&#34;&gt;incident that GitHub&lt;/a&gt; and &lt;a href=&#34;https://status.heroku.com/incidents/2413&#34;&gt;Heroku announced&lt;/a&gt; way back in April,
in which OAuth tokens were stolen, &lt;a href=&#34;https://github.blog/2022-05-26-npm-security-update-oauth-tokens/&#34;&gt;has now been resolved&lt;/a&gt;. Hurrah!&lt;/p&gt;
&lt;p&gt;One side affect of GitHub and Heroku&amp;rsquo;s investigation was that the &lt;a href=&#34;https://devcenter.heroku.com/articles/github-integration&#34;&gt;Heroku
GitHub integration&lt;/a&gt; was turned off. This affected many teams, I&amp;rsquo;m sure, and we
were no different, disrupting our deployment pipeline and use of &lt;a href=&#34;https://devcenter.heroku.com/articles/github-integration-review-apps&#34;&gt;review
apps&lt;/a&gt;. It caused a lot of hassle, but I believe they did the right thing.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.blog/2022-05-26-npm-security-update-oauth-tokens/&#34;&gt;GitHub have written up their analysis&lt;/a&gt; of what the bad actor was able to do
&amp;ndash; seems bad, but could of been worse?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve found the amount of people immediately ready to jump ship amusing. That
new shiny platform you now favour will likely have issues like this one day.
No one is free from these attacks. I&amp;rsquo;m not saying don&amp;rsquo;t hold Heroku to
account, but your hot take hosting recommendations on Twitter might be
slightly overzealous.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saying that, I&amp;rsquo;m nothing if not a hypocrite.&lt;/p&gt;
&lt;p&gt;Some alternative hosting options are always worth knowing about: &lt;a href=&#34;https://render.com&#34;&gt;Render&lt;/a&gt;,
&lt;a href=&#34;https://railway.app&#34;&gt;Railway&lt;/a&gt;, and of course, &lt;a href=&#34;https://fly.io&#34;&gt;Fly&lt;/a&gt; all seem to be popular. There are a surprising
amount of new hosting companies popping up these days.&lt;/p&gt;
&lt;p&gt;(AWS or GCP native options have been excluded, because have you ever tried to
get started with those services?!).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://helix-editor.com/news/release-22-05-highlights/&#34;&gt;Helix Editor&lt;/a&gt; is interesting and they have just released a new version. I
think it would take a lot to move me off of Neovim at this point, but
competition is good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Microsoft Teams keeps doing &lt;em&gt;something&lt;/em&gt; that makes my webcam completely
inaccessible necessitating a system &lt;strong&gt;restart&lt;/strong&gt; &amp;ndash; terrible state of affairs.
I&amp;rsquo;ve never used Teams before, and I don&amp;rsquo;t recommend it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I hooked up the &lt;a href=&#34;https://www.ruby-lang.org/en/feeds/news.rss&#34;&gt;Ruby News&lt;/a&gt; and &lt;a href=&#34;http://feeds.feedburner.com/herokuchangelog&#34;&gt;Heroku Changelog&lt;/a&gt; RSS feeds to be posted into
Slack. Useful for seeing when things change that we rely on. I subscribe to
these personally (in &lt;a href=&#34;https://netnewswire.com&#34;&gt;NetNewsWire&lt;/a&gt;/&lt;a href=&#34;https://feedbin.com&#34;&gt;Feedbin&lt;/a&gt;) but it&amp;rsquo;s nice for the whole team
to be aware.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub are now supporting &lt;a href=&#34;https://github.blog/changelog/2022-05-19-updates-to-markdown-pasting-on-github/&#34;&gt;pasting onto selected text&lt;/a&gt; to create links in
Markdown. This is a nice improvement that brings GitHub into line with other
services such as Jira and Trello.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/starsandrobots/status/1529083932142194690&#34;&gt;Interesting point about copy/paste&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The pasteboard/clipboard memory buffer on a computer is the most difficult
thing I regularly use which functionally has no UI.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My friend &lt;a href=&#34;https://twitter.com/mynameisharry/status/1529086750278270977&#34;&gt;Harry pointed out that he likes to use Alfred&lt;/a&gt; for searching the
clipboard, something I&amp;rsquo;m trying to use &lt;a href=&#34;https://www.raycast.com&#34;&gt;Raycast&lt;/a&gt; for.&lt;/p&gt;
&lt;p&gt;And then &lt;a href=&#34;https://twitter.com/enf/status/1529148078917160960&#34;&gt;this bombshell&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every version of the Mac Finder since 1984 has had a &amp;ldquo;Show Clipboard&amp;rdquo;
command on the Edit menu that you could in theory use to keep a window open
to make the state visible, but basically no one knows that it exists&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m part of the club that had &lt;em&gt;no&lt;/em&gt; idea that this existed!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://rails-hosting.com/2022/#legacy-vs-greenfield&#34;&gt;Rails is dead&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 47: Arbitrary commands</title>
      <link>https://elver.me/weeknotes/47-arbitrary-commands/</link>
      <pubDate>Sun, 22 May 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/47-arbitrary-commands/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/sindresorhus/status/1527528976666992641&#34;&gt;Simon B. Støvring noticed&lt;/a&gt; that his &lt;a href=&#34;https://github.com/simonbs/runestone&#34;&gt;Runestone repo&lt;/a&gt; was trending on GitHub
for the C language, but the project itself is Swift. This is caused by
vendoreding dependencies included via submodules. The solution, as &lt;a href=&#34;https://twitter.com/sindresorhus/status/1527528976666992641&#34;&gt;indicated
by Sindre Sorhus&lt;/a&gt;, is to set the dependencies as vendored using the
&lt;code&gt;.gitattributes&lt;/code&gt; &lt;a href=&#34;https://github.com/github/linguist/blob/master/docs/overrides.md&#34;&gt;file that Linquist uses&lt;/a&gt; to determine the language of a
repo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rails/rails/issues/45117&#34;&gt;&amp;ldquo;ComparisonValidator example code does not work&amp;rdquo;&lt;/a&gt; &amp;ndash; I was confused by this
behaviour recently.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Person&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;ActiveRecord&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Base&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  validates_comparison_of &lt;span style=&#34;color:#990073&#34;&gt;:birth_date&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;less_than_or_equal_to&lt;/span&gt;: &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt; { &lt;span style=&#34;color:#008080&#34;&gt;Date&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;today }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which will result in a &lt;code&gt;ActiveRecord::RecordInvalid&lt;/code&gt; with this message:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Birth date wrong number of arguments (given 1, expected 0)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You must remember to supply an argument for the record instance when using a
lambda like &lt;code&gt;-&amp;gt;(_person) { Date.today }&lt;/code&gt;, but soon this won&amp;rsquo;t be necessary
since &lt;a href=&#34;https://github.com/fatkodima&#34;&gt;@fatkodima&lt;/a&gt; made this change: &lt;a href=&#34;https://github.com/rails/rails/pull/45118&#34;&gt;Make validators accept lambdas without
record argument&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gary Bernhardt &lt;a href=&#34;https://www.executeprogram.com/blog/the-code-is-the-to-do-list&#34;&gt;writes about a neat way of tracking TODOs in a project&lt;/a&gt; (&lt;a href=&#34;https://twitter.com/steveklabnik/status/1527528638152904705&#34;&gt;via
Steve Klabnik&lt;/a&gt;) &amp;ndash; have them fail the linter. Ironic that I post this after my
appeal to &lt;a href=&#34;/weeknotes/46-appease-the-linter/&#34;&gt;not appease the linter last week&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/veganstraightedge&#34;&gt;Shane Becker follows up with&lt;/a&gt; &lt;a href=&#34;https://twitter.com/searls&#34;&gt;@searls&amp;rsquo;&lt;/a&gt; &lt;a href=&#34;https://github.com/searls/todo_or_die&#34;&gt;&lt;code&gt;todo_or_die&lt;/code&gt;&lt;/a&gt; gem for Ruby which
has a similar vibe but different approach.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;&lt;a href=&#34;https://github.com/rails/rails/pull/45035&#34;&gt;Provide pattern matching for ActiveModel #45035&lt;/a&gt;&amp;rdquo;. Even though Ruby&amp;rsquo;s pattern
matching seems a bit awkward to me (to be fair, I haven&amp;rsquo;t had much of an
opportunity to use it yet due to my project&amp;rsquo;s Ruby version) this is cool.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Current&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;user
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;in&lt;/span&gt; { &lt;span style=&#34;color:#990073&#34;&gt;superuser&lt;/span&gt;: &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Thanks for logging in. You are a superuser.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;in&lt;/span&gt; { &lt;span style=&#34;color:#990073&#34;&gt;admin&lt;/span&gt;: &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;, &lt;span style=&#34;color:#0086b3&#34;&gt;name&lt;/span&gt;: }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Thanks for logging in, admin &lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;#{&lt;/span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;in&lt;/span&gt; { &lt;span style=&#34;color:#0086b3&#34;&gt;name&lt;/span&gt;: }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Welcome, &lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;#{&lt;/span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was updating some documentation for Rake tasks this week. You use the &lt;code&gt;desc&lt;/code&gt;
method to document tasks and they can be listed with &lt;code&gt;-T&lt;/code&gt; (&lt;code&gt;--tasks&lt;/code&gt;) and &lt;code&gt;-D&lt;/code&gt;
(&lt;code&gt;--describe&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-T&lt;/code&gt; will show an abbreviated description - just the first line of the
description, whilst &lt;code&gt;-D&lt;/code&gt; will show the full, multi-line, description.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://getoban.pro/oban/jobs&#34;&gt;Checkout just how cool the Oban Pro dashboard&lt;/a&gt; is 😎 This is what is possible
using LiveView, PubSub etc with Elixir and Phoenix.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL about the &lt;a href=&#34;https://puppet.com/docs/puppet/5.5/lang_template_erb.html&#34;&gt;slightly lesser used ERB delimiters&lt;/a&gt;. I never remember that &lt;code&gt;&amp;lt;%-&lt;/code&gt;
will trim the preceding indentation, and &lt;code&gt;-%&amp;gt;&lt;/code&gt; trims the following line break.
I&amp;rsquo;ve only been using ERB for multiple years, so give me a break.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.arkency.com/keep-your-team-up-to-date-on-production-data-changes/&#34;&gt;Keep your team up to date on production data changes&lt;/a&gt; is a really nice idea
&amp;ndash; hack IRB in production to output all commands to Slack so there&amp;rsquo;s
visibility of what is being done.&lt;/p&gt;
&lt;p&gt;This has been a problem everywhere I have worked to some degree. Rigorous
testing, PR reviews, and manual testing, but then allowing arbitrary commands
to be run in production!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 46: Appease the linter</title>
      <link>https://elver.me/weeknotes/46-appease-the-linter/</link>
      <pubDate>Sun, 15 May 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/46-appease-the-linter/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you want to write tests for rendered HTML you might find it tricky to
assert against the text because the tags will get in the way.&lt;/p&gt;
&lt;p&gt;To &lt;a href=&#34;https://stackoverflow.com/a/2505170/120615&#34;&gt;workaround this&lt;/a&gt; you can extract the text using &lt;a href=&#34;https://nokogiri.org&#34;&gt;Nokogiri&lt;/a&gt; like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[1] pry(main)&amp;gt; html = &amp;quot;&amp;lt;b&amp;gt;I&#39;m bold&amp;lt;/b&amp;gt;&amp;quot;
=&amp;gt; &amp;quot;&amp;lt;b&amp;gt;I&#39;m bold&amp;lt;/b&amp;gt;&amp;quot;
[2] pry(main)&amp;gt; Nokogiri::HTML(html).text
=&amp;gt; &amp;quot;I&#39;m bold&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;File under &lt;a href=&#34;https://twitter.com/adamwathan/status/1523345746421985281&#34;&gt;&amp;quot;&amp;hellip;so preoccupied with whether they could, they didn&amp;rsquo;t stop to think
if they should&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;‹div class=&amp;quot;[&amp;amp;*: nth-child(2)]: text-red-500 [&amp;amp;&amp;gt;*[data-potato]]:italic&amp;quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I flip-flop about Tailwind often, but I&amp;rsquo;m really not sure about this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/Steve8708/status/1523793487572783104&#34;&gt;&amp;ldquo;The &lt;code&gt;download&lt;/code&gt; attribute in HTML at a glance&amp;rdquo;&lt;/a&gt; &amp;ndash; Never heard of this, looks
handy, and &lt;a href=&#34;https://caniuse.com/?search=download&#34;&gt;browser support is very good&lt;/a&gt;. Do I even computer?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/40-less-work-more-learning/&#34;&gt;I wrote recently about discovering NanoIDs&lt;/a&gt;. This week I was introduced to
&lt;a href=&#34;https://hashids.org&#34;&gt;HashIDs&lt;/a&gt;, which are similar but can be decoded back to their source integer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hashids is a small open-source library that generates short, unique,
non-sequential ids from numbers.&lt;/p&gt;
&lt;p&gt;It converts numbers like 347 into strings like “yr8”, or array of numbers
like [27, 986] into “3kTMd”.&lt;/p&gt;
&lt;p&gt;You can also decode those ids back. This is useful in bundling several
parameters into one or simply using them as short UIDs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub&amp;rsquo;s &amp;ldquo;Authorize Slack&amp;rdquo; button in their settings page doesn&amp;rsquo;t do anything
in Safari. Click, nothing. Good times. Works in Chrome though doesn&amp;rsquo;t it&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I prototyped a quick way to render a linked table of contents for Markdown
files this week. I used &lt;a href=&#34;https://github.com/vmg/redcarpet&#34;&gt;Redcarpet&lt;/a&gt; because it ranked high in my Google search
😉&lt;/p&gt;
&lt;p&gt;You need to pass the &lt;code&gt;HTML_TOC&lt;/code&gt; renderer when rendering.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;renderer &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Redcarpet&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Render&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;HTML_TOC&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;new(&lt;span style=&#34;color:#990073&#34;&gt;nesting_level&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;..&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Redcarpet&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Markdown&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;new(renderer)&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;render(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;markdown&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will output a link for each header in the document, letting you link
directly to them. Handily, you can tell Redcarpet to only take into account
Markdown headers of a certain range. For example, this ignores &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;s but
outputs all the others.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The side project is progressing now, by which I mean &amp;ldquo;procrastinating by
reading about JavaScript animations&amp;rdquo; instead of doing what actually needs to
be done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the linter. Consider the linter. But, please, do not appease the linter.
It&amp;rsquo;s a computer, and is &lt;em&gt;often&lt;/em&gt; wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 45: Control the source</title>
      <link>https://elver.me/weeknotes/45-control-the-source/</link>
      <pubDate>Sun, 08 May 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/45-control-the-source/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After &lt;a href=&#34;/weeknotes/43-retry-anyway/&#34;&gt;being introduced to it recently&lt;/a&gt; I actually used &lt;a href=&#34;https://github.com/palkan/anyway_config&#34;&gt;Anyway Config&lt;/a&gt; this
week to encapsulate some configuration. I&amp;rsquo;m sold on the idea. It enabled me to
tidy up some config, and tested too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I usually rely heavily on the &lt;a href=&#34;https://slack.github.com&#34;&gt;GitHub Slack integration&lt;/a&gt;. Unfortunately, it
refuses to work on my current project&amp;rsquo;s repo &amp;ndash; very strange. It&amp;rsquo;s messing up
my workflow. These things are great until they stop working and become
completely opaque.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/dailydevtips1/status/1521450635194949632&#34;&gt;Have you ever used any other version control than Git?&lt;/a&gt; &amp;ndash; This had me
thinking.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t &lt;em&gt;think&lt;/em&gt; I ever used &lt;a href=&#34;http://cvs.nongnu.org&#34;&gt;CVS&lt;/a&gt;, I was a bit too young and beardless for
that. So my first introduction to source control was &lt;a href=&#34;https://en.wikipedia.org/wiki/Microsoft_Visual_SourceSafe&#34;&gt;Visual SourceSafe&lt;/a&gt; &amp;ndash;
genuinely awful. When &lt;a href=&#34;https://subversion.apache.org&#34;&gt;Subversion&lt;/a&gt; (and &lt;a href=&#34;https://tortoisesvn.net&#34;&gt;TortoiseSVN&lt;/a&gt;) came along it was a
breath of fresh air. Then a new job dictated a move to Microsoft&amp;rsquo;s TFS (now
called &lt;a href=&#34;https://en.wikipedia.org/wiki/Azure_DevOps_Server&#34;&gt;Azure DevOps Server&lt;/a&gt;) &amp;ndash; also awful, but modern awful.
And finally &lt;a href=&#34;https://git-scm.com&#34;&gt;Git&lt;/a&gt;, a game changer.&lt;/p&gt;
&lt;p&gt;Is Git perfect? Nope. But it&amp;rsquo;s served me well for years and mostly stays
out of my way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/jmhodges/status/1522282897905840128&#34;&gt;GraphQL is a trap&lt;/a&gt; according to &lt;a href=&#34;https://twitter.com/jmhodges&#34;&gt;Jeff Hodges&lt;/a&gt;. Full disclosure, I&amp;rsquo;ve never
used &lt;a href=&#34;https://graphql.org&#34;&gt;GraphQL&lt;/a&gt;, but I can see how it appeals to the those consuming it.&lt;/p&gt;
&lt;p&gt;Jeff seems to have a lot of experience with GraphQL and he makes some good
points. Everything is a trade-off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No progress on the side project. I did attempt to start it up again but
couldn&amp;rsquo;t remember what I was even trying to achieve 😞&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 44: Slow progress</title>
      <link>https://elver.me/weeknotes/44-slow-progress/</link>
      <pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/44-slow-progress/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/github/status/1520056081329893376&#34;&gt;GitHub now supports code navigation for Elixir repos&lt;/a&gt;. Neat!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I didn&amp;rsquo;t know &lt;a href=&#34;https://twitter.com/wintermeyer/status/1520290074012889089&#34;&gt;you can pass relative dates to Git&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;git reset &amp;ndash;hard main@{5.days.ago}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But&amp;hellip;I&amp;rsquo;m not sure I would ever want to? The imprecision worries me. Surely you
know &lt;em&gt;which&lt;/em&gt; point in time you want to return to?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Slow progress on the &lt;a href=&#34;/weeknotes/43-retry-anyway/&#34;&gt;side project I spoke of last week&lt;/a&gt;. I fear it might not
get done like the myriad other projects I&amp;rsquo;ve started over the years. Staying
interested in my side projects remains a problem. It usually starts at the
point at which they get hard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CTRL-o&lt;/code&gt; in Vim takes you back to the last place you were before you moved.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL that &lt;a href=&#34;https://dashbit.co/blog/automatic-and-manual-ecto-migrations&#34;&gt;Ecto allows has a &lt;code&gt;--migrations-path&lt;/code&gt; option&lt;/a&gt; so you can split up
migrations by type, or organise them as you please. As &lt;a href=&#34;https://twitter.com/solnic29a/status/1518958268714004481&#34;&gt;Peter Solnica&lt;/a&gt; says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is &lt;em&gt;really nice&lt;/em&gt; because you can easily split migrations into various
groups (ie schema changes, data changes etc&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve seen quite a lot of chat on Twitter in recent months advocating that most
of your tests should be higher level acceptance tests &amp;ndash; tests that test what
the end user does from the top down. These types of test are a great idea, and
very valuable, but the idea that they should make up the majority of your test
suite is extremely misguided.&lt;/p&gt;
&lt;p&gt;Trying to refactor a complex codebase with these tests alone is very
difficult. Acceptance tests are slower to run, more likely to break, and
harder to debug.&lt;/p&gt;
&lt;p&gt;We need to stop being so dogmatic. Higher level acceptance tests are one part
of the testing toolbox, not the only tests you need.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s a shame you can&amp;rsquo;t start an adhoc review on GitHub without a PR. I
occasionally want to communicate about existing code without having any new
code, but this isn&amp;rsquo;t possible unfortunately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/psliwka/vim-dirtytalk&#34;&gt;vim-dirtytalk: spellcheck dictionary for programmers&lt;/a&gt; &amp;ndash; This is a cool idea.
I&amp;rsquo;m constantly adding obscure programming words to my personal dictionary, and
this would obviate that.&lt;/p&gt;
&lt;p&gt;Unfortunately, I couldn&amp;rsquo;t get it to work with Neovim using the default
installation instructions &amp;ndash; it seems to only be compatible with Vim 😞 &lt;a href=&#34;https://github.com/psliwka/vim-dirtytalk/issues/1#issuecomment-1114194179&#34;&gt;I
worked around the issue though&lt;/a&gt;. Hopefully it gets updated to work with both
Vim and Neovim.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 43: Retry anyway</title>
      <link>https://elver.me/weeknotes/43-retry-anyway/</link>
      <pubDate>Sun, 24 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/43-retry-anyway/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;An interesting deep dive into how &lt;a href=&#34;https://www.mitchellhanberg.com/how-eex-turns-your-template-into-html/&#34;&gt;How EEx Turns Your Template Into HTML&lt;/a&gt; by
&lt;a href=&#34;https://twitter.com/mitchhanberg&#34;&gt;Mitchell Hanberg&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was introduced to &lt;a href=&#34;https://github.com/palkan/anyway_config&#34;&gt;Anyway Config&lt;/a&gt; from Evil Martians this week. It&amp;rsquo;s been
around since 2015 but this was the first time I&amp;rsquo;d heard of it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anyway Config is a configuration library for Ruby gems and applications.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The core idea is that you encapsulate configuration values in objects rather
than just reaching into the global &lt;code&gt;ENV&lt;/code&gt; like almost all my projects up to now
have done (with the exception of &lt;em&gt;that&lt;/em&gt; one project that just committed
production values into git 🙀).&lt;/p&gt;
&lt;p&gt;You can read configuration values from many different sources: YAML, TOML,
Rails&amp;rsquo; encrypted credential files, environment variables etc. And they cascade
allowing them to be overridden, which is useful in development.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve written my own configuration classes before, but you do tend to reinvent
the wheel each time, and of course, not everyone on the project does the same
thing, so having some formalization seems like a good idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The recent &lt;a href=&#34;https://github.blog/2022-04-15-security-alert-stolen-oauth-user-tokens/&#34;&gt;GitHub&lt;/a&gt;/&lt;a href=&#34;https://status.heroku.com/incidents/2413&#34;&gt;Heroku&lt;/a&gt; OAuth token related issues have been an eye
opener for some. It continues to cause some issues for us, but workarounds are
in-place. Maybe those production secrets in Git weren&amp;rsquo;t such a good idea after
all? 😉&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Simon Willison is building cool things again, this time &lt;a href=&#34;https://simonwillison.net/2022/Apr/18/covid-sewage/&#34;&gt;a Covid sewage
Twitter bot&lt;/a&gt; that takes a screenshot of Covid sewage data and &lt;a href=&#34;https://twitter.com/covidsewage&#34;&gt;tweets it out
@covidsewerage&lt;/a&gt;. Apart from the technical side of things, I had no idea that
it was possible to get information about Covid prevalence via sewerage water.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;a href=&#34;https://github.com/teamon/tesla&#34;&gt;Tesla&lt;/a&gt; on a side project.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tesla is an HTTP client loosely based on Faraday. It embraces the concept of
middleware when processing the request/response cycle.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Being influenced by &lt;a href=&#34;https://github.com/lostisland/faraday&#34;&gt;Ruby&amp;rsquo;s Faraday&lt;/a&gt; is no bad thing as I&amp;rsquo;m a fan of that
library. It has suited my needs so far, worth a try if you&amp;rsquo;re looking for an
Elixir HTTP client.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://davidcel.is/posts/stop-validating-email-addresses-with-regex/&#34;&gt;Stop Validating Email Addresses With Regex&lt;/a&gt; &amp;ndash; a compelling argument. There
is no such thing as checking for an email, only increasingly more complex, but
incorrect, regexes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/hopsoft/status/1517586369521979392&#34;&gt;How many of y&amp;rsquo;all knew that Ruby has a native retry mechanism?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was vaguely aware, but have never used or seen it used in a codebase.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 42: StandardError</title>
      <link>https://elver.me/weeknotes/42-standarderror/</link>
      <pubDate>Sun, 17 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/42-standarderror/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://til.hashrocket.com/posts/zwoz3m7eie-lock-screen-keyboard-shortcut-on-osx&#34;&gt;Hashrocket&amp;rsquo;s TIL site&lt;/a&gt; is great (I&amp;rsquo;m surprised I haven&amp;rsquo;t linked to it yet as
I read it a lot). This time I learnt that you can do &lt;a href=&#34;https://til.hashrocket.com/posts/zwoz3m7eie-lock-screen-keyboard-shortcut-on-osx&#34;&gt;&lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;Command&lt;/code&gt; +
&lt;code&gt;Q&lt;/code&gt;&lt;/a&gt; to lock your Mac.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was listening to a recent &lt;a href=&#34;https://remoteruby.transistor.fm&#34;&gt;Remote Ruby&lt;/a&gt; episode &amp;ndash; &lt;a href=&#34;https://remoteruby.transistor.fm/171&#34;&gt;Parsers, Interpreters,
and YJIT with Kevin Newton&lt;/a&gt; &amp;ndash; on the recommendation of my friend &lt;a href=&#34;https://harry.dev&#34;&gt;Harry&lt;/a&gt; and
really enjoyed it. They covered several topics but the formatter related chat
had me thinking about the impact of using formatting tools.&lt;/p&gt;
&lt;p&gt;In general, I&amp;rsquo;m a fan of formatters &amp;ndash; they are good for learning (I&amp;rsquo;ve found
&lt;a href=&#34;https://github.com/rust-lang/rustfmt&#34;&gt;&lt;code&gt;rustfmt&lt;/code&gt;&lt;/a&gt; helpful when learning Rust) and they can reduce endless
&lt;a href=&#34;https://en.wiktionary.org/wiki/bikeshedding#English&#34;&gt;bikeshedding&lt;/a&gt; when reviewing PRs. However, as long term Rubyist I&amp;rsquo;m not sure
how I feel about being forced to write Ruby in a certain way.&lt;/p&gt;
&lt;p&gt;If a formatter had been around when Ruby was becoming popular would &lt;a href=&#34;https://en.wikipedia.org/wiki/Domain-specific_language&#34;&gt;DSLs&lt;/a&gt; such
as those used in RSpec and Sinatra have become so popular? And would that have
been good or bad?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I learnt this week that &lt;a href=&#34;https://ruby-doc.org/core-2.7.5/Exception.html#class-Exception-label-Defaults&#34;&gt;&lt;code&gt;rescue&lt;/code&gt; in Ruby defaults to &lt;code&gt;StandardError&lt;/code&gt;&lt;/a&gt;. I
think this behaviour has changed. I&amp;rsquo;m sure that it used to be the case that
rescuing without specifying the exception class was a very bad idea because it
would include things like syntax errors.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Two Ruby statements have default exception classes:&lt;br&gt;
raise: defaults to RuntimeError.&lt;br&gt;
rescue: defaults to StandardError.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That seems to no longer be a problem, but I can&amp;rsquo;t help thinking that maybe it
is worth being explicit and always choosing &lt;code&gt;StandardError&lt;/code&gt; if something more
specific is unavailable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://evilmartians.com&#34;&gt;Evil Martians&lt;/a&gt; released a font! &amp;ndash; &lt;a href=&#34;https://github.com/evilmartians/mono&#34;&gt;Martian Mono&lt;/a&gt;. It&amp;rsquo;s really nice, but I
think I&amp;rsquo;m sticking with &lt;a href=&#34;https://www.jetbrains.com/lp/mono/&#34;&gt;JetBrains Mono&lt;/a&gt; for now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was aware of &lt;a href=&#34;https://www.raycast.com&#34;&gt;Raycast&lt;/a&gt; when it first came out, but I was already using
Alfred, and I didn&amp;rsquo;t really give it a good try. Well, a colleague brought it
to my attention again recently and I&amp;rsquo;ve given it more of a chance this time.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s really good. I don&amp;rsquo;t know why, but it &lt;em&gt;clicks&lt;/em&gt; with me more than Alfred
ever has. Although a long time user of Alfred I never became a power user and
ended up using it as a better Spotlight.&lt;/p&gt;
&lt;p&gt;Stand-out Raycast extensions for me are those for &lt;a href=&#34;https://www.raycast.com/raycast/github&#34;&gt;GitHub&lt;/a&gt; and &lt;a href=&#34;https://www.raycast.com/raycast/jira&#34;&gt;Jira&lt;/a&gt;. Especially
Jira as I can lookup issues faster than loading the website (which is a sad
state of affairs, but here we are).&lt;/p&gt;
&lt;p&gt;My only worry is that it is free for individuals, so will it still be around
in a few years?&lt;/p&gt;
&lt;p&gt;Worth checking out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In my experience people don&amp;rsquo;t tend to write unit tests for Rails helpers as
much as they do for &amp;ldquo;other&amp;rdquo; code. Which is weird because those same people
also love to make Rails helpers do all sorts of crazy stuff that shouldn&amp;rsquo;t be
in a helper - like querying the database.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/jasonswett/status/1514257942715023362&#34;&gt;Jason is correct&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Only add memoization if a) you&amp;rsquo;re sure it&amp;rsquo;s needed and b) you have a plan to
measure the before/after performance.
Otherwise you&amp;rsquo;re not optimizing, you&amp;rsquo;re just randomly doing stuff.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t automatically chuck in a &lt;code&gt;@foo ||= &amp;quot;bar&amp;quot;&lt;/code&gt; just because memoization is
convenient in Ruby.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.panozzaj.com/blog/2016/03/21/ignore-urls-and-acroynms-while-spell-checking-vim/&#34;&gt;Ignore URLs and Acroynms While Spell-checking Vim&lt;/a&gt; &amp;ndash; a useful tip on how to
stop URLs showing up as spelling errors in Vim. This had been bugging me for a
while.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;syn match UrlNoSpell &#39;\w\+:\/\/[^[:space:]]\+&#39; contains=@NoSpell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I can&amp;rsquo;t quite figure out how to make it happy inside my now Lua-based
config, but it works in a regular Vimscript configuration file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://lexical.dev/&#34;&gt;Lexical&lt;/a&gt; looks promising.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An extensible text editor framework that does things differently&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;React only at the moment, designed to work with other frameworks in the future
too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://oozou.com/blog/custom-attribute-types-in-rails-5-77&#34;&gt;Custom Attribute Types in Rails 5+&lt;/a&gt; &amp;ndash; I&amp;rsquo;ve never used the Rails Attribute
APIs directly. Maybe I should be?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 41: A Ludicrous Display</title>
      <link>https://elver.me/weeknotes/41-a-ludicrous-display/</link>
      <pubDate>Sun, 10 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/41-a-ludicrous-display/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Well, &lt;a href=&#34;/weeknotes/37-sticker-me/&#34;&gt;I bought one&lt;/a&gt; &amp;ndash; an &lt;a href=&#34;https://www.apple.com/uk/studio-display/&#34;&gt;Apple Studio Display&lt;/a&gt;. And it turned up (early)
yesterday. I was pretty anxious about this purchase. They&amp;rsquo;re not cheap, and I
was also concerned about wobble and reflection.&lt;/p&gt;
&lt;p&gt;I mounted it on my monitor arm and I&amp;rsquo;d say the wobble is a &lt;em&gt;little&lt;/em&gt; bit better
than my current display, probably because it weighs less. I think I can deal
with it for now, but ultimately I want to stop it, which I think is going to
mean either a new desk or monitor arm, or both.&lt;/p&gt;
&lt;p&gt;The reflection is about as much as I was expecting given my experience with
the &lt;a href=&#34;https://en.wikipedia.org/wiki/Apple_Cinema_Display#LED_Cinema_Display&#34;&gt;Apple LED Cinema Display&lt;/a&gt;. I decided to go with the normal glass because
I was worried about cleaning the Nano-texture glass, and reports of &lt;em&gt;slightly&lt;/em&gt;
poorer image quality. The day I set it up was a particularly sunny day, so
hopefully it&amp;rsquo;s the most it will be.&lt;/p&gt;
&lt;p&gt;The webcam does look a bit crap, it&amp;rsquo;s true. I will see if a software update
with fix it, but I think I&amp;rsquo;ve made peace with the idea that it&amp;rsquo;s actually
quite nice that my current (better quality) webcam can be positioned much more
easily &amp;ndash; something I&amp;rsquo;ve realised I do more often than I thought. I bought
this monitor knowing nothing of the webcam, so I&amp;rsquo;m not too worried.&lt;/p&gt;
&lt;p&gt;Now, the good.&lt;/p&gt;
&lt;p&gt;The speakers sound really good. Like, &lt;em&gt;really&lt;/em&gt; good. I will probably never use
them. I&amp;rsquo;m a headphones at my desk kind of guy.&lt;/p&gt;
&lt;p&gt;I have yet to test the built-in microphone, so I&amp;rsquo;m unsure if I&amp;rsquo;ll end up
using that.&lt;/p&gt;
&lt;p&gt;It looks &lt;em&gt;lovely&lt;/em&gt;, both physically, and image-wise &amp;ndash; it looks as good as I&amp;rsquo;d
hoped. This is ultimately what I care about the most so I&amp;rsquo;m very happy with
that. Read about why this matters to me and others in &lt;a href=&#34;https://bjango.com/articles/macexternaldisplays2/&#34;&gt;Mac external displays
for designers and developers, part 2&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some days I feel like giving up on Safari &amp;ndash; this is one reason 👇&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lately I&amp;rsquo;ve noticed several websites being really slow or not loading at all
in Safari but working fine in Chrome. Unchecking this fixed it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/soffes&#34;&gt;Sam Soffes&lt;/a&gt; has been suffering from this too, and &lt;a href=&#34;https://twitter.com/soffes/status/1512613255033856005&#34;&gt;proffers a potential
solution&lt;/a&gt;. I have turned the option off for now, but it&amp;rsquo;s too soon to tell
whether it has fixed anything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cloudflare have an interesting feature &amp;ndash; &lt;a href=&#34;https://support.cloudflare.com/hc/en-us/articles/200168236-Configuring-Cloudflare-IP-Geolocation&#34;&gt;Cloudflare IP Geolocation&lt;/a&gt; &amp;ndash; to
capture a user&amp;rsquo;s ISO 3166-1 country code and pass it on via a &lt;code&gt;CF-IpCountry&lt;/code&gt;
header that you can grab and use in your app. Useful for basic geolocating.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cloudflare can include the country code of the visitor&amp;rsquo;s IP (in ISO 3166-1
Alpha 2 format) with each request between Cloudflare and the upstream origin
web server. This allows site administrators to capture their visitor&amp;rsquo;s IP
location in server logging and/or application logic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I started working with a new client this week. So far, so good. It has been
really nice to have some good collaboration via code reviews. Something I&amp;rsquo;ve
missed. I really should have taken a week off first though &amp;ndash; I am tired.
Luckily there is a long weekend coming up, which I&amp;rsquo;ve elongated by a day each
side and we&amp;rsquo;ll be going away for a break 😎&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was surprised/delighted to see that the new client I&amp;rsquo;m working with keep
meeting notes. Yes, notes. Of a meeting. For each meeting. You know, so the
attendees have some idea of what the point was later. What a novel idea!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/joemasilotti/status/1511329054892257287&#34;&gt;&amp;ldquo;Wait&amp;hellip;what?&amp;rdquo;&lt;/a&gt; &amp;ndash; my thoughts exactly. I had no idea a &lt;code&gt;form&lt;/code&gt; attribute
existed for inputs. The original &lt;a href=&#34;https://www.smashingmagazine.com/2022/03/html-attributes-you-never-use/#the-form-attribute-for-form-fields&#34;&gt;Smashing Magazine article&lt;/a&gt; explains it best.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In most cases, you’re going to nest your form inputs and controls inside a
&lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; element. But if your app or layout requires something a little
different, you have the option to put a form input anywhere you want and
associate it with any &lt;form&gt; element — even one that’s not the element’s
parent.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://wrapbook.engineering/we-re-wrote-every-view.html&#34;&gt;Using feature flags to rewrite every view in our Rails app&lt;/a&gt; &amp;ndash; Nice post
about how wrapbook rewrote a lot of their UI behind a feature flag. I
particularly like their idea of running the test suite using a GitHub Action
matrix in the before and after states.&lt;/p&gt;
&lt;p&gt;I wonder whether they could have used &lt;a href=&#34;/weeknotes/38-tips-tips-tips/&#34;&gt;Rails variants as I wrote about
recently&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be nice. Treat people well. &lt;a href=&#34;https://www.youtube.com/watch?v=1uYWYWPc9HU&#34;&gt;Or this is what you&amp;rsquo;ll get&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 40: Less work. More learning.</title>
      <link>https://elver.me/weeknotes/40-less-work-more-learning/</link>
      <pubDate>Sun, 03 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/40-less-work-more-learning/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It would be really nice if I could mark certain repos/organisations on GitHub
as &amp;ldquo;work&amp;rdquo; and turn off notifications for those over the weekend. Is it
possible without a separate account?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/TylerAYoung/status/1508413319178297352&#34;&gt;Nice tip for making doctests easier to write&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TIL Elixir&amp;rsquo;s doctests support an &lt;code&gt;import: true&lt;/code&gt; flag so that you don&amp;rsquo;t have
to write out the full module name in your doctests.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When I last wrote some &lt;a href=&#34;https://elixir-lang.org/getting-started/mix-otp/docs-tests-and-with.html#doctests&#34;&gt;Elixir doctests&lt;/a&gt; I remember this being a problem. I
would often have modules nested several layers deep which made referencing
them in the test difficult.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/CodeEditApp/CodeEdit&#34;&gt;CodeEdit&lt;/a&gt;, a new code editor for macOS &amp;ndash; not yet released.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, comparable editors are built on Electron. This is a huge limitation
because it cannot utilize all system resources to its fullest potential.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Shots fired, but not wrong. Electron is used for a lot of reasons, but
performance isn&amp;rsquo;t one of them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://planetscale.com/blog/why-we-chose-nanoids-for-planetscales-api&#34;&gt;Why we chose NanoIDs for PlanetScale&amp;rsquo;s API&lt;/a&gt; &amp;ndash; this is the first time I&amp;rsquo;ve
heard about NanoIDs. Basically, a more URL-friendly alternative to UUIDs,
which tend to be cumbersome and ugly.&lt;/p&gt;
&lt;p&gt;Most of the systems I&amp;rsquo;ve used still use auto-incrementing integers for
database records, and sometimes a UUID against the record that can be shared
more readily between front and back ends where an identifier needs to be
passed into another system.&lt;/p&gt;
&lt;p&gt;The idea of an identifier in a system having a collision terrifies me. But as
you can see from the &lt;a href=&#34;https://zelark.github.io/nano-id-cc/&#34;&gt;Nano ID Collision Calculator&lt;/a&gt; the probability is
actually much less than I anticipated.&lt;/p&gt;
&lt;p&gt;For example, if you create 1000 IDs per second, using this alphabet -
&lt;code&gt;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&lt;/code&gt; - at 21
characters long, the probability of having a collision is 1% in ~30 million
years. Those odds seem good.&lt;/p&gt;
&lt;p&gt;And as well as the &lt;a href=&#34;https://github.com/ai/nanoid&#34;&gt;JavaScript support&lt;/a&gt;, there are also client libraries for
&lt;a href=&#34;https://github.com/radeno/nanoid.rb&#34;&gt;Ruby&lt;/a&gt;, &lt;a href=&#34;https://docs.rs/nanoid/latest/nanoid/&#34;&gt;Rust&lt;/a&gt;, and &lt;a href=&#34;https://hexdocs.pm/nanoid/Nanoid.html&#34;&gt;Elixir&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve read quite a lot of criticism of NanoIDs, some of it fair, but an awful
lot seemed to miss the main selling point, readability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.johnwhiles.com/posts/work.html&#34;&gt;Maybe you should do less &amp;lsquo;work&amp;rsquo;&lt;/a&gt; by John Whiles &amp;ndash; I mean, maybe? This is the
sort of thing a lot of people do, but never talk about.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://jvns.ca/blog/2017/08/06/learning-at-work/&#34;&gt;Learning at work&lt;/a&gt; by Julia Evans. Related to the above.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My view is that it’s my job to take time out of my workday to learn things.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You shouldn&amp;rsquo;t be expected to learn everything outside of work, when the work
&lt;em&gt;is&lt;/em&gt; constant learning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://planetscale.com/blog/generics-can-make-your-go-code-slower&#34;&gt;Generics can make your Go code slower&lt;/a&gt;. I don&amp;rsquo;t know Go. I don&amp;rsquo;t really want
to, but I found this article (what I understood of it) very interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve written about Fly a few times, but their blog output is consistently
interesting, and this is no different &amp;ndash; &lt;a href=&#34;https://fly.io/blog/a-foolish-consistency/&#34;&gt;A Foolish Consistency: Consul at
Fly.io&lt;/a&gt; by &lt;a href=&#34;https://twitter.com/tqbf/status/1509211018777534465&#34;&gt;Thomas H. Ptacek&lt;/a&gt;. The things they have to do to wrangle VMs on
multiple continents is crazy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you want your digits to take up the same space regardless of number?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;if your font supports it, you can use &lt;code&gt;font-variant-numeric: tabular-nums&lt;/code&gt; in your CSS to keep your numerals the same width and prevent
shifting layout.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/xdesro/status/1508172487347036169&#34;&gt;https://twitter.com/xdesro/status/1508172487347036169&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I stalled moving &lt;a href=&#34;https://github.com/jordelver/dotfiles/tree/master/config/nvim&#34;&gt;my Vim config&lt;/a&gt; over to &lt;a href=&#34;https://www.lua.org&#34;&gt;Lua&lt;/a&gt; but made progress this week &amp;ndash;
&lt;em&gt;nearly&lt;/em&gt; done.&lt;/p&gt;
&lt;p&gt;I figured that I rely on so many Neovim-only plugins now that there is
probably no going back to regular ol&amp;rsquo; Vim, so I might as well fully embrace
the new world.&lt;/p&gt;
&lt;p&gt;Lua feels a lot more like something I could write myself, it makes basic
sense as a language, whereas Vimscript has always felt weird to me, a bit like
trying to do something in Bash.&lt;/p&gt;
&lt;p&gt;The move is a work in progress as not all Neovim APIs are available from Lua
at the moment (as they are in Vimscript), but there are fairly good
workarounds.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 39: Burning Bridges</title>
      <link>https://elver.me/weeknotes/39-burning-bridges/</link>
      <pubDate>Sun, 27 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/39-burning-bridges/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I used &lt;a href=&#34;https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/message-chains&#34;&gt;RSpec&amp;rsquo;s &lt;code&gt;receive_message_chain&lt;/code&gt;&lt;/a&gt; this week for the first time. I&amp;rsquo;m not
sure how I&amp;rsquo;ve managed to avoid it for all these years. I generally consider it
a code smell, as do the RSpec docs, but sometimes it&amp;rsquo;s the most
sensible/readable way forward. In this case, stubbing an object over which I
have no control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://brightonruby.com&#34;&gt;Brighton Ruby conference&lt;/a&gt; is back this year and I managed to bag myself a
ticket from the second batch. I&amp;rsquo;m really looking forward to it after a few
years off. I&amp;rsquo;ve been going since 2014 apparently!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Formerly remote-first companies might find that their new office doesn&amp;rsquo;t fix
their communication issues, but actually makes them worse.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/mcrumm/98059439c673be7e0484589162a54a01&#34;&gt;Deploying to Fly.io with SQLite&lt;/a&gt; by &lt;a href=&#34;https://twitter.com/mcrumm&#34;&gt;Micheal Crumm&lt;/a&gt; shows how to deploy a
Phoenix app to Fly with SQLite instead of Postgres. Once you know how it&amp;rsquo;s not
that hard. I will be bookmarking this for the future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m trying to improve my development workflow and part of that is perhaps
moving my vim config into lua, or certainly using a lot more lua than I
currently do.  I was browsing &lt;a href=&#34;https://github.com/tjdevries/config_manager&#34;&gt;TJ DeVries&amp;rsquo; dotfiles&lt;/a&gt; and came across &lt;code&gt;pcall&lt;/code&gt; -
what is &lt;code&gt;pcall&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Turns out that it&amp;rsquo;s &lt;a href=&#34;https://www.lua.org/pil/8.4.html&#34;&gt;how Lua does error handling&lt;/a&gt;, or part of how it does it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For many applications, you do not need to do any error handling in Lua.
Usually, the application program does this handling. All Lua activities
start from a call by the application, usually asking Lua to run a chunk. If
there is any error, this call returns an error code and the application can
take appropriate actions. In the case of the stand-alone interpreter, its
main loop just prints the error message and continues showing the prompt and
running the commands.&lt;/p&gt;
&lt;p&gt;If you need to handle errors in Lua, you should use the pcall function
(protected call) to encapsulate your code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From the wall of my local coffee shop.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When one burns one&amp;rsquo;s bridges, what a very nice fire it makes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ndash; Dylan Thomas&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 38: Tips, tips, tips</title>
      <link>https://elver.me/weeknotes/38-tips-tips-tips/</link>
      <pubDate>Sun, 20 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/38-tips-tips-tips/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I learnt of the &lt;a href=&#34;https://twitter.com/KevinJPowell/status/1504421195516727301&#34;&gt;&lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; element this week via Kevin Powell&lt;/a&gt;. A native modal
with associated JavaScript API &amp;ndash; very cool!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;While it isn&amp;rsquo;t fully supported yet, we&amp;rsquo;re getting very close to the dialog
element being in all modern browsers!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is great, but there&amp;rsquo;s a part of me that can&amp;rsquo;t quite believe that this is
only a thing that we can maybe, possibly, start using in 2022. How long have
we needed modals? The Web moves both too slowly and too quickly at once.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/websebdev/status/1502785256335855620&#34;&gt;Sebastien Auriault with a useful tip&lt;/a&gt; about Rails template variants. I had no
idea this feature existed &amp;ndash; I keep discovering new Rails features despite
having used the framework for 10+ years at this point &amp;ndash; and it looks useful
in circumstances where you definitely need separate templates.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I believe that a team should try and communicate &amp;ldquo;in public&amp;rdquo; as much as
possible because it has a lot of benefits. Information can be picked up by the
team organically reducing knowledge silos. People can chip-in and help out if
the someone else is not available. Etc, etc.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s so hard to stop myself slipping back into communicating over DMs
though&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/simonw&#34;&gt;Simon Willison&lt;/a&gt; is constantly finding new and interesting ways to use &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub
Actions&lt;/a&gt;. He recently created a new tool called &lt;a href=&#34;https://github.com/simonw/shot-scraper&#34;&gt;&lt;code&gt;shot-scraper&lt;/code&gt;&lt;/a&gt; for screen
scraping that uses &lt;a href=&#34;https://playwright.dev&#34;&gt;Playwright&lt;/a&gt; under the hood, and has now combined that with
a new &lt;a href=&#34;https://simonwillison.net/2022/Mar/14/shot-scraper-template/&#34;&gt;GitHub repo template&lt;/a&gt; that makes setting up automated screen scraping
easy.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/simonw&#34;&gt;His Twitter&lt;/a&gt; and &lt;a href=&#34;https://simonwillison.net&#34;&gt;website&lt;/a&gt; are well worth following.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/channel/UCd3dNckv1Za2coSaHGHl5aA&#34;&gt;TJ DeVries&lt;/a&gt; continues to release great videos on the latest and greatest in
Neovim. This time 2 minutes on a &lt;a href=&#34;https://www.youtube.com/watch?v=jH5PNvJIa6o&#34;&gt;brand new feature: Global Statusline&lt;/a&gt;. Looks
pretty neat. You see a lot of Redditers moaning about people posting
video-only content, many preferring written descriptions, but I find video
summaries like this extremely helpful. Bravo, TJ!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/hauleth/status/1502281780421873664&#34;&gt;Nice tip&lt;/a&gt; from &lt;a href=&#34;https://twitter.com/hauleth&#34;&gt;@hauleth&lt;/a&gt; on making &amp;ldquo;lockfiles&amp;rdquo; such as &lt;code&gt;Gemfile.lock&lt;/code&gt;,
&lt;code&gt;mix.lock&lt;/code&gt;, &lt;code&gt;package-lock.json&lt;/code&gt;, and &lt;code&gt;yarn.lock&lt;/code&gt; less of a hassle to merge by
setting the &lt;code&gt;merge=binary&lt;/code&gt; attribute against those file types in
&lt;code&gt;~/.config/git/attributes&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It will force Git to treat lock file as a binary file, which mean that it
will not modify the file with conflict markers while still marking file as a
conflict in stage. Then you can &amp;ldquo;resolve conflicts&amp;rdquo; via mix deps.get/mix
deps.update&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TIL: You can reset the commit date of an existing commit using &lt;code&gt;git commit --amend --date=now&lt;/code&gt;. If you made some work-in-progress commits over time, but
you want to bring the dates up-to-date after a rebase this is useful.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 37: Sticker me</title>
      <link>https://elver.me/weeknotes/37-sticker-me/</link>
      <pubDate>Sun, 13 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/37-sticker-me/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The BBC seem to be putting a time-wall up in front of a lot of my favourite
podcasts forcing me to use BBC Sounds, a poorly implemented podcast app, if I
want to listen to topical shows in a timely manner. Great job BBC. I&amp;rsquo;m not
sure what has motivated this move, there are a couple that spring to mind, but
it&amp;rsquo;s very inconvenient.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/YS-L/csvlens&#34;&gt;&lt;code&gt;csvlens&lt;/code&gt;&lt;/a&gt; is a nice tool to view CSV files in the terminal.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;csvlens is a CSV file viewer in the command line. It is similar to less but
made for CSV.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apple finally released a new monitor this week &amp;ndash; &lt;a href=&#34;https://www.apple.com/uk/studio-display/&#34;&gt;Apple Studio Display&lt;/a&gt;. I
cannot overstate just &lt;em&gt;how long&lt;/em&gt; I&amp;rsquo;ve been waiting for Apple to release a
product like this. Actually I can, since November 2016, when I retired my
trusty &lt;a href=&#34;https://en.wikipedia.org/wiki/Apple_Cinema_Display#LED_Cinema_Display&#34;&gt;LED Cinema Display&lt;/a&gt; &amp;ndash; the finest monitor I&amp;rsquo;ve ever owned.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.apple.com/uk/pro-display-xdr/&#34;&gt;Pro Display XDR&lt;/a&gt; is the closest they&amp;rsquo;ve come, but&amp;hellip;the price. I&amp;rsquo;d be
lying if I said I hadn&amp;rsquo;t considered it, but I couldn&amp;rsquo;t bring myself to part
with the best part of £5k!&lt;/p&gt;
&lt;p&gt;The new display has the quality panel of the LG 5K but wrapped in nice,
non-plastic, enclosure with other niceties like the webcam and speakers.
Mostly I just hope it works well, unlike the LG 5K which has been plagued with
&amp;ldquo;it works for me&amp;rdquo; issues throughout it&amp;rsquo;s life.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.nytimes.com/interactive/2022/podcasts/trojan-horse-affair.html&#34;&gt;Trojan Horse Letter&lt;/a&gt; podcast is a good listen. There seems to have been
some rebuking of the findings, but I have yet to finish it, so I will catch up
with those afterwards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I &lt;a href=&#34;https://twitter.com/charmcli/status/1501665167746101248&#34;&gt;bagged myself some stickers&lt;/a&gt; this week. I&amp;rsquo;m a sucker for a sticker. I was
already aware of the various cli stuff &lt;a href=&#34;https://charm.sh&#34;&gt;Charm&lt;/a&gt; have been working on for a
while now, but this giveaway has achieved its aim and drawn me in to have
another look.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Heroku seem to have come to their senses and are &lt;a href=&#34;https://devcenter.heroku.com/changelog-items/2364&#34;&gt;lengthening the session times&lt;/a&gt;
on their dashboard. Logging into the dashboard every single day gets tiresome.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;the default web session length will increase from 12 hours to 24 hours. In
addition, users with Multi-Factor Authentication (MFA) enabled have their
web sessions extended an additional 24 hours when they are active on the
Heroku Dashboard. MFA-enabled users’ sessions can be extended up to 10 days
(240 hours).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It sounds like MFA-enabled user sessions get sessions that last up to 10 days?
The docs are not clearly written to me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href=&#34;https://twitter.com/jenistyping/status/1499852188348125184&#34;&gt;valuable lesson&lt;/a&gt; that I learnt recently.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t burn yourself out trying to change the culture of an organization
where you are not in a position of power.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 36: Time keeping new and old</title>
      <link>https://elver.me/weeknotes/36-time-keeping-new-and-old/</link>
      <pubDate>Sun, 06 Mar 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/36-time-keeping-new-and-old/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Feature flags are great. They enable you to roll out features slowly, or test
in production, but they are &lt;em&gt;not&lt;/em&gt; free.&lt;/p&gt;
&lt;p&gt;They add complexity. They require extra work. They add tech debt. Worth
remembering.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been looking for a good note taking system for a long time. At the moment
my &amp;ldquo;work notes&amp;rdquo; consists of a massive &lt;code&gt;TODO.md&lt;/code&gt;, which has been surprisingly
effective. The area were is really falls down is quick notes. I often want to
note down how I did a thing, or things to remember for these weeknotes. But
there is a lot of friction involved in that at the moment.&lt;/p&gt;
&lt;p&gt;I heard about &lt;a href=&#34;https://zettelkasten.de/introduction/&#34;&gt;Zettelkasten&lt;/a&gt; a while ago, and like the idea, but have failed
to integrate it into my life in anyway. So this week I&amp;rsquo;ve been playing with
&lt;a href=&#34;https://github.com/mickael-menu/zk/&#34;&gt;&lt;code&gt;zk&lt;/code&gt;&lt;/a&gt; which is a notetaking cli app with Vim integration via &lt;a href=&#34;https://github.com/mickael-menu/zk-nvim&#34;&gt;zk-nvim&lt;/a&gt;. I&amp;rsquo;m
very hopeful that this can work for me, but I&amp;rsquo;m still setting it up and
experimenting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I felt really let down this week. A decision was made, but it wasn&amp;rsquo;t the
outcome that bothered me, although disappointing, it was the way in which it
was handled.&lt;/p&gt;
&lt;p&gt;Turns out some people are only nice to you when they need you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I tried out &lt;a href=&#34;https://cron.com&#34;&gt;Cron&lt;/a&gt; (no, not that &lt;code&gt;cron&lt;/code&gt;) this week. I&amp;rsquo;m not a heavy calendar
user, but I do want quick access to my Zoom meetings and Cron happens to do a
great job of that. It has a neat menubar widget that shows all upcoming
meetings, and when a meeting is about to start it pops up a button to join. No
more &amp;ldquo;open a web browser in a random tab to start the meeting&amp;rdquo; mess.&lt;/p&gt;
&lt;p&gt;However, Cron uses nearly a gig of memory on my computer 😮 This seems like a
lot to just sit there and notify me of meetings? Of course, Cron is an
Electron app.&lt;/p&gt;
&lt;p&gt;Evaluating Cron reminded of Fantasical on desktop though. I&amp;rsquo;ve been an iOS
user of Fantasical for years and love it, but I&amp;rsquo;ve never tried the desktop
version. It has a similar meeting widget and only uses ~320MB so there is a
nice saving there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finally wrote a &lt;a href=&#34;https://elver.me/uses&#34;&gt;/uses page&lt;/a&gt;. I&amp;rsquo;ve had this on my TODO list for a while
now, but a conversation with my friend prompted me to finish it off. Please
delight in just how &lt;em&gt;old skool&lt;/em&gt; the web page is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;👆 I used a neat little tool called &lt;a href=&#34;https://github.com/kpym/gm&#34;&gt;&lt;code&gt;gm&lt;/code&gt;&lt;/a&gt; to build the page. I considered
just going FULL HTML MODE, but there are absolutely &lt;em&gt;tons&lt;/em&gt; of links on the
page and it gets boring really quickly manually linking them all up. Markdown
excels at this.&lt;/p&gt;
&lt;p&gt;Hugo has been doing a great job for this website but it requires setup, and I
didn&amp;rsquo;t want that for a quick and dirty page. &lt;code&gt;gm&lt;/code&gt; is a thin wrapper around the
&lt;a href=&#34;https://github.com/yuin/goldmark&#34;&gt;Goldmark&lt;/a&gt; Markdown library that Hugo uses, which is ideal as I&amp;rsquo;ve been very
happy with it in that context.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=If61baWF4GE&#34;&gt;Why Russia is Invading Ukraine&lt;/a&gt; &amp;ndash; I found this video really helpful in
understanding what is currently going on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 35: Grokking neovim</title>
      <link>https://elver.me/weeknotes/35-grokking-neovim/</link>
      <pubDate>Sun, 27 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/35-grokking-neovim/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I bought a new monitor arm so that I can raise my laptop up off the desk and
align it into a better position. I wasn&amp;rsquo;t really using the laptop screen,
which I felt was a shame considering how nice is it compared to my main
monitor.&lt;/p&gt;
&lt;p&gt;I got the &lt;a href=&#34;https://www.fully.com/accessories/jarvis-dual-monitor-arm.html&#34;&gt;Fully Jarvis Dual Monitor Arm&lt;/a&gt; with laptop tray, in white. I&amp;rsquo;d
heard good things about it, but after months of casually researching I
suddenly took the plunge because I was fed up of looking.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a bit wobbly, but so is my single arm Amazon Basics model &amp;mdash; the desk is
too flimsy to stop any wobble I fear. However, it looks nice, and does allow
the positioning I was after. There was a small sticker part missing from the
package but it wasn&amp;rsquo;t a problem.&lt;/p&gt;
&lt;p&gt;So far, I like it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/conundrum9999/status/1494187346102607876&#34;&gt;Why you should avoid symbols and nonstandard letters in your twitter name if you want to be screen reader friendly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This reminded me that you should also &lt;a href=&#34;https://en.wikipedia.org/wiki/Camel_case&#34;&gt;CamelCase&lt;/a&gt; your #HashTags to make them
screen reader friendly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I installed &lt;a href=&#34;https://github.com/nvim-telescope/telescope.nvim&#34;&gt;Telescope&lt;/a&gt; this week after thinking about it for ages (I&amp;rsquo;ve found
it completing overwhelming to keep up with the constantly moving ecosystem).
I&amp;rsquo;ve always been pretty happy with my &lt;a href=&#34;https://github.com/junegunn/fzf.vim&#34;&gt;&lt;code&gt;fzf.vim&lt;/code&gt;&lt;/a&gt;-based fuzzy-finding setup
but I kept hearing a lot about Telescope, and a lot of plugins are being built
on top of it.&lt;/p&gt;
&lt;p&gt;I decided to use slightly different keybindings than what I was previously
using. Of course, this means constant mis-typings due to muscle-memory 😬&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m keen revitalize my Neovim setup after watching a couple of inspiring
streams on YouTube &amp;mdash;  &lt;a href=&#34;https://www.youtube.com/watch?v=puWgHa7k3SY&#34;&gt;Neovim Builtin LSP Setup Guide&lt;/a&gt; and &lt;a href=&#34;https://www.youtube.com/watch?v=Dn800rlPIho&#34;&gt;Introduction to
LuaSnip&lt;/a&gt;. I&amp;rsquo;m going to set up Neovim LSP next I think.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of Neovim LSP. This week the popular Language Server,
&lt;a href=&#34;https://rust-analyzer.github.io&#34;&gt;&lt;code&gt;rust-analyzer&lt;/code&gt;&lt;/a&gt;, become part of the official Rust organisation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;is now officially a part of the wider Rust organization! 🎉
&lt;a href=&#34;https://blog.rust-lang.org/2022/02/21/rust-analyzer-joins-rust-org.html&#34;&gt;https://blog.rust-lang.org/2022/02/21/rust-analyzer-joins-rust-org.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I guess this is going to mean good things for the development of
&lt;code&gt;rust-analyzer&lt;/code&gt; in the future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can save a file in vim without any autocommands by using &lt;code&gt;:noa w&lt;/code&gt;. I
needed this recently because I have certain filetypes auto-formatted upon
save, but I was saving some fixture data that I didn&amp;rsquo;t want formatted and this
did the job.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://stripe.com/docs/stripe-cli&#34;&gt;&lt;code&gt;stripe&lt;/code&gt; cli&lt;/a&gt; is really nice for testing webhooks from Stripe. Usually I lean
on &lt;code&gt;ngrok&lt;/code&gt; to make my local development server accessible to the Internet.
&lt;code&gt;stripe&lt;/code&gt; cli makes this unnecessary. You can listen for Stripe webhook events
on your local machine messing with any networking. You can also forward those
events onto a local development server using the &lt;code&gt;--forward-to&lt;/code&gt; flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I haven&amp;rsquo;t felt very productive this week, due to factors. Anxiety, man.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 34: Build and test</title>
      <link>https://elver.me/weeknotes/34-build-and-test/</link>
      <pubDate>Sun, 20 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/34-build-and-test/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I spent a couple of days trying (and SPOILER 🙈 eventually succeeding) to
install a 3rd party dependency on Heroku this week. I&amp;rsquo;ve not had to do this
before as most stuff I&amp;rsquo;ve worked on has had a fairly vanilla setup.&lt;/p&gt;
&lt;p&gt;First attempt to install was via the &lt;a href=&#34;https://github.com/heroku/heroku-buildpack-apt&#34;&gt;heroku-apt-buildpack&lt;/a&gt; as packages were
available. This seemed to be the most straight-forward approach, but was
quickly stymied by the fact that &lt;code&gt;apt&lt;/code&gt; couldn&amp;rsquo;t download the public keys
needed to validate the packages 😢&lt;/p&gt;
&lt;p&gt;So I forked a custom buildpack from elsewhere and thought I was onto a winner
until I realised that the buildpack included a statically built binary &amp;mdash; not
good as I couldn&amp;rsquo;t verify its authenticity. I decided to build my own static
binary so I could have control, but a C++ &lt;code&gt;cmake&lt;/code&gt; headache ensued where a
static binary refused to be static 😭&lt;/p&gt;
&lt;p&gt;I ended up with a dynamically build binary installed via the custom buildpack
with its dependencies installed via &lt;code&gt;heroku-apt-buildpack&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not perfect, but it is done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The default output from &lt;code&gt;cargo test&lt;/code&gt; isn&amp;rsquo;t great imo. It&amp;rsquo;s a bit verbose for
my liking. It seems that &lt;a href=&#34;https://twitter.com/sunshowers6&#34;&gt;rain&lt;/a&gt; thought the same and released &lt;a href=&#34;https://nexte.st&#34;&gt;cargo-nextest&lt;/a&gt;
this week. I&amp;rsquo;ve only used it very briefly but it looks great so far and much
more along the lines of other test runners I&amp;rsquo;ve used.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Announcing cargo-nextest: a new test runner for Rust projects! nextest has a
beautiful user interface, several new features, and is up 60% faster than
cargo test.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cargo nextest run
    Finished test [unoptimized + debuginfo] target(s) in 0.08s
    Starting 6 tests across 3 binaries
        PASS [   0.039s]                   pushover_cli pushover::tests::invalid_user
        PASS [   0.039s]                   pushover_cli pushover::tests::invalid_token
        PASS [   0.039s]                   pushover_cli pushover::tests::five_hundred_error
        PASS [   0.038s]                   pushover_cli pushover::tests::missing_message
        PASS [   0.045s] pushover_cli::integration_test version_flag
        PASS [   0.045s] pushover_cli::integration_test help_flag
     Summary [   0.045s] 6 tests run: 6 passed, 0 skipped
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Along the same lines &lt;a href=&#34;https://twitter.com/mgattozzi&#34;&gt;@mgattozzi&lt;/a&gt; &lt;a href=&#34;https://twitter.com/mgattozzi/status/1493338010297028609&#34;&gt;released assay&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Announcing a new crate assay which is a super powered testing macro for
@rustlang ! &lt;code&gt;async&lt;/code&gt; test support, per test env vars, automatic temp
directory, auto ? in tests, setup and tear down functions and more! You can
read more about how to use it here:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I haven&amp;rsquo;t tried this yet, but I&amp;rsquo;m about to do some work involving ENV vars so
this is timely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.askamanager.org/2022/01/the-new-hire-who-showed-up-is-not-the-same-person-we-interviewed.html&#34;&gt;the new hire who showed up is not the same person we interviewed&lt;/a&gt; via &lt;a href=&#34;https://twitter.com/simonw/status/1493461021771517960&#34;&gt;@simonw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Apparently this is a thing that&amp;rsquo;s happening? 🤔&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.meetup.com/south-west-ruby/&#34;&gt;South West Ruby&lt;/a&gt; meetup was back this week! I haven&amp;rsquo;t been to any sort of
meetup in a long time for obvious reasons, and I had to push myself to go to
this. I&amp;rsquo;m anxious at the best of times, and not being around large groups of
people for a while has only made that worse. I&amp;rsquo;m really glad I went though!&lt;/p&gt;
&lt;p&gt;There was a really interesting talk by &lt;a href=&#34;https://twitter.com/bruckmayer&#34;&gt;Christian Buckmayer&lt;/a&gt; from Shopify who
works on their CI - &amp;ldquo;Keeping Developers Happy With A Fast CI&amp;rdquo;. It wasn&amp;rsquo;t
recorded but Christian also &lt;a href=&#34;https://www.youtube.com/watch?v=WzKzqdpCAx4&amp;amp;list=PLbHJudTY1K0f0oMhWtY-UyzOb7tUlaHps&amp;amp;index=43&#34;&gt;gave this talk at Rubyconf 2021&lt;/a&gt; if you want to
watch it.&lt;/p&gt;
&lt;p&gt;It was lovely to catch up with people I hadn&amp;rsquo;t seen in ages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://zachholman.com/posts/kobayashi-maru-of-comparing-dates-with-times&#34;&gt;The Kobayashi Maru of Comparing Dates with Times&lt;/a&gt; by Zach Holman&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t let anyone tell you that date maths is easy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m really keen to starting using the latest Ruby 3.1 so I can take advantage
of this &lt;a href=&#34;https://blog.saeloun.com/2022/02/16/ruby-3.1-adds-error-highlighting.html&#34;&gt;error highlighting gem&lt;/a&gt;. I can&amp;rsquo;t help but feel like someone has taken
a look at the error messages from Rust and tried to bring a tiny part of it
to Ruby 🙂&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;test.rb:9:in `user_name&#39;: undefined method `[]&#39; for nil:NilClass (NoMethodError)

    data[:result].first[:first_name]
                       ^^^^^^^^^^^^^
    from test.rb:14:in `&amp;lt;main&amp;gt;&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;John Siracusa making a lot of sense as usual in &lt;a href=&#34;https://hypercritical.co/2022/02/15/streaming-apps&#34;&gt;An Unsolicited Streaming App
Spec&lt;/a&gt; and the follow up &lt;a href=&#34;https://hypercritical.co/2022/02/17/streaming-app-sentiments&#34;&gt;Streaming App Sentiments&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don’t think any engagement-related metric is worth angering users in this
way—even if it really does help users discover new content or stay
subscribed longer. I’m reminded of the old saying, “People won’t remember
what you said, but they will remember how you made them feel.” It applies to
apps as well as people.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The incentives for product managers within companies are often in direct
opposition to what a user wants from an app. Do you get a promotion/pay rise
for driving up &amp;ldquo;engagement&amp;rdquo; by 20%, or for making users happy?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve enjoyed two new TV series this week: 1) &lt;a href=&#34;https://www.imdb.com/title/tt16352098/&#34;&gt;The Curse&lt;/a&gt; is really great with
&lt;a href=&#34;https://twitter.com/BigTomD&#34;&gt;Tom Davis&lt;/a&gt; as Mick a stand-out for me; 2) &lt;a href=&#34;https://www.imdb.com/title/tt8681148/&#34;&gt;This Is Going To Hurt&lt;/a&gt; is a really
well done adaption of the book.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 33: Testing Rust</title>
      <link>https://elver.me/weeknotes/33-testing-rust/</link>
      <pubDate>Sun, 13 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/33-testing-rust/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Last week I wondered if &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; did anything to handle em dashes. I&amp;rsquo;ve been
wondering for a while if and when I should be using them, so I investigated.&lt;/p&gt;
&lt;p&gt;Hugo uses the &lt;a href=&#34;https://github.com/yuin/goldmark/&#34;&gt;Goldmark&lt;/a&gt; Markdown processor by default, which &lt;a href=&#34;https://github.com/yuin/goldmark/#typographer-extension&#34;&gt;&lt;em&gt;automatically&lt;/em&gt;
converts&lt;/a&gt; &lt;code&gt;--&lt;/code&gt; to an &lt;a href=&#34;https://en.wikipedia.org/wiki/Dash#En_dash&#34;&gt;En dash&lt;/a&gt;, and &lt;code&gt;---&lt;/code&gt; to an &lt;a href=&#34;https://en.wikipedia.org/wiki/Dash#Em_dash&#34;&gt;Em dash&lt;/a&gt; which means there is
nothing to do other than start using double or triple dashes when writing
Markdown 🙌&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The amount of time it takes WhatsApp to start on my MacBook Air M1 is
hilarious. We can probably blame &lt;a href=&#34;https://www.electronjs.org&#34;&gt;Electron&lt;/a&gt; in some capacity &amp;lt;/s&amp;gt;, but in the
meantime I&amp;rsquo;m going to try the web version.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I ran this site through &lt;a href=&#34;https://developers.google.com/web/tools/lighthouse&#34;&gt;Google&amp;rsquo;s Lighthouse&lt;/a&gt; tool in Chrome. It scored pretty
well but did throw up a couple of issues. In particular, there was an
accessibility related change I could make to ensure heading tags were in the
correct source order. That is a worthwhile change to make.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not convinced that all the rules make sense, so I&amp;rsquo;m not taking all the
suggestions verbatim. It can easily become &lt;a href=&#34;https://en.wikipedia.org/wiki/Cargo_cult_programming&#34;&gt;cargo culting&lt;/a&gt; without any real
benefit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;My &lt;a href=&#34;/weeknotes/32-what-a-pushover/&#34;&gt;Rust project&lt;/a&gt; is coming along. I already had some integration tests in-place
(written last week using a nice library  called &lt;a href=&#34;https://crates.io/crates/assert_cmd&#34;&gt;&lt;code&gt;assert_cmd&lt;/code&gt;&lt;/a&gt;) and this week
I turned my attention to unit tests.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d written some code that performs requests against a JSON API and felt it
really needed testing. I was &lt;em&gt;not&lt;/em&gt; looking forward to this as I had imagined
that mocking the network requests would be difficult. Fortunately, I found a
nice library called &lt;a href=&#34;https://crates.io/crates/wiremock&#34;&gt;wiremock&lt;/a&gt; which made it fairly easy. It works by starting
a separate process for each test and stubbing out the responses. This would
not be viable in Ruby, but works well here.&lt;/p&gt;
&lt;p&gt;Testing the code did require some minor changes so I could pass in the URL of
the test server started by &lt;code&gt;wiremock&lt;/code&gt;. But like &lt;em&gt;most&lt;/em&gt; changes required for
testing, it made the code better &amp;mdash; less coupling, fewer responsibilities.&lt;/p&gt;
&lt;p&gt;Interestingly, it seems the standard Rust way to add unit tests is to put them
alongside the code itself, in the same file. On the one hand I like this a lot
because you don&amp;rsquo;t have to constantly switch files to see what you&amp;rsquo;re testing,
on the other, I wonder just how long my files are going to get if everything
is in one file?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I used &lt;a href=&#34;https://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-destroy_by&#34;&gt;&lt;code&gt;ActiveRecord::Relation#destroy_by&lt;/code&gt;&lt;/a&gt; this week for the first time.
It&amp;rsquo;s a nice shorthand for &lt;code&gt;relation.where(condition).destroy_all&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I often find myself not knowing about the latest features in Rails, but these
things are just a Google away most of the time so I don&amp;rsquo;t suppose it matters.&lt;/p&gt;
&lt;p&gt;Saying that, I do now subscribe to &lt;a href=&#34;https://world.hey.com/this.week.in.rails&#34;&gt;This Week in Rails&lt;/a&gt; in order to have some
visibility of what new stuff is coming to the framework.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://pauljuliusmartinez.github.io/&#34;&gt;jless&lt;/a&gt; seems cool &amp;mdash; a command-line JSON viewer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;JLess is a command-line JSON viewer designed for reading, exploring, and
searching through JSON data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I usually use &lt;a href=&#34;https://stedolan.github.io/jq/&#34;&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/a&gt; in it&amp;rsquo;s most basic form, &lt;code&gt;jq .&lt;/code&gt; , for things like this,
but whilst is does a great job of formatting, highlighting, and displaying the
JSON it doesn&amp;rsquo;t let you interactively navigate around. Sometimes figuring out
the shape of the data is what I&amp;rsquo;m looking for.&lt;/p&gt;
&lt;p&gt;I hope to remember I have installed &lt;code&gt;jless&lt;/code&gt; when the next use-case pops up 😬&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 32: What, a Pushover?</title>
      <link>https://elver.me/weeknotes/32-what-a-pushover/</link>
      <pubDate>Sun, 06 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/32-what-a-pushover/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I &lt;a href=&#34;/weeknotes/31-super-fly-culture/&#34;&gt;recommended TRex recently&lt;/a&gt; for OCRing on-screen text. I also &lt;a href=&#34;/weeknotes/31-super-fly-culture/&#34;&gt;recommended
CleanShot X&lt;/a&gt; for all your screenshot needs. Well, CleanShot now has support
for capturing text via OCR, so I only need CleanShot now - one less thing in
the menubar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/31-super-fly-culture/&#34;&gt;Speaking of&lt;/a&gt; &lt;a href=&#34;https://fly.io&#34;&gt;Fly&lt;/a&gt;, I&amp;rsquo;m currently working on a side project using Elixir and
Phoenix and needed somewhere to deploy it. I&amp;rsquo;d been hearing good things about
them for a while so decided to give it a try. They also recently announced
that they would &lt;a href=&#34;https://fly.io/blog/free-postgres/&#34;&gt;start offering free Postgres&lt;/a&gt; which certainly doesn&amp;rsquo;t hurt.&lt;/p&gt;
&lt;p&gt;The deployment process was really good overall.&lt;/p&gt;
&lt;p&gt;I had trouble with &lt;a href=&#34;https://www.npmjs.com/package/node-sass&#34;&gt;&lt;code&gt;node-sass&lt;/code&gt;&lt;/a&gt; (as everyone on the Internet does) so I moved
to &lt;a href=&#34;https://www.npmjs.com/package/sass&#34;&gt;&lt;code&gt;dart-sass&lt;/code&gt;&lt;/a&gt; instead which is doesn&amp;rsquo;t require compiling anything to work.
This wasn&amp;rsquo;t Fly&amp;rsquo;s fault, I&amp;rsquo;ve had problems with &lt;code&gt;node-sass&lt;/code&gt; many times.&lt;/p&gt;
&lt;p&gt;Once I got the app fully deployed I encountered a more serious issue with the
VM running out of memory.&lt;/p&gt;
&lt;p&gt;I connected to the VM using &lt;code&gt;fly ssh console&lt;/code&gt; and then started an &lt;code&gt;iex&lt;/code&gt;
session so that I could create some test users in the database. Whenever I did
so &lt;code&gt;iex&lt;/code&gt; would get killed - very strange. Later I realised that the BEAM would
get killed whenever I logged in via the web too. What is common between these
two actions? Password hashing!&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://community.fly.io/t/out-of-memory-on-elixir-phoenix-app-when-connecting-iex-session/3852/3&#34;&gt;I posted on Fly&amp;rsquo;s community forum for help&lt;/a&gt;, and Chris McCord himself replied
but it wasn&amp;rsquo;t clear what was happening. I later found the solution on the
&lt;a href=&#34;https://elixirforum.com/t/staging-environment-how-to-debug-out-of-memory-errors-in-production-on-fly-io/42763/7&#34;&gt;Elixir Forum&lt;/a&gt;. Turns out that &lt;a href=&#34;https://en.wikipedia.org/wiki/Argon2&#34;&gt;Argon2&lt;/a&gt; is very memory expensive by default.
So every time I was hashing a password it would use a lot of memory and bloat
the process pushing it over the allowed limits.&lt;/p&gt;
&lt;p&gt;Some configuration and all it now well.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# config/prod.exs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# Set cost of password hashing complexity to use less memory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config &lt;span style=&#34;color:#990073&#34;&gt;:argon2_elixir&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;t_cost&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;m_cost&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;15&lt;/span&gt; &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# ~60ms&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Fly has been really good so far in my limited experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://devcenter.heroku.com/articles/nodejs-support#specifying-a-node-js-version&#34;&gt;Pin your Node version in &lt;code&gt;package.json&lt;/code&gt;&lt;/a&gt;, especially when deploying to Heroku,
in case, hypothetically, &lt;a href=&#34;https://devcenter.heroku.com/changelog-items/2349&#34;&gt;they bump the Node version&lt;/a&gt; and your build fails and
you can&amp;rsquo;t deploy to production. Hypothetically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A colleague was debugging a Heroku build issue and put together a quick
&lt;code&gt;Dockerfile&lt;/code&gt; using the base image supplied by Heroku. It hadn&amp;rsquo;t occurred to me
that &lt;a href=&#34;https://devcenter.heroku.com/articles/heroku-18-stack#heroku-18-docker-image&#34;&gt;Heroku Stacks were available as Docker images&lt;/a&gt;. Pushing to Heroku over
and over to diagnose an issue gets old fast so this approach is welcome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://incident.io/blog/no-capes?utm_source=pocket_mylist&#34;&gt;No capes: the perils of being a hero-engineer&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;when you show up to a new job where there’s a hero (or group of heroes)
jumping in to fix things constantly, it’s frustratingly slow to understand how
everything fits together from the outside. There’s hints dropped in Slack and
breadcrumbs in pull requests but all the discussion has happened in a private
chat elsewhere.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;ve experienced this. It made me feel like I couldn&amp;rsquo;t contribute because the
hero always got there first - not a healthy culture. And what happens when
your hero leaves?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://nikodunk.com/a-node-js-developer-discovers-rails/&#34;&gt;An interesting take on a JavaScript programmer coming to Rails&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;coming from the current Javascript ecosystem makes discovering Rails a revelation&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daringfireball.net/linked/2022/02/03/facebook-tanks&#34;&gt;lol&lt;/a&gt; 😆&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Facebook’s stock stayed down all day, wiping $200 billion in value from the
company’s market cap — the biggest one-day drop in market value ever.
Couldn’t happen to a nicer company.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/24-force-pushing-rust/&#34;&gt;Rust returns!&lt;/a&gt; Again. I&amp;rsquo;ve picked a project to implement in Rust now.
Something small enough in scope that it doesn&amp;rsquo;t overwhelm, but significant
enough to not be a complete toy.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m writing a command line app to send notifications using the &lt;a href=&#34;https://pushover.net&#34;&gt;Pushover&lt;/a&gt;
&lt;a href=&#34;https://pushover.net/api&#34;&gt;API&lt;/a&gt;, something that I&amp;rsquo;m sure already exists, but that I personally have a
requirement for, which is a nice way to scratch my own itch.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve got something that works already, which is great, but there is a lot of
tidy up, and many improvements to be made.&lt;/p&gt;
&lt;p&gt;Learning new languages means more than just syntax. You also have to acquaint
yourself with how the community operates, the idioms of the language, the
approach to testing &amp;mdash; myriad topics.&lt;/p&gt;
&lt;p&gt;One of those topics is error handling. Rust&amp;rsquo;s error handling is, from what I
understand, one of it&amp;rsquo;s unique features, but very different to what I&amp;rsquo;m used
to. &lt;a href=&#34;https://www.sheshbabu.com/posts/rust-error-handling/&#34;&gt;This article&lt;/a&gt; was very helpful during the learning process.&lt;/p&gt;
&lt;p&gt;I need to remember that Rust is a big language with many ideas completely
foreign to me, and I don&amp;rsquo;t need to know it all &lt;em&gt;right now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Like lots of Rust features, it&amp;rsquo;s error handling approach makes me feel
confident that the program I&amp;rsquo;m writing will work at &lt;em&gt;runtime&lt;/em&gt;. Ruby has lots
of great qualities, but &lt;em&gt;that&lt;/em&gt; is not one of them for me.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 31: Super Fly culture</title>
      <link>https://elver.me/weeknotes/31-super-fly-culture/</link>
      <pubDate>Sun, 30 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/31-super-fly-culture/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In last week&amp;rsquo;s weeknote entry I had some code examples with long lines, so I
needed to make them more legible. Some &lt;code&gt;overflow: hidden&lt;/code&gt; and a bit of padding
did the job, but whilst in a CSS mood I had a think about quotations, and
specifically &lt;code&gt;&amp;lt;blockquote&amp;gt;&lt;/code&gt;. &amp;ldquo;Can I add quotation marks automatically?&amp;rdquo;, I
thought.&lt;/p&gt;
&lt;p&gt;The venerable &lt;a href=&#34;https://css-tricks.com/quoting-in-html-quotations-citations-and-blockquotes/&#34;&gt;CSS Tricks&lt;/a&gt; comes to the rescue, as usual. And, yes. Yes you
can. In Safari you can even have fancy hanging quotes with the
&lt;a href=&#34;https://caniuse.com/css-hanging-punctuation&#34;&gt;&lt;code&gt;hanging-punctuation&lt;/code&gt;&lt;/a&gt; property.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I upgraded an Elixir Phoenix app to 1.6 this week. No matter the language, or
framework, dependencies are always a problem. And this was no different. After
following &lt;a href=&#34;https://gist.github.com/chrismccord/2ab350f154235ad4a4d0f4de6decba7b&#34;&gt;the upgrade guide&lt;/a&gt; and failing, I decided to generate a new fresh
app and compare the &lt;code&gt;mix.exs&lt;/code&gt; of old and new. That got me moving in the end,
and the rest was a simple undertaking.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continuing my interest in the work of &lt;a href=&#34;/weeknotes/21-totally-dope/&#34;&gt;Patrick Radden Keefe&lt;/a&gt; led me to the
&lt;a href=&#34;https://crooked.com/podcast-series/wind-of-change/&#34;&gt;Wind of Change podcast series&lt;/a&gt;, which I&amp;rsquo;ve now finished. It was a fun ride.
Recommended.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🚨 GITHUB TIP! 🚨 When putting a GitHub PR together I usually pre-review it
myself adding notes for reviewers and explaining decisions which couldn&amp;rsquo;t be
expressed in the code itself. If the PR is long I tend to use the &amp;ldquo;Viewed&amp;rdquo;
checkbox in the GitHub interface to methodically go through each file. It
helps me keep track.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s all well and good until you want to see contents of all the files
again. Unchecking the &amp;ldquo;Viewed&amp;rdquo; checkbox next to each file is &lt;em&gt;not&lt;/em&gt; a fun
experience.&lt;/p&gt;
&lt;p&gt;Well, turns out if you alt + click on the downwards facing chevron next to
each file it OPENS ALL THE FILES IN ONE GO! I&amp;rsquo;m would never have found this
out if it weren&amp;rsquo;t for &lt;a href=&#34;https://github.com/refined-github/refined-github/issues/2865#issuecomment-595767171&#34;&gt;this issue&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Everyone should get &lt;a href=&#34;https://cleanshot.com&#34;&gt;CleanShot X&lt;/a&gt;. What. A. Great. App. The ability to take a
screenshot, easily annotate it, and share, cannot be overstated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fly&amp;rsquo;s &lt;a href=&#34;https://fly.io/blog/docker-without-docker/&#34;&gt;&amp;ldquo;Docker without Docker&amp;rdquo;&lt;/a&gt; blog post is a very interesting read about how
their &amp;ldquo;Docker&amp;rdquo; architecture works. TLDR; they don&amp;rsquo;t run your Docker image,
they transmogrify it into a Firecracker VM which runs natively.&lt;/p&gt;
&lt;p&gt;This made me laugh:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You’re likely of one of two mindsets about this: (1) that it’s extremely
Unixy and thus excellent, or (2) that it’s extremely Unixy and thus
horrifying.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been enjoying the &lt;a href=&#34;https://anchor.fm/jamie-loftus&#34;&gt;My Year in Mensa&lt;/a&gt; by podcast series by &lt;a href=&#34;https://en.wikipedia.org/wiki/Jamie_Loftus&#34;&gt;Jamie Loftus&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 30: Quality of life improvement</title>
      <link>https://elver.me/weeknotes/30-quality-of-life-improvement/</link>
      <pubDate>Sun, 23 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/30-quality-of-life-improvement/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I discovered recently that &lt;a href=&#34;https://ruby-doc.org/core-2.5.0/Struct.html&#34;&gt;Ruby&amp;rsquo;s Struct&lt;/a&gt; has a &lt;code&gt;keyword_init&lt;/code&gt; option which
was introduced in version 2.5. It makes using Structs much more pleasant not
having to rely on the positional arguments&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Build&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Struct&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;new(&lt;span style=&#34;color:#990073&#34;&gt;:built_on&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:slug_id&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;keyword_init&lt;/span&gt;: &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Build&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;new(&lt;span style=&#34;color:#990073&#34;&gt;build_on&lt;/span&gt;: now, &lt;span style=&#34;color:#990073&#34;&gt;slug_id&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;123&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In other Ruby news, &lt;a href=&#34;https://www.ruby-lang.org/en/news/2021/12/25/ruby-3-1-0-released/&#34;&gt;recently released 3.1&lt;/a&gt; has some very nice quality of life
improvements with IRB now supporting suggestions/completions with the
introduction of a new readline compatible library called &lt;a href=&#34;https://github.com/ruby/reline&#34;&gt;reline&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ruby has been lagging behind in good developer tooling. This has become more
apparent to me after using Elixir and Rust, both of which put a lot of effort
into it. These changes are very welcome 👏&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wondered this which gems had native extensions and a quick Google and &lt;a href=&#34;https://stackoverflow.com/a/32567708/120615&#34;&gt;Stack
Overflow&lt;/a&gt; later this one liner told me:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bundle show --paths | ruby -e &amp;quot;STDIN.each_line {|dep| puts dep.split(&#39;/&#39;).last if File.directory?(File.join(dep.chomp, &#39;ext&#39;)) }&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Useful in the context of Apple&amp;rsquo;s new silicon future.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been dipping my toe back into JavaScript/TypeScript and this week I
discovered the &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/console/dir&#34;&gt;console.dir&lt;/a&gt; and &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/console/table&#34;&gt;console.table&lt;/a&gt; methods for logging to the
console in a more structure way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Turns out you can have &lt;a href=&#34;https://vimtricks.com/p/highlight-syntax-inside-markdown/&#34;&gt;syntax highlighting in Markdown fenced code blocks in Vim&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&amp;#34; Configure languages so we get syntax highlighting in Markdown files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;let&lt;/span&gt; g:markdown_fenced_languages = [&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;bash&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;elixir&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;fish&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;html&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;javascript&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;ruby&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;rust&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;typescript&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;vim&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I found this nice utility called &lt;a href=&#34;https://github.com/amebalabs/TRex&#34;&gt;TRex&lt;/a&gt; which sits in the menubar on macOS
and allows you to capture text from anywhere on the screen using OCR.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TRex captures any text right into your Clipboard with magic of OCR.
But what is OCR anyway? Imagine you have a PDF file or a Web page where
you can&amp;rsquo;t select the text, image with text on it, or even a YouTube video.
Forget retyping it manually; with TRex, you can extract text from
anywhere, and it is as easy as taking a screenshot.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;From memory, I think Apple released some OCR related APIs fairly recently. I
wonder if that&amp;rsquo;s what is used here. It does a single thing really well. I
think it could become very useful to me.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 29: Folding, navigating, serializing</title>
      <link>https://elver.me/weeknotes/29-folding-navigating-serializing/</link>
      <pubDate>Sun, 16 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/29-folding-navigating-serializing/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve never got my head around folding in Vim (in fact, I haven&amp;rsquo;t gotten my
head around a lot of things in Vim!) but I really should. In particular I have
installed a plugin to allow Vim to &lt;a href=&#34;https://github.com/rlue/vim-fold-rspec&#34;&gt;fold RSpec spec files&lt;/a&gt;, which often get long
and unruly.&lt;/p&gt;
&lt;p&gt;Still getting the hang of the keybindings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://youtu.be/NYj3DnI81AQ?t=301&#34;&gt;Tom Scott agrees with me&lt;/a&gt; about wireless headphones. This makes me very happy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I still think wireless headphones are a terrible idea&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yes, Tom ✅&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you want to access Rails url helpers inside a &lt;a href=&#34;https://github.com/jsonapi-serializer/jsonapi-serializer&#34;&gt;JSON:API serializer&lt;/a&gt; you
can&amp;rsquo;t do the usual mixin include as everything inside a JSON:API serializer is
evaluated at a class level.&lt;/p&gt;
&lt;p&gt;Instead include into the class.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;UserSerializer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  singleton_class&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;include &lt;span style=&#34;color:#008080&#34;&gt;Rails&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;application&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;routes&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;url_helpers
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Reference: &lt;a href=&#34;https://github.com/jsonapi-serializer/jsonapi-serializer/issues/157&#34;&gt;https://github.com/jsonapi-serializer/jsonapi-serializer/issues/157&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I read &lt;a href=&#34;https://moxie.org/2022/01/07/web3-first-impressions.html&#34;&gt;My first impressions of web3&lt;/a&gt; this week and there was a lot I didn&amp;rsquo;t
understand. Still, this made me laugh:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At this point, software projects require an enormous amount of human effort.
Even relatively simple apps require a group of people to sit in front of a
computer for eight hours a day, every day, forever.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://vector-logic.com/blog/posts/losing-your-way-with-ruby-safe-navigation-operator&#34;&gt;Losing Your Way With Ruby Safe-Navigation Operator&lt;/a&gt; has some good points.
I&amp;rsquo;ve seen liberal use of the safe navigation operator in codebases I&amp;rsquo;ve worked
on and people do seem to just throw it in without necessarily understanding
the ramifications. I&amp;rsquo;m using it more and more, but care is required.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 28: First week back</title>
      <link>https://elver.me/weeknotes/28-first-week-back/</link>
      <pubDate>Sun, 09 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/28-first-week-back/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I saw &lt;a href=&#34;https://twitter.com/noelrap/status/1478479138587660292&#34;&gt;Noel Rappin&lt;/a&gt; asking about a utility he once used for called &lt;a href=&#34;https://github.com/thisredone/rb&#34;&gt;&lt;code&gt;rb&lt;/code&gt;&lt;/a&gt;.
It&amp;rsquo;s a nice idea - it allows you to more easily run Ruby code from the command
line. As a Ruby programmer this is very tempting. I&amp;rsquo;ve installed it, but not
sure if it will stick or not. A part of me things I should spend the time
improving my normal shell skills instead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/24-force-pushing-rust/&#34;&gt;Rust learning&lt;/a&gt; has taken a hit over the Christmas holidays so I&amp;rsquo;m trying to
get back on it this week. I learnt about Rust Modules by watching &lt;a href=&#34;https://www.youtube.com/watch?v=969j0qnJGi8&#34;&gt;this video&lt;/a&gt;
from &lt;a href=&#34;https://www.youtube.com/channel/UCSp-OaMpsO8K0KkOqyBl7_w&#34;&gt;Let&amp;rsquo;s Get Rusty&lt;/a&gt;. The Rust module system is a bit weird compared to
other languages but I like how explicit it feels.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The first week back after Christmas break has been a massive shock to my
system after two weeks off. Before the break I really felt I needed some rest.
I don&amp;rsquo;t &lt;em&gt;feel&lt;/em&gt; particularly rested unfortunately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tenderlove wrote a nice account of how he has setup his new M1 using
&lt;a href=&#34;https://tenderlovemaking.com/2022/01/07/homebrew-rosetta-and-ruby.html&#34;&gt;Homebrew, Rosetta, and Ruby&lt;/a&gt;. When I setup my Macbook Air M1 I (eventually,
after first fighting with many Rubygem-related issues) opted to run
everything under Rosetta for ease, but if I were to setup everything again I
would try out his method of configuring the shell to switch between
architectures.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 27: Anti-content producer</title>
      <link>https://elver.me/weeknotes/27-anti-content-producer/</link>
      <pubDate>Sun, 02 Jan 2022 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/27-anti-content-producer/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The time off over Christmas has gone too fast. I&amp;rsquo;ve been desperate to be
productive over the time, making lists, and not ticking anything off them&amp;hellip;
I had a several projects lined up to keep me busy over the festive period and
I&amp;rsquo;ve done none.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.bbc.co.uk/programmes/m0012rhj&#34;&gt;Richard Osman was on Desert Island Discs&lt;/a&gt;. He spoke about his food addiction
and it brought a tear to my eye. His comments couldn&amp;rsquo;t have rang any truer to
me. You don&amp;rsquo;t need booze, or drugs, or cigarettes. But you do need food.&lt;/p&gt;
&lt;p&gt;He said he thinks that it will always be with him, and I think it&amp;rsquo;ll always be
with me too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Twenty Four. That&amp;rsquo;s how many books I read this year. It might not seem like a
lot to some, but it&amp;rsquo;s a lot for me, and the most consistently I&amp;rsquo;ve read too. I
plan to continue this trend in 2022. I&amp;rsquo;ve started a 36 book challenge on
Goodreads.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Works starts proper again on Tuesday 💩&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 26: Mistletoe and Wine</title>
      <link>https://elver.me/weeknotes/26-mistletoe-and-wine/</link>
      <pubDate>Sun, 26 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/26-mistletoe-and-wine/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Christmas again. It really did creep up on me this year. We had planned for it
to be a quieter one. Usually we would go away but COVID made that
difficult/impossible this year (and last) so we were staying home.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unfortunately A&amp;rsquo;s grandfather passed away on Christmas Eve. It was very sad,
but he&amp;rsquo;d had a good life and was surrounded by his family. Not a bad way to
go.&lt;/p&gt;
&lt;p&gt;As a result our Christmas plans changed, not for the worse, just different. We
ended up having Christmas with a lot of different family members which for me
in particular was strange.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 25: Colouring in and Vim tabs</title>
      <link>https://elver.me/weeknotes/25-colouring-in-and-vim-tabs/</link>
      <pubDate>Sun, 19 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/25-colouring-in-and-vim-tabs/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m experimenting with using tabs in Vim having never used them before. The
common advice I&amp;rsquo;ve seen always says that they are not &amp;ldquo;the Vim way&amp;rdquo;, whatever
that means. Which, now that I read it back, is weird.&lt;/p&gt;
&lt;p&gt;I was looking for a way to keep a working notes file open whilst working in
other splits and I found &lt;a href=&#34;https://vimtricks.com/p/quickly-access-project-notes/&#34;&gt;this article&lt;/a&gt; that I bookmarked in Pocket ages ago.
Seems to be working well at the moment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Turns out &lt;a href=&#34;https://docs.cypress.io/api/utilities/_&#34;&gt;Cypress includes Lodash by default&lt;/a&gt;, which is good news as it means
not having to re-invent the wheel every time you want to do something basic
like you usually do with JavaScript.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Jira. Urgh.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I don&amp;rsquo;t agree with all the points in &lt;a href=&#34;https://thoughtbot.com/blog/tailwind-and-the-femininity-of-css&#34;&gt;Tailwind and the Femininity of CSS&lt;/a&gt;, but
I do think they&amp;rsquo;re on to something regarding how CSS is viewed.&lt;/p&gt;
&lt;p&gt;I remember overhearing a conversation at work years ago where the CSS work
being done by a colleague was referred to as &amp;ldquo;colouring in&amp;rdquo; by a couple of
brogrammers on the team. Brogrammers who didn&amp;rsquo;t write CSS.&lt;/p&gt;
&lt;p&gt;Jeremy Keith quoted in the article also has a good point.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think that’s what’s happened with some programmers coming to CSS for the
first time. They’ve heard it’s simple, so they assume it’s easy. But then
when they try to use it, it doesn’t work. It must be the fault of the
language&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After &lt;a href=&#34;/weeknotes/23-debugging-audio-processing-and-things-falling-apart/&#34;&gt;bragging about managing to get a &lt;code&gt;rebase --onto&lt;/code&gt; working correctly the
first time recently&lt;/a&gt; I forgot the order of arguments this week.&lt;/p&gt;
&lt;p&gt;For posterity here is the format:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git rebase --onto &amp;lt;newparent&amp;gt; &amp;lt;oldparent&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&#34;https://stackoverflow.com/a/39081674/120615&#34;&gt;https://stackoverflow.com/a/39081674/120615&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 24: Force pushing Rust</title>
      <link>https://elver.me/weeknotes/24-force-pushing-rust/</link>
      <pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/24-force-pushing-rust/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;As someone who can&amp;rsquo;t hold a lot in my head at once, of course, I strongly
agree with this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;I&amp;rsquo;ve stopped admiring very talented engineers who can hold a lot of
complexity in their head and started admiring very talented engineers who
have moved a lot of complexity outside their head and into tools, and I like
it much much better this way.&amp;rdquo;
&lt;a href=&#34;https://twitter.com/fasterthanlime/status/1468739998505656327&#34;&gt;https://twitter.com/fasterthanlime/status/1468739998505656327&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I managed to snag a &lt;a href=&#34;https://warp.dev&#34;&gt;Warp&lt;/a&gt; invite code, which I&amp;rsquo;ve been keen to try out for a
while. I&amp;rsquo;m not sure how I feel about yet. It doesn&amp;rsquo;t yet support my shell of
choice, &lt;a href=&#34;https://fishshell.com&#34;&gt;Fish&lt;/a&gt;, so it&amp;rsquo;s hard to give it a proper try. It sure &lt;em&gt;looks&lt;/em&gt; slick.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was writing quite a few &lt;a href=&#34;https://www.cypress.io&#34;&gt;Cypress&lt;/a&gt; tests this week and picked up a couple of tips.&lt;/p&gt;
&lt;p&gt;Find an element based on the text it contains:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cy.get(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;some &amp;gt; selector&amp;#39;&lt;/span&gt;).invoke(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;text&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  .then((text)=&amp;gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    expect(text).to.contain(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;I am text&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run only the current &lt;code&gt;describe&lt;/code&gt; or &lt;code&gt;it&lt;/code&gt; block using &lt;a href=&#34;https://docs.cypress.io/guides/core-concepts/writing-and-organizing-tests#Excluding-and-Including-Tests&#34;&gt;&lt;code&gt;.only&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;describe.only(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;a group of tests&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// test body
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;it.only(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;does a thing&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// test body
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another tip that I use all the time, this time for Git. Force pushing is
necessary if you rebase your branches a lot like I do. However, you can
overwrite someone else&amp;rsquo;s commits if they have also pushed to the same branch.&lt;/p&gt;
&lt;p&gt;The generally accepted rule is to only force push to a branch that you alone
use, but life sometimes isn&amp;rsquo;t that straight forward, so in those cases where
someone else could&amp;rsquo;ve pushed to your branch you can use &lt;a href=&#34;https://git-scm.com/docs/git-push#Documentation/git-push.txt---force-with-leaseltrefnamegt&#34;&gt;&lt;code&gt;--force-with-lease&lt;/code&gt;&lt;/a&gt;
instead of &lt;code&gt;--force&lt;/code&gt; and it will refuse to force push if someone else has
already pushed to it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.rust-lang.org&#34;&gt;Rust&lt;/a&gt; is back on the agenda! I&amp;rsquo;ve been looking at Rust for a few years now,
maybe more. I pick it up, get stuck, put it down. Anyway, I&amp;rsquo;m trying again.
This time starting with the &lt;a href=&#34;https://doc.rust-lang.org/book/&#34;&gt;Rust Book&lt;/a&gt;. It&amp;rsquo;s a really good book.&lt;/p&gt;
&lt;p&gt;Rust is a complicated language for someone like me who&amp;rsquo;s mostly programmed in
dynamic languages. It&amp;rsquo;s full of concepts and ideas that I&amp;rsquo;ve never heard of.
And that&amp;rsquo;s part of what I like about it - it&amp;rsquo;s different. But that makes it
challenging.&lt;/p&gt;
&lt;p&gt;Rust stands alone as a language that could be really useful for me (The idea
of writing a cli program in Ruby doesn&amp;rsquo;t appeal to me, but writing one in Rust
certainly does). However it also seems like it would be an good choice for
writing &amp;ldquo;extensions&amp;rdquo; to other languages. Ruby gems and Elixir NIFs can both be
written in Rust.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m looking forward to some time off over Christmas! 🎄🎅&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 23: Debugging, audio processing, and things falling apart</title>
      <link>https://elver.me/weeknotes/23-debugging-audio-processing-and-things-falling-apart/</link>
      <pubDate>Sun, 05 Dec 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/23-debugging-audio-processing-and-things-falling-apart/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The current app I&amp;rsquo;m working on involves various audio processing.
Unfortunately, I&amp;rsquo;ve not had much involvement with that side of things so far -
too many others features to build and bugs to fix! I do find it really
interesting though so I&amp;rsquo;m starting to pick up some things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I performed several &lt;a href=&#34;https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---ontoltnewbasegt&#34;&gt;&lt;code&gt;git rebase --onto&lt;/code&gt;&lt;/a&gt; operations on the first try. A cause
for celebration as I usually get into an unholy mess.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some spelunking into the &lt;a href=&#34;https://activeadmin.info&#34;&gt;Active Admin&lt;/a&gt; source code necessitated the use of
Ruby&amp;rsquo;s &lt;code&gt;#source_location&lt;/code&gt; this week. When combined with &lt;code&gt;#method&lt;/code&gt; it is
extremely useful to help find where code is defined.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I started listening to &lt;a href=&#34;https://www.bbc.co.uk/sounds/series/m0011cpr&#34;&gt;Things Fell Apart by Jon Ronson&lt;/a&gt;. It&amp;rsquo;s really good.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was doing a lot of debugging this week that necessitated restarting the
Rails server over and over. This project uses &lt;a href=&#34;https://github.com/puma/puma-dev&#34;&gt;&lt;code&gt;puma-dev&lt;/code&gt;&lt;/a&gt; which means running
&lt;code&gt;touch tmp/restart.txt&lt;/code&gt; to tell it to restart. This soon got tedious so I went
Googling for a way to do this inside of vim.&lt;/p&gt;
&lt;p&gt;I &lt;a href=&#34;http://joncairns.com/2012/11/restarting-thin-or-passenger-rails-server-from-vim/&#34;&gt;came across this article from 2012&lt;/a&gt; which had the solution. Some slight
tweaking and a new key bind in my config and I was away. I can now press
&lt;code&gt;&amp;lt;leader&amp;gt; rr&lt;/code&gt; to restart Rails from within Vim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nick Cave being great, again.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We all have regrets and, as bad as they may feel, they are signals of our
growth as human beings. A person with no regrets is simply leading an
unexamined life.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.theredhandfiles.com/i-just-cant-forgive-myself/&#34;&gt;https://www.theredhandfiles.com/i-just-cant-forgive-myself/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 22: This grid will only take 2 hours</title>
      <link>https://elver.me/weeknotes/22-this-grid-will-only-take-2-hours/</link>
      <pubDate>Sun, 28 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/22-this-grid-will-only-take-2-hours/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I took part in a whiteboarding session! But &lt;a href=&#34;/weeknotes/20-whiteboards-and-css/&#34;&gt;not at my house&lt;/a&gt;, at a co-working
space, and I didn&amp;rsquo;t do any of the drawing, so I&amp;rsquo;m not quite there yet.
However, it was really successful in helping a colleague and I with a problem
we were previously a bit stuck on.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been working remotely for around 7 years now, and I believe that most of
my work &lt;em&gt;can&lt;/em&gt; be done fine from home, but I have to admit that it&amp;rsquo;s hard to
replicate these sort of in-person workshop-type sessions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A lot of this week has been spent writing specifications and planning. I found
it quite hard to take all my notes and turn them into something that someone
else could make sense of. In fact, I still haven&amp;rsquo;t fully managed that, but I
have got some fairly decent cards written for Jira.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;During the planning I did 👆 I came up with a potential solution to a problem
that we will need to solve. There are often so many ways to solve something
that I find it extremely difficult to decide what to do. I think sometimes you
just have to pick what you think the correct solution is and go for it. You
can always change course later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/strzibnyj&#34;&gt;Josef Strzibny&lt;/a&gt; proving once again that dates and times are hard in &lt;a href=&#34;https://nts.strzibny.name/datetime-summer-time/&#34;&gt;Summer
and winter time changes with DateTime&lt;/a&gt;. Elixir has a nice way of handling DST
changes though, as you&amp;rsquo;d expect 😉.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;&lt;a href=&#34;https://web.eecs.utk.edu/~azh/blog/thisprojectwillonlytake.html&#34;&gt;This project will only take 2 hours&lt;/a&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;A very well articulated example of why software is hard.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The students then discussed how they would implement the idea and asked a
few clarification questions, before one stated:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;This project will only take 2 hours.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;After seeing the look on my face, another student said, &amp;ldquo;I think it would be
more like 4 hours. I&amp;rsquo;ve never used the clipboard system call before.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Incidentally, I love an old skool website served from a home directory like it
is here at &lt;code&gt;~/azh&lt;/code&gt; 👌.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After my &lt;a href=&#34;/weeknotes/20-whiteboards-and-css/&#34;&gt;recent foray into Flexbox&lt;/a&gt; I started &lt;a href=&#34;https://cssgrid.io&#34;&gt;Wes Bos&amp;rsquo; CSS Grid course&lt;/a&gt; too.
I&amp;rsquo;m about 8 videos in and my initial impression is that it&amp;rsquo;s impressive what
can be achieved with &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout&#34;&gt;Grid&lt;/a&gt; - layouts that would be very hard without it are
simple.&lt;/p&gt;
&lt;p&gt;Also, the Developer Tools for Grid are mightily impressive to a guy who
started out using Microsoft Notepad and &amp;ldquo;View Source&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 21: Totally dope</title>
      <link>https://elver.me/weeknotes/21-totally-dope/</link>
      <pubDate>Sun, 21 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/21-totally-dope/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Adam_Buxton&#34;&gt;Adam Buxton&lt;/a&gt; had &lt;a href=&#34;https://www.patrickraddenkeefe.com&#34;&gt;Patrick Radden Keefe&lt;/a&gt; on his &lt;a href=&#34;https://www.adam-buxton.co.uk/podcasts/wmcgmfe7zj7chps-89fa4-2e48e-rwzy8-824b8-4mdjd-2hcs8-chrb2-7y8jj-5pcse-2wtsh-cz8zd-e3cdy-g68s7&#34;&gt;podcast this week&lt;/a&gt;. I&amp;rsquo;d never
heard of Patrick before but the conversation was a very enjoyable listen. They
spoke about a few of Patrick&amp;rsquo;s articles and books including his &lt;a href=&#34;https://www.newyorker.com/magazine/2013/02/11/a-loaded-gun&#34;&gt;New Yorker
article on Amy Bishop&lt;/a&gt;, and his book &lt;a href=&#34;https://www.goodreads.com/book/show/43868109-empire-of-pain&#34;&gt;Empire of Pain: The Secret History of
the Sackler Dynasty&lt;/a&gt; about the Sackler family, inventors of OxyContin.&lt;/p&gt;
&lt;p&gt;I was looking for a new book to read. I haven&amp;rsquo;t gotten very far through the
book yet, but I did read the article, and that got me started reading some of
his others including one about &lt;a href=&#34;https://www.newyorker.com/magazine/2018/08/06/how-a-notorious-gangster-was-exposed-by-his-own-sister&#34;&gt;Astrid and Wim Holleeder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By a strange coincidence I decided to start watching &lt;a href=&#34;https://www.imdb.com/title/tt9174558/&#34;&gt;Dopesick&lt;/a&gt;, a drama
starring Micheal Keaton, and it&amp;rsquo;s all about the Sackler&amp;rsquo;s and OxyContin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was pointed at this &lt;a href=&#34;https://bugs.chromium.org/p/chromium/issues/detail?id=468153#c164&#34;&gt;interesting issue&lt;/a&gt; on the Chromium tracker this week. I&amp;rsquo;ve
had problems with trying to tell browsers to not autocomplete fields in the
past so this was an interesting read into why Chromium ignores
&lt;code&gt;autocomplete=&amp;quot;off&amp;quot;&lt;/code&gt; now (well, since 2016).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I needed to export some Postgres tables and it turns out this is easily done
from within Postgres itself. For CSV with headers&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;COPY &amp;lt;table_name&amp;gt; TO &#39;/tmp/output.csv&#39; WITH (FORMAT CSV, HEADER);
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A much needed weekend away was had this weekend. We spent some time in
Dartmoor, Devon. We walked, we ate, we sat around. It was nice.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 20: Whiteboards and CSS</title>
      <link>https://elver.me/weeknotes/20-whiteboards-and-css/</link>
      <pubDate>Sun, 14 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/20-whiteboards-and-css/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I bought a whiteboard! It&amp;rsquo;s now installed in my office next to my desk. I&amp;rsquo;m
hoping it&amp;rsquo;s going to help me with problem solving.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I found a cool trick when working with browser developer tools - the &lt;a href=&#34;https://stackoverflow.com/questions/49453385/chrome-devtools-loop-through-nodelist&#34;&gt;&lt;code&gt;copy&lt;/code&gt;
helper&lt;/a&gt;. It lets you copy output straight from the console to your clipboard.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;copy($$(&#39;.foobar&#39;).map(e =&amp;gt; e.textContent).join(&#39;\n&#39;))&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;ve been using &lt;a href=&#34;https://tailwindcss.com&#34;&gt;Tailwind CSS&lt;/a&gt; at work and it didn&amp;rsquo;t take very long before I
was getting stuck. I realised pretty quickly though that it&amp;rsquo;s not a lack of
Tailwind knowledge per se, but rather a general lack of &lt;em&gt;modern&lt;/em&gt; CSS knowledge.&lt;/p&gt;
&lt;p&gt;I used to do a lot more frontend work. I started off doing a lot of HTML/CSS,
but I&amp;rsquo;ve focused on the backend for many years now, and keeping up is hard.&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;ve decided it&amp;rsquo;s time to get up-to-date and I&amp;rsquo;m starting by learning
&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox&#34;&gt;Flexbox&lt;/a&gt; using &lt;a href=&#34;https://flexbox.io&#34;&gt;Wes Bos&amp;rsquo; videos&lt;/a&gt;. Wish me luck!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://daringfireball.net/linked/2021/11/12/new-york-city-street&#34;&gt;John Gruber writes&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There are a lot of good ideas here. Drastically reducing curbside parking
and using that space to widen sidewalks and increase outdoor eating areas is
something that’s happened in a lot of cities during this pandemic. It’s been
a huge win here in Philly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I wish we could make better use of our space here in the UK.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sadly I found out this week that another former colleague had passed away. I
worked in the same team as Dave for almost a year. A very clever guy who had
a vast wealth of experience. RIP.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 19: Burn brightly</title>
      <link>https://elver.me/weeknotes/19-burn-brightly/</link>
      <pubDate>Sun, 07 Nov 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/19-burn-brightly/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I got an iPad Mini 6 recently. I&amp;rsquo;ve had iPads before but they never really got
used apart from on holiday. This one was bought specifically to see if it can
help me with note taking, diagram creation, and annotation of learning
materials.&lt;/p&gt;
&lt;p&gt;I was trying to make a decision between Good Notes 5 and Notability
when Notability decided to move to a freemium model so that pushed me in their
direction. However, I&amp;rsquo;ve since also tried Good Notes 5 and it seems really
good. I haven&amp;rsquo;t settled on one or the other yet.&lt;/p&gt;
&lt;p&gt;So far I&amp;rsquo;m impressed. I&amp;rsquo;m not sure if it&amp;rsquo;s going to suit marking up PDFs or
not yet but time will tell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nick Cave &lt;a href=&#34;https://www.theredhandfiles.com/heart-that-kills-you-it-is-a-beautiful-thing/&#34;&gt;wrote something lovely&lt;/a&gt; in his latest The Red Hand Files entry.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;the anger at the indifference and casual cruelty of this world can still
burn bright, but it does not define us, for the oxygen that fuels that anger
is love — love for the world and love for the people in it. Love becomes
anger’s great animator, as it should, as it must.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🔥 Burn out update: Feeling a bit better, but also looking forward to some
proper time off over the Christmas period. I am mindful that I need to make
sure to take breaks more regularly in the future to stop being burnt out
becoming something more serious.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I heard a few weeks ago that &lt;a href=&#34;https://mikerogers.io&#34;&gt;Mike Rogers&lt;/a&gt; had been involved in a serious
accident. Mike is unfortunately no longer with us. I didn&amp;rsquo;t know Mike very
well (our paths did cross when we were both working at the same place for a
month or so, but we worked on different projects). He was extremely
enthusiastic about the Ruby community and it&amp;rsquo;s clear from &lt;a href=&#34;https://twitter.com/search?q=mikerogers0&amp;amp;src=recent_search_click&amp;amp;f=live&#34;&gt;his mentions on
Twitter&lt;/a&gt; that he meant a lot to many people. He will be greatly missed 😢&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 18: Chunky bacon</title>
      <link>https://elver.me/weeknotes/18-chunky-bacon/</link>
      <pubDate>Sun, 31 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/18-chunky-bacon/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve tried to convince various colleagues over the years that using
ActiveRecord models inside a migration is a bad idea. Data migration code
should reside in a separate &lt;code&gt;rake&lt;/code&gt; task in my view. I expect I haven&amp;rsquo;t done a
good job of explaining myself.&lt;/p&gt;
&lt;p&gt;I was reminded of this once again when I happened across the &lt;a href=&#34;https://github.com/testdouble/good-migrations&#34;&gt;good_migrations&lt;/a&gt;
gem.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;That means that if your migrations reference the ActiveRecord model objects
you&amp;rsquo;ve defined in app/models, your old migrations are likely to break.
That&amp;rsquo;s not good.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Perhaps I will sneak the gem into codebases I work on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub did a nice write up about &lt;a href=&#34;https://github.com/readme/featured/why-the-lucky-stiff&#34;&gt;_why the lucky stiff&lt;/a&gt; recently. It was a
nice reminder about &lt;a href=&#34;https://en.wikipedia.org/wiki/Why_the_lucky_stiff&#34;&gt;_why&lt;/a&gt; and how he influenced Ruby early on. He certainly
had a big impact on me when I was first learning Ruby.&lt;/p&gt;
&lt;p&gt;I wish I still had my &lt;a href=&#34;https://poignant.guide/book/chapter-3.html&#34;&gt;chunky bacon&lt;/a&gt; t-shirt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/phoenixframework/phoenix_live_view&#34;&gt;LiveView&lt;/a&gt; continues to grow and impress. I have used it a bit and I ran into
some of the issues that &lt;a href=&#34;https://www.youtube.com/watch?v=Of1phFsC4ZI&#34;&gt;Chris McCord talks about in his ElixirConf 2021
talk&lt;/a&gt;. The solutions he proposes seem to make a lot of sense to me. Wrinkles
are being ironed out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub released a feature preview this week - &lt;a href=&#34;https://docs.github.com/en/get-started/using-github/github-command-palette&#34;&gt;Command Palette&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Just like keyboard shortcuts in an IDE, command palette lets you run
commands and navigate across organizations, repositories, issues, pull
requests, and more all within the GitHub UI.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;⌘ + k&lt;/code&gt; your way around GitHub - very nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been feeling irritable for &lt;em&gt;at least&lt;/em&gt; the last few weeks. I don&amp;rsquo;t feel
listened to. I&amp;rsquo;m anxious. I don&amp;rsquo;t feel good enough. I think I&amp;rsquo;m experiencing
the ol&amp;rsquo; &amp;ldquo;burn out&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I decided, in the interest of my mental health, to take the rest of the week
off. I&amp;rsquo;m not sure this is going to be enough of a break, in fact I&amp;rsquo;m positive it
won&amp;rsquo;t be, but hopefully it will help.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 17: Safe MacBook Navigation</title>
      <link>https://elver.me/weeknotes/17-safe-macbook-navigation/</link>
      <pubDate>Sun, 24 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/17-safe-macbook-navigation/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;/weeknotes/16-standard-checks-and-breakages/&#34;&gt;StandardRB check&lt;/a&gt; seems to be broken again. FML.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I read &lt;a href=&#34;https://thoughtbot.com/blog/ruby-safe-navigation&#34;&gt;Ruby Safe Navigation&lt;/a&gt; from ThoughtBot this week. The article makes a
lot of good points. When I first head that this new operator was being added
to Ruby I wondered whether this sort of usage might result. I myself have seen
it being liberally sprinkled around codebases. It should be used with care,
which unfortunately doesn&amp;rsquo;t seem to happen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another read this week: &lt;a href=&#34;https://nts.strzibny.name/business-logic-in-rails-with-contexts/?utm_source=pocket_mylist&#34;&gt;Organizing business logic in Rails with contexts&lt;/a&gt;.
I&amp;rsquo;ve admired the &lt;a href=&#34;https://www.phoenixframework.org&#34;&gt;Phoenix&lt;/a&gt; way of doing things too, but not having much
practical experience with Elixir/Phoenix means I&amp;rsquo;m not really qualified to say
whether it works in practice, but I&amp;rsquo;ve heard it does.&lt;/p&gt;
&lt;p&gt;In particular I like the idea of returning an explicit &lt;code&gt;Result&lt;/code&gt; object. It&amp;rsquo;s
idiomatic in Elixir to return a tuple like &lt;code&gt;{:ok, thing}&lt;/code&gt; when successful and
&lt;code&gt;{:error, reason}&lt;/code&gt; when it&amp;rsquo;s not. And in Rust there are many types of
&amp;ldquo;Result&amp;quot;s that can be returned and &lt;em&gt;must&lt;/em&gt; be handled. In Ruby I only ever see
a &lt;code&gt;nil&lt;/code&gt; or a boolean, which is a shame.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apple released their new MacBook Pro line this week. Thank, god. It doesn&amp;rsquo;t
seem like they fucked it. They&amp;rsquo;ve righted wrongs, and improved on what were
already game changing processors. There&amp;rsquo;s a cool &lt;a href=&#34;https://twitter.com/stevesi/status/1450255227945242628&#34;&gt;thread on Twitter&lt;/a&gt; that
talks about the history of how Apple got to the current ARM future.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 16: Standard checks and breakages</title>
      <link>https://elver.me/weeknotes/16-standard-checks-and-breakages/</link>
      <pubDate>Sun, 17 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/16-standard-checks-and-breakages/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We&amp;rsquo;ve had a malfunctioning &lt;a href=&#34;https://github.com/testdouble/standard&#34;&gt;StandardRB&lt;/a&gt; &lt;a href=&#34;https://github.com/andrewmcodes/standardrb-action&#34;&gt;check&lt;/a&gt; on one of our repos for a few
weeks. It would fail if the PR contained a single commit - a scenario I failed
to originally test but I think I be forgiven for not doing so, strange as it is.&lt;/p&gt;
&lt;p&gt;Anyway, I had to more or less totally rewrite the way it worked.&lt;/p&gt;
&lt;p&gt;The check works by getting a list of added or modified files and passing that
list to &lt;code&gt;standardrb&lt;/code&gt; for checking. The reason for this is that we don&amp;rsquo;t want
to run the check on the whole codebase at the moment due to a large number of
StandardRB violations.&lt;/p&gt;
&lt;p&gt;However, it seems that it&amp;rsquo;s surprisingly hard to get a list of files changed
in a PR using existing actions - they all have problems or fail under
weird conditions.&lt;/p&gt;
&lt;p&gt;So, I rewrote it to get the list of files from the GitHub API instead after
seeing someone mention they had done the same whilst Googling about for
solutions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Agreed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t use comments! Use code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.matheusrich.com/dont-use-comments-use-code/&#34;&gt;https://www.matheusrich.com/dont-use-comments-use-code/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The current app I&amp;rsquo;m working on uses &lt;a href=&#34;https://redis.io/topics/pubsub&#34;&gt;Redis PubSub&lt;/a&gt; in a few places, but it&amp;rsquo;s
expanding to use Rails&amp;rsquo; &lt;a href=&#34;https://guides.rubyonrails.org/action_cable_overview.html&#34;&gt;ActionCable&lt;/a&gt; too - something I&amp;rsquo;ve never used. A
question about our setup kicked off a brief investigation into how Redis
stores the messages to be published to subscribers. My naive thought was that
it would actually write the messages as keys like any other record, but no.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Redis does not queue anything on pub/sub channels. On the contrary, it tends
to read the item from the publisher socket, and write the item in all the
subscriber sockets, ideally in the same iteration of the event loop. Nothing
is kept in Redis data structures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://stackoverflow.com/a/27746701/120615&#34;&gt;https://stackoverflow.com/a/27746701/120615&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I broke a fairly major thing this week by not surrounding an argument with
quotes. Bad times. Lessons were learnt though - our testing process is clearly
not good enough.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 15: Secure content warning</title>
      <link>https://elver.me/weeknotes/15-secure-content-warning/</link>
      <pubDate>Sun, 10 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/15-secure-content-warning/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After last week&amp;rsquo;s &lt;a href=&#34;/weeknotes/14-the-week-nothing-happened/&#34;&gt;lack of Content&lt;/a&gt; comes &lt;em&gt;slightly&lt;/em&gt; more Content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I spent some time diagnosing an SSL issue this week. Occasionally some Ruby
code was throwing &lt;code&gt;OpenSSL::SSL:SSLError&lt;/code&gt; exceptions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error:
certificate verify failed (unable to get local issuer certificate)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It seems OpenSSL, and as a consequence Ruby, could not connect to a URL
because it can&amp;rsquo;t verify the SSL certificate. It doesn&amp;rsquo;t happen on every https
URL, but happens enough to warrant an investigation.&lt;/p&gt;
&lt;p&gt;I found a couple of useful scripts whilst Googling around for ideas. The first
was a &lt;a href=&#34;https://raw.githubusercontent.com/rubygems/ruby-ssl-check/master/check.rb&#34;&gt;script put together by the Bundler team&lt;/a&gt;. This was really useful to get
a broad idea of what might be going wrong.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/mislav/ssl-tools&#34;&gt;second was by Mislav Marohnić&lt;/a&gt; dated back in 2013 - some problems don&amp;rsquo;t go
away - and he also had written an accompanying &lt;a href=&#34;https://mislav.net/2013/07/ruby-openssl/&#34;&gt;blog post explaining the issues&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The solution seems to be that we need to update our root SSL certificates.
I haven&amp;rsquo;t done that yet, but hopefully it solves the issue 🤞&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 14: The week nothing happened</title>
      <link>https://elver.me/weeknotes/14-the-week-nothing-happened/</link>
      <pubDate>Sun, 03 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/14-the-week-nothing-happened/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=OdPYEdUDlEk&#34;&gt;Nothing much happened this week&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 13: 1.3GB of node_modules/ and stress testing CI</title>
      <link>https://elver.me/weeknotes/13-1-3gb-of-node-modules-and-stress-testing-ci/</link>
      <pubDate>Sun, 26 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/13-1-3gb-of-node-modules-and-stress-testing-ci/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Retro-fitting tests is so much more difficult than writing them at the time of
the implementation. Writing them afterwards often forces you to change the
implementation in order to even test anything, and you (I, dear reader)
usually end up with a highly coupled test too, making future changes more
difficult. I would ideally like to an integration test to cover the subject
under test whilst changing it, but that&amp;rsquo;s not always possible, as was the case
this time, so making the changes feels perilous. I did my best.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Debugging failed tests on CI is never fun. It works on my machine has never
been more painful. It sucks the life out of me. The slow feedback cycle is a
killer having to push small changes and see if they pass. This particular CI
was running on GitHub Actions and thankfully I found this neat action called
&lt;a href=&#34;https://github.com/marketplace/actions/debugging-with-tmate&#34;&gt;action-tmate&lt;/a&gt; on the GitHub Actions Marketplace. It essentially provides you
with a shell on the GitHub Actions machine your tests are running on. Much
easier to debug. With this in-place I could run tests directly and use a
debugger to work out what was going wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We got into a position where we couldn&amp;rsquo;t deploy to our application hosted on
Heroku this week 🤦‍♂️ Our &lt;a href=&#34;https://devcenter.heroku.com/articles/slug-compiler&#34;&gt;Slug&lt;/a&gt; size had gradually been growing but a
recent merge of some major JavaScript changes massively increased our bundle
sizes and left us in a position where we couldn&amp;rsquo;t actually deploy any more!&lt;/p&gt;
&lt;p&gt;Investigating on Heroku using &lt;code&gt;heroku run bash&lt;/code&gt; I came across our
&lt;code&gt;node_modules/&lt;/code&gt; directory.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ du -sh .[^.]* * | sort -hr
1.3G    node_modules
532M    vendor
268M    tmp
118M    .heroku
95M     public
12M     app
1.9M    spec
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Oh, Node.&lt;/p&gt;
&lt;p&gt;I did some Googling and &lt;a href=&#34;https://blog.saeloun.com/2020/05/04/how-to-reduce-heroku-slug-size.html&#34;&gt;found what seemed like a reasonable, easy to
implement, approach&lt;/a&gt;. We augment the &lt;code&gt;assets:clean&lt;/code&gt; Rake task that
Heroku already call during the deployment process to remove the
&lt;code&gt;node_modules/&lt;/code&gt; directory &lt;em&gt;before&lt;/em&gt; the Slug is compressed. This change make
the Slug size 264MB smaller than before - an over 50% saving.&lt;/p&gt;
&lt;p&gt;The deployment should also be faster from now on as the Slug Compiler
shouldn&amp;rsquo;t have to compress 1.3GB of files anymore.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Short work week for me this week. We went away to Cornwall for a few days.
It&amp;rsquo;s been ages since I&amp;rsquo;ve been away properly what with one thing and another.
A combination of uncomfortable AirBnB and poor weather meant that we decided
to come home early.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 12: RSpec let and the Gell-Mann amnesia effect</title>
      <link>https://elver.me/weeknotes/12-rspec-let-and-the-gell-mann-amnesia-effect/</link>
      <pubDate>Sun, 19 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/12-rspec-let-and-the-gell-mann-amnesia-effect/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I read an interesting article on why the &lt;a href=&#34;https://mortoray.com/2013/11/27/the-string-type-is-broken/&#34;&gt;string type is broken&lt;/a&gt; this week. It
was written in 2013 but still seems to apply in 2021. Ruby, my main
programming language, fairs pretty well in most of the test cases put forth,
but the issues are well worth being aware of.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;By happenstance I learnt about the &lt;a href=&#34;https://en.wikipedia.org/wiki/Michael_Crichton#GellMannAmnesiaEffect&#34;&gt;Gell-Mann amnesia effect&lt;/a&gt; via
&lt;a href=&#34;https://twitter.com/jerodsanto/status/1438155433009635334&#34;&gt;Twitter&lt;/a&gt;. I&amp;rsquo;ve experienced it myself many times so its
interesting that the phenomenon has a name.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;you read with exasperation or amusement the multiple errors in a story,
and then turn the page to national or international affairs, and read as if
the rest of the newspaper was somehow more accurate about Palestine than the
baloney you just read. You turn the page, and forget what you know.” -
&lt;a href=&#34;https://www.epsilontheory.com/gell-mann-amnesia/&#34;&gt;Michael Crichton&lt;/a&gt; (1942-2008)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another &lt;a href=&#34;https://twitter.com/hopsoft/status/1438932131422490629&#34;&gt;tweet by Nate Hopkins&lt;/a&gt; caught my eye too. He asked about RSpec&amp;rsquo;s
&lt;code&gt;let&lt;/code&gt; syntax.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why does RSpec support &amp;ldquo;let&amp;rdquo; syntax? Is it simply to squash parts of a before
hook into a single line or is there some practical utility? I currently see it
as only serving to obfuscate things.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have come to strongly agree with Nate&amp;rsquo;s assertion that they only serve to
obfuscate things. I&amp;rsquo;ve written many tests using the &lt;code&gt;let&lt;/code&gt; syntax myself and
everything is great at the beginning. The problem comes as the test file
grows and you can no longer see the whole test in one go. You&amp;rsquo;ll find that a
&lt;code&gt;let&lt;/code&gt; at the top of the file is affecting a test on line 1000, and tracking
all over the file to reason about the test becomes very tiresome.&lt;/p&gt;
&lt;p&gt;These days I much prefer a longer, simpler style of tests where all
dependencies are shown up front and center with nothing hidden. Tests which
provide design feedback - if you have a lot of dependencies to setup a test,
you have a complicated object. This information is often hidden with &lt;code&gt;let&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You may experience push back from team members writing tests in this style.
People will say they are verbose - they are. And not very DRY - they&amp;rsquo;re not.
But in my view, they they tend to make the whole test more understandable, and
are cut and pasteable when a base for new tests is required. They lead to more
maintainable tests in my experience.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 11: Office Life, DNS, and old Ruby features</title>
      <link>https://elver.me/weeknotes/11-office-life-dns-and-old-ruby-features/</link>
      <pubDate>Sun, 12 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/11-office-life-dns-and-old-ruby-features/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Working from an office again was weird. I spent a day in an office that wasn&amp;rsquo;t
in my house this week. With other people. I found it to be a mixed experience.
It was nice to get out of the house (I&amp;rsquo;ve found getting out of the house once
a week is a good idea for my sanity) and when the commute isn&amp;rsquo;t every day it&amp;rsquo;s
a nice way to unwind. Seeing my colleagues face-to-face was also nice.&lt;/p&gt;
&lt;p&gt;However, I can say without a doubt that it was my most unproductive day in a
long time. I&amp;rsquo;m sure COVID has reduced my already low tolerance for noise and
general disruption. Concentrating felt impossible, even with headphones and
music. Luckily I didn&amp;rsquo;t have too much hardcore concentrating to do due to the
work I had lined up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The lesson I learn over and over is to test your own assumptions. This
happened again this week when debugging a test failure. It was failing due to
a DNS change (long story), which was something I didn&amp;rsquo;t consider whilst
investigating. A fresh set of eyes from another solved the problem, but it was
a good reminder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m gradually using really quite old Ruby features. This week it was the &lt;code&gt;...&lt;/code&gt;
operator used for forwarding arguments on. Usually I would collect the
arguments using &lt;code&gt;*args&lt;/code&gt; and then destructure them again also using &lt;code&gt;*args&lt;/code&gt;,
but I always forget which syntax. Having &lt;code&gt;...&lt;/code&gt; for a single purpose is pretty
nice. Contrary to a lot of the new syntax added to Ruby, I think this is
worth it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 10: Docker on Apple M1, and writing tests</title>
      <link>https://elver.me/weeknotes/10-docker-on-apple-m1-and-writing-tests/</link>
      <pubDate>Sun, 05 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/10-docker-on-apple-m1-and-writing-tests/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When deploying to &lt;a href=&#34;https://www.heroku.com&#34;&gt;Heroku&lt;/a&gt; I&amp;rsquo;ve always used the &lt;a href=&#34;https://devcenter.heroku.com/articles/git&#34;&gt;git push&lt;/a&gt; method but you can
also &lt;a href=&#34;https://devcenter.heroku.com/articles/container-registry-and-runtime&#34;&gt;deploy Docker containers&lt;/a&gt;, and I did so this week. I was expecting to
have to tweak my Dockerfile in some way, however I was pleasantly surprised
that everything just worked.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;heroku container:push web --app &amp;lt;app&amp;gt;
heroku container:release web --app &amp;lt;app&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I ran into a small issue because I was deploying from an &lt;a href=&#34;https://en.wikipedia.org/wiki/Apple_M1&#34;&gt;Apple M1&lt;/a&gt;-based
computer but it was easily remedied by setting an environment variable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export DOCKER_DEFAULT_PLATFORM=linux/amd64
heroku container:push web --app live-transcriber-api
heroku container:release web --app &amp;lt;app&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This allows us to run the same containers in development as well as production
so it&amp;rsquo;s a big win for productivity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Writing tests for existing code is so much harder &lt;em&gt;after&lt;/em&gt; the implementation.
But it&amp;rsquo;s important to fill in any gaps in coverage before making changes, so
this week I was doing that. It was a lot trickier than I was expecting as the
tests needed to cover many areas of the codebase that I was unfamiliar with so
I had to learn how everything worked as I went. It feels good to have improved
the test coverage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 9: Testing tests and Electron drama</title>
      <link>https://elver.me/weeknotes/9-testing-tests-and-electron-drama/</link>
      <pubDate>Sun, 29 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/9-testing-tests-and-electron-drama/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://edgeapi.rubyonrails.org/classes/ActionMailer/Base.html&#34;&gt;ActionMailer&lt;/a&gt; has a feature called &lt;a href=&#34;https://guides.rubyonrails.org/action_mailer_basics.html#intercepting-emails&#34;&gt;interceptors&lt;/a&gt;. It allows you to make
modifications to an email before it&amp;rsquo;s delivered and I had the perfect
use-case, to override the email recipient depending on various factors such as
environment. It solved my problem quickly and provides a nice, de-coupled, way
to hook into ActionMailer. Not deployed to production yet, but recommended
regardless.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Writing tests gives me confidence in the code I&amp;rsquo;m producing. Struggling with
test frameworks does not. Sadly there was a fair bit of the latter this week
figuring out why RSpec Request specs where not performing jobs automatically
as they should when the ActiveJob queue adaptor is set to &lt;code&gt;:inline&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;My problem sounds like this &lt;a href=&#34;https://github.com/rails/rails/issues/37270&#34;&gt;Rails issue&lt;/a&gt;. During request specs the queue
adapter is reset to &lt;code&gt;:test&lt;/code&gt; which means that jobs are not performed
automatically.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t completely fix the issue, and the potential fix of upgrading Rails
was too much to do at the time, but I did work around it by writing a &lt;a href=&#34;https://relishapp.com/rspec/rspec-expectations/v/3-10/docs/custom-matchers/define-a-custom-matcher&#34;&gt;custom
RSpec matcher&lt;/a&gt;. A lot of time was wasted that I could have spent on writing
tests though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was an interesting discussion about &lt;a href=&#34;https://www.electronjs.org&#34;&gt;Electron&lt;/a&gt; on &lt;a href=&#34;https://atp.fm/444&#34;&gt;ATP 444&lt;/a&gt;. It was
prompted by &lt;a href=&#34;https://blog.1password.com/1password-8-the-story-so-far/&#34;&gt;1Password&amp;rsquo;s move to Electron&lt;/a&gt;, especially in relation
to macOS. I myself was worried about this move, but as the hosts of ATP
discussed, the situation is more nuanced than it first appears.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m conflicted. As someone with web development skills but no &amp;ldquo;native&amp;rdquo; app
skills (save for some messing about with &lt;a href=&#34;https://en.wikipedia.org/wiki/Objective-C&#34;&gt;Objective-C&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Cocoa_(API)&#34;&gt;Cocoa&lt;/a&gt; years ago)
Electron is appealing to me, but I also miss the native feel of apps that can
be lost when using Electron.&lt;/p&gt;
&lt;p&gt;I think it probably makes a lot of sense for some companies to use it.  I&amp;rsquo;m
sure it would mean the difference between having a native app available for a
platform and not at all in many cases, but you&amp;rsquo;d have to be mindful of the
trade-offs involved. There is a danger that you end up creating an app that is
not fit for the platform on which it runs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 8: Fire in the Valley and git subtree</title>
      <link>https://elver.me/weeknotes/8-fire-in-the-valley-and-git-subtree/</link>
      <pubDate>Sun, 22 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/8-fire-in-the-valley-and-git-subtree/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;After a reading hiatus that has lasted way too long I finished &lt;a href=&#34;https://www.goodreads.com/book/show/1427580&#34;&gt;Fire in the
Valley: The Making of the Personal Computer&lt;/a&gt; last week (but I forgot to
mention it then). I had next to no knowledge of how the Personal Computer was
created despite owing my career to it. The only complaint I have is that it
doesn&amp;rsquo;t cover much of what was happening in Europe over the same time period
(I wonder if it exists?) but it is entitled &amp;ldquo;Fire in the &lt;em&gt;Valley&lt;/em&gt;&amp;rdquo; so it&amp;rsquo;s
understandable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We decided to move some services alongside each other in a single &lt;a href=&#34;https://en.wikipedia.org/wiki/Monorepo&#34;&gt;monorepo&lt;/a&gt;.
The source repo needed to live in a sub-directory of an existing repo, and
ideally I wanted to bring the commit history from the source repo along with
the code - it&amp;rsquo;s a shame to waste a well written commit history.&lt;/p&gt;
&lt;p&gt;Googling resulted in many methods, old and new, but in the end I setted on
using &lt;code&gt;git subtree&lt;/code&gt;. It seemed to be the most straightforward way to move a
repo into another.&lt;/p&gt;
&lt;p&gt;I pulled the external repo into a sub directory using:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git subtree add --prefix sub-directory/ path/to/source-repo/ master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This resulted in a single commit and also brings along history.&lt;/p&gt;
&lt;p&gt;Straying from normal day-to-day Git usage can be scary. There are many ways to
achieve a goal and trying to find the &lt;em&gt;proper&lt;/em&gt; way to do it can be difficult,
so hopefully this works out ok.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Google Cloud Console continues to tell me lies about the state of running
services. They could do with dragging their slider to the right too - so slow.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 7: Alpine fun and games</title>
      <link>https://elver.me/weeknotes/7-alpine-fun-and-games/</link>
      <pubDate>Sun, 15 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/7-alpine-fun-and-games/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Part of this week consisted of working on some bigger architectural ideas
rather being heads down writing code. Finding a clean boundary within a system
can be hard but I think we might have managed it, and this particular idea
will make the system simpler as a whole, and hopefully sets a precedent for
likely future expansion. The prototype seems to make sense, so only time will
tell how well it works out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Docker related problems rearing their head this week. I built some Docker
images recently using &lt;a href=&#34;https://www.alpinelinux.org&#34;&gt;Alpine Linux&lt;/a&gt; as the base operating system. I
chose Alpine because it&amp;rsquo;s well supported and is very small so you can keep the
overall size of Docker images quite small. The Docker community seems to have
decided to standardize on Dockerfiles with either Alpine or Ubuntu as the base
OS, so Alpine felt like a safe choice.&lt;/p&gt;
&lt;p&gt;This particular &lt;code&gt;Dockerfile&lt;/code&gt; installs various packages using Alpine&amp;rsquo;s &lt;code&gt;apk&lt;/code&gt;
and specifies exact versions. The idea being that this image should be
deterministic, that is, I could build it over and over and get the same result
at the end.&lt;/p&gt;
&lt;p&gt;Well, my Docker image started failing to build because the package version I
specified for one of my dependencies was no longer available. It turns out
that Alpine doesn&amp;rsquo;t keep old versions of a package around when a new version
is released. Considering Alpine is very popular in combination with Docker
this decision seems strange.&lt;/p&gt;
&lt;p&gt;A move away from Alpine seems probable, which is a shame.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/marketplace?type=actions&amp;amp;query=slack&#34;&gt;GitHub Actions Marketplace&lt;/a&gt; has a few workflows
available to send notifications to Slack, but the top two by stars at the time
of writing are &lt;a href=&#34;https://github.com/marketplace/actions/slack-notify&#34;&gt;Slack Notify&lt;/a&gt; and &lt;a href=&#34;https://github.com/marketplace/actions/action-slack&#34;&gt;action-slack&lt;/a&gt;. I decided upon
action-slack to improve the visibility of some build processes. It seemed
slightly less &lt;em&gt;fiddly&lt;/em&gt; than the other options. I&amp;rsquo;ve been enjoying automating
more things with Actions recently.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 6: Windows and Wurhammer</title>
      <link>https://elver.me/weeknotes/6-windows-and-wurhammer/</link>
      <pubDate>Sun, 08 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/6-windows-and-wurhammer/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Nothing particularly noteworthy happened this week. I was feeling under the
weather for a couple of days so that wiped out some time, and everything else
was pretty uneventful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I briefly played some &lt;a href=&#34;https://en.wikipedia.org/wiki/Warhammer_40,000:_Dawn_of_War&#34;&gt;Warhammer Dawn of War&lt;/a&gt; which of course meant
firing up my Windows PC, and enduring all that comes with that. Firstly, the
network cable didn&amp;rsquo;t work for unknown reasons (not strictly Windows&amp;rsquo; fault
;)). Then, of course, all the things needed updating, which took an age. And
finally, just generally using Windows, which remains a shit-show after all
these years. I don&amp;rsquo;t understand all the recent converts back to Windows &lt;em&gt;at
all&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Needless to say it didn&amp;rsquo;t have the relaxing affect I was looking for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An &lt;a href=&#34;https://chelseatroy.com/2019/12/18/reviewing-pull-requests/&#34;&gt;insightful article on Pull Request reviews&lt;/a&gt; caught my eye this
week. The author makes some great points about how to perform reviews.&lt;/p&gt;
&lt;p&gt;For me, reviews have always been framed as something else that you do for the
team in-between doing &lt;em&gt;actual&lt;/em&gt; work. As a result I feel like I can&amp;rsquo;t take as
much time for the reviews as maybe I should. Perhaps this is a personal
failing, or a team cultural problem, or a mix of both.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m definitely going to be giving reviews more time in the future so that I
can do things like checking out and running code instead of just suggesting
changes directly on the PR. It&amp;rsquo;s very easy to suggest without testing - pseudo
code is fun and easy! - but I&amp;rsquo;m not sure this is helpful to the original
author and, as pointed out in the article, can build resentment.&lt;/p&gt;
&lt;p&gt;She mentions that she sometimes pushes commits directly to the reviewee&amp;rsquo;s
branch. I originally thought that I would find that quite jarring - &amp;ldquo;what does
this person think they are doing pushing to my branch?!&amp;rdquo; - but upon further
reflection I have changed my mind. If collaboration is the true aim of reviews
then why not?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Zoom APIs made an unwelcome return to my life this week. Third party APIs seem
to have this knack for doing &lt;em&gt;most&lt;/em&gt; of what you want to do but making anything
else incredibly difficult.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/4-bye-bye-comfort-hello-hugo/&#34;&gt;The chair&lt;/a&gt; is no more.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 5: Professional Bash programmer</title>
      <link>https://elver.me/weeknotes/5-professional-bash-programmer/</link>
      <pubDate>Sun, 01 Aug 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/5-professional-bash-programmer/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A first for me again this week as I moved some holding pages for a couple of
domains to &lt;a href=&#34;https://pages.github.com&#34;&gt;GitHub Pages&lt;/a&gt;. The setup was fairly easy once I grokked
the DNS changes required. It&amp;rsquo;s a shame that GitHub&amp;rsquo;s help pages have become
more and more &amp;ldquo;enterprise-y&amp;rdquo; over the last few years though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wrote some Bash this week. Strangely I&amp;rsquo;ve never really written any Bash
professionally (if you can call it that) before, only ever in my own tinkering
with side projects. It&amp;rsquo;s surprisingly difficult to do the most basic things
and there are always half a dozen ways. How many systems are glued together
using Bash?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m working on getting a TIL site up and running. Since I first saw &lt;a href=&#34;https://github.com/jbranchaud/til&#34;&gt;Josh
Branchaud&lt;/a&gt; do this I&amp;rsquo;ve thought it was a great idea. I&amp;rsquo;m not keen on
categorizing TILs using directories and manually keeping an index though.&lt;/p&gt;
&lt;p&gt;I like the pureness of just having documents stored as a collection of
Markdown documents in directories, but without any metadata stored against the
files it&amp;rsquo;s hard to do tagging.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m considering storing TILs as Markdown but with &lt;a href=&#34;https://gohugo.io/content-management/front-matter/&#34;&gt;frontmatter&lt;/a&gt; that Hugo can
read and build, but keeping the documents separate from the build. One way to
achieve this that I stumbled upon is using an orphaned branch in Git which
shares no history with other branches. This allows having one branch for
content only and one for the build tool setup, in this case Hugo.&lt;/p&gt;
&lt;p&gt;You can create an orphaned branch like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git checkout --orphan &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I&amp;rsquo;ll explore this idea soon.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 4: Bye bye comfort. Hello Hugo.</title>
      <link>https://elver.me/weeknotes/4-bye-bye-comfort-hello-hugo/</link>
      <pubDate>Sun, 25 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/4-bye-bye-comfort-hello-hugo/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Slight cheat, this was started last week, which is how you&amp;rsquo;re able to read
this - but it has continued into this week so I think I&amp;rsquo;m off the hook. This
site is built using &lt;a href=&#34;https://gohugo.io&#34;&gt;Hugo&lt;/a&gt;. The amount of static site generators these
days is crazy. Choosing is very difficult so I ended up with Hugo because 1)
it&amp;rsquo;s a single binary that should continue to work for many years; 2) speed,
it&amp;rsquo;s very quick to build; and 3) it&amp;rsquo;s well supported.&lt;/p&gt;
&lt;p&gt;The templating is a bit weird, but ok for my basic needs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Speaking of websites&amp;hellip;I am using &lt;a href=&#34;https://www.netlify.com&#34;&gt;Netlify&lt;/a&gt; to host the site. I have
been slow to adopt the various &amp;ldquo;Jamstack&amp;rdquo; offerings, but so far I&amp;rsquo;m impressed.
Anecdotally I don&amp;rsquo;t think that Netlify is &lt;em&gt;quite&lt;/em&gt; as fast as one of my other
sites hosted on Amazon S3/CloudFront but it&amp;rsquo;s still very quick, and deployment
is easier. I really appreciate Netlify&amp;rsquo;s ability to preview pull requests and
branches, lovely stuff.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;/weeknotes/3-office-furniture-and-javascript/&#34;&gt;The chair&lt;/a&gt; arrived. Not sure what I think about it. I have spent
most of a week sitting in it, and I don&amp;rsquo;t love it. I probably &lt;em&gt;should&lt;/em&gt; love it
for the amount of money it cost. Current plan is to return it. And the search
continues again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was pleased to see that the Phoenix team are &lt;a href=&#34;https://twitter.com/josevalim/status/1417017859847475201&#34;&gt;moving away from using
webpack&lt;/a&gt; as the default and switching to &lt;a href=&#34;https://github.com/evanw/esbuild&#34;&gt;esbuild&lt;/a&gt;. A lot of
their &lt;a href=&#34;https://twitter.com/chris_mccord/status/1417177471502503936&#34;&gt;support issues are related to webpack&lt;/a&gt;, which is extremely
unsurprising considering how hard webpack is to configure for even the most
basic needs, so it&amp;rsquo;s hard to argue with their reasoning. I haven&amp;rsquo;t used
esbuild but I&amp;rsquo;ve heard reports that it&amp;rsquo;s good so I&amp;rsquo;m interested to see where
it leads.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 3: Office furniture and JavaScript</title>
      <link>https://elver.me/weeknotes/3-office-furniture-and-javascript/</link>
      <pubDate>Sun, 18 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/3-office-furniture-and-javascript/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I ordered a new &lt;a href=&#34;https://eugaming.hermanmiller.com/products/embody-gaming-chair&#34;&gt;office chair&lt;/a&gt; this week. It&amp;rsquo;s been a long time coming.
I&amp;rsquo;ve been considering, researching, investigating, and thinking about buying a
new chair for a few years now. Considering that my current chair is held in
the up position using a piece of uPVC pipe I think this is necessary.  It has
a 14 day &amp;ldquo;no-hassle&amp;rdquo; returns policy so I decided to take the plunge and try it
for a few days.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been writing JavaScript this week. It&amp;rsquo;s been a while since I&amp;rsquo;ve done so,
so it&amp;rsquo;s been good|bad|terrible to be refreshing what I already know and also
learning some new things. I wrote some tests using &lt;a href=&#34;https://jestjs.io&#34;&gt;Jest&lt;/a&gt; and extended a
&lt;a href=&#34;https://koajs.com&#34;&gt;Koa&lt;/a&gt; based REST API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redis has always been a dumb cache to me. I suspect that is the way most
people use it - hook your app up and let it sit there being fast.  However, my
current project has greater needs than a simple cache.  We&amp;rsquo;re storing results
from a streaming API and will need to pull the data out again sorted by
timestamp. &lt;a href=&#34;https://redis.io/topics/data-types#sorted-sets&#34;&gt;Sorted sets&lt;/a&gt; seem to be just the ticket so I&amp;rsquo;ve been
investigating how they work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 2: GitHub Actions Action</title>
      <link>https://elver.me/weeknotes/2-github-actions-action/</link>
      <pubDate>Sun, 11 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/2-github-actions-action/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m writing a lot of docs at the moment. This might strike fear
into some, but I really like it. They really help me to
understand what I&amp;rsquo;m trying to achieve. Communicating ideas with
others forces you to think more deeply about what you&amp;rsquo;re trying
to do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I finished up some Terraform config, and also learnt about &lt;a href=&#34;https://www.terraform.io/docs/language/state/workspaces.html&#34;&gt;Terraform
workspaces&lt;/a&gt; this week. They let you save different state per
workspace. Useful for different environments.  Use of workspaces is encouraged
by some and frowned upon by others. It works for me though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continuing my journey into Docker - I&amp;rsquo;ve been learning about image tagging.
Using the &lt;code&gt;latest&lt;/code&gt; tag with Docker images is very common it seems, but the
behaviour of &lt;code&gt;docker&lt;/code&gt; is a bit odd. If you &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; specify any tag then your
image will get &lt;code&gt;latest&lt;/code&gt; by default. This is problematic if you rely on
&lt;code&gt;latest&lt;/code&gt; to pull your images into production as it&amp;rsquo;s very easy to not get the
image you thought you were getting. It&amp;rsquo;s probably worth tagging your images
with a specific tag and relying on that to save yourself potential future
headaches.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Weeknotes 1: Let&#39;s Begin</title>
      <link>https://elver.me/weeknotes/1-let-s-begin/</link>
      <pubDate>Sun, 04 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/weeknotes/1-let-s-begin/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It appears that I&amp;rsquo;m now doing weeknotes. My goal throughout 2020 was to blog
more. I set myself a target of one post per month to try and break down my
perfectionism. It didn&amp;rsquo;t need to be perfect, I just needed to write something.
I&amp;rsquo;m glad that I managed to accomplish it, but I don&amp;rsquo;t feel like I&amp;rsquo;ve formed
the habit to share, which was ultimately the real goal. I&amp;rsquo;m hoping the more
informal and regular nature of weeknotes will form a habit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve been learning lots of new things recently - Docker, Terraform, Google
Cloud. This is great! I&amp;rsquo;m feel that I&amp;rsquo;ve languished for quite a while -
imposter syndrome is bad, and I&amp;rsquo;ve realised over time that I&amp;rsquo;m happiest when
I&amp;rsquo;m learning. The trick is finding a working environment that allows learning
without stress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As mentioned above I&amp;rsquo;ve become a devops expert, but which I mean I have some
small amount of Docker, Terraform, and Google Cloud knowledge now. Still,
having done very little with &amp;ldquo;the cloud&amp;rdquo; it&amp;rsquo;s been a big learning experience
and I&amp;rsquo;ve enjoyed it. Don&amp;rsquo;t let anyone tell you its easier than Heroku though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I met up with some work colleagues in a beer garden this week. It was strange
to be amongst people.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Running custom Ruby with Cypress</title>
      <link>https://elver.me/blog/running-custom-ruby-with-cypress/</link>
      <pubDate>Fri, 30 Apr 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/running-custom-ruby-with-cypress/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using &lt;a href=&#34;https://www.cypress.io&#34;&gt;Cypress&lt;/a&gt; on a recent project to do end-to-end testing.
From the brief introduction I&amp;rsquo;ve had so far, I&amp;rsquo;m impressed. The debugging
experience seems like it&amp;rsquo;s going to be considerably better than with tests
written using &lt;a href=&#34;https://github.com/teamcapybara/capybara&#34;&gt;Capybara&lt;/a&gt;. Capybara is great, but Cypress&amp;rsquo;s visual
debugging is hard to compete against.&lt;/p&gt;
&lt;h2 id=&#34;running-custom-ruby&#34;&gt;Running custom Ruby&lt;/h2&gt;
&lt;p&gt;This project uses &lt;a href=&#34;https://github.com/shakacode/cypress-on-rails&#34;&gt;CypressOnRails&lt;/a&gt; to build a bridge between
tests running within Cypress and Ruby-land, where the Rails app lives. In one
particular test I wanted to turn a feature switch on and off (using
&lt;a href=&#34;https://github.com/jnunemaker/flipper&#34;&gt;Flipper&lt;/a&gt;). This required me calling some Ruby code from the Cypress
test.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Flipper&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;enable(&lt;span style=&#34;color:#990073&#34;&gt;:new_feature&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is possible through &lt;code&gt;cy.appEval&lt;/code&gt; added by CypressOnRails.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;it(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;Tests something with a feature switch turned on&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cy.appEval(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Flipper.enable(:new_feature)&amp;#34;&lt;/span&gt;).then(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cy.visit(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;/a/page&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// select some elements
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// assert some things
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;making-it-reusable&#34;&gt;Making it reusable&lt;/h2&gt;
&lt;p&gt;Cypress supports adding functions that can be re-used inside the
&lt;code&gt;spec/cypress/support/commands.js&lt;/code&gt; file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Cypress.Commands.add(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;enableFeature&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt; (flag) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cy.appEval(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;Flipper.enable(:&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;+&lt;/span&gt; flag &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;)&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Cypress.Commands.add(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;disableFeature&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt; (flag) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cy.appEval(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;Flipper.disable(:&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;+&lt;/span&gt; flag &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;)&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we can call these functions throughout all our tests.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;it(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;Tests something with a feature switch turned on&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cy.enableFeature(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;new_feature&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Turn it on
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cy.visit(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;/a/page&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// select some elements
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// assert some things
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cy.disableFeature(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;new_feature&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Turn it off again
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>TIL about Markdown reference style links</title>
      <link>https://elver.me/blog/til-about-markdown-reference-style-links/</link>
      <pubDate>Sat, 13 Mar 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/til-about-markdown-reference-style-links/</guid>
      <description>&lt;p&gt;After years of writing Markdown I only recently discovered that you can use any
identifier in a reference style link. I had made the incorrect assumption that
the identifier &lt;em&gt;had&lt;/em&gt; to be a number, but no!&lt;/p&gt;
&lt;h2 id=&#34;before&#34;&gt;Before&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[I am an example link][1]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[1]: https://example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;after&#34;&gt;After&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[I am an example link][example]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[example]: https://example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve spent a long time re-ordering/numbering my reference links in the past but
that should no longer be necessary.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Converting ebook formats with ebook-convert</title>
      <link>https://elver.me/blog/converting-ebook-formats-with-ebook-convert/</link>
      <pubDate>Sun, 28 Feb 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/converting-ebook-formats-with-ebook-convert/</guid>
      <description>&lt;p&gt;I need to convert between ebook formats on a regular basis so that I can read
them on my Kindle, and I prefer to do this on the command line as it&amp;rsquo;s quicker
and easier.&lt;/p&gt;
&lt;p&gt;I found a utility called &lt;code&gt;ebook-convert&lt;/code&gt; that comes included as part of
&lt;a href=&#34;https://calibre-ebook.com&#34;&gt;Calibre&lt;/a&gt;, the ebook management behemouth, and it suits the task
superbly.  It&amp;rsquo;s a shame to have to install such a big application to get access
to a small utility, but I do sometimes use the metadata editing features of
Calibre, so it&amp;rsquo;s a price I&amp;rsquo;m willing to pay.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s very easy to use and hasn&amp;rsquo;t failed me up to now.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ebook-convert *.epub .mobi &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# from epub to mobi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ebook-convert *.mobi .epub &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# from mobi to epub&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Other formats are also supported.&lt;/p&gt;
&lt;p&gt;Installable on macOS using &lt;code&gt;brew install calibre&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You might want to link the &lt;code&gt;ebook-convert&lt;/code&gt; binary to &lt;code&gt;/usr/local/bin&lt;/code&gt; for easier
usage after installation: &lt;code&gt;ln -s /Applications/calibre.app/Contents/MacOS/ebook-convert /usr/local/bin/ebook-convert&lt;/code&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Combine PDFs on the command line with pdfunite</title>
      <link>https://elver.me/blog/combine-pdfs-on-the-command-line-with-pdfunite/</link>
      <pubDate>Sat, 30 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/combine-pdfs-on-the-command-line-with-pdfunite/</guid>
      <description>&lt;p&gt;I often need a quick way to combine PDF pages into a single file. I&amp;rsquo;ve used
macOS&amp;rsquo;s Preview in the past but found it clunky so I went looking for a command
line alternative.&lt;/p&gt;
&lt;p&gt;There seem to be many ways to do this, but I&amp;rsquo;ve found the &lt;code&gt;pdfunite&lt;/code&gt; utility
to be the least friction method for me.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pdfunite file1.pdf file2.pdf destination.pdf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Files are combined in the order you supply them in the arguments.&lt;/p&gt;
&lt;p&gt;Thankfully &lt;code&gt;pdfunite&lt;/code&gt; is easily installable on macOS, as part of the
&lt;a href=&#34;https://poppler.freedesktop.org/&#34;&gt;Poppler&lt;/a&gt; project, using &lt;code&gt;brew install poppler&lt;/code&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Project specific .gemrc files using the GEMRC environment variable</title>
      <link>https://elver.me/blog/project-specific-gemrc-files-using-the-gemrc-environment-variable/</link>
      <pubDate>Sun, 06 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/project-specific-gemrc-files-using-the-gemrc-environment-variable/</guid>
      <description>&lt;p&gt;Recently I needed to add a new &lt;a href=&#34;https://guides.rubygems.org/command-reference/#gem-sources&#34;&gt;source entry&lt;/a&gt; to my &lt;code&gt;.gemrc&lt;/code&gt; for a
private &lt;a href=&#34;https://rubygems.org/&#34;&gt;RubyGems&lt;/a&gt; server. I &lt;a href=&#34;https://github.com/jordelver/dotfiles/blob/master/gemrc&#34;&gt;commit my &lt;code&gt;.gemrc&lt;/code&gt; to
Git&lt;/a&gt;, so this was a problem.  Not only because I don&amp;rsquo;t want
project specific changes cluttering up my &lt;code&gt;.gemrc&lt;/code&gt; (I don&amp;rsquo;t), but also because
the URL of the source contains secrets that shouldn&amp;rsquo;t be shared.&lt;/p&gt;
&lt;p&gt;My default &lt;code&gt;gemrc&lt;/code&gt; &lt;code&gt;:sources:&lt;/code&gt; entry looked like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#555&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000080&#34;&gt;:sources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- https://rubygems.org&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There doesn&amp;rsquo;t seem to be a supported way to have per-project &lt;code&gt;.gemrc&lt;/code&gt; files but
you &lt;em&gt;can&lt;/em&gt; &lt;a href=&#34;http://www.soulcutter.com/articles/hiding-gemrc-credentials-in-dotfiles.html&#34;&gt;override the file using the &lt;code&gt;GEMRC&lt;/code&gt;&lt;/a&gt;
environment variable. So if you can set a per-project &lt;code&gt;GEMRC&lt;/code&gt; environment
variable, you &lt;em&gt;can&lt;/em&gt; have a per-project &lt;code&gt;.gemrc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&#34;https://direnv.net/&#34;&gt;&lt;code&gt;direnv&lt;/code&gt;&lt;/a&gt; to set environment variables for my projects by
creating a &lt;code&gt;.envrc&lt;/code&gt; file in each of my project directories. So I can also use
that here. I just add a line like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;GEMRC&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;path/to/project/specific/gemrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And in that file I add the extra key to &lt;code&gt;:sources:&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#555&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000080&#34;&gt;:sources&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- https://rubygems.org&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;- https://user:pass@custom.gem.server&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I need to add the original &lt;code&gt;https://rubygems.org&lt;/code&gt; source too because although
the &lt;code&gt;~/.gemrc&lt;/code&gt; will still be read, the keys in the project specific file will
replace any keys with the same name completely - they are not merged. You can
see what values &lt;code&gt;gem&lt;/code&gt; is using by running &lt;code&gt;gem environment&lt;/code&gt;. Great for
debugging.&lt;/p&gt;
&lt;p&gt;I think using &lt;code&gt;GEMRC&lt;/code&gt; for this purpose is a reasonable workaround for
per-project &lt;code&gt;.gemrc&lt;/code&gt; files.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Vim plugins don&#39;t have to be hard</title>
      <link>https://elver.me/blog/vim-plugins-dont-have-to-be-hard/</link>
      <pubDate>Fri, 20 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/vim-plugins-dont-have-to-be-hard/</guid>
      <description>&lt;p&gt;When pairing on something I will often insert &lt;a href=&#34;https://docs.github.com/en/free-pro-team@latest/github/committing-changes-to-your-project/creating-a-commit-with-multiple-authors#creating-co-authored-commits-on-the-command-line&#34;&gt;GitHub coauthorship
information&lt;/a&gt; into a commit by adding &lt;code&gt;Co-authored-by: name &amp;lt;name@example.com&amp;gt;&lt;/code&gt; to the bottom of a commit message. Both parties then get
credit for the work.  However, it&amp;rsquo;s a bit tedious to do this manually.&lt;/p&gt;
&lt;p&gt;I went looking for a solution that could be triggered from within Vim and &lt;a href=&#34;https://github.com/maxjacobson/vim-fzf-coauthorship&#34;&gt;found
this nice little plugin&lt;/a&gt;. It gives you a command
&lt;code&gt;:Coauthorship&lt;/code&gt; which when run will show a list of Git repo contributors from
whom you can choose using the &lt;code&gt;fzf&lt;/code&gt; fuzzy finder. It&amp;rsquo;s really neat, and does
exactly what I was looking for.&lt;/p&gt;
&lt;p&gt;Here is the Vimscript in its entirety.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-vimscript&#34; data-lang=&#34;vimscript&#34;&gt;function! AttributeCoauthorship(nameAndEmail)
  let attribution = &amp;#34;Co-authored-by: &amp;#34; . a:nameAndEmail
  silent put =attribution
endfunction

function! Coauthorship()
  call fzf#run({
    \ &amp;#39;source&amp;#39;: &amp;#39;git log --pretty=&amp;#34;%an &amp;lt;%ae&amp;gt;&amp;#34; | sort | uniq&amp;#39;,
    \ &amp;#39;sink&amp;#39;: function(&amp;#39;AttributeCoauthorship&amp;#39;),
    \ &amp;#39;options&amp;#39;: &amp;#34;--preview &amp;#39;git log -1 --author {} --pretty=\&amp;#34;authored %h %ar:%n%n%B\&amp;#34;&amp;#39;&amp;#34;
    \ })
endfunction

command! Coauthorship call Coauthorship()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;What struck me is just how little code it takes to get something like this
working. Of course, it&amp;rsquo;s relying on external programs (&lt;code&gt;git&lt;/code&gt;, &lt;code&gt;sort&lt;/code&gt;, &lt;code&gt;uniq&lt;/code&gt;)
and libraries (the &lt;code&gt;fzf&lt;/code&gt; vim plugin code), but the &lt;em&gt;plumbing&lt;/em&gt; to compose this
is small, concise, and easy to build upon. It feels like the unix philosophy in
action.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve never gone as far as programming my editor for fear of thinking &amp;ldquo;this
isn&amp;rsquo;t for me, its too hard&amp;rdquo; but this plugin has got me thinking that it &lt;em&gt;might
just&lt;/em&gt; be for me after all.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>RSpec-like doc format output in Elixir tests</title>
      <link>https://elver.me/blog/rspec-like-doc-format-output-in-elixir-tests/</link>
      <pubDate>Sat, 24 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/rspec-like-doc-format-output-in-elixir-tests/</guid>
      <description>&lt;p&gt;When running RSpec tests &lt;a href=&#34;https://relishapp.com/rspec/rspec-core/v/3-9/docs/command-line/format-option&#34;&gt;you can pass a &lt;code&gt;--format&lt;/code&gt; flag&lt;/a&gt; to &lt;code&gt;rspec&lt;/code&gt;
to format test output in a more verbose style. The default output looks like this.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;....F.....*.....
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you pass &lt;code&gt;--format documentation&lt;/code&gt; it will look more like this.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;something
  does something that passes
  does something that fails (FAILED - 1)
  does something that is pending (PENDING: Not Yet Implemented)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I find this output really helpful. It helps to visualise the &lt;em&gt;shape&lt;/em&gt; of the
tests, and guides naming because you can see the visual hierarchy of how things
fit together.&lt;/p&gt;
&lt;h2 id=&#34;elixir-and-exunit&#34;&gt;Elixir and ExUnit&lt;/h2&gt;
&lt;p&gt;You can achieve a very similar result to RSpec by passing &lt;code&gt;--trace&lt;/code&gt; to &lt;code&gt;mix test&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mix test --trace

TestApp.TimeDateHelper
  * test relative_format/1 single hour, multiple minutes (0.00ms)
  * test relative_format/1 greater than an hour (0.00ms)
  * test relative_format/1 less than a minute (0.00ms)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can make this change across the whole test suite by changing the call to
&lt;code&gt;ExUnit.start/1&lt;/code&gt; to include a trace option. This is usually in your
&lt;code&gt;test/test_helper.exs&lt;/code&gt; file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;ExUnit&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;start(&lt;span style=&#34;color:#990073&#34;&gt;trace&lt;/span&gt;: &lt;span style=&#34;color:#008080&#34;&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Be aware though, this might not be what you want. From &lt;a href=&#34;https://hexdocs.pm/ex_unit/ExUnit.html#configure/1-options&#34;&gt;the ExUnit
docs&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote style=&#34;text-align: left; margin: 0;&#34;&gt;
  &lt;p style=&#34;margin: 0;&#34;&gt;
    ...sets ExUnit into trace mode, &lt;strong&gt;this sets :max_cases to 1&lt;/strong&gt;
    and prints each test case and test while running...
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Setting &lt;code&gt;trace: true&lt;/code&gt; will also set &lt;code&gt;max_cases: 1&lt;/code&gt; which will reduce the amount
of tests that are run in parallel.&lt;/p&gt;
&lt;p&gt;So this could slow down your test suite. Be careful!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using gitattributes to improve git output</title>
      <link>https://elver.me/blog/gitattributes/</link>
      <pubDate>Wed, 30 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/gitattributes/</guid>
      <description>&lt;p&gt;From the git man page:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A gitattributes file is a simple text file that gives attributes to pathnames.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://www.git-scm.com/docs/gitattributes&#34;&gt;&lt;code&gt;gitattributes&lt;/code&gt;&lt;/a&gt; allows you to tell git that files should be
treated in certain ways. You can use git attributes to apply various attributes
but we&amp;rsquo;re focussing on &lt;code&gt;diff&lt;/code&gt;. For example, this tells git that files ending in
&lt;code&gt;*.ex&lt;/code&gt; should be treated as Elixir code during diff operations.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;*.ex diff=elixir
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I couldn&amp;rsquo;t get the standard &lt;code&gt;~/.gitattributes&lt;/code&gt; file location to work for me so I
decided to take this opportunity to standardise all my git config under
&lt;code&gt;~/.config/git&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt; You can use &lt;a href=&#34;https://www.git-scm.com/docs/git-check-attr&#34;&gt;&lt;code&gt;git check-attr --all -- path/to/file&lt;/code&gt;&lt;/a&gt; to
check which attributes are applying to a file. This is very useful during setup.&lt;/p&gt;
&lt;p&gt;So what effect does this have?&lt;/p&gt;
&lt;h2 id=&#34;hunk-output&#34;&gt;Hunk output&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a simple example. On line 5 we can see a change, but that isn&amp;rsquo;t the
important part. The interesting difference is what&amp;rsquo;s shown on line 1 after the
filename. In this case it&amp;rsquo;s &lt;code&gt;defmodule TestWeb.ListController&lt;/code&gt; which in the
Elixir &lt;strong&gt;module&lt;/strong&gt; in which the change has been made.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-patch&#34; data-lang=&#34;patch&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa&#34;&gt;@ path/to/file.ex:25 @ defmodule TestWeb.ListController do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa&#34;&gt;&lt;/span&gt;     {:ok, _list} = Lists.delete_list(list)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     conn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    |&amp;gt; put_flash(:info, &amp;#34;List deleted successfully.&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;-    |&amp;gt; put_flash(:info, &amp;#34;List deleted successfully&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;&lt;/span&gt;     |&amp;gt; redirect(to: Routes.list_path(conn, :index))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   end
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we add &lt;code&gt;*.ex diff=elixir&lt;/code&gt; to the attributes file we see &lt;code&gt;def delete(conn, %{&amp;quot;id&amp;quot; =&amp;gt; id})&lt;/code&gt;, which is the &lt;strong&gt;function&lt;/strong&gt; containing the change. Far more
specific.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-patch&#34; data-lang=&#34;patch&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa&#34;&gt;@ path/to/file.ex:25 @ def delete(conn, %{&amp;#34;id&amp;#34; =&amp;gt; id}) do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa&#34;&gt;&lt;/span&gt;     {:ok, _list} = Lists.delete_list(list)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     conn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    |&amp;gt; put_flash(:info, &amp;#34;List deleted successfully.&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;-    |&amp;gt; put_flash(:info, &amp;#34;List deleted successfully&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;&lt;/span&gt;     |&amp;gt; redirect(to: Routes.list_path(conn, :index))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   end
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;--function-context&#34;&gt;&amp;ndash;function-context&lt;/h2&gt;
&lt;p&gt;Adding this setting also changes the way that
&lt;a href=&#34;https://www.git-scm.com/docs/git-diff#Documentation/git-diff.txt---function-context&#34;&gt;&lt;code&gt;--function-context&lt;/code&gt;&lt;/a&gt; works. What is &lt;code&gt;--function-context&lt;/code&gt;? It
can be passed to &lt;code&gt;git diff&lt;/code&gt; (and other subcommands) and will show the full
change in the full context of where the change has been made.  By default this
means it will show the &lt;em&gt;full&lt;/em&gt; module, which is probably not what you want most
of the time.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-patch&#34; data-lang=&#34;patch&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa&#34;&gt;@ path/to/file.ex:25 @ def delete(conn, %{&amp;#34;id&amp;#34; =&amp;gt; id}) do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa&#34;&gt;&lt;/span&gt; defmodule TestWeb.ListController do
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   use TestWeb, :controller
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   # ...other functions removed for brevity
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   def delete(conn, %{&amp;#34;id&amp;#34; =&amp;gt; id}) do
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     list = Lists.get_list!(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     {:ok, _list} = Lists.delete_list(list)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     conn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    |&amp;gt; put_flash(:info, &amp;#34;List deleted successfully.&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;-    |&amp;gt; put_flash(:info, &amp;#34;List deleted successfully&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;&lt;/span&gt;     |&amp;gt; redirect(to: Routes.list_path(conn, :index))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   end
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, with the change to &lt;code&gt;gitattributes&lt;/code&gt;, the &amp;ldquo;function context&amp;rdquo; becomes the
&lt;em&gt;actual&lt;/em&gt; function.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-patch&#34; data-lang=&#34;patch&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa&#34;&gt;@ path/to/file.ex:25 @ def delete(conn, %{&amp;#34;id&amp;#34; =&amp;gt; id}) do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa&#34;&gt;&lt;/span&gt;   def delete(conn, %{&amp;#34;id&amp;#34; =&amp;gt; id}) do
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     list = Lists.get_list!(id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     {:ok, _list} = Lists.delete_list(list)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     conn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+    |&amp;gt; put_flash(:info, &amp;#34;List deleted successfully.&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;-    |&amp;gt; put_flash(:info, &amp;#34;List deleted successfully&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;&lt;/span&gt;     |&amp;gt; redirect(to: Routes.list_path(conn, :index))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   end
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s strange that a lot of the available &lt;code&gt;gitattibutes&lt;/code&gt; are not defaults in git.
But with a few simple tweaks you can get more useful git output.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to get a list of filenames from a Plex playlist</title>
      <link>https://elver.me/blog/how-to-get-a-list-of-filenames-from-a-plex-playlist/</link>
      <pubDate>Mon, 31 Aug 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/how-to-get-a-list-of-filenames-from-a-plex-playlist/</guid>
      <description>&lt;p&gt;I recently wanted to delete some files from my Plex server. Plex has a feature
to allow deleting of files through the web interface, but it makes me feel
slightly uneasy having that feature turned on due to security concerns, so I
chose to keep it off, and for this one-off task I decided to delete the files
manually.&lt;/p&gt;
&lt;p&gt;I needed a list of filenames so I started by adding all the files I wanted to
delete to a playlist called &amp;ldquo;To Delete&amp;rdquo;. Plex uses a SQLite database to store
metadata. This is what I used to get the information from the playlist.&lt;/p&gt;
&lt;p&gt;Connect to the SQLite database like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sqlite3 &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Plug-in Support/Databases/com.plexapp.plugins.library.db&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can then list all playlists. The &lt;code&gt;15&lt;/code&gt; in &lt;code&gt;metadata_type = 15&lt;/code&gt; is for
playlists.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sqlite&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;select&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;title&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;metadata_items&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;where&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;metadata_type&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;15&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can see that the output includes the &amp;ldquo;To Delete&amp;rdquo; playlist.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Christmas
Pixar
Comedy classics
Star Wars
To Delete
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ideally, we&amp;rsquo;d like a list of filenames in a text file. This makes it easy to
process later. The &lt;code&gt;sqlite&lt;/code&gt; client has a &lt;code&gt;.output&lt;/code&gt; command that allows you to
redirect output from queries to an external file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sqlite&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;.&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;output&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;files&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;to&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;delete&lt;/span&gt;.txt&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When we run subsequent queries, the output will end up in &lt;code&gt;files-to-delete.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now, we can run a query to get a list of filenames. I won&amp;rsquo;t pretend to
understand the whole structure of this query, but it works for me. Thanks to
&lt;a href=&#34;https://www.reddit.com/r/PleX/comments/3cbku8/export_list_of_file_paths_in_a_plex_playlist_for/&#34;&gt;this Reddit thread&lt;/a&gt;. Note the &lt;code&gt;where metadata_items.title = &#39;To Delete&#39;&lt;/code&gt; clause where we specify the playlist name.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sqlite&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;select&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;file&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;from&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;media_parts&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;outer&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;join&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;media_items&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;on&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;media_items.id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;media_parts.media_item_id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;outer&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;join&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;play_queue_generators&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;on&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;play_queue_generators.metadata_item_id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;media_items.metadata_item_id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;left&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;outer&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;join&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;metadata_items&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;on&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;metadata_items.id&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;play_queue_generators.playlist_id&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;where&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;metadata_items.title&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;To Delete&amp;#39;&lt;/span&gt;;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;files-to-delete.txt&lt;/code&gt; file now contains a list of filenames for the movies
on the &amp;ldquo;To Delete&amp;rdquo; playlist. We can now use that list to delete the files. In my
case, I used a loop in fish shell.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;for&lt;/span&gt; f in &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;cat files-to-delete.txt&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  rm -i -v &lt;span style=&#34;color:#008080&#34;&gt;$f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are certainly many ways to do this, but this is how I did it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Renaming files Vim-style</title>
      <link>https://elver.me/blog/renaming-files-vim-style/</link>
      <pubDate>Sun, 12 Jul 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/renaming-files-vim-style/</guid>
      <description>&lt;p&gt;I’ve &lt;a href=&#34;/blog/renaming-files-like-a-pro/&#34;&gt;previously written about renaming files&lt;/a&gt; with the &lt;code&gt;rename&lt;/code&gt;
utility.  &lt;code&gt;rename&lt;/code&gt; uses sed-like syntax with regular expressions to rename
files, which are very powerful, but can be a bit tricky to get right.&lt;/p&gt;
&lt;p&gt;I recently came across &lt;a href=&#34;https://github.com/thameera/vimv&#34;&gt;vimv&lt;/a&gt;, which is a utility (written in bash) to
let you use the full power of Vim to rename files. As a vim user being able to
use the same patterns I would use when writing code is very appealing.&lt;/p&gt;
&lt;script id=&#34;asciicast-RfVtJfuoplCMZd50vESXbOAFR&#34;
src=&#34;https://asciinema.org/a/RfVtJfuoplCMZd50vESXbOAFR.js&#34; async&gt;&lt;/script&gt;
&lt;p&gt;It&amp;rsquo;s a great idea, and it turns out that this is also not a new idea. Many other
tools have very similar abilities as pointed out by many great &lt;a href=&#34;https://twitter.com/MasteringVim/status/1270720407272738818&#34;&gt;replies to the
original tweet&lt;/a&gt;. Some of tools that offer this ability
include (in order of discovery) the aforementioned vimv; three different file
managers: &lt;a href=&#34;https://github.com/ranger/ranger&#34;&gt;ranger&lt;/a&gt;, &lt;a href=&#34;https://github.com/jarun/nnn&#34;&gt;nnn&lt;/a&gt;, and &lt;a href=&#34;https://github.com/vifm/vifm&#34;&gt;vifm&lt;/a&gt;; &lt;a href=&#34;https://github.com/trapd00r/vidir&#34;&gt;vidir&lt;/a&gt;; and
&lt;a href=&#34;http://www.nongnu.org/renameutils/&#34;&gt;qmv&lt;/a&gt;, from renameutils (around since 2001!).&lt;/p&gt;
&lt;script id=&#34;asciicast-Scwm0G1Qc70AgaOKhiHdezKSr&#34;
src=&#34;https://asciinema.org/a/Scwm0G1Qc70AgaOKhiHdezKSr.js&#34; async&gt;&lt;/script&gt;
&lt;p&gt;We are spoilt for choice! I already use &lt;code&gt;nnn&lt;/code&gt; so I will be making use of it&amp;rsquo;s
&amp;ldquo;batch rename&amp;rdquo; feature on my file server. For other cases I think I&amp;rsquo;ll be
reaching for &lt;code&gt;qmv&lt;/code&gt; as it&amp;rsquo;s very mature, and simple to use. Try out one that
works for you.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Get video URLs from a YouTube playlist</title>
      <link>https://elver.me/blog/get-video-urls-from-a-youtube-playlist/</link>
      <pubDate>Thu, 11 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/get-video-urls-from-a-youtube-playlist/</guid>
      <description>&lt;p&gt;I wanted to make my own list of YouTube video URLs today, and as far as I can
tell, YouTube doesn&amp;rsquo;t let you do that. The excellent tool
&lt;a href=&#34;https://github.com/ytdl-org/youtube-dl&#34;&gt;&lt;code&gt;youtube-dl&lt;/code&gt;&lt;/a&gt; came to the rescue, along with a post on
&lt;a href=&#34;https://askubuntu.com/questions/1090510/how-to-download-a-playlist-without-the-videos&#34;&gt;askubuntu&lt;/a&gt; that combines it with &lt;code&gt;jq&lt;/code&gt; and &lt;code&gt;sed&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I wanted to output the video URLs &lt;em&gt;and&lt;/em&gt; the titles, and it turns out this can be
achieved with &lt;code&gt;jq&lt;/code&gt; on it&amp;rsquo;s own. I changed the &lt;code&gt;jq&lt;/code&gt; portion and the final
commandline looks like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;youtube-dl --dump-json --flat-playlist &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;https://www.youtube.com/playlist?list=PL46-cKSxMYYCMpzXo6p0Cof8hJInYgohU&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  | jq -r &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;&amp;#34;\(.title)\nhttps://youtu.be/\(.id)\n&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This outputs something like:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Vim Un-Alphabet 01: Teaser
https://youtu.be/7LDlUMMbv6k

Vim Un-Alphabet 02: Help
https://youtu.be/ZTCzWRqR_us

Vim Un-Alphabet 03: Tilde
https://youtu.be/5jMiYtXz2QA
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Of course, we can pipe the result of this to a file by appending &lt;code&gt; &amp;gt; result.txt&lt;/code&gt;
or, in my case, straight to the clipboard with &lt;code&gt; | pbcopy&lt;/code&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Fixing commits with git commit --fixup and git rebase --autosquash</title>
      <link>https://elver.me/blog/fixing-commits-with-git-commit-fixup-and-git-rebase-autosquash/</link>
      <pubDate>Thu, 04 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/fixing-commits-with-git-commit-fixup-and-git-rebase-autosquash/</guid>
      <description>&lt;p&gt;The way I like to make changes in response to a PR review is to make any fixes
to the original commits using a rebase. I don&amp;rsquo;t want commits that &amp;ldquo;fix typos&amp;rdquo; in
my history, especially at the feature branch level. There are varying opinions
and approaches to this, but I think rebasing is great tool when used on your &lt;em&gt;own&lt;/em&gt;
branches and in moderation.&lt;/p&gt;
&lt;p&gt;Standard procedure for this is - 1) Make the code change; 2) Commit the change;
3) Start an interactive rebase; 4) Identify the commit that needs fixing; 5)
Move the new commit underneath it; 6) Change it to &amp;ldquo;squash&amp;rdquo;. It&amp;rsquo;s quite tedious.&lt;/p&gt;
&lt;h2 id=&#34;fixup-commits&#34;&gt;Fixup commits&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---fixupltcommitgt&#34;&gt;Fixup commits&lt;/a&gt; are created using &lt;code&gt;git commit --fixup &amp;lt;SHA&amp;gt;&lt;/code&gt;.
Practically, &lt;code&gt;--fixup&lt;/code&gt; associates a new commit with an existing commit so that
when you do an interactive rebase, you don&amp;rsquo;t have to re-order any commits in
order to squash them. And you don&amp;rsquo;t have to change any commit messages. From the
docs:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Construct a commit message for use with rebase &amp;ndash;autosquash.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;--autosquash&#34;&gt;&amp;ndash;autosquash?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---autosquash&#34;&gt;&lt;code&gt;--autosquash&lt;/code&gt;&lt;/a&gt; is a flag to use with &lt;code&gt;rebase&lt;/code&gt; and takes everything
a step further. Once you&amp;rsquo;ve committed your changes with &lt;code&gt;git commit --fixup &amp;lt;SHA&amp;gt;&lt;/code&gt; you can start an interactive rebase as normal, but pass the
&lt;code&gt;--autosquash&lt;/code&gt; flag too.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git rebase -i --autosquash master
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now you won&amp;rsquo;t have to do anything, the rebase will automatically take care of
squashing those commits created with &lt;code&gt;--fixup&lt;/code&gt; in the correct order!&lt;/p&gt;
&lt;p&gt;You can have this behaviour by default, which seems safe and sensible, by
setting &lt;code&gt;autosquash = true&lt;/code&gt; in your &lt;code&gt;~/.gitconfig&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[rebase]
  autosquash = true
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;automating-further&#34;&gt;Automating further&lt;/h2&gt;
&lt;p&gt;I use &lt;code&gt;--fixup&lt;/code&gt; so much that I have a helper alias in my &lt;code&gt;~/.gitconfig&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[alias]
  fixup = &amp;#34;!git log -n 50 --pretty=format:&amp;#39;%h %s&amp;#39; --no-merges | fzf | cut -c -7 | xargs -o git commit --fixup&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This lets me type &lt;code&gt;git fixup&lt;/code&gt; and presents a list of my 50 most recent commits
and allows me to search the list using fzf. Once a commit is selected, the SHA
is passed to &lt;code&gt;git commit --fixup&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It works like this:&lt;/p&gt;
&lt;script id=&#34;asciicast-nyRPY9XaPPtC39ihVDgoN3anH&#34;
src=&#34;https://asciinema.org/a/nyRPY9XaPPtC39ihVDgoN3anH.js&#34; async&gt;&lt;/script&gt;
&lt;p&gt;I hope this makes your commit fixing easier!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>History deleting helper for Fish shell</title>
      <link>https://elver.me/blog/history-deleting-helper-for-fish-shell/</link>
      <pubDate>Fri, 29 May 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/history-deleting-helper-for-fish-shell/</guid>
      <description>&lt;p&gt;I &lt;a href=&#34;/blog/deleting-fish-shell-history/&#34;&gt;wrote back in February&lt;/a&gt; about a neat &lt;code&gt;history&lt;/code&gt; command built-in to the Fish
shell that allows you to, amongst other things, delete entries from your
history.&lt;/p&gt;
&lt;p&gt;To recap, you use it like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#0086b3&#34;&gt;history&lt;/span&gt; delete --contains &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;mix echo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#0086b3&#34;&gt;history&lt;/span&gt; search --contains &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;mix echo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; mix echo.migrate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;3&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; mix echo.create
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;4&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; mix echo.reset
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;5&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; mix echo.setup
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter nothing to cancel the delete, or
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter one or more of the entry IDs separated by a space, or
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;all&amp;#34;&lt;/span&gt; to delete all the matching entries.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;I&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; Delete which entries? &amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is really cool, but the only thing missing for me was the ability to
fuzzily find history entries, so I wrote a quick Fish function to combine
&lt;code&gt;history&lt;/code&gt; with &lt;a href=&#34;https://github.com/junegunn/fzf&#34;&gt;&lt;code&gt;fzf&lt;/code&gt;&lt;/a&gt;, my favourite shell program. I also made a small
change to the history command by swapping &lt;code&gt;--contains&lt;/code&gt; for &lt;code&gt;--prefix&lt;/code&gt; which
makes more sense when combined with &lt;code&gt;fzf&lt;/code&gt; as the search is more constrained.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt; dh -d &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Fuzzily delete entries from your history&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#0086b3&#34;&gt;history&lt;/span&gt; | fzf | &lt;span style=&#34;color:#0086b3&#34;&gt;read&lt;/span&gt; -l item; and &lt;span style=&#34;color:#0086b3&#34;&gt;history&lt;/span&gt; delete --prefix &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;$item&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you can type &lt;code&gt;dh&lt;/code&gt; and fuzzily search for history before being dropped into
the interactive prompt as usual.&lt;/p&gt;
&lt;script id=&#34;asciicast-hoIxMqnjYe9qjg4uA46EC0rRG&#34;
src=&#34;https://asciinema.org/a/hoIxMqnjYe9qjg4uA46EC0rRG.js&#34; async&gt;&lt;/script&gt;
</description>
    </item>
    
    <item>
      <title>Protecting Phoenix endpoints with HTTP Basic Auth (on Heroku)</title>
      <link>https://elver.me/blog/protecting-phoenix-endpoints-with-http-basic-auth/</link>
      <pubDate>Fri, 01 May 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/protecting-phoenix-endpoints-with-http-basic-auth/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/phoenixframework/phoenix_live_dashboard&#34;&gt;Phoenix LiveDashboard&lt;/a&gt; was recently officially announced
by &lt;a href=&#34;https://twitter.com/josevalim/status/1250846714665357315&#34;&gt;José Valim&lt;/a&gt;, and I was keen try it out so I
installed it on a toy app I&amp;rsquo;ve been developing, which is deployed to Heroku.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t want my LiveDashboard to be available to the whole world, so the
quickest and easiest method of protecting it was to use HTTP Basic Authentication,
&lt;a href=&#34;https://hexdocs.pm/phoenix_live_dashboard/Phoenix.LiveDashboard.html#module-extra-add-dashboard-access-on-all-environments-including-production&#34;&gt;something that is recommended in the LiveDashboard docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To that end, I installed and configured the &lt;a href=&#34;https://hex.pm/packages/basic_auth&#34;&gt;&lt;code&gt;basic_auth&lt;/code&gt; plug&lt;/a&gt;,
and read the username and password to configure it from environment variables.&lt;/p&gt;
&lt;p&gt;These are the steps I took.&lt;/p&gt;
&lt;h2 id=&#34;install-and-configure&#34;&gt;Install and configure&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Add the &lt;code&gt;basic_auth&lt;/code&gt; plug&lt;/p&gt;
&lt;p&gt;Add &lt;code&gt;basic_auth&lt;/code&gt; to your &lt;code&gt;mix.exs&lt;/code&gt; file&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#990073&#34;&gt;:basic_auth&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;~&amp;gt; 2.2.4&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install dependencies&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mix deps.get
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure &lt;code&gt;basic_auth&lt;/code&gt; from environment variables&lt;/p&gt;
&lt;p&gt;Edit your &lt;code&gt;prod.secret.exs&lt;/code&gt; file and add this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http_basic_auth_username &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;System&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;get_env(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;HTTP_BASIC_AUTH_USERNAME&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;    environment variable HTTP_BASIC_AUTH_USERNAME is missing.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;    &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http_basic_auth_password &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;System&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;get_env(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;HTTP_BASIC_AUTH_PASSWORD&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;||&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;    environment variable HTTP_BASIC_AUTH_PASSWORD is missing.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;    &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# Set basic auth from environment variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config &lt;span style=&#34;color:#990073&#34;&gt;:example_web&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;basic_auth&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#990073&#34;&gt;username&lt;/span&gt;: http_basic_auth_username,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#990073&#34;&gt;password&lt;/span&gt;: http_basic_auth_password,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the router to protect the LiveDashboard routes&lt;/p&gt;
&lt;p&gt;Create a new pipeline that conditionally adds the &lt;code&gt;basic_auth&lt;/code&gt; plug if the
&lt;code&gt;HTTP_BASIC_AUTH_USERNAME&lt;/code&gt; or &lt;code&gt;HTTP_BASIC_AUTH_PASSWORD&lt;/code&gt; are present.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pipeline &lt;span style=&#34;color:#990073&#34;&gt;:protected&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;System&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;get_env(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;HTTP_BASIC_AUTH_USERNAME&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;System&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;get_env(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;HTTP_BASIC_AUTH_PASSWORD&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    plug &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;BasicAuth&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;use_config&lt;/span&gt;: {&lt;span style=&#34;color:#990073&#34;&gt;:example_web&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:basic_auth&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then add &lt;code&gt;:protected&lt;/code&gt; to the pipeline.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scope &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;ExampleWeb&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pipe_through [&lt;span style=&#34;color:#990073&#34;&gt;:browser&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;:protected&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  live_dashboard &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;/dashboard&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set your environment variables on Heroku&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;heroku config:set &lt;span style=&#34;color:#008080&#34;&gt;HTTP_BASIC_AUTH_USERNAME&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;admin &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;                  &lt;span style=&#34;color:#008080&#34;&gt;HTTP_BASIC_AUTH_PASSWORD&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;P@ssword
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now when you visit &lt;code&gt;/dashboard&lt;/code&gt; you should be prompted to enter your username
and password.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>TIL about the @external_resource module attribute in Elixir</title>
      <link>https://elver.me/blog/til-about-the-external-resource-module-attribute-in-elixir/</link>
      <pubDate>Thu, 23 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/til-about-the-external-resource-module-attribute-in-elixir/</guid>
      <description>&lt;p&gt;Today I learnt about the &lt;code&gt;@external_resource&lt;/code&gt; module attribute in &lt;a href=&#34;https://elixir-lang.org/&#34;&gt;Elixir&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From the &lt;a href=&#34;https://hexdocs.pm/elixir/Module.html#module-external_resource&#34;&gt;Module documentation page&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sometimes a module embeds information from an external file. This attribute
allows the module to annotate which external resources have been used.&lt;/p&gt;
&lt;p&gt;Tools like Mix may use this information to ensure the module is recompiled in case any of the external resources change.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;@external_resource&lt;/code&gt; means that you can specify a resource &lt;em&gt;outside&lt;/em&gt; of your
module that will trigger recompilation of your module - basically, it sets up a
dependency between your module and another file.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.oestrich.org/2018/03/elixir-external-resources/&#34;&gt;Eric Oestrich blogged about a real-life use-case&lt;/a&gt; for this feature -
generating functions based on an external &amp;ldquo;translations&amp;rdquo; file. At compile-time
he reads the file and generates functions based on it. His post goes into a lot
more depth and has code examples. I recommend giving it a read.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Handling a custom response body with Faraday middleware</title>
      <link>https://elver.me/blog/handling-a-custom-response-body-with-faraday-middleware/</link>
      <pubDate>Fri, 27 Mar 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/handling-a-custom-response-body-with-faraday-middleware/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been working with a REST API recently that returns JSON except for one
particular endpoint. This endpoint returns a plain text response with a
non-standard content type header.&lt;/p&gt;
&lt;p&gt;It looks like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;A:1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP:2213,2214,2215
A:201AGBHDRLQHNHPHKKMPKLGPMDRDTDMVL:3134,3135,3136,3137
U:1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP:2212
U:201AGBHDRLQHNHPHKKMPKLGPMDRDTDMVL:3133
X:2AVDSSBSTSQDRDKBHCNTRTHPNTBGQDTMD:2677,2685,2969,2996,3002
X:1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP:3029,3056
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The output is seat availability for concert venues with colons separating the
fields like so &lt;code&gt;&amp;lt;seat-type&amp;gt;:&amp;lt;band-id&amp;gt;:&amp;lt;seats&amp;gt;&lt;/code&gt;. The problem is that we need to
handle this response explicitly as the default JSON parsing doesn&amp;rsquo;t know what to
do with it.&lt;/p&gt;
&lt;p&gt;The desired output in this case would be like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:seat_type&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:band_id&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:seats&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;2213&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;2214&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;2215&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:seat_type&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:band_id&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;201AGBHDRLQHNHPHKKMPKLGPMDRDTDMVL&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#990073&#34;&gt;:seats&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;3134&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;3135&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;3136&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;3137&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;faraday-middleware&#34;&gt;Faraday Middleware&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;a href=&#34;https://lostisland.github.io/faraday/&#34;&gt;Faraday&lt;/a&gt; as the HTTP client for this project and it has the
concept of middleware. Middleware can apply to requests or responses and are
hooked into the lifecycle of a request.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Faraday is an HTTP client library that provides a common interface over many
adapters (such as Net::HTTP) and &lt;strong&gt;embraces the concept of Rack
middleware when processing the request/response cycle.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This means that we can write a custom middleware to parse the response for our
custom content type, which for the purpose of illustration, we&amp;rsquo;ll call
&lt;code&gt;venue/seats&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;custom-response-middleware&#34;&gt;Custom response middleware&lt;/h2&gt;
&lt;p&gt;First we make sure we have the correct gems.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gem &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;faraday&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;~&amp;gt; 1.0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gem &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;faraday_middleware&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;github&lt;/span&gt;: &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;lostisland/faraday_middleware&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;ref&lt;/span&gt;: &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;e1324ca&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The latest version of &lt;code&gt;faraday_middleware&lt;/code&gt; isn&amp;rsquo;t compatible with Faraday 1.0 as
far as I can tell at the moment, so I pinned the gem to commit &lt;code&gt;e1324c&lt;/code&gt;, which
is. There is a &lt;a href=&#34;https://github.com/lostisland/faraday_middleware/releases/tag/v1.0.0.rc1&#34;&gt;pre-release version available&lt;/a&gt; at the time
of writing.&lt;/p&gt;
&lt;p&gt;Now we can write a middleware that we will later hook into the request/response
cycle. I&amp;rsquo;m using the &lt;code&gt;ResponseMiddleware&lt;/code&gt; from &lt;a href=&#34;https://github.com/lostisland/faraday_middleware/blob/master/lib/faraday_middleware/response_middleware.rb&#34;&gt;&lt;code&gt;faraday_middleware&lt;/code&gt;&lt;/a&gt;
as it has a neat &lt;code&gt;define_parser&lt;/code&gt; helper which allows us to very easily supply a
parser for &lt;code&gt;venue/seats&lt;/code&gt; content type.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;faraday&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;faraday_middleware&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;faraday_middleware/response_middleware&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# Custom response middleware&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;SeatAvailabilityResponse&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;FaradayMiddleware&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;ResponseMiddleware&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  define_parser &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;body, _&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#008080&#34;&gt;SeatAvailability&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;parse(body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# Register the middleware so we can use it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Faraday&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Response&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;register_middleware(&lt;span style=&#34;color:#990073&#34;&gt;seat_availability&lt;/span&gt;: &lt;span style=&#34;color:#008080&#34;&gt;SeatAvailabilityResponse&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At the bottom you can see that I register this class as a response middleware
called &amp;ldquo;seat_availability&amp;rdquo; using &lt;code&gt;Faraday::Response.register_middleware&lt;/code&gt;. This
allows us to refer to this middleware in the future.&lt;/p&gt;
&lt;h2 id=&#34;response-parsing&#34;&gt;Response parsing&lt;/h2&gt;
&lt;p&gt;I also delegate parsing responsibility to another class, &lt;code&gt;SeatAvailability&lt;/code&gt;.
You could just as easily add it inline, but I like to separate the
responsibilities, and it also makes it easier to test if it&amp;rsquo;s a separate class.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;SeatAvailability&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;parse&lt;/span&gt;(body)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; body&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;nil?
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    body&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;split&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;map &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;section&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      seat_type, band_id, seats &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; section&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;:&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#990073&#34;&gt;seat_type&lt;/span&gt;: seat_type,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#990073&#34;&gt;band_id&lt;/span&gt;: band_id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#990073&#34;&gt;seats&lt;/span&gt;: seats&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;,&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;registering-the-middleware&#34;&gt;Registering the middleware&lt;/h2&gt;
&lt;p&gt;And this is how we use the new middleware. We create &lt;code&gt;Faraday&lt;/code&gt; connection object
and in the block call &lt;code&gt;conn.response&lt;/code&gt; in order to add it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conn &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Faraday&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;new(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;http://example.com/api&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;conn&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;#...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# Use the `SeatAvailabilityResponse` middleware for &amp;#34;venue/seats&amp;#34; content types&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  conn&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;response &lt;span style=&#34;color:#990073&#34;&gt;:seat_availability&lt;/span&gt;, &lt;span style=&#34;color:#990073&#34;&gt;content_type&lt;/span&gt;: &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;venue/seats&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;#...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now when we make a call to an endpoint that returns a body with a &lt;code&gt;venue/seats&lt;/code&gt;
content type it will automatically be parsed into an array of hashes for us.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; (pry) &lt;span style=&#34;color:#990073&#34;&gt;main&lt;/span&gt;: &lt;span style=&#34;color:#099&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; response &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; conn&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;availability&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#990073&#34;&gt;:seat_type&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#990073&#34;&gt;:band_id&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;1AHGJDSMMPLMPPGNLJBQVLBRSKVDLQRPP&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#990073&#34;&gt;:seats&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;2213&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;2214&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;2215&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#990073&#34;&gt;:seat_type&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#990073&#34;&gt;:band_id&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;201AGBHDRLQHNHPHKKMPKLGPMDRDTDMVL&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#990073&#34;&gt;:seats&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;3134&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;3135&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;3136&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;3137&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I hope this demonstrates how easy it is to handle custom responses in a very
straight-forward and modular way.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Deleting fish shell history</title>
      <link>https://elver.me/blog/deleting-fish-shell-history/</link>
      <pubDate>Fri, 21 Feb 2020 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/deleting-fish-shell-history/</guid>
      <description>&lt;p&gt;Have you ever made a typo? No, me neither, but in case you ever do&amp;hellip;&lt;/p&gt;
&lt;p&gt;I run a lot of commands via the shell history using &lt;a href=&#34;https://github.com/junegunn/fzf#key-bindings-for-command-line&#34;&gt;fzf and CTRL-R&lt;/a&gt; to save
re-typing, and ironically, mispellings. However, if you &lt;em&gt;do&lt;/em&gt; mispell something
it ends up in the history forevermore, taunting you upon each invocation of
&lt;a href=&#34;https://github.com/junegunn/fzf/blob/master/shell/key-bindings.fish#L109&#34;&gt;fzf-history-widget&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It turns out that &lt;a href=&#34;https://fishshell.com/docs/current/cmds/history.html#cmd-history&#34;&gt;fish ships with a neat &lt;code&gt;history&lt;/code&gt; command&lt;/a&gt; that allows you
to manipulate the history is various ways including searching, deleting, and
completely clearing.&lt;/p&gt;
&lt;p&gt;The command I want to remove in this case is &lt;code&gt;mix echo&lt;/code&gt; (which should be &lt;code&gt;mix ecto&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;I use the &lt;code&gt;--contains&lt;/code&gt; option here which will present a prompt showing the
entries and allowing you to delete individual entries or remove all.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ &lt;span style=&#34;color:#0086b3&#34;&gt;history&lt;/span&gt; delete --contains &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;mix echo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#0086b3&#34;&gt;history&lt;/span&gt; search --contains &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;mix echo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; mix echo.migrate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;3&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; mix echo.create
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;4&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; mix echo.reset
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;5&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; mix echo.setup
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter nothing to cancel the delete, or
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter one or more of the entry IDs separated by a space, or
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;all&amp;#34;&lt;/span&gt; to delete all the matching entries.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;I&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; Delete which entries? &amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you want to search before running &lt;code&gt;delete&lt;/code&gt; you can do &lt;code&gt;history search --contains &amp;quot;&amp;lt;search&amp;gt;&amp;quot;&lt;/code&gt; which will return a list of items for you to check.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Routing Docker traffic through a VPN connection</title>
      <link>https://elver.me/blog/routing-docker-traffic-through-a-vpn-connection/</link>
      <pubDate>Mon, 03 Jun 2019 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/routing-docker-traffic-through-a-vpn-connection/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently taken to using Docker to install and run various software
on my home server. Something that so far, it excels at - the people at
&lt;a href=&#34;https://linuxserver.io&#34;&gt;linuxserver.io&lt;/a&gt; are doing great work! I&amp;rsquo;ve had a rocky time with Docker in
the past after having had it foisted upon me for development work, which I did
&lt;em&gt;not&lt;/em&gt; enjoy, but I can see the benefits for certain situations.&lt;/p&gt;
&lt;p&gt;I found myself needing to run the traffic from one particular container
(&lt;a href=&#34;https://github.com/linuxserver/docker-jackett&#34;&gt;Jackett&lt;/a&gt;) over a VPN connection so that it could by-pass country-specific
restrictions. As a noob Docker user, this caused some confusion, but I eventually
stumbled upon the &lt;code&gt;--net&lt;/code&gt; parameter to &lt;code&gt;docker create&lt;/code&gt; and &lt;code&gt;run&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Using this parameter it&amp;rsquo;s possible to tell a container to use the network of
another. You can run an OpenVPN client container, which will initiate a secure
connection, and configure other containers to use its network. The beauty of
this setup is that you don&amp;rsquo;t need to learn or manage any complicated &lt;code&gt;ip_tables&lt;/code&gt;
rules or any other network configuration, you can just point one container at
another and have the traffic secured.&lt;/p&gt;
&lt;p&gt;All I needed now was a suitable Docker image. Eventually, I got lucky and
&lt;a href=&#34;https://github.com/bubuntux/nordvpn&#34;&gt;found an image that supported my exact VPN provider&lt;/a&gt;, &lt;a href=&#34;https://nordvpn.com/&#34;&gt;NordVPN&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is how I created and started the OpenVPN container. Once this was running,
a secure VPN connection was established to NordVPN.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --name vpn &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --cap-add&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;NET_ADMIN &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --device /dev/net/tun &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -p 9117:9117 &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -e &lt;span style=&#34;color:#008080&#34;&gt;NETWORK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;192.168.1.0/24 &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -e &lt;span style=&#34;color:#008080&#34;&gt;USER&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;username &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -e &lt;span style=&#34;color:#008080&#34;&gt;PASS&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;password&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  bubuntux/nordvpn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Most of these options are standard, but the &lt;code&gt;-p 9117:9117&lt;/code&gt; parameter on line 5
needs explanation. This is the port mapping that Jackett uses by default. When
we use another container&amp;rsquo;s network it&amp;rsquo;s necessary to expose the port(s) that our
other containers use on the VPN container.&lt;/p&gt;
&lt;p&gt;And here is how I setup Jackett to use the VPN container. The relevant line is
&lt;code&gt;--net=container:vpn&lt;/code&gt;. Note that I don&amp;rsquo;t have a &lt;code&gt;-p 9117:9117&lt;/code&gt; line here like I
would if I was not using &lt;code&gt;--net=container:vpn&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --name&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;jackett &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --restart unless-stopped &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -e &lt;span style=&#34;color:#008080&#34;&gt;PUID&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;1000&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -e &lt;span style=&#34;color:#008080&#34;&gt;PGID&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#099&#34;&gt;1000&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -e &lt;span style=&#34;color:#008080&#34;&gt;TZ&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;Europe/London &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --net&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;container:vpn &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -v /opt/appdata/jackett:/config &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  -v /opt/appdata/jackett/downloads:/downloads &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  linuxserver/jackett
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now I can access Jackett at &lt;code&gt;http://&amp;lt;host-ip&amp;gt;:9117&lt;/code&gt; and all traffic will be sent
through the VPN container&amp;rsquo;s network!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to replace a failed disk in a ZFS mirror</title>
      <link>https://elver.me/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/</link>
      <pubDate>Mon, 26 Nov 2018 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/how-to-replace-a-failed-disk-in-a-zfs-mirror/</guid>
      <description>&lt;p&gt;I recently built a new file server for my media needs at home. Something I&amp;rsquo;ve
been thinking about doing for &lt;em&gt;literally&lt;/em&gt; years.  I chose to go with ZFS as the
storage technology after having used Linux software RAID for many years.
I went with a mirrored setup for a lot of the reasons &lt;a href=&#34;http://www.openoid.net/zfs-you-should-use-mirror-vdevs-not-raidz/&#34;&gt;outlined in this
article&lt;/a&gt; - performance, simplicity, and in particular, easy recovery from
disk failures.&lt;/p&gt;
&lt;p&gt;This is the setup I ended up with according to &lt;code&gt;zpool status&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ zpool status
  pool: storage
 state: ONLINE
  scan: none requested
config:

	NAME                                   STATE     READ WRITE CKSUM
	storage                                ONLINE       0     0     0
	  mirror-0                             ONLINE       0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX  ONLINE       0     0     0
	    ata-WDC_WD80EFAX-68KNBN0_VAGASE7L  ONLINE       0     0     0
	  mirror-1                             ONLINE       0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX  ONLINE       0     0     0
	    ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL  ONLINE       0     0     0
	  mirror-2                             ONLINE       0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHD982X  ONLINE       0     0     0
	    ata-WDC_WD80EFAX-68KNBN0_VAG9X8YL  ONLINE       0     0     0

errors: No known data errors
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Well, no sooner had I completed the ZFS setup (a very straightforward process)
than one of my disks started reporting SMART errors. I don&amp;rsquo;t think a disk that
is weeks old should do this, so I decided to start the RMA process.&lt;/p&gt;
&lt;p&gt;And this is how I replaced the disk.&lt;/p&gt;
&lt;h2 id=&#34;replacing-the-disk&#34;&gt;Replacing the disk&lt;/h2&gt;
&lt;p&gt;I started by physically removing the old disk, and replacing with a brand new
one. I originally setup my pool using the disk id from &lt;code&gt;/dev/disk/by-id/&lt;/code&gt;, so
identifying the failed disk was very easy as the serial number is part of the
device name&lt;/p&gt;
&lt;p&gt;Once I started back up, I ran &lt;code&gt;zpool status&lt;/code&gt; and saw this output.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ zpools status
  pool: storage
 state: DEGRADED
status: One or more devices could not be used because the label is missing or
	invalid.  Sufficient replicas exist for the pool to continue
	functioning in a degraded state.
action: Replace the device using &amp;#39;zpool replace&amp;#39;.
   see: http://zfsonlinux.org/msg/ZFS-8000-4J
  scan: none requested
config:

	NAME                                   STATE     READ WRITE CKSUM
	storage                                DEGRADED     0     0     0
	  mirror-0                             ONLINE       0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX  ONLINE       0     0     0
	    ata-WDC_WD80EFAX-68KNBN0_VAGASE7L  ONLINE       0     0     0
	  mirror-1                             ONLINE       0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX  ONLINE       0     0     0
	    ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL  ONLINE       0     0     0
	  mirror-2                             DEGRADED     0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHD982X  ONLINE       0     0     0
	    18311740819329882151               UNAVAIL      0     0     0  was /dev/disk/by-id/ata-WDC_WD80EFAX-68KNBN0_VAG9X8YL-part1

errors: No known data errors
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ZFS noticed that it had a missing disk, and was now in a &lt;code&gt;DEGRADED&lt;/code&gt; state, but
crucially, everything was still working and available.&lt;/p&gt;
&lt;p&gt;The next step was to find out what the &lt;em&gt;new&lt;/em&gt; device is called. I did this by
running &lt;code&gt;ls -1 /dev/disk/by-id/&lt;/code&gt; and seeing which disk was new.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ls -1 /dev/disk/by-id/ | grep ata
ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL
ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL-part1
ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL-part9
ata-WDC_WD80EFAX-68KNBN0_VAGASE7L
ata-WDC_WD80EFAX-68KNBN0_VAGASE7L-part1
ata-WDC_WD80EFAX-68KNBN0_VAGASE7L-part9
ata-WDC_WD80EFAX-68LHPN0_7HJSWL7F
ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX
ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX-part1
ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX-part9
ata-WDC_WD80EFZX-68UW8N0_VJHD982X
ata-WDC_WD80EFZX-68UW8N0_VJHD982X-part1
ata-WDC_WD80EFZX-68UW8N0_VJHD982X-part9
ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX
ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX-part1
ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX-part9
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The new disk is the one on line 8 - &lt;code&gt;ata-WDC_WD80EFAX-68LHPN0_7HJSWL7F&lt;/code&gt;. It
stands out in this example as all the other disk serial numbers start with &amp;ldquo;V&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I now needed to tell ZFS to replace the missing disk with this one.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo zpool replace -f storage 18311740819329882151 /dev/disk/by-id/ata-WDC_WD80EFAX-68LHPN0_7HJSWL7F
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ZFS automatically started the resilvering process (copying data to the new
disk). I wasn&amp;rsquo;t sure how long that would take&amp;hellip;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ zpool status
  pool: storage
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Thu Nov 15 17:01:06 2018
	7.97G scanned out of 7.51T at 233M/s, 9h22m to go
	2.56G resilvered, 0.10% done
config:

	NAME                                     STATE     READ WRITE CKSUM
	storage                                  DEGRADED     0     0     0
	  mirror-0                               ONLINE       0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX    ONLINE       0     0     0
	    ata-WDC_WD80EFAX-68KNBN0_VAGASE7L    ONLINE       0     0     0
	  mirror-1                               ONLINE       0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX    ONLINE       0     0     0
	    ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL    ONLINE       0     0     0
	  mirror-2                               DEGRADED     0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHD982X    ONLINE       0     0     0
	    replacing-1                          DEGRADED     0     0     0
	      18311740819329882151               UNAVAIL      0     0     0  was /dev/disk/by-id/ata-WDC_WD80EFAX-68KNBN0_VAG9X8YL-part1
	      ata-WDC_WD80EFAX-68LHPN0_7HJSWL7F  ONLINE       0     0     0  (resilvering)

errors: No known data errors
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The resilvering completed in 5 hours and 53 minutes. A figure I&amp;rsquo;m very satisfied
with. In this mirrored setup the data is at risk whilst resilvering completes,
so the quicker, the better.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ zpool status
  pool: storage
 state: ONLINE
  scan: resilvered 2.50T in 5h53m with 0 errors on Thu Nov 15 22:54:41 2018
config:

	NAME                                   STATE     READ WRITE CKSUM
	storage                                ONLINE       0     0     0
	  mirror-0                             ONLINE       0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHDBDGX  ONLINE       0     0     0
	    ata-WDC_WD80EFAX-68KNBN0_VAGASE7L  ONLINE       0     0     0
	  mirror-1                             ONLINE       0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHD6BAX  ONLINE       0     0     0
	    ata-WDC_WD80EFAX-68KNBN0_VAGA5BPL  ONLINE       0     0     0
	  mirror-2                             ONLINE       0     0     0
	    ata-WDC_WD80EFZX-68UW8N0_VJHD982X  ONLINE       0     0     0
	    ata-WDC_WD80EFAX-68LHPN0_7HJSWL7F  ONLINE       0     0     0

errors: No known data errors
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ZFS is easy to setup and use for the most part. It &lt;em&gt;feels&lt;/em&gt; solid. Stable.
If all disk replacements are this easy I will be very happy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>A new way to deploy to Amazon S3</title>
      <link>https://elver.me/blog/a-new-way-to-deploy-to-aws/</link>
      <pubDate>Sun, 29 Oct 2017 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/a-new-way-to-deploy-to-aws/</guid>
      <description>&lt;p&gt;Pretty much since I began hosting this site on Amazon S3 I&amp;rsquo;ve been using
&lt;a href=&#34;https://github.com/fredjean/middleman-s3_sync&#34;&gt;middleman-s3_sync&lt;/a&gt; to do the heavy lifting of syncing files to the bucket. Unfortunately, somewhere along the way it stopped picking up certain
files that should&amp;rsquo;ve been synced. I tried to be a good OSS citizen and find a fix, but
after delving into the Middleman innards, I couldn&amp;rsquo;t find the problem.&lt;/p&gt;
&lt;h2 id=&#34;a-new-method&#34;&gt;A new method&lt;/h2&gt;
&lt;p&gt;A new method of deploying the site was needed and recently I moved to
using Amazon&amp;rsquo;s own &lt;a href=&#34;https://aws.amazon.com/cli/&#34;&gt;aws cli&lt;/a&gt; utility. After years of providing next to
nothing in regards to tooling, Amazon have released their own command line
utility for interacting with AWS. And the best part is that it seems very nice .&lt;/p&gt;
&lt;p&gt;This is how I now deploy the site.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aws s3 sync build s3://jordanelver.co.uk &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --profile jordanelver.co.uk &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --delete &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --acl public-read &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&lt;/span&gt;  --exclude *.DS_Store &lt;span style=&#34;color:#d14&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;build&lt;/code&gt; is the local directory to be synced, and &lt;code&gt;s3://jordanelver.co.uk&lt;/code&gt; is the remote
S3 bucket.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--delete&lt;/code&gt; says to delete files at the destination that are not in the &lt;code&gt;build/&lt;/code&gt;
directory.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--profile&lt;/code&gt; controls which credentials and other settings to use when connecting
to S3. More on this below.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--acl public-read&lt;/code&gt; makes the synced files publicly readable, &lt;a href=&#34;http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteAccessPermissionsReqd.html&#34;&gt;as required by S3
static website hosting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--exclude&lt;/code&gt; excludes those pesky &lt;code&gt;.DS_Store&lt;/code&gt; files that OS X litters around the
filesystem.&lt;/p&gt;
&lt;h2 id=&#34;credentials&#34;&gt;Credentials&lt;/h2&gt;
&lt;p&gt;Credentials are stored in &lt;code&gt;~/.aws/credentials&lt;/code&gt;. I have a section like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;jordanelver.co.uk&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;aws_access_key_id&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &amp;lt;ACCESSKEY&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;aws_secret_access_key&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &amp;lt;SECRET&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll see that this matches the &lt;code&gt;--profile jordanelver.co.uk&lt;/code&gt; line in the
&lt;code&gt;s3 sync&lt;/code&gt; commandline.&lt;/p&gt;
&lt;p&gt;That covers authentication, but you can also specify additional configuration
values in &lt;code&gt;~/.aws/config&lt;/code&gt;. In this case, the S3 bucket region.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;profile jordanelver.co.uk&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#008080&#34;&gt;region&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#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;I used &lt;code&gt;aws configure --profile jordanelver.co.uk&lt;/code&gt; to configure these values.&lt;/p&gt;
&lt;h2 id=&#34;one-last-thing&#34;&gt;One last thing&lt;/h2&gt;
&lt;p&gt;One last thing that deserves to be mentioned is the &lt;code&gt;--dryrun&lt;/code&gt; flag.  It&amp;rsquo;s very
handy for testing what&amp;rsquo;s going to happen, before it happens. &lt;a href=&#34;https://github.com/jordelver/jordanelver.co.uk/blob/master/bin/deploy&#34;&gt;I ended up
wrapping my sync command in a Ruby script&lt;/a&gt; to conditionally add &lt;code&gt;--dryrun&lt;/code&gt; as
and when I need it.&lt;/p&gt;
&lt;p&gt;Happy syncing!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Split lines easily in Vim</title>
      <link>https://elver.me/blog/split-lines-easily-in-vim/</link>
      <pubDate>Mon, 25 Sep 2017 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/split-lines-easily-in-vim/</guid>
      <description>&lt;p&gt;Vim has a way of making me feel like a wizard one minute and a complete novice
the next. I constantly feel the need to revisit the basics, and this led me to
try and make &lt;code&gt;J&lt;/code&gt; stick in my Vim vocabulary.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;J&lt;/code&gt; joins lines, I’ve been using it regularly for a while now; it’s finally
found its way into my muscle memory. It works like this.&lt;/p&gt;
&lt;script type=&#34;text/javascript&#34;
src=&#34;https://asciinema.org/a/bozOxUMgIQV7TmK5OlbzUbazJ.js&#34;
id=&#34;asciicast-bozOxUMgIQV7TmK5OlbzUbazJ&#34; async&gt;&lt;/script&gt;
&lt;p&gt;I recently discovered a complementary plugin called &lt;a href=&#34;https://github.com/drzel/vim-split-line&#34;&gt;vim-split-line&lt;/a&gt;. It
makes splitting lines as easy as joining. It mirrors &lt;code&gt;J&lt;/code&gt;, mapping by default to
&lt;code&gt;S&lt;/code&gt;. See how it works below.&lt;/p&gt;
&lt;script type=&#34;text/javascript&#34;
src=&#34;https://asciinema.org/a/i48SaXAXDGkCVM9l8Pte7wziQ.js&#34;
id=&#34;asciicast-i48SaXAXDGkCVM9l8Pte7wziQ&#34; async&gt;&lt;/script&gt;
&lt;p&gt;There are, no doubt, countless ways to do this using Vim (&lt;a href=&#34;https://github.com/drzel/vim-split-line#alternatives&#34;&gt;in fact, the author
of the plugin points this out&lt;/a&gt;), but I really like the simplicity of this
plugin. And it handles a couple of edgecases for you too such as auto indenting
the second line, and removing trailing whitespace.&lt;/p&gt;
&lt;p&gt;Let’s hope this one sticks.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Capturing output from Heroku with tee</title>
      <link>https://elver.me/blog/capturing-output-from-heroku-with-tee/</link>
      <pubDate>Sun, 17 Sep 2017 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/capturing-output-from-heroku-with-tee/</guid>
      <description>&lt;p&gt;Have you ever been working with a console on Heroku and needed to capture the
output? I was recently tasked with generating a quick &amp;ldquo;report&amp;rdquo;, and I decided
to spin up a &lt;a href=&#34;http://guides.rubyonrails.org/command_line.html#rails-console&#34;&gt;Rails console&lt;/a&gt; on Heroku to connect to the database and munge
some data into the right format.&lt;/p&gt;
&lt;p&gt;The problem is how to capture the output from Heroku. What are the options for
saving that on your computer? Well, you &lt;em&gt;can&lt;/em&gt; write it to the filesystem, but
then how do you transfer the file? You could upload it to Amazon S3, or use
FTP, or something else, but it starts getting complicated fast&amp;hellip;&lt;/p&gt;
&lt;p&gt;Instead, we use &lt;a href=&#34;https://en.wikipedia.org/wiki/Tee_(command)&#34;&gt;&lt;code&gt;tee&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here we run a Rails console on Heroku but also redirect all output to a file
called &lt;code&gt;output.log&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;heroku run bundle exec rails console | tee output.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can work with the console as usual, but also capture the whole session in a
file for later inspection. We will get all of the input and output (commands we
typed, and their responses) so there is often some post processing to do. But
still, this is a quick and dirty way to save output from Heroku&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Renaming files like a pro</title>
      <link>https://elver.me/blog/renaming-files-like-a-pro/</link>
      <pubDate>Tue, 31 Jan 2017 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/renaming-files-like-a-pro/</guid>
      <description>&lt;p&gt;Renaming files en masse was always something that I knew the commandline could
excel at but that I&amp;rsquo;d never managed to easily replicate daily. I&amp;rsquo;d always have
to look up the shell syntax for looping over a list of files, and the rules for
escaping paths, and so on and so forth. Whilst I&amp;rsquo;d like to improve my skills
with the shell, in the meantime I have discovered another option, &lt;code&gt;rename&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now, when I say &lt;code&gt;rename&lt;/code&gt;, there is &lt;a href=&#34;http://unix.stackexchange.com/questions/229230/whats-with-all-the-renames&#34;&gt;some confusion&lt;/a&gt; about various different
versions of this utility. I&amp;rsquo;ve been using the version included with Ubuntu
Trusty 14.04 and also &lt;a href=&#34;http://plasmasturm.org/code/rename/&#34;&gt;the version included in Homebrew&lt;/a&gt; on macOS Sierra.
The examples below work with both of these versions.&lt;/p&gt;
&lt;p&gt;A good understanding of regular expressions (the Perl variety) will allow you
to get the most out of &lt;code&gt;rename&lt;/code&gt; but you can still use it in a basic fashion and
get great results.&lt;/p&gt;
&lt;h2 id=&#34;some-examples&#34;&gt;Some examples&lt;/h2&gt;
&lt;p&gt;Take these files.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;01-run_the_jewels-run_the_jewels.flac
02-run_the_jewels-banana_clipper_(feat._big_boi).flac
03-run_the_jewels-36_inch_chain.flac
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Let&amp;rsquo;s make the filenames uppercase (because we are monsters).&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ rename -n &amp;#39;y/a-z/A-Z/ *.flac
01-run_the_jewels-run_the_jewels.flac renamed as 01-RUN_THE_JEWELS-RUN_THE_JEWELS.FLAC
02-run_the_jewels-banana_clipper_(feat._big_boi).flac renamed as 02-RUN_THE_JEWELS-BANANA_CLIPPER_(FEAT._BIG_BOI).FLAC
03-run_the_jewels-36_inch_chain.flac renamed as 03-RUN_THE_JEWELS-36_INCH_CHAIN.FLAC
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You&amp;rsquo;ll notice that &lt;code&gt;rename&lt;/code&gt; prints out the renaming it &lt;em&gt;would&lt;/em&gt; do. This is
because we&amp;rsquo;ve used the &lt;code&gt;-n&lt;/code&gt; flag, which turns on dry runs allowing us to see
the changes that will be made before we commit to changing them. You&amp;rsquo;ll find
&lt;code&gt;-n&lt;/code&gt; invaluable when using &lt;code&gt;rename&lt;/code&gt;, especially when new to it.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s change dashes and underscores to spaces instead.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ rename -n &amp;#39;s/-|_/ /g&amp;#39; *.flac
&amp;#39;01-run_the_jewels-run_the_jewels.flac&amp;#39; would be renamed to &amp;#39;01 run the jewels run the jewels.flac&amp;#39;
&amp;#39;02-run_the_jewels-banana_clipper_(feat._big_boi).flac&amp;#39; would be renamed to &amp;#39;02 run the jewels banana clipper (feat. big boi).flac&amp;#39;
&amp;#39;03-run_the_jewels-36_inch_chain.flac&amp;#39; would be renamed to &amp;#39;03 run the jewels 36 inch chain.flac&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Or remove &lt;code&gt;-run_the_jewels-&lt;/code&gt; from the filename entirely.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ rename -n &amp;#39;s/-run_the_jewels-/ /g&amp;#39; *.flac
&amp;#39;01-run_the_jewels-run_the_jewels.flac&amp;#39; would be renamed to &amp;#39;01 run_the_jewels.flac&amp;#39;
&amp;#39;02-run_the_jewels-banana_clipper_(feat._big_boi).flac&amp;#39; would be renamed to &amp;#39;02 banana_clipper_(feat._big_boi).flac&amp;#39;
&amp;#39;03-run_the_jewels-36_inch_chain.flac&amp;#39; would be renamed to &amp;#39;03 36_inch_chain.flac&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Getting a bit more advanced, you can even use captures in your expression. Take
a directory of files with names like this.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;S03E01-oh-em-gee-i-love-telly.mkv
S03E02-thrilling-watch.mkv
S03E03-a-great-episode.mkv
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We&amp;rsquo;ll rename the filenames to look like &lt;code&gt;S??E??.mkv&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ rename -n &amp;#39;s/.*(S\d{1,2}E\d{1,2}).*(.{3}$)/$1.$2/g&amp;#39; *.mkv
&amp;#39;S03E01-oh-em-gee-i-love-telly.mkv&amp;#39; would be renamed to &amp;#39;S03E01.mkv&amp;#39;
&amp;#39;S03E02-thrilling-watch.mkv&amp;#39; would be renamed to &amp;#39;S03E02.mkv&amp;#39;
&amp;#39;S03E03-a-great-episode.mkv&amp;#39; would be renamed to &amp;#39;S03E03.mkv&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The regular expression matches the &lt;code&gt;S??E??&lt;/code&gt; part of the filename as &lt;code&gt;$1&lt;/code&gt;, and the extension &lt;code&gt;.mkv&lt;/code&gt;
as &lt;code&gt;$2&lt;/code&gt;, and uses them both to construct a new filename like &lt;code&gt;S03E01.mkv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That regular expression is quite a mouthfull, so I&amp;rsquo;d recommend using a tool
to help you construct your expressions. I personally use &lt;a href=&#34;http://rubular.com/&#34;&gt;Rubular&lt;/a&gt; even
though it&amp;rsquo;s Ruby-specific; it does a good job for me.&lt;/p&gt;
&lt;p&gt;I hope you can get a sense of how powerful &lt;code&gt;rename&lt;/code&gt; can be. Regular expressions
are the limit to how you can rename files.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How I added heading anchors with Middleman</title>
      <link>https://elver.me/blog/how-i-added-heading-anchors-with-middleman/</link>
      <pubDate>Sat, 19 Mar 2016 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/how-i-added-heading-anchors-with-middleman/</guid>
      <description>&lt;p&gt;I really like being able to link directly to certain parts of web page.
Unfortunately, many page authors fail to add the necessary anchors to make
this possible. Until recently, this included me!&lt;/p&gt;
&lt;p&gt;Here is how I remedied the situation.&lt;/p&gt;
&lt;p&gt;Outputting headings with id attributes &lt;a href=&#34;https://forum.middlemanapp.com/t/using-a-custom-redcarpet-renderer/1004&#34;&gt;looked like it should&amp;rsquo;ve already been
supported out of the box&lt;/a&gt;. I could see a &lt;code&gt;toc_data&lt;/code&gt; option, but for some
reason this didn&amp;rsquo;t work for me, so I created a custom Markdown renderer
instead.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;middleman-core/renderers/redcarpet&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;CustomRenderer&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Middleman&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Renderers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;MiddlemanRedcarpetHTML&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;header&lt;/span&gt;(text, header_level)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;&amp;lt;h%s id=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;gt;%s&amp;lt;/h%s&amp;gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;header_level, text&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;parameterize, text, header_level&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I inherit from the default renderer so that I can replace the &lt;code&gt;header&lt;/code&gt;
implementation to add the necessary &lt;code&gt;id&lt;/code&gt; attributes.&lt;/p&gt;
&lt;p&gt;I required it in my &lt;code&gt;config.rb&lt;/code&gt; and then configured &lt;a href=&#34;https://github.com/vmg/redcarpet&#34;&gt;Redcarpet&lt;/a&gt; to use the
new renderer.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set &lt;span style=&#34;color:#990073&#34;&gt;:markdown&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#990073&#34;&gt;fenced_code_blocks&lt;/span&gt;: &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#990073&#34;&gt;smartypants&lt;/span&gt;: &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#990073&#34;&gt;renderer&lt;/span&gt;: &lt;span style=&#34;color:#008080&#34;&gt;CustomRenderer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There we have it. Heading tags now have ids, so we can link directly to them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Free SSL with Amazon Certificate Manager and Cloudfront</title>
      <link>https://elver.me/blog/free-ssl-with-amazon-certificate-manager-and-cloudfront/</link>
      <pubDate>Tue, 16 Feb 2016 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/free-ssl-with-amazon-certificate-manager-and-cloudfront/</guid>
      <description>&lt;p&gt;Following my &lt;a href=&#34;/blog/moving-to-amazon-s3/&#34;&gt;recent move to Amazon S3&lt;/a&gt; I&amp;rsquo;ve now gone one step further and
added &lt;a href=&#34;https://aws.amazon.com/cloudfront/&#34;&gt;Cloudfront&lt;/a&gt; to the mix. Cloudfront is a &lt;a href=&#34;https://en.wikipedia.org/wiki/Content_delivery_network&#34;&gt;CDN&lt;/a&gt;; it puts web pages
closer to the client so they&amp;rsquo;re faster. Faster is better. However, my
motivation for adding Cloudfront was not speed, it was SSL.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d already been toying with the idea of adding SSL to this site with
&lt;a href=&#34;https://www.cloudflare.com/&#34;&gt;Cloudflare&lt;/a&gt; when fellow &lt;a href=&#34;http://www.meetup.com/bathruby/&#34;&gt;Bath Ruby&lt;/a&gt; attendee Paul Leader &lt;a href=&#34;https://twitter.com/NoNeeeed/status/690544764706504705&#34;&gt;told me
that Amazon were offering free SSL&lt;/a&gt; through their &lt;a href=&#34;https://aws.amazon.com/blogs/aws/new-aws-certificate-manager-deploy-ssltls-based-apps-on-aws/&#34;&gt;recently announced
Amazon Certificate Manager&lt;/a&gt; product. I decided to give it a try.&lt;/p&gt;
&lt;h2 id=&#34;why-ssl&#34;&gt;Why SSL?&lt;/h2&gt;
&lt;p&gt;Privacy and trust. Visitors to this site are getting the version of this page
that I publish. No one can interfere or tamper with it. No ads or malware can
be inserted. And why not? SSL is no longer expensive to implement. Gone are the
days of being extorted by companies selling SSL certificates. SSL is now freely
available from the likes of Cloudflare, Amazon and, perhaps more importantly,
&lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;amazon-certificate-manager&#34;&gt;Amazon Certificate Manager?&lt;/h2&gt;
&lt;p&gt;As with all Amazon products it&amp;rsquo;s often difficult to understand a) What it is;
and b) What it&amp;rsquo;s for. Amazon Certificate Manager allows you to create SSL
certificates for free and easily use them with Amazon products. Currently,
&lt;a href=&#34;https://aws.amazon.com/elasticloadbalancing/&#34;&gt;ELB&lt;/a&gt; and Cloudfront are supported. The best part is that they automatically
handle renewals for you! Once setup, there is no maintenance to do.&lt;/p&gt;
&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;
&lt;h3 id=&#34;distribution-setup&#34;&gt;Distribution setup&lt;/h3&gt;
&lt;p&gt;Cloudfront has a concept called Distributions. A distribution is a set of files
that Amazon will distribute across the world to be served from it&amp;rsquo;s &lt;a href=&#34;https://aws.amazon.com/about-aws/global-infrastructure/&#34;&gt;edge
locations&lt;/a&gt; meaning the files will be geographically closer to the client
requesting them.&lt;/p&gt;
&lt;p&gt;Setting up the distribution looks fairly complex but I went with the defaults
and it seems to work well. You can point a distribution straight to an S3
bucket but I found that not all of my pages were picked up by Cloudfront if I
did it that way. Index pages were missed for some reason. The fix was to
point the distribution at the Amazon S3 URL instead. The pages were then all
correctly picked up.&lt;/p&gt;
&lt;h3 id=&#34;dns-changes&#34;&gt;DNS changes&lt;/h3&gt;
&lt;p&gt;Like using S3 directly a very simple change is required. I already had an
&lt;code&gt;ALIAS&lt;/code&gt; record to point from &lt;code&gt;jordanelver.co.uk&lt;/code&gt; to
&lt;code&gt;jordanelver-co-uk.s3-website-eu-west-1.amazonaws.com&lt;/code&gt;. I&amp;rsquo;ve now changed that
&lt;code&gt;ALIAS&lt;/code&gt; to point to the Cloudfront address instead, which is
&lt;code&gt;d1jmxhequyb081.cloudfront.net&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;invalidating-the-cache&#34;&gt;Invalidating the cache&lt;/h3&gt;
&lt;p&gt;Now that the site content is spread across Amazon&amp;rsquo;s network and cached
appropriately, the cache will need to be invalidated when new files are
deployed to S3 or we&amp;rsquo;ll be serving stale content. &lt;a href=&#34;https://github.com/andrusha/middleman-cloudfront&#34;&gt;There is a Middleman
extension to handle this&lt;/a&gt; but at the moment I&amp;rsquo;m manually invalidating the
cache through the Amazon Cloudfront console. As I deploy infrequently it isn&amp;rsquo;t
a problem for me to do it manually at the moment but I might end up using
that extension eventually.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I thought that the site was fairly speedy when served as a &lt;a href=&#34;https://github.com/rack/rack&#34;&gt;rack&lt;/a&gt; app on
Heroku. The speed seemed to increase when I moved to S3 but now it&amp;rsquo;s on
Cloudfront it &lt;em&gt;feels&lt;/em&gt; noticably faster! Combine those speed increases with free
SSL and I&amp;rsquo;m very happy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Moving to Amazon S3</title>
      <link>https://elver.me/blog/moving-to-amazon-s3/</link>
      <pubDate>Mon, 25 Jan 2016 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/moving-to-amazon-s3/</guid>
      <description>&lt;p&gt;A couple of years ago &lt;a href=&#34;/blog/how-i-deployed-middleman-to-heroku/&#34;&gt;I wrote about how I deployed this blog to Heroku&lt;/a&gt;.
Since then everything has changed; it is now served from &lt;a href=&#34;https://aws.amazon.com/s3/&#34;&gt;Amazon S3&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;why-change&#34;&gt;Why change?&lt;/h2&gt;
&lt;p&gt;It was prompted by &lt;a href=&#34;https://blog.heroku.com/archives/2015/6/15/dynos-pricing-ga&#34;&gt;Heroku&amp;rsquo;s price changes last year&lt;/a&gt;. I think their new
pricing model is completely reasonable, and their &amp;ldquo;free&amp;rdquo; product still
generous, but Heroku &lt;em&gt;can&lt;/em&gt; get expensive. This low traffic site will cost very
little to host with Amazon.&lt;/p&gt;
&lt;p&gt;It seemed like a no-brainer to try it out, and this is how I did it.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-static-website-hosting&#34;&gt;Setting up Static Website Hosting&lt;/h2&gt;
&lt;p&gt;Amazon offer Static Website Hosting as a feature of S3. This serves a
bucket over HTTP at a URL that Amazon gives you. The first step was to create a
bucket to host the files. This is easily done through the &lt;a href=&#34;https://aws.amazon.com/console/&#34;&gt;Amazon S3
console&lt;/a&gt;. I called mine jordanelver.co.uk, not because I&amp;rsquo;m self-obsessed,
but because that is the name of this website.&lt;/p&gt;
&lt;p&gt;Configuring the bucket to serve the site was straight forward. Once I&amp;rsquo;d enabled
Static Website Hosting in the bucket properties, the site was available at
&lt;code&gt;jordanelver-co-uk.s3-website-eu-west-1.amazonaws.com&lt;/code&gt;. Of course, I hadn&amp;rsquo;t
transferred anything to Amazon at this point, and the permissions were not yet
set, so nothing but an error message was served at this point.&lt;/p&gt;
&lt;h2 id=&#34;permissions&#34;&gt;Permissions&lt;/h2&gt;
&lt;p&gt;Setting the correct permissions was by far the most confusing part of the whole
process. There are two parts to this 1) creating a user to interact with S3;
and 2) setting the correct bucket permissions.&lt;/p&gt;
&lt;p&gt;I first setup an &lt;a href=&#34;http://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html&#34;&gt;IAM user&lt;/a&gt; that had access to the correct bucket.  This
allowed me to upload the files to Amazon. These credentials are used later as
part of the automated deployment.&lt;/p&gt;
&lt;p&gt;The second part is allowing the files in S3 to be served over HTTP to the public.
By default files in S3 are not publically available, for obvious reasons. I
used the following policy to allow the files to be read. This is added through
the bucket properties.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{
  &amp;#34;Version&amp;#34;: &amp;#34;2012-10-17&amp;#34;,
  &amp;#34;Statement&amp;#34;: [
    {
      &amp;#34;Sid&amp;#34;: &amp;#34;PublicReadGetObject&amp;#34;,
      &amp;#34;Effect&amp;#34;: &amp;#34;Allow&amp;#34;,
      &amp;#34;Principal&amp;#34;: &amp;#34;*&amp;#34;,
      &amp;#34;Action&amp;#34;: &amp;#34;s3:GetObject&amp;#34;,
      &amp;#34;Resource&amp;#34;: &amp;#34;arn:aws:s3:::jordanelver.co.uk/*&amp;#34;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;deploying-with-middleman&#34;&gt;Deploying with Middleman&lt;/h2&gt;
&lt;p&gt;Moving away from Heroku meant losing the ability to deploy using &lt;code&gt;git push&lt;/code&gt; so
I went looking for other methods. Luckily, &lt;a href=&#34;https://directory.middlemanapp.com/#/extensions/deployment/&#34;&gt;Middleman has many extensions
available&lt;/a&gt; to help with automating deployment. I decided on
&lt;a href=&#34;https://github.com/fredjean/middleman-s3_sync&#34;&gt;Middleman::S3Sync&lt;/a&gt; as it only transfers files that have changed, rather
than transferring everything each time, which seems like a good thing.&lt;/p&gt;
&lt;p&gt;I added &lt;code&gt;gem &#39;middleman-s3_sync&#39;&lt;/code&gt; to my &lt;code&gt;Gemfile&lt;/code&gt;, ran &lt;code&gt;bundle&lt;/code&gt; and added the
following config to my &lt;code&gt;config.rb&lt;/code&gt; file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;activate &lt;span style=&#34;color:#990073&#34;&gt;:s3_sync&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;delete                     &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;after_build                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;prefer_gzip                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;path_style                 &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;reduced_redundancy_storage &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;acl                        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;public-read&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;encryption                 &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;version_bucket             &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;index_document             &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;index.html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  s3_sync&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;error_document             &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;404.html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The sync process needs to know what the bucket name is, the Amazon region, and
the user credentials to upload the files. &lt;a href=&#34;https://github.com/fredjean/middleman-s3_sync#setting-aws-credentials&#34;&gt;There are several supported
methods&lt;/a&gt; and I choose to use a &lt;code&gt;.s3_sync&lt;/code&gt; file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#555&#34;&gt;---&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000080&#34;&gt;bucket&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;jordanelver.co.uk&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000080&#34;&gt;region&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;eu-west-1&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000080&#34;&gt;aws_access_key_id&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&amp;lt;ACCESS_KEY_ID&amp;gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bbb&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000080&#34;&gt;aws_secret_access_key&lt;/span&gt;:&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&amp;lt;SECRET_ACCESS_KEY&amp;gt;&lt;span style=&#34;color:#bbb&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Deploying the site is now as simple as first building with &lt;code&gt;middleman build&lt;/code&gt; and
then syncing with &lt;code&gt;middleman s3_sync&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;dns-changes&#34;&gt;DNS changes&lt;/h2&gt;
&lt;p&gt;The final step is to hook up the domain name to the bucket. I use &lt;a href=&#34;https://dnsimple.com/r/d7a9918c2a5dd7&#34;&gt;DNSimple&lt;/a&gt;
to host my DNS which makes the changes required simple. I setup an &lt;code&gt;ALIAS&lt;/code&gt;
record to point from &lt;code&gt;jordanelver.co.uk&lt;/code&gt; to
&lt;code&gt;jordanelver-co-uk.s3-website-eu-west-1.amazonaws.com&lt;/code&gt; and the site is now
served at this domain name.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m very happy with this setup so far. Once you&amp;rsquo;ve set it up the first time, the
process can easily be replicated to add additional sites. I can see that I&amp;rsquo;ll
continue to use this method of hosting for my &amp;ldquo;holding page&amp;rdquo; and static sites
needs.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Working with Vim highlight groups</title>
      <link>https://elver.me/blog/working-with-vim-colorschemes/</link>
      <pubDate>Wed, 27 May 2015 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/working-with-vim-colorschemes/</guid>
      <description>&lt;p&gt;Highlight groups are used in Vim to control how the user interface will look.
For example, to change the colour of highlighted search items, you would add
this line to your &lt;code&gt;~/.vimrc&lt;/code&gt; or colorscheme in &lt;code&gt;~/.vim/colors/&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;highlight Search ctermfg=0 ctermbg=226
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This would make highlighted search items show up with a yellow background and
black text (when running in a terminal). This allows customisation of
everything you see on screen. However, given the breadth of customisation
possible it can be difficult to figure out which groups apply to the particular
item you want to change.&lt;/p&gt;
&lt;h2 id=&#34;showing-highlight-groups&#34;&gt;Showing highlight groups&lt;/h2&gt;
&lt;p&gt;This function will show what groups are being applied. Add to your &lt;code&gt;~/.vimrc&lt;/code&gt;,
place your cursor over the item in question, and press &lt;code&gt;&amp;lt;leader&amp;gt;sp&lt;/code&gt; to output
the groups.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-viml&#34; data-lang=&#34;viml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nmap &amp;lt;leader&amp;gt;sp :call &amp;lt;SID&amp;gt;SynStack()&amp;lt;CR&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt;! &amp;lt;SID&amp;gt;SynStack()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; !exists(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;*synstack&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    return
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;map&lt;/span&gt;(synstack(line(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;), col(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;)), &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;synIDattr(v:val, &amp;#34;name&amp;#34;)&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;endfunc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For example, placing my cursor over a comment in a Ruby file gives this output.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[&amp;#39;rubyMultilineComment&amp;#39;, &amp;#39;rubyComment&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can now change how Ruby comments look using these groups.&lt;/p&gt;
&lt;p&gt;This should greatly help when modifying colorschemes.&lt;/p&gt;
&lt;h2 id=&#34;outputting-all-highlight-groups&#34;&gt;Outputting all highlight groups&lt;/h2&gt;
&lt;p&gt;It can also be very useful to see how all highlight groups look.&lt;/p&gt;
&lt;p&gt;Whilst browsing the highlight help page recently (&lt;code&gt;:help highlight&lt;/code&gt;) I found
that you can output all groups currently active using a script that comes with
Vim. Running &lt;code&gt;:so $VIMRUNTIME/syntax/hitest.vim&lt;/code&gt; will show something similar to
below.&lt;/p&gt;
&lt;img src=&#34;/images/highlight-groups.png&#34; /&gt;
&lt;p&gt;There are many more lines in the full output, but it should be clear that this
is very useful when debugging colorschemes.&lt;/p&gt;
&lt;p&gt;Vim colorschemes should now be easier to create and modify.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Backups for the truly paranoid</title>
      <link>https://elver.me/blog/backups-for-the-truly-paranoid/</link>
      <pubDate>Wed, 29 Apr 2015 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/backups-for-the-truly-paranoid/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been meaning to sort out a proper backup solution for a long, long time.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve never lost data on my main machine, but I&amp;rsquo;ve been lucky. It does happen, I
recently had a file server with disks in &lt;a href=&#34;http://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5&#34;&gt;RAID5&lt;/a&gt; fail. I&amp;rsquo;m most concerned
about hardware failure. I&amp;rsquo;m fairly conservative when it comes to deleting
files, so I don&amp;rsquo;t tend to do it by accident. I&amp;rsquo;m sure it will happen one day,
but I think I&amp;rsquo;m much more likely to suffer data loss via catastrophic hardware
failure than by accidental deletion.&lt;/p&gt;
&lt;h2 id=&#34;strategy&#34;&gt;Strategy&lt;/h2&gt;
&lt;p&gt;My general strategy is to have several backups, in different locations, for
different purposes. To spread the data out. My current setup has a local clone,
a local incremental backup, and an offsite incremental backup.&lt;/p&gt;
&lt;h3 id=&#34;local-clone&#34;&gt;Local clone&lt;/h3&gt;
&lt;p&gt;The idea of having a local clone is to get back up and running as soon as
possible in the event of hardware failure or loss. I can boot from the clone
and carry on working or use it to restore to a new computer.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;a href=&#34;http://www.shirt-pocket.com/SuperDuper/&#34;&gt;SuperDuper!&lt;/a&gt; to create a bootable clone to an external hard drive
every night. &lt;a href=&#34;https://www.bombich.com/&#34;&gt;Carbon Copy Cloner&lt;/a&gt; is another popular alternative, but I&amp;rsquo;ve
found SuperDuper! meets my needs at the moment.&lt;/p&gt;
&lt;p&gt;I used my clone to restore recently due to a non-catastrophic problem with a
new computer, so I&amp;rsquo;m fairly certain that it will work when it&amp;rsquo;s needed.  I will
boot from it periodically to test.&lt;/p&gt;
&lt;h3 id=&#34;local-incremental-backup&#34;&gt;Local incremental backup&lt;/h3&gt;
&lt;p&gt;For a local incremental backup I&amp;rsquo;m using &lt;a href=&#34;http://en.wikipedia.org/wiki/Time_Machine_(OS_X)&#34;&gt;Time Machine&lt;/a&gt; to an external hard
drive. This allows me to retrieve files from different time periods.  Time
Machine backs up on an hourly basis.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s free and stays out of the way most of the time.&lt;/p&gt;
&lt;h3 id=&#34;offsite-incremental-backup&#34;&gt;Offsite incremental backup&lt;/h3&gt;
&lt;p&gt;For the offsite backup, I&amp;rsquo;m only uploading user data, not system files. This
is not a full system backup. I don&amp;rsquo;t intend to ever use this backup except for
in truly disasterous sitations i.e. my computer and local backup disks are
either destroyed or lost.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;a href=&#34;https://www.haystacksoftware.com/arq/&#34;&gt;Arq&lt;/a&gt; to do the backing up. Arq has a good reputation and can
backup to &lt;a href=&#34;https://www.google.co.uk/drive/&#34;&gt;Google Drive&lt;/a&gt;, &lt;a href=&#34;https://www.dropbox.com&#34;&gt;Dropbox&lt;/a&gt;, &lt;a href=&#34;http://aws.amazon.com/s3/&#34;&gt;Amazon S3 or Glacier&lt;/a&gt; and
&lt;a href=&#34;https://onedrive.live.com&#34;&gt;Microsoft OneDrive&lt;/a&gt;. It can also backup to &lt;a href=&#34;https://cloud.google.com/storage/docs/nearline-storage&#34;&gt;Google Nearline&lt;/a&gt; which is a
new competitor to Amazon&amp;rsquo;s offerings. I decided to give Nearline a try.&lt;/p&gt;
&lt;p&gt;The initial backup of approximately 200GB took around 5 days. Unfortunately, I
experienced some errors before it completed. It did complete in the end, and
seems fine, but any sort of error message does not inspire confidence.&lt;/p&gt;
&lt;p&gt;This backup should only cost a few dollars per month. It does seem to be
backing up more data than I expected though, so I will need to monitor this to
stop it getting too large and increasing the cost.&lt;/p&gt;
&lt;p&gt;I can see me trying out other services such as &lt;a href=&#34;https://www.backblaze.com&#34;&gt;Backblaze&lt;/a&gt; or
&lt;a href=&#34;http://www.code42.com/crashplan/&#34;&gt;Crashplan&lt;/a&gt; in the future.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This setup is still a work in progress. There are some parts that I&amp;rsquo;m happy
with and others which make me feel uneasy. I can see my offsite backup changing
in the future due to the flakiness I&amp;rsquo;ve experienced with Arq and Google.
However, I do feel that there is a good level of data redundancy and the
backups are spread out enough. I should now hopefully be able to sleep better
at night.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to compile the tmk_keyboard firmware for ErgoDox on Mac OS X</title>
      <link>https://elver.me/blog/how-to-compile-the-tmk-keyboard-firmware-for-ergodox-on-mac-os-x/</link>
      <pubDate>Mon, 30 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/how-to-compile-the-tmk-keyboard-firmware-for-ergodox-on-mac-os-x/</guid>
      <description>&lt;p&gt;I received my &lt;a href=&#34;http://ergodox.org/&#34;&gt;ErgoDox keyboard&lt;/a&gt; from &lt;a href=&#34;https://www.massdrop.com/buy/ergodox?s=ergodox&#34;&gt;Massdrop&lt;/a&gt; a month or so ago. After
a false start because of some missing parts, and with the &lt;a href=&#34;https://twitter.com/richbezz&#34;&gt;help of a friend&lt;/a&gt;
handy with a soldering iron, it is now up and running.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve wanted to try the &lt;a href=&#34;https://normanlayout.info/&#34;&gt;Norman layout&lt;/a&gt; for a while. This seemed like the
perfect opportunity. The ErgoDox is so different anyway, changing the layout
would should not pose too much of a problem? That&amp;rsquo;s the theory. Unfortunately,
the &lt;a href=&#34;https://github.com/benblazak/ergodox-firmware&#34;&gt;&amp;ldquo;official&amp;rdquo; ErgoDox firmware&lt;/a&gt; doesn&amp;rsquo;t come with Norman. I didn&amp;rsquo;t want to
start hacking at keyboard firmware before even getting it up and running, so I
decided to try &lt;a href=&#34;https://github.com/tmk/tmk_keyboard&#34;&gt;tmk_keyboard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is how I got it working.&lt;/p&gt;
&lt;h2 id=&#34;install-dependencies&#34;&gt;Install dependencies&lt;/h2&gt;
&lt;p&gt;We need to install &lt;a href=&#34;http://www.nongnu.org/avr-libc/&#34;&gt;AVR Libc&lt;/a&gt;. This package contains C libraries for AVR
microcontrollers (used by the &lt;a href=&#34;https://www.pjrc.com/teensy/&#34;&gt;Teensy&lt;/a&gt; microcontroller in the ErgoDox) and most
importantly for us, a version of GCC that will allow us to build the firmware.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AVR Libc is a Free Software project whose goal is to provide a high quality C
library for use with GCC on Atmel AVR microcontrollers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can install the dependencies using &lt;a href=&#34;http://brew.sh/&#34;&gt;Homebrew&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ brew tap larsimmisch/avr
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ brew install avr-libc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;build-the-firmware&#34;&gt;Build the firmware&lt;/h2&gt;
&lt;p&gt;There are many versions of the &lt;code&gt;tmk_keyboard&lt;/code&gt; firmware available on GitHub. I&amp;rsquo;m
using &lt;a href=&#34;https://github.com/tenderlove/tmk_keyboard&#34;&gt;Tenderlove&amp;rsquo;s fork&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Get the source code.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone git@github.com:tenderlove/tmk_keyboard.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Change to the ErgoDox keyboard firmware directory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;cd&lt;/span&gt; tmk_keyboard/keyboard/ergodox
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Build the firmware.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make clean
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make -f Makefile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should now have a file called &lt;code&gt;ergodox_pjrc.hex&lt;/code&gt; in the directory. This is
what you need to load onto the keyboard.&lt;/p&gt;
&lt;h2 id=&#34;install-the-firmware&#34;&gt;Install the firmware&lt;/h2&gt;
&lt;p&gt;I used the Teensy Loader app. Follow the &lt;a href=&#34;http://www.pjrc.com/teensy/loader_mac.html&#34;&gt;instructions on their website&lt;/a&gt;
choosing the &lt;code&gt;ergodox_pjrc.hex&lt;/code&gt; file that we just built.&lt;/p&gt;
&lt;p&gt;Hopefully, that should be it. Good luck fellow ErgoDox owners!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Editing the command line in Vim</title>
      <link>https://elver.me/blog/editing-the-commandline-in-vim/</link>
      <pubDate>Mon, 02 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/editing-the-commandline-in-vim/</guid>
      <description>&lt;p&gt;Constructing long commands on the command line can quickly get out of control.
I use Vim keybindings in ZSH, which helps greatly. They allow you to navigate
the shell using familiar shortcuts from Vim. Wouldn&amp;rsquo;t it be neat if you could
edit those commands directly in Vim though?&lt;/p&gt;
&lt;p&gt;You can.&lt;/p&gt;
&lt;img src=&#34;/images/edit-in-vim.gif&#34; /&gt;
&lt;p&gt;Add this to your &lt;code&gt;~/.zshrc&lt;/code&gt; file and reload your terminal.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;autoload edit-command-line
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;zle -N edit-command-line
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bindkey -M vicmd v edit-command-line
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now when you hit &lt;code&gt;ESC&lt;/code&gt; and then &lt;code&gt;v&lt;/code&gt;, the current command line will open in Vim.
Saving and exiting (&lt;code&gt;:wq&lt;/code&gt;) will return you to the command line with the changes
you made.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Two handy CURL tips for working with RESTful APIs</title>
      <link>https://elver.me/blog/two-handy-curl-tips-for-working-with-restful-apis/</link>
      <pubDate>Tue, 27 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/two-handy-curl-tips-for-working-with-restful-apis/</guid>
      <description>&lt;p&gt;I was recently working on a REST API for an iPhone app. I used &lt;a href=&#34;http://curl.haxx.se/&#34;&gt;curl&lt;/a&gt;
alongside automated tests to manually test as I built. curl is a great tool but
if you need to specify lots of arguments, as I did, it can soon become
unwieldy.&lt;/p&gt;
&lt;p&gt;These two tips helped me out.&lt;/p&gt;
&lt;h2 id=&#34;1-read-arguments-from-a-file&#34;&gt;1) Read arguments from a file&lt;/h2&gt;
&lt;p&gt;I had many arguments to pass when testing the API including the &lt;code&gt;Accept&lt;/code&gt; and
&lt;code&gt;Authorisation&lt;/code&gt; headers. With those alone, the argument list is already pretty
big.&lt;/p&gt;
&lt;p&gt;Luckily, the authors of curl have thought of this and have &lt;a href=&#34;http://curl.haxx.se/docs/manpage.html#-K&#34;&gt;built-in an option&lt;/a&gt;
for them to be read from a file.&lt;/p&gt;
&lt;p&gt;Create a file for your arguments and list them inside. Mine looked something
like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-H &amp;quot;Accept:application/vnd.vendor-v1+json&amp;quot;
-H &amp;quot;Authorization:Basic cZHV0Z29vdVhBR1...&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then tell curl where to find them.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl &amp;lt;url&amp;gt; -K path/to/file
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;2-reading-post-data-from-a-file&#34;&gt;2) Reading POST data from a file&lt;/h2&gt;
&lt;p&gt;I needed to POST a lot of JSON data at various API endpoints. As with
arguments, you can also tell curl to &lt;a href=&#34;http://curl.haxx.se/docs/manpage.html#-d&#34;&gt;read the data from a file&lt;/a&gt;. This is
especially useful as formatting JSON data on the command line is no fun!&lt;/p&gt;
&lt;p&gt;To make curl read the data from a file, prefix the filename with an @ symbol.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl &amp;lt;url&amp;gt; –data @filename
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These tips should hopefully make using curl easier.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Disable spell check on form fields</title>
      <link>https://elver.me/blog/disable-spell-check-on-form-fields/</link>
      <pubDate>Sun, 13 Jul 2014 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/disable-spell-check-on-form-fields/</guid>
      <description>&lt;p&gt;TIL that you can turn off spell checking for text input form fields.&lt;/p&gt;
&lt;p&gt;I know, this sounds like a terrible idea. Similar atrocities such as turning
off cut and paste have been committed by others and are very annoying indeed.
However, used carefully and in the right context, it&amp;rsquo;s good to know that this
is possible.&lt;/p&gt;
&lt;p&gt;My particular use case was for a form field designed to accept a Foursquare ID.
The value entered would only ever be a mixture of numbers and letters and would
&lt;strong&gt;always&lt;/strong&gt; fail a spell check. The red dotted line signals to the user that
they have made a mistake, even if their input is valid.&lt;/p&gt;
&lt;img src=&#34;/images/spellcheck_before.png&#34;&gt;
&lt;p&gt;This is one such case where I think turning off spell checking is a good idea.&lt;/p&gt;
&lt;p&gt;To do this, you simply add the &lt;code&gt;spellcheck&lt;/code&gt; attribute to your input tag and set
it to &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#000080&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;foursquare_id&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;spellcheck&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;img src=&#34;/images/spellcheck_after.png&#34;&gt;
&lt;p&gt;And, there we go, no spell checking on the form field.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ruby method objects</title>
      <link>https://elver.me/blog/ruby-method-objects/</link>
      <pubDate>Wed, 25 Jun 2014 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/ruby-method-objects/</guid>
      <description>&lt;p&gt;If we want to capitalise all the values in an array, we can use &lt;code&gt;#map&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;apple&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;pear&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;banana&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;].&lt;/span&gt;map { &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;fruit&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; fruit&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;upcase }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;APPLE&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;PEAR&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;BANANA&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alternatively, a more terse version is available using the &lt;code&gt;Symbol#to_proc&lt;/code&gt; trick.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;apple&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;pear&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;banana&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;].&lt;/span&gt;map(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#990073&#34;&gt;:upcase&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;APPLE&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;PEAR&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;BANANA&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can even achieve the same thing using an explicit &lt;code&gt;Proc&lt;/code&gt; object.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;apple&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;pear&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;banana&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;].&lt;/span&gt;map(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Proc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;new { &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;fruit&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt; fruit&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;upcase })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;APPLE&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;PEAR&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;BANANA&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;but-i-wanna-call-my-own-method&#34;&gt;But, I wanna call my own method!&lt;/h2&gt;
&lt;p&gt;But what if you want to call a method of your own creation?&lt;/p&gt;
&lt;p&gt;In Ruby, methods are not objects. They are one of the few things in Ruby that
aren&amp;rsquo;t. That&amp;rsquo;s why we have the &lt;code&gt;Object#method&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;We need to get an object instance which we can pass to &lt;code&gt;#map&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;Foo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;self&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;bar&lt;/span&gt;(value)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    value&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;upcase
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;apple&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;pear&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;banana&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;].&lt;/span&gt;map(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;method(&lt;span style=&#34;color:#990073&#34;&gt;:bar&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;APPLE&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;PEAR&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;BANANA&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We first get an instance of the &lt;code&gt;.bar&lt;/code&gt; method using &lt;code&gt;Foo.method&lt;/code&gt; and then the
&lt;code&gt;Method&lt;/code&gt; object is converted to a block using &lt;code&gt;&amp;amp;&lt;/code&gt; and applied to every item in
the array.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sorting columns of text in Vim using sort</title>
      <link>https://elver.me/blog/sorting-columnds-of-text-in-vim-using-sort/</link>
      <pubDate>Wed, 12 Mar 2014 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/sorting-columnds-of-text-in-vim-using-sort/</guid>
      <description>&lt;p&gt;I recently wanted to get some stats on some Mongo collections to see a) which
collection had the most documents; and b) which collections were the biggest by
data size.&lt;/p&gt;
&lt;p&gt;I copy and pasted the stats from our hosted Mongo provider, MongoHQ, and then
sorted them in Vim. This is what the text looked like after pasting into Vim
(with the &lt;code&gt;:set paste&lt;/code&gt; option set).&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;affiliates  1038  680 KB
article_ratings 699 168 KB
authors 30  40 KB
fs.chunks 3401  633.89 MB
fs.files  1476  680 KB
nodes 1432  24.29 MB
nodes_search  91  2.8 MB
nodes_tags  272 40 KB
page_views  107769  16.37 MB
page_views_map  212 40 KB
recommendations 34305 45.1 MB
rewrite_rules 209 168 KB
sign_ups  10331 12.52 MB
sitemaps  1 14.84 MB
suppliers 13  8 KB
tariff_price_check_reports  34  540 KB
tariff_price_checks 1129  968 KB
tariffs 5 680 KB
users 17  64 KB
users_tags  2 8 KB
versions  18031 156.64 MB
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;First I sorted the text into &amp;ldquo;proper&amp;rdquo; columns using the &lt;code&gt;column&lt;/code&gt; utility.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;:%!column -t
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Which resulted in nice, spaced out, columns.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;affiliates                  1038    680     KB
article_ratings             699     168     KB
authors                     30      40      KB
fs.chunks                   3401    633.89  MB
fs.files                    1476    680     KB
nodes                       1432    24.29   MB
nodes_search                91      2.8     MB
nodes_tags                  272     40      KB
page_views                  107769  16.37   MB
page_views_map              212     40      KB
recommendations             34305   45.1    MB
rewrite_rules               209     168     KB
sign_ups                    10331   12.52   MB
sitemaps                    1       14.84   MB
suppliers                   13      8       KB
tariff_price_check_reports  34      540     KB
tariff_price_checks         1129    968     KB
tariffs                     5       680     KB
users                       17      64      KB
users_tags                  2       8       KB
versions                    18031   156.64  MB
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To sort the text by the total number of documents in the collection, I did this.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;:%!sort -k2nr
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This sorted by the second column (&lt;code&gt;-k2&lt;/code&gt;), treats the text as a number (&lt;code&gt;n&lt;/code&gt;) and
then sorts in reverse (&lt;code&gt;r&lt;/code&gt;), which results in.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;page_views                  107769  16.37   MB
recommendations             34305   45.1    MB
versions                    18031   156.64  MB
sign_ups                    10331   12.52   MB
fs.chunks                   3401    633.89  MB
fs.files                    1476    680     KB
nodes                       1432    24.29   MB
tariff_price_checks         1129    968     KB
affiliates                  1038    680     KB
article_ratings             699     168     KB
nodes_tags                  272     40      KB
page_views_map              212     40      KB
rewrite_rules               209     168     KB
nodes_search                91      2.8     MB
tariff_price_check_reports  34      540     KB
authors                     30      40      KB
users                       17      64      KB
suppliers                   13      8       KB
tariffs                     5       680     KB
users_tags                  2       8       KB
sitemaps                    1       14.84   MB
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then, I sort by the the 4th column (&lt;code&gt;-k4&lt;/code&gt;), followed by the 3rd column, but this
time we require a few more switches. We ignore leading blank spaces (&lt;code&gt;b&lt;/code&gt;), and
this time we sort using a general numeric sort (&lt;code&gt;g&lt;/code&gt;).&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;:%!sort -k4 -bk3g
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And there we have it, sorted by file size.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;suppliers                   13      8       KB
users_tags                  2       8       KB
authors                     30      40      KB
nodes_tags                  272     40      KB
page_views_map              212     40      KB
users                       17      64      KB
article_ratings             699     168     KB
rewrite_rules               209     168     KB
tariff_price_check_reports  34      540     KB
affiliates                  1038    680     KB
fs.files                    1476    680     KB
tariffs                     5       680     KB
tariff_price_checks         1129    968     KB
nodes_search                91      2.8     MB
sign_ups                    10331   12.52   MB
sitemaps                    1       14.84   MB
page_views                  107769  16.37   MB
nodes                       1432    24.29   MB
recommendations             34305   45.1    MB
versions                    18031   156.64  MB
fs.chunks                   3401    633.89  MB
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;*nix is cool.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How I deployed Middleman to Heroku</title>
      <link>https://elver.me/blog/how-i-deployed-middleman-to-heroku/</link>
      <pubDate>Mon, 17 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/how-i-deployed-middleman-to-heroku/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently redesigned this website and it is now built using &lt;a href=&#34;http://www.middlemanapp.com&#34;&gt;Middleman&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Middleman is a static site generator using all the shortcuts and tools in
modern web development&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This post is about how I deployed the site to &lt;a href=&#34;http://www.heroku.com&#34;&gt;Heroku&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;building-the-site&#34;&gt;Building the site&lt;/h2&gt;
&lt;p&gt;Middleman is a &lt;strong&gt;static&lt;/strong&gt; site generator, as such, we need to figure out how
to get the site built when we deploy. This saves having to build the site and
commit the result before deploying.&lt;/p&gt;
&lt;p&gt;Heroku will automatically attempt to execute a rake task called &lt;code&gt;assets:precompile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This was originally for the benefit of Rails, but we can take advantage of this
now for our own needs.&lt;/p&gt;
&lt;p&gt;I created a new &lt;code&gt;Rakefile&lt;/code&gt; and added the following.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;namespace &lt;span style=&#34;color:#990073&#34;&gt;:assets&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  task &lt;span style=&#34;color:#990073&#34;&gt;:precompile&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sh &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;middleman build&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The task simply shells out to call &lt;code&gt;middleman build&lt;/code&gt; which builds the site
automatically when the site is pushed to Heroku. Middleman will output all
files to &lt;code&gt;./build&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;serving-the-site&#34;&gt;Serving the site&lt;/h2&gt;
&lt;p&gt;The process of serving a static Middleman site on Heroku is quite straight
forward once you understand the basics. The site will be running as a Rack
app, so we&amp;rsquo;ll need a &lt;code&gt;config.ru&lt;/code&gt; file. Here is what mine looks like.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;rack&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;rack/contrib/try_static&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# Serve files from the build directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;use &lt;span style=&#34;color:#008080&#34;&gt;Rack&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#008080&#34;&gt;TryStatic&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#990073&#34;&gt;root&lt;/span&gt;: &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;build&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#990073&#34;&gt;urls&lt;/span&gt;: &lt;span style=&#34;color:#d14&#34;&gt;%w[/]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#990073&#34;&gt;try&lt;/span&gt;: &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;.html&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;index.html&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;/index.html&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;run &lt;span style=&#34;color:#0086b3&#34;&gt;lambda&lt;/span&gt;{ &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;env&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  four_oh_four_page &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;File&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;expand_path(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;../build/404/index.html&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#999&#34;&gt;__FILE__&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#099&#34;&gt;404&lt;/span&gt;, { &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;text/html&amp;#39;&lt;/span&gt;}, &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;File&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;read(four_oh_four_page) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;Rack::TryStatic&lt;/code&gt; section is how we serve up the static files that
Middleman builds when the site is pushed to Heroku. Middleman outputs all
files into &lt;code&gt;./build&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If no page is served from the &lt;code&gt;Rack::Trystatic&lt;/code&gt; app, the 404 page is served
using the next &lt;code&gt;run&lt;/code&gt; section.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; Make sure to add &lt;code&gt;rack-contrib&lt;/code&gt; to your &lt;code&gt;Gemfile&lt;/code&gt; as pointed out by
&lt;a href=&#34;https://twitter.com/fulljames/status/469128779777212417&#34;&gt;@fulljames&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I decided to use the &lt;a href=&#34;http://puma.io&#34;&gt;Puma&lt;/a&gt; web server to do the &lt;em&gt;actual&lt;/em&gt; web serving of the
files as I had never used it before and wanted to try it out. I added Puma to
my &lt;code&gt;Gemfile&lt;/code&gt; and created this &lt;code&gt;Procfile&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#990073&#34;&gt;web&lt;/span&gt;: bundle &lt;span style=&#34;color:#0086b3&#34;&gt;exec&lt;/span&gt; puma &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;p&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;$PORT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puma is working great.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s as simple as that. Once pushed to Heroku, everything just works.&lt;/p&gt;
&lt;h2 id=&#34;keeping-the-site-alive&#34;&gt;Keeping the site alive&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m using a single free &lt;a href=&#34;https://devcenter.heroku.com/articles/dynos&#34;&gt;Dyno&lt;/a&gt; to serve the site and it&amp;rsquo;s seriously fast. Granted,
this site is not receiving lots of traffic, but it&amp;rsquo;s still very quick.&lt;/p&gt;
&lt;p&gt;The only downside of a single Heroku Dyno is that it will idle after a period
of inactivity, which can happen often unless you get lots of regular traffic.&lt;/p&gt;
&lt;p&gt;I order to keep the site alive, the sites needs to be requested periodically.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;a href=&#34;http://www.pingdom.com&#34;&gt;Pingdom&lt;/a&gt; for this.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Middleman is really easy to work with, especially for a Rails developer, and
Heroku serves the site very well. I would definitely recommend the combination
of Middleman and Heroku.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The Middleman build environment</title>
      <link>https://elver.me/blog/the-middleman-build-environment/</link>
      <pubDate>Mon, 10 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/the-middleman-build-environment/</guid>
      <description>&lt;p&gt;Rails has long had the concept of environments built-in. That is, the ability
to set the environment to &lt;strong&gt;development&lt;/strong&gt;, &lt;strong&gt;production&lt;/strong&gt; or &lt;strong&gt;test&lt;/strong&gt;, and only
run code when in one or more of those environments. For example, the
development environment has class caching turned off by default, so that code
is reloaded on every request, perfect whilst developing. In production, this is
turned on, for much improved performance.&lt;/p&gt;
&lt;p&gt;Middleman has a similar idea, but the environments are &lt;strong&gt;build&lt;/strong&gt; and
&lt;strong&gt;development&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I recently took advantage of this feature, specifically, the build environment.&lt;/p&gt;
&lt;p&gt;The build environment is set when the site is being built using &lt;code&gt;middleman build&lt;/code&gt;. I used this to only include Google Analytics tracking code when the
site is built. This stops local web browsing from affecting my web statistics.&lt;/p&gt;
&lt;p&gt;In my &lt;code&gt;layout.erb&lt;/code&gt;, I&amp;rsquo;ve used the &lt;code&gt;build?&lt;/code&gt; helper to conditionally include the
relevant JavaScript code.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-erb&#34; data-lang=&#34;erb&#34;&gt;&amp;lt;% if build? %&amp;gt;

&amp;lt;script type=&amp;#34;text/javascript&amp;#34;&amp;gt;
  var _gaq = _gaq || [];
  _gaq.push([&amp;#39;_setAccount&amp;#39;, &amp;#39;xxxxxxxxxx&amp;#39;]);
  _gaq.push([&amp;#39;_trackPageview&amp;#39;]);

  (function() {
    var ga = document.createElement(&amp;#39;script&amp;#39;); ga.type = &amp;#39;text/javascript&amp;#39;; ga.async = true;
    ga.src = (&amp;#39;https:&amp;#39; == document.location.protocol ? &amp;#39;https://ssl&amp;#39; : &amp;#39;http://www&amp;#39;) + &amp;#39;.google-analytics.com/ga.js&amp;#39;;
    var s = document.getElementsByTagName(&amp;#39;script&amp;#39;)[0]; s.parentNode.insertBefore(ga, s);
  })();
&amp;lt;/script&amp;gt;

&amp;lt;% end %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see, this is very simple, but also very useful for customising
templates at build time.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Troubleshooting Heroku deploys with empty Git commits</title>
      <link>https://elver.me/blog/troubleshooting-heroku-deploys-with-empty-git-commits/</link>
      <pubDate>Tue, 04 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/troubleshooting-heroku-deploys-with-empty-git-commits/</guid>
      <description>&lt;p&gt;When troubleshooting Heroku deployments, you need to push to the Heroku remote
over and over until you&amp;rsquo;ve found the problem. It&amp;rsquo;s necessary to add new Git
commits in order to force Heroku to re-compile your &lt;a href=&#34;https://devcenter.heroku.com/articles/slug-compiler&#34;&gt;application slug&lt;/a&gt; or else
you will get the &lt;code&gt;Everything up-to-date&lt;/code&gt; message back from Git.&lt;/p&gt;
&lt;p&gt;Rather than making trivial changes all the time, you can add empty commits.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git commit --allow-empty -m &amp;quot;Force slug recompilation&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It still adds unnecessary commits to your repo, but it&amp;rsquo;s cleaner and at least
you&amp;rsquo;re not touching any code.&lt;/p&gt;
&lt;h2 id=&#34;update&#34;&gt;Update&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://simonstarr.com&#34;&gt;Simon Starr&lt;/a&gt; has mentioned another method to achieve the same thing. Using
Git with the &lt;code&gt;--amend&lt;/code&gt; flag.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git commit --amend
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Usually, this is used to add missing files to your previous commit or change
the commit message, but it &lt;em&gt;also&lt;/em&gt; removes the previous commit and creates a new
one, which means that Heroku will update and re-compile without a problem.&lt;/p&gt;
&lt;p&gt;Be careful though, this is not a good method if you&amp;rsquo;ve already shared your
commits with someone else, but it&amp;rsquo;s worth bearing in mind depending on the
situation as it saves you adding &lt;em&gt;any&lt;/em&gt; new commits to your repo. Thanks, Simon.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Find where your code broke with git bisect</title>
      <link>https://elver.me/blog/find-where-your-code-broke-with-git-bisect/</link>
      <pubDate>Fri, 31 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/find-where-your-code-broke-with-git-bisect/</guid>
      <description>&lt;p&gt;Your code is broken. You know everything was working at a certain point in time
or that a particular commit was ok, but you&amp;rsquo;re not sure which commit
&lt;em&gt;since&lt;/em&gt; then has introduced the problem.&lt;/p&gt;
&lt;p&gt;You need &lt;code&gt;git bisect&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;From the &lt;a href=&#34;http://git-scm.com/docs/git-bisect&#34;&gt;git documentation&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;git-bisect - Find by binary search the change that introduced a bug&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Umm, right. Ok.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;git bisect&lt;/code&gt; starts by specifying a &lt;strong&gt;good&lt;/strong&gt; and a &lt;strong&gt;bad&lt;/strong&gt; revision. &lt;code&gt;git&lt;/code&gt; will
then checkout each commit by splitting (or bisecting) the range of commits and
running the supplied command until it returns with an exit code of zero.&lt;/p&gt;
&lt;p&gt;An exit code of zero means the command was successful.&lt;/p&gt;
&lt;p&gt;The command can be anything that &lt;strong&gt;will&lt;/strong&gt; return an exit code, which includes
most *nix binaries or scripts.&lt;/p&gt;
&lt;p&gt;In this example, we&amp;rsquo;re using &lt;a href=&#34;http://cukes.info&#34;&gt;Cucumber&lt;/a&gt; as the command.&lt;/p&gt;
&lt;h2 id=&#34;a-working-example-using-cucumber&#34;&gt;A working example using Cucumber&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git bisect start
git bisect good &amp;lt;commit-where-stuff-is-working&amp;gt;
git bisect bad &amp;lt;commit-where-stuff-is-not-working&amp;gt;
git bisect run bundle exec cucumber features/a-feature.feature
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If the tests fail, Cucumber will return a non-zero exit code and &lt;code&gt;git&lt;/code&gt; will
keep trying other commits until it finds one that is successful. We will then
know when the code was &amp;ldquo;good&amp;rdquo;, and more importantly, the commit where it became
&amp;ldquo;bad&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;When finished, reset your branch to the previous state before starting the &lt;code&gt;git bisect&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git bisect reset
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you&amp;rsquo;d expect with &lt;code&gt;git&lt;/code&gt;, it &lt;a href=&#34;http://git-scm.com/docs/git-bisect&#34;&gt;can do &lt;em&gt;a lot&lt;/em&gt; more than this&lt;/a&gt;, but this is
the way in which I normally use it.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>It&#39;s the little things</title>
      <link>https://elver.me/blog/its-the-little-things/</link>
      <pubDate>Sat, 30 Jul 2011 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/its-the-little-things/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been thinking about the &lt;a href=&#34;http://littlebigdetails.com/&#34;&gt;little things&lt;/a&gt; that can be changed to make a
web page easier to use. Seemingly small changes can add up to have a big impact
on the way people will interact with the page.&lt;/p&gt;
&lt;p&gt;On one particular site, I have a pretty standard widget used to select the
amount of products to show per page. I&amp;rsquo;m sure you&amp;rsquo;ve seen something similar to
that of below on many other websites.&lt;/p&gt;
&lt;img src=&#34;/images/dropdown.gif&#34; alt=&#34;Example of a dropdown list used to select the amount of products to show on the page&#34; /&gt;
&lt;p&gt;The way this is currently implemented, it takes &lt;strong&gt;three&lt;/strong&gt; clicks to complete
the intended operation. This could be reduced to &lt;strong&gt;two&lt;/strong&gt; clicks by adding some
JavaScript to trigger the page change (and removing the button), but there is a
problem with this method: The options at &lt;strong&gt;not all visible&lt;/strong&gt; at once. You have
to click to see what the options are.&lt;/p&gt;
&lt;h2 id=&#34;rethinking-the-implementation&#34;&gt;Rethinking the implementation&lt;/h2&gt;
&lt;p&gt;I decided to change the way this was implemented, moving to a horizontal list of links.&lt;/p&gt;
&lt;img src=&#34;/images/list.gif&#34; alt=&#34;Example of a list used to select the amount of products to show on the page&#34; /&gt;
&lt;p&gt;The advantages of this approach are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can see all options at once. Please, &lt;a href=&#34;http://www.amazon.co.uk/Dont-Make-Me-Think-Usability/dp/0321344758&#34;&gt;don&amp;rsquo;t make me think&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s only a &lt;strong&gt;single&lt;/strong&gt; click to select an option.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s better for accessibility because you don&amp;rsquo;t have to fiddle with a
dropdown (and who wants to?).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I think this is a fairly good example of how changing small things, perhaps
even those that seem inconsequential, can contribute to improving the overall
experience of the page, and delight the user.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Rails Footnotes problem</title>
      <link>https://elver.me/blog/rails-footnotes-problem/</link>
      <pubDate>Sun, 24 Jul 2011 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/rails-footnotes-problem/</guid>
      <description>&lt;p&gt;I recently had a head-scratching time trying to figure out why code that
integrates with a 3rd party payment processor had suddenly stopped working. The
code in question simply returns a text only response to the 3rd party, who then
read, parse and act on it. Within my Rails controller:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;render &lt;span style=&#34;color:#990073&#34;&gt;:text&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Status=OK,Detail=Some details here&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I found the culprit by going through my git log to see what had changed
recently. Turns out it was the recent addition of Rails Footnotes causing the
problem. &lt;a href=&#34;http://rubydoc.info/gems/rails-footnotes/3.7.4/frames&#34;&gt;Rails Footnotes&lt;/a&gt; is an awesome gem that adds various information
about your app to the bottom of every page including clickable links to
controllers, views and partials. Clicking these links opens the file in your
text editor of choice.&lt;/p&gt;
&lt;p&gt;Rails Footnotes was appending its debugging HTML (as designed) to my text-only
response, breaking the payment processors parsing. After an &lt;a href=&#34;http://railstips.org/blog/archives/2010/10/14/stop-googling/&#34;&gt;inspection of the
source&lt;/a&gt; I noticed that Footnotes are only output if the content type
includes &amp;ldquo;html&amp;rdquo;, such as &amp;ldquo;text/html&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;the-fix&#34;&gt;The fix&lt;/h2&gt;
&lt;p&gt;In my case the whole controller could (and probably should) be returned as
&amp;ldquo;text/plain&amp;rdquo;. I hooked up a &lt;code&gt;before_filter&lt;/code&gt; to add the &lt;code&gt;Content-Type&lt;/code&gt; header to
the response and that fixed it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#458;font-weight:bold&#34;&gt;NotificationController&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;ApplicationController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;# Set the content type to text/plain so footnotes don&amp;#39;t show&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  before_filter &lt;span style=&#34;color:#990073&#34;&gt;:set_content_type&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#900;font-weight:bold&#34;&gt;set_content_type&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    headers&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;text/plain&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For versions of Rails Footnotes greater than 3.7.0 (which is Rails 3 only) you
can actually configure if Footnotes are added to the page using an initializer
(or similar). Unfortunately, I&amp;rsquo;m still using Rails 2 on this project so I
currently can&amp;rsquo;t take advantage of that.&lt;/p&gt;
&lt;h2 id=&#34;in-conclusion&#34;&gt;In conclusion&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://rubydoc.info/gems/rails-footnotes/3.7.4/frames&#34;&gt;Rails Footnotes&lt;/a&gt; is a must-have, you really should check it out.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Automatically attaching to a tmux session via SSH</title>
      <link>https://elver.me/blog/automatically-attaching-to-a-tmux-session-via-ssh/</link>
      <pubDate>Sat, 27 Nov 2010 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/automatically-attaching-to-a-tmux-session-via-ssh/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using &lt;a href=&#34;http://tmux.sourceforge.net/&#34;&gt;tmux&lt;/a&gt; as a
&lt;a href=&#34;http://www.gnu.org/software/screen/&#34;&gt;screen&lt;/a&gt; replacement for a while now. I
find it easier to use and configure than screen. I tend to leave a tmux session
running on servers that I administer so that everything is just as it was when
I last connected. It&amp;rsquo;s very handy.&lt;/p&gt;
&lt;p&gt;To make this even more convenient, I wanted to be able to automatically attach
to a running tmux session when connecting to servers using
&lt;a href=&#34;http://en.wikipedia.org/wiki/Secure_Shell&#34;&gt;SSH&lt;/a&gt;. The SSH client already comes
with the ability to run a command when connecting. It works like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh &amp;lt;hostname&amp;gt; &amp;lt;command&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Unfortunately, this didn&amp;rsquo;t work when I tried attaching to a tmux session.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh &amp;lt;hostname&amp;gt; tmux a
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;not a terminal
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After a bit of Googling, it turns out that you need to supply the &lt;code&gt;-t&lt;/code&gt; option
to the &lt;code&gt;ssh&lt;/code&gt; command. The ssh man page describes the option as such:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-t Force pseudo-tty allocation. This can be used to execute
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   arbitrary screen-based programs on a remote machine, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   which can be very useful, e.g., when implementing menu
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   services.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we do that, we&amp;rsquo;re in business:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh &amp;lt;hostname&amp;gt; -t tmux a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To make the command even shorter, I&amp;rsquo;ve been adding bash aliases to my
&lt;code&gt;~/.bash_profile&lt;/code&gt; for each server I connect to, like so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;alias&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;servername&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;ssh servername -t tmux a&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, I can just type &lt;code&gt;servername&lt;/code&gt; and get a SSH connection to servername with
tmux automatically attached. Issuing a &lt;code&gt;&amp;lt;ctrl&amp;gt; + b + d&lt;/code&gt; will detach the tmux
session and disconnect the SSH connection.&lt;/p&gt;
&lt;p&gt;Command line magic!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How to upgrade Phusion Passenger for nginx</title>
      <link>https://elver.me/blog/how-to-upgrade-phusion-passenger-for-nginx/</link>
      <pubDate>Fri, 27 Nov 2009 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/how-to-upgrade-phusion-passenger-for-nginx/</guid>
      <description>&lt;p&gt;I keep forgetting the procedure to upgrade Passenger and nginx, so thought I&amp;rsquo;d
note them down here in case anyone finds it useful. These instructions assume
that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You already have &lt;a href=&#34;http://www.modrails.com/&#34;&gt;Phusion Passenger&lt;/a&gt; installed and
configured for &lt;a href=&#34;http://nginx.net/&#34;&gt;nginx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;re using &lt;a href=&#34;http://www.rubyenterpriseedition.com/&#34;&gt;Ruby Enterprise Edition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;upgrade&#34;&gt;Upgrade&lt;/h2&gt;
&lt;p&gt;Download the latest nginx source and uncompress to a temporary directory.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;cd&lt;/span&gt; ~/sources
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget http://sysoev.ru/nginx/nginx-0.7.64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar xzvf nginx-0.7.64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Install the latest Passenger gem&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo /opt/ruby-enterprise-1.8.6-20090520/bin/gem install passenger
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run the Passenger installer&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo /opt/ruby-enterprise-1.8.6-20090520/bin/passenger-install-nginx-module
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Follow the onscreen instructions, choose option 2 to use your own sources.
Specify the location of the nginx sources when prompted.&lt;/p&gt;
&lt;p&gt;If you want to use any other optional nginx modules, enable them when prompted.
I want to use the SSL and Status modules, so I enable them like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--with-http_ssl_module --with-http_stub_status_module
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The full configure line will look something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./configure --prefix&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;/opt/nginx&amp;#39;&lt;/span&gt; --with-pcre&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;/tmp/pcre-7.8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--add-module&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;/opt/ruby-enterprise-1.8.6-20090520/lib/ruby/gems/1.8/gems/passenger-2.2.5/ext/nginx&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--with-http_ssl_module --with-http_stub_status_module
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After the installer has finished, the new version will be installed in
&lt;code&gt;/opt/nginx&lt;/code&gt; and the old version will be renamed to &lt;code&gt;nginx.old&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;configure&#34;&gt;Configure&lt;/h2&gt;
&lt;p&gt;Update the &lt;code&gt;nginx.conf&lt;/code&gt; with the correct paths, you should only need to change
the path to the &lt;code&gt;passenger_root&lt;/code&gt; directive.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;http &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    passenger_root /opt/ruby-enterprise-1.8.6-20090520/lib/ruby/gems/1.8/gems/passenger-2.2.5;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;restart&#34;&gt;Restart&lt;/h2&gt;
&lt;p&gt;I like to do a config file syntax check before I restart nginx, just in case
of typos and the like.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo /opt/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the check is successful, restart nginx.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo /etc/init.d/nginx restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should now be running the latest version of Passenger and nginx.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>jQuery Event Delegation</title>
      <link>https://elver.me/blog/jquery-event-delegation/</link>
      <pubDate>Wed, 03 Jun 2009 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/jquery-event-delegation/</guid>
      <description>&lt;p&gt;Recently, I&amp;rsquo;ve been working on adding some extra features to a shopping cart
page using &lt;a href=&#34;http://jquery.com/&#34;&gt;jQuery&lt;/a&gt;. The idea is that you select your
country from a dropdown and an AJAX(Asynchronous JavaScript and XML) request is
performed, which updates a list of radio buttons on the page. If you select one
of these radio buttons, it triggers another AJAX(Asynchronous JavaScript and
XML) request, which updates the postage prices for the given items in the
basket.&lt;/p&gt;
&lt;p&gt;Each of the radio buttons has an event like this bound to it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;#options input&amp;#39;&lt;/span&gt;).click(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// lookup postage prices via ajax
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This triggers the AJAX(Asynchronous JavaScript and XML) request which looks up
the postage prices from the database. It works fine with the default set of
radio buttons that are present on the page when it loads. The problem comes
when new radio buttons are added to the page via AJAX(Asynchronous JavaScript
and XML). When a new radio button is added to the list, it doesn&amp;rsquo;t
automatically have a click event (like the one above) bound to it like the
existing items do. The events are not automatically carried across to the new
item you&amp;rsquo;ve added.&lt;/p&gt;
&lt;p&gt;We can get around this problem by re-binding the events each time a new radio
button is added to the page. But this can be messy and there is a much cleaner
way of solving the problem.&lt;/p&gt;
&lt;h2 id=&#34;event-delegation-to-the-rescue&#34;&gt;Event delegation to the rescue&lt;/h2&gt;
&lt;p&gt;This is where event delegation comes in. Event delegation takes advantage of
the fact that browsers &amp;ldquo;bubble&amp;rdquo; events up the DOM(Document Object Model) when
they are triggered on a page. For example, given the HTML(HyperText Markup
Language) below, when clicking the radio button the browser will generate a
click event which will &amp;ldquo;bubble&amp;rdquo; upwards so that first the &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; element
receives the event, followed by the &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;, then the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, and so on.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#000080&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;options&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#000080&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#000080&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;radio&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;postage_method_1&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#000080&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#000080&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#000080&#34;&gt;input&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;radio&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;postage_method_2&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#000080&#34;&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#000080&#34;&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can take advantage of this &amp;ldquo;event bubbling&amp;rdquo;. Instead of binding the event to
each individual &lt;code&gt;input&lt;/code&gt;, we&amp;rsquo;ll bind it to a parent element instead and let the
click events from the inputs bubble up to the parent element. In this case, the
div called options.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;#options&amp;#39;&lt;/span&gt;).click(&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;function&lt;/span&gt;(event) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; ($(event.target).is(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;input&amp;#39;&lt;/span&gt;)){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// do ajax request
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, each time we add an additional input to the page, it will automatically
respond to the same event as the rest of the inputs.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s worth noting that this event will get triggered whenever any element under
the &lt;code&gt;#options&lt;/code&gt; div is clicked, so inside the event we check that the target of
the event was an &lt;code&gt;input&lt;/code&gt; element. This will restrict the code inside the event
so that it only executes when it&amp;rsquo;s an &lt;code&gt;input&lt;/code&gt; that&amp;rsquo;s been clicked.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Event delegation greatly improves the readability of the code. It sounds scary,
but really isn&amp;rsquo;t. It also has the added benefit of speeding up the processing
of the page because you&amp;rsquo;re not spending time looping through many DOM elements
(which takes time) in order to add your event handlers.&lt;/p&gt;
&lt;p&gt;Check out the references below for a much better explanation of how event
delegation and binding of event handlers work.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://icant.co.uk/sandbox/eventdelegation/&#34;&gt;Event Delegation versus Event Handling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://lab.distilldesign.com/event-delegation/&#34;&gt;Event Delegation with jQuery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.danwebb.net/2008/2/8/event-delegation-made-easy-in-jquery&#34;&gt;Event Delegation Made Easy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Learning jQuery - Working with Events, &lt;a href=&#34;http://www.learningjquery.com/2008/03/working-with-events-part-1&#34;&gt;part 1&lt;/a&gt;, and &lt;a href=&#34;http://www.learningjquery.com/2008/05/working-with-events-part-2&#34;&gt;part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>htop - a prettier top</title>
      <link>https://elver.me/blog/htop-a-prettier-top/</link>
      <pubDate>Wed, 31 Dec 2008 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/htop-a-prettier-top/</guid>
      <description>&lt;p&gt;You use &lt;a href=&#34;http://en.wikipedia.org/wiki/Top_%28Unix%29&#34;&gt;top&lt;/a&gt; right? No? Well,
that&amp;rsquo;s probably because top is not the friendliest program in the world. Yes,
it gets the job done, but it could be prettier.&lt;/p&gt;
&lt;p&gt;As I was using top more and more for monitoring my VPS, I looked for something
a bit nicer.&lt;/p&gt;
&lt;p&gt;This is where &lt;a href=&#34;http://htop.sourceforge.net/&#34;&gt;htop&lt;/a&gt; comes in. It&amp;rsquo;s top, but with
colours, progress bars, and a process tree view. Much better. Try it, you
might like it.&lt;/p&gt;
&lt;img src=&#34;/images/htop.jpg&#34; /&gt;
</description>
    </item>
    
    <item>
      <title>Changing Recent Commits with Git</title>
      <link>https://elver.me/blog/changing-recent-commits-with-git/</link>
      <pubDate>Tue, 16 Dec 2008 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/changing-recent-commits-with-git/</guid>
      <description>&lt;p&gt;Have you ever committed to your repo and realised you&amp;rsquo;ve done something a bit
silly? I just did that. I moved to a new machine and forgot to setup my
&lt;code&gt;.gitconfig&lt;/code&gt; with the correct username and email, so when I committed, the
commit had the wrong user against it. Not a big problem, but it just looks a
bit&amp;hellip;well, untidy.&lt;/p&gt;
&lt;p&gt;Fear not. Git is all-powerful and allows you to change your mistake even
though you&amp;rsquo;ve already committed it. Thanks to Tekkub on the
&lt;a href=&#34;http://groups.google.com/group/github&#34;&gt;GitHub Google Group&lt;/a&gt; for
the nudge in the right direction.&lt;/p&gt;
&lt;h2 id=&#34;how-does-i-dos-it&#34;&gt;How does I dos it?&lt;/h2&gt;
&lt;p&gt;Like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git reset --soft HEAD^
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will reset your working copy to the state before you committed and remove
the commit so you can make changes to your working copy (if needed) and
re-commit.&lt;/p&gt;
&lt;p&gt;Re-commit the changes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Changed something&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;ve already pushed to &amp;ldquo;GitHub&amp;rdquo;:http://www.github.com or another external
repo, you can re-push, but you&amp;rsquo;ll need to add &lt;code&gt;--force&lt;/code&gt; because we have removed
a commit locally and Git doesn&amp;rsquo;t like that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push origin --force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;m not sure whether this would be a good idea if someone else has cloned your
repo, but I&amp;rsquo;m ok because I am the only person who pushes to this one.&lt;/p&gt;
&lt;p&gt;Git is great, but powerful, so be careful. I&amp;rsquo;m sure it would be easy to
completely trash your repo with the wrong series of commands.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google Analytics Ecommerce Tracking</title>
      <link>https://elver.me/blog/google-analytics-ecommerce-tracking/</link>
      <pubDate>Thu, 07 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/google-analytics-ecommerce-tracking/</guid>
      <description>&lt;p&gt;So you&amp;rsquo;ve installed &lt;a href=&#34;http://www.google.com/analytics&#34;&gt;Google Analytics&lt;/a&gt;, the
superb free web analytics software and it&amp;rsquo;s telling you all sorts of things
about your site, most of which you don&amp;rsquo;t even understand. You&amp;rsquo;re learning what
a &lt;a href=&#34;http://en.wikipedia.org/wiki/Bounce_Rate&#34;&gt;Bounce Rate&lt;/a&gt; is and realising how
powerful this thing really is.&lt;/p&gt;
&lt;p&gt;Well, it gets even better. I&amp;rsquo;ve recently discovered its&amp;rsquo; Ecommerce tracking
feature.  It allows you to capture Ecommerce related statistics alongside your
normal web related statistics. Once you have it correctly setup for your site
you can see how much money you&amp;rsquo;ve taken in sales, how many transactions have
taken place, how many products have been purchased, and your Ecommerce
conversion rate. Very nice.&lt;/p&gt;
&lt;h2 id=&#34;make-it-so&#34;&gt;Make it so&lt;/h2&gt;
&lt;p&gt;In order to activate Ecommerce tracking, you need to firstly turn on the
feature within Google Analytics, and secondly add some extra JavaScript code to
your receipt or thanks page.&lt;/p&gt;
&lt;p&gt;To turn on the feature, go to the Profile Settings for your site, click Edit
(top right) and under E-Commerce Website, select &amp;ldquo;Yes, an E-Commerce Site&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the extra code you need to add to the receipt page straight from
&lt;a href=&#34;http://www.google.com/support/googleanalytics/bin/answer.py?hl=en&amp;amp;answer=55528&#34;&gt;Google&amp;rsquo;s help page&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#000080&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;var&lt;/span&gt; gaJsHost &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; ((&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;https:&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#0086b3&#34;&gt;document&lt;/span&gt;.location.protocol) &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;https://ssl.&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;http://www.&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0086b3&#34;&gt;document&lt;/span&gt;.write(unescape(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;%3Cscript src=&amp;#39;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;+&lt;/span&gt; gaJsHost &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;google-analytics.com/ga.js&amp;#39; type=&amp;#39;text/javascript&amp;#39;%3E%3C/script%3E&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#000080&#34;&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#000080&#34;&gt;script&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;var&lt;/span&gt; pageTracker &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; _gat._getTracker(&lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;UA-XXXXX-1&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pageTracker._trackPageview();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pageTracker._addTrans(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;1234&amp;#34;&lt;/span&gt;,                                     &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Order ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Mountain View&amp;#34;&lt;/span&gt;,                            &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Affiliation
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;11.99&amp;#34;&lt;/span&gt;,                                    &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Total
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;1.29&amp;#34;&lt;/span&gt;,                                     &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Tax
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;5&amp;#34;&lt;/span&gt;,                                        &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Shipping
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;San Jose&amp;#34;&lt;/span&gt;,                                 &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// City
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;California&amp;#34;&lt;/span&gt;,                               &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// State
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;USA&amp;#34;&lt;/span&gt;                                       &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Country
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pageTracker._addItem(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;1234&amp;#34;&lt;/span&gt;,                                     &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Order ID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;DD44&amp;#34;&lt;/span&gt;,                                     &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// SKU
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;T-Shirt&amp;#34;&lt;/span&gt;,                                  &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Product Name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Green Medium&amp;#34;&lt;/span&gt;,                             &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Category
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;11.99&amp;#34;&lt;/span&gt;,                                    &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Price
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;                                         &lt;span style=&#34;color:#998;font-style:italic&#34;&gt;// Quantity
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#998;font-style:italic&#34;&gt;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pageTracker._trackTrans();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#000080&#34;&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;re already using Analytics, the first few lines will be familier to you.
They&amp;rsquo;re just the standard page tracking calls. The bits we&amp;rsquo;re interested in are
the &lt;code&gt;pageTacker._addTrans()&lt;/code&gt;, &lt;code&gt;pageTracker._addItem()&lt;/code&gt; and
&lt;code&gt;pageTracker._trackTrans()&lt;/code&gt; methods.  You&amp;rsquo;ll need to fill in the relevant
details, and more importantly repeat the &lt;code&gt;_addItem&lt;/code&gt; call for each item within
the order. The method for doing this will obviously differ depending on your
server side choices, but for Rails I&amp;rsquo;ve got something similar to this.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-erb&#34; data-lang=&#34;erb&#34;&gt;&amp;lt;% @order.items.each do |item| %&amp;gt;

  pageTracker._addItem(
    &amp;lt;%= @order.order_id %&amp;gt;,                     // Order ID
    &amp;lt;%= @order.sku %&amp;gt;,                          // SKU
    &amp;lt;%= item.product.name %&amp;gt;,                   // Product Name
    &amp;lt;%= item.product.category %&amp;gt;,               // Category
    &amp;lt;%= item.unit_price %&amp;gt;,                     // Price
    &amp;lt;%= item.quantity %&amp;gt;                        // Quantity
  );

&amp;lt;% end %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You should now start to get E-Commerce stats showing up under the Ecommerce
section of Google Analytics.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.google.com/support/googleanalytics/bin/answer.py?hl=en&amp;amp;answer=55528&#34;&gt;Google Analytics Help&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.epikone.com/blog/2008/07/02/google-analytics-e-commerce-tracking-pt-4-tacking-lead-gen-forms/&#34;&gt;Analytics Talk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Git Patching Flexibility</title>
      <link>https://elver.me/blog/git-patching-flexibility/</link>
      <pubDate>Mon, 04 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/git-patching-flexibility/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know about you, but when I&amp;rsquo;m coding I&amp;rsquo;ll often need to make a change
that&amp;rsquo;s unrelated to the current feature or bug I am working on. I&amp;rsquo;ll notice a
spelling mistake, a typo, or some other small code change. You don&amp;rsquo;t want to
commit the unrelated change as part of your overall commit because, well, it&amp;rsquo;s
unrelated. It should be its own commit with its own commit message.  This will
make it much easier to read the commit log and cuts down on confusion.  People
won&amp;rsquo;t have to ask &amp;ldquo;Why did they change that? It has nothing to do with the
change&amp;rdquo;&lt;/p&gt;
&lt;p&gt;When I used Subversion, you had to remove the unrelated change, commit, then
add it back in and commit again. Maybe there was a nicer way, but I didn&amp;rsquo;t
know it. Git is much nicer.&lt;/p&gt;
&lt;p&gt;When you stage a file ready for committing, Git allows you to only stage a
certain part or parts of the file, which it calls hunks.&lt;/p&gt;
&lt;p&gt;So, run:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add --patch &amp;lt;filename&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Git will show you a diff of the first difference that it wants to stage and
will ask if you&amp;rsquo;d like to stage the current hunk, like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Stage this hunk &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;y/n/a/d/s/?&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;?
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The options in this example are:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y - stage this hunk
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n - &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt; not stage this hunk
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a - stage this and all the remaining hunks in the file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;d - &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt; not stage this hunk nor any of the remaining hunks in the file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;s - split the current hunk into smaller hunks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Choose what you&amp;rsquo;d like to do with the current hunk. Git will continue to go
through the rest of the hunks in the file, asking you what to do with each one.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;ve decided which hunks should be staged, commit as normal and only
those changes will form part of the commit. You can then add the rest of
your changes and commit again.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s the flexibility that&amp;rsquo;s great. It works with you, not against you.&lt;/p&gt;
&lt;p&gt;For a much more in depth look at the capabilities of &lt;code&gt;git add --patch&lt;/code&gt;, see
the following article.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[The Thing About Git](&lt;a href=&#34;http://tomayko.com/writings/the-thing-about-git&#34;&gt;http://tomayko.com/writings/the-thing-about-git&lt;/a&gt; by
&amp;ldquo;Ryan Tomayko&amp;rdquo;:http://tomayko.com/)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>How to generate / request an SSL certificate</title>
      <link>https://elver.me/blog/how-to-generate-request-an-ssl-certificate/</link>
      <pubDate>Thu, 24 Jul 2008 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/how-to-generate-request-an-ssl-certificate/</guid>
      <description>&lt;p&gt;Generating an SSL certificate can be confusing if you&amp;rsquo;ve never done it
before. Actually, it&amp;rsquo;s confusing if you have done it before. Hopefully this
should remind me how to do it in the future!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PLEASE NOTE:&lt;/strong&gt; I am no expert on SSL, but this does the job for me.&lt;/p&gt;
&lt;p&gt;I recently had to do this after the &lt;a href=&#34;http://www.ubuntu.com/usn/usn-612-1&#34;&gt;Debian security
vulnerability&lt;/a&gt; affected one of my SSL
certificates.&lt;/p&gt;
&lt;p&gt;I currently get my SSL cerficiates through &lt;a href=&#34;http://www.namecheap.com&#34;&gt;NameCheap&lt;/a&gt;
for $10.  They are re-sellers of RapidSSL and GeoTrust certificates. Mine is a
RapidSSL.&lt;/p&gt;
&lt;h2 id=&#34;generate-a-private-key-and-certificate-signing-request&#34;&gt;Generate a private key and Certificate Signing Request&lt;/h2&gt;
&lt;p&gt;We need to generate an OpenSSL keypair and a &lt;a href=&#34;http://en.wikipedia.org/wiki/Certificate_signing_request&#34;&gt;Certificate Signing Request
(CSR)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The keypair consists of two cryptographic keys. A public and private. The
public key is included with the CSR along with other applicant information such
as name, company, etc. The private key is used to sign the CSR request.&lt;/p&gt;
&lt;p&gt;A CSR is what you send to your chosen Certificate Authority (CA) to request
that they supply you with an SSL certificate. It includes your identifying
information and the public key for your server/site.&lt;/p&gt;
&lt;p&gt;Generate it like this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssl req -new -newkey rsa:1024 -nodes -keyout example.key -out example.csr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll be prompted to enter information such as Common Name, Organisation,
Country etc.&lt;/p&gt;
&lt;p&gt;It should be fairly straight forward, but your CA will let you know if you&amp;rsquo;ve
done it wrong, I&amp;rsquo;m sure.&lt;/p&gt;
&lt;p&gt;This will create &lt;code&gt;example.key&lt;/code&gt; (the private key) and &lt;code&gt;example.csr&lt;/code&gt; (the CSR).&lt;/p&gt;
&lt;h2 id=&#34;requesting-your-certificate&#34;&gt;Requesting your certificate&lt;/h2&gt;
&lt;p&gt;This part should be easy. Normally your CA will have a form on their website
which allows you to paste in your CSR. This obviously varies from company to
company. Once you have given them your CSR, they will first ask you for money,
and then generate your CRT file. Yay!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m only scratching the surface of SSL here. OpenSSL has a massive amount of
options. There is much to learn.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://help.ubuntu.com/community/OpenSSL&#34;&gt;More information on OpenSSL commands&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Rails Deployment with Git, Vlad and SSH Agent Forwarding</title>
      <link>https://elver.me/blog/rails-deployment-with-git-vlad-and-ssh-agent-forwarding/</link>
      <pubDate>Thu, 10 Jul 2008 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/rails-deployment-with-git-vlad-and-ssh-agent-forwarding/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m switching my code repositories over to Git from Subversion. For the most
part it&amp;rsquo;s going well. I&amp;rsquo;m having some issues with line endings, but that&amp;rsquo;s for
another post. I&amp;rsquo;m still getting to grips with day to day usage, but can already
see that it&amp;rsquo;s going to be a great improvement on Subversion.&lt;/p&gt;
&lt;p&gt;This is how I&amp;rsquo;ve setup Vlad, Git, and SSH to work together.&lt;/p&gt;
&lt;h2 id=&#34;vlad-configuration&#34;&gt;Vlad Configuration&lt;/h2&gt;
&lt;p&gt;I use &lt;a href=&#34;http://rubyhitsquad.com/Vlad_the_Deployer.html&#34;&gt;Vlad&lt;/a&gt; to deploy my
projects to the staging/live server, so I needed to re-configure Vlad to
support Git. This was very simple to do. In my &lt;code&gt;Rakefile&lt;/code&gt;, I included the Git
class instead of the Subversion class. This removes the Subversion specific
commands and includes the Git specific commands instead.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;-require &amp;#39;vlad/subversion&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+require &amp;#39;vlad/git&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I also changed the repository address in my &lt;code&gt;config/deploy.rb&lt;/code&gt; file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;-set :repository, &amp;#39;https://sub.version.server/repo&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;background-color:#fdd&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#000;background-color:#dfd&#34;&gt;+set :repository, &amp;#39;git@github.com:username/repo.git&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These are the only changes I needed to make.&lt;/p&gt;
&lt;h2 id=&#34;ssh-and-git-setup&#34;&gt;SSH and Git setup&lt;/h2&gt;
&lt;p&gt;Git uses SSH keys to control access to repositories. As I&amp;rsquo;m using GitHub as my
deployment Git repository, I needed to identify myself with them. To do this, I
supplied them with my SSH public key. &lt;a href=&#34;http://github.com/guides/providing-your-ssh-key#linux&#34;&gt;GitHub have good instructions on how to
do this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As the code is cloned from GitHub directly to the deployment server (not my
machine), my private SSH key would also need to be installed on the deployment
server.&lt;/p&gt;
&lt;p&gt;Vlad deployment now works! This will checkout the latest HEAD and deploy it to
the server. &lt;a href=&#34;http://scie.nti.st/2007/9/25/vlad-the-deployer-and-git&#34;&gt;You can set the specific revision that you
want&lt;/a&gt; in your
&lt;code&gt;config/deploy.rb&lt;/code&gt; as well if required. I&amp;rsquo;m not doing that at the moment.&lt;/p&gt;
&lt;h2 id=&#34;so-whats-the-problem&#34;&gt;So, what&amp;rsquo;s the problem?&lt;/h2&gt;
&lt;p&gt;The problem is that you need to install your private SSH key on the deployment
server. I didn&amp;rsquo;t want to do this in case the server was ever compromised.
If it was compromised, the attacker could also theoretically get into
other systems using that key if it didn&amp;rsquo;t have a passphrase. This would be bad.
My key does have a passphrase, but why install it when you don&amp;rsquo;t really need to?&lt;/p&gt;
&lt;h2 id=&#34;making-it-more-secure&#34;&gt;Making it more secure&lt;/h2&gt;
&lt;p&gt;Fortunately, there&amp;rsquo;s a rather nifty solution to this problem — SSH agent
forwarding.  In order to do so, you must first be using SSH Agent. SSH Agent
allows you to authenticate yourself once per session, so you don&amp;rsquo;t have to
enter your password every time you connect to the server. If you&amp;rsquo;re already
using SSH keys and have SSH Agent running on your system (which is the default
in Ubuntu), you just need to do:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-add ~/.ssh/&amp;lt;keyname&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll be prompted for the passphrase to the key. Once you enter it, you should
be able to connect to any servers using that key without entering it again.
This is very handy anyway regardless of whether you&amp;rsquo;re going to be using
forwarding or not.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&#34;http://en.wikipedia.org/wiki/Ssh-agent#Setting_Up_Ssh_Agent&#34;&gt;this wikipedia
page&lt;/a&gt; for more
information.&lt;/p&gt;
&lt;h2 id=&#34;how-to-setup-the-forwarding&#34;&gt;How to setup the forwarding&lt;/h2&gt;
&lt;p&gt;This is where the forwarding comes in. SSH can forward requests for
authentication back to the original SSH Agent process running on your machine.
So, you can connect to your deployment server and then connect to another
server without re-entering your passphrase or having to install any keys on the
deployment machine itself.  Much coolness. This negates the need to install any
other keys on the deployment server itself.&lt;/p&gt;
&lt;p&gt;There is a very well explained article called &lt;a href=&#34;http://www.unixwiz.net/techtips/ssh-agent-forwarding.html&#34;&gt;An Illustrated Guide to SSH
Agent Forwarding&lt;/a&gt;
over at &lt;a href=&#34;http://www.unixwiz.net&#34;&gt;Unixwiz.net&lt;/a&gt; that goes into a lot of detail
about how this all works. It&amp;rsquo;s well worth a read.&lt;/p&gt;
&lt;p&gt;This is how to set it up.&lt;/p&gt;
&lt;p&gt;Edit your &lt;code&gt;~/.ssh/config&lt;/code&gt; file and add something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Host &amp;lt;name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  HostName &amp;lt;ip or host&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  User &amp;lt;username&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  IdentityFile ~/.ssh/&amp;lt;filename&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ForwardAgent yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is all you need. If you&amp;rsquo;ve got SSH Agent running, you&amp;rsquo;re sorted.&lt;/p&gt;
&lt;p&gt;Incidentally, you can add these sections for as many hosts as required. It saves you
having to type out lots of command line switches all the time. Just leave out the
&lt;code&gt;ForwardAgent yes&lt;/code&gt; line.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://github.com/guides/providing-your-ssh-key#linux&#34;&gt;GitHub - Providing your SSH key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://scie.nti.st/2007/9/25/vlad-the-deployer-and-git&#34;&gt;Vlad the Deployer and Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Ssh-agent#Setting_Up_Ssh_Agent&#34;&gt;SSH Agent on Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.unixwiz.net/techtips/ssh-agent-forwarding.html&#34;&gt;An Illustrated Guide to SSH Agent Forwarding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://dysinger.net/2008/04/30/deploying-with-capistrano-git-and-ssh-agent/&#34;&gt;Deploying with Capistrano, Git and SSH-Agent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Rake dependencies</title>
      <link>https://elver.me/blog/rake-dependencies/</link>
      <pubDate>Mon, 30 Jun 2008 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/rake-dependencies/</guid>
      <description>&lt;p&gt;Rake tasks are great for all sorts of small tasks. They give you a bit of
structure to what would normally be a shell or ruby script.  However, the thing
I like about rake tasks are dependencies.&lt;/p&gt;
&lt;h2 id=&#34;a-simple-example&#34;&gt;A simple example&lt;/h2&gt;
&lt;p&gt;You see, you can make one task rely on another. Take this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;desc &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Make coffee&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task &lt;span style=&#34;color:#990073&#34;&gt;:coffee&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#990073&#34;&gt;:get_mug&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#0086b3&#34;&gt;puts&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Making a coffee&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task &lt;span style=&#34;color:#990073&#34;&gt;:get_mug&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#0086b3&#34;&gt;puts&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#34;Getting a mug&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake get_mug
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Getting&lt;/span&gt; a mug
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rake coffee
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Getting&lt;/span&gt; a mug
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#008080&#34;&gt;Making&lt;/span&gt; a coffee
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Easy to understand isn&amp;rsquo;t it? &lt;code&gt;coffee&lt;/code&gt; depends on &lt;code&gt;get_mug&lt;/code&gt;, so &lt;code&gt;get_mug&lt;/code&gt; will be
called before the main &lt;code&gt;coffee&lt;/code&gt; task every time &lt;code&gt;rake coffee&lt;/code&gt; is run.&lt;/p&gt;
&lt;h2 id=&#34;a-better-example&#34;&gt;A better example&lt;/h2&gt;
&lt;p&gt;You can also redefine task dependencies without altering the original task.
For example, on this blog I have a task which creates index pages for the
category pages. I want this to run everytime the &lt;code&gt;build&lt;/code&gt; task is run. I could
modify the original &lt;code&gt;build&lt;/code&gt; task, but a much nicer and cleaner way is to
redefine the task and add the dependant task like so.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;task &lt;span style=&#34;color:#990073&#34;&gt;:build&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#d14&#34;&gt;&amp;#39;blog:categories:create_indexes&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will keep any existing dependencies that the build task originally had and
also add my new one. Ain&amp;rsquo;t it pretty?&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;p&gt;Thanks to the guys at &lt;a href=&#34;http://www.railsenvy.com&#34;&gt;Rails Envy&lt;/a&gt; for their tutorial&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.railsenvy.com/2007/6/11/ruby-on-rails-rake-tutorial&#34;&gt;Ruby on Rails Rake Tutorial [aka. How rake turned me into an
alcoholic]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Git bash completion = Yay!</title>
      <link>https://elver.me/blog/git-completion-yay/</link>
      <pubDate>Wed, 18 Jun 2008 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/git-completion-yay/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;ve heard of, or are already using bash completion, you&amp;rsquo;ll know how great
it is.  Here&amp;rsquo;s how to use it with &lt;a
href=&#34;http://en.wikipedia.org/wiki/Git_(software)&#34;&gt;Git&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;how-to-get-the-sweetness&#34;&gt;How to get the sweetness?&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m using Ubuntu (Hardy), but setup instructions should be similar for others.
For Ubuntu, uncomment this section in &lt;code&gt;/etc/bash.bashrc&lt;/code&gt; and you&amp;rsquo;ve enabled bash
completion. You&amp;rsquo;ll need to open a new terminal for it to take affect.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt; -f /etc/bash_completion &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; . /etc/bash_completion
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;how-to-enable-git-completion&#34;&gt;How to enable Git completion&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll need the bash completion file for Git. This file details how the Git
commands will be completed. The file comes as part of the Git distribution.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download the lastest git release from
&lt;a href=&#34;http://www.kernel.org/pub/software/scm/git/&#34;&gt;http://www.kernel.org/pub/software/scm/git/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Find the &lt;code&gt;git-completion.bash&lt;/code&gt; file in the &lt;code&gt;contrib/&lt;/code&gt; directory and copy to
the &lt;code&gt;/etc/bash_completion.d/&lt;/code&gt; directory&lt;/li&gt;
&lt;li&gt;Start a new login shell (logout/login or start a new Terminal tab)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;try-it-out&#34;&gt;Try it out&lt;/h2&gt;
&lt;p&gt;Now, typing &lt;code&gt;git &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;&lt;/code&gt; should list all of the various git commands (of
which there are many).  However, the really cool part is that it will also list
your branches for you. Typing &lt;code&gt;git checkout &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;&lt;/code&gt; within your Git repo
will list all of the branches you have.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jord@jordan /home/jord/webby&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;master&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; $ git checkout &amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HEAD    master
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;RSI, be gone!&lt;/p&gt;
&lt;h2 id=&#34;thanks&#34;&gt;Thanks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.bitfluent.com/post/27983389/git-utilities-you-cant-live-without&#34;&gt;Bitfluent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>w00t! First post evar!</title>
      <link>https://elver.me/blog/hello-and-welcome/</link>
      <pubDate>Tue, 17 Jun 2008 00:00:00 +0000</pubDate>
      <guid>https://elver.me/blog/hello-and-welcome/</guid>
      <description>&lt;p&gt;Hello. The proper site is now live. It&amp;rsquo;s been way too long coming, but now it&amp;rsquo;s
here. I built it using &lt;a href=&#34;http://webby.rubyforge.net/&#34;&gt;Webby&lt;/a&gt;. Hopefully there&amp;rsquo;ll
be some posts explaining how that was done soon.&lt;/p&gt;
&lt;p&gt;P.S. I know some people won&amp;rsquo;t like the colours, but I do.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
