<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Posts | Kim Grytøyr</title>
  <subtitle>Posts, notes, links and other things.</subtitle>
  <link href="https://kim.grytoyr.io/feed/posts.xml" rel="self" />
  <link href="https://kim.grytoyr.io/" />
  <updated>2025-04-14T00:00:00Z</updated>
  <id>https://kim.grytoyr.io/</id>
  <author>
    <name>Kim Grytøyr</name>
  </author>
  <entry>
    <title>Our dog: Kento</title>
    <link href="https://kim.grytoyr.io/blog/our-dog-kento/" />
    <updated>2025-04-14T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/our-dog-kento/</id>
    <content type="html">&lt;p&gt;I haven&#39;t yet posted any pictures of or information about our beloved dog Kento, an almost 3 years old fawn colored Standard Poodle. Here are a few pictures of him growing up:&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;
      &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/sm32ojUOt9-400.avif 400w, https://kim.grytoyr.io/img/sm32ojUOt9-800.avif 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/sm32ojUOt9-400.webp 400w, https://kim.grytoyr.io/img/sm32ojUOt9-800.webp 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/sm32ojUOt9-400.jpeg&quot; alt=&quot;Kento at the age of 3 months.&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;600&quot; srcset=&quot;https://kim.grytoyr.io/img/sm32ojUOt9-400.jpeg 400w, https://kim.grytoyr.io/img/sm32ojUOt9-800.jpeg 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
    &lt;figcaption&gt;Kento at the age of 3 months.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/0cWApHdD0i-400.avif 400w, https://kim.grytoyr.io/img/0cWApHdD0i-800.avif 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/0cWApHdD0i-400.webp 400w, https://kim.grytoyr.io/img/0cWApHdD0i-800.webp 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/0cWApHdD0i-400.jpeg&quot; alt=&quot;Kento at the age of 3 months.&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;600&quot; srcset=&quot;https://kim.grytoyr.io/img/0cWApHdD0i-400.jpeg 400w, https://kim.grytoyr.io/img/0cWApHdD0i-800.jpeg 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
    &lt;figcaption&gt;Kento at the age of 3 months.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/u-fAviuH4J-400.avif 400w, https://kim.grytoyr.io/img/u-fAviuH4J-800.avif 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/u-fAviuH4J-400.webp 400w, https://kim.grytoyr.io/img/u-fAviuH4J-800.webp 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/u-fAviuH4J-400.jpeg&quot; alt=&quot;A cold 1.5 year old Kento getting warmed.&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;956&quot; srcset=&quot;https://kim.grytoyr.io/img/u-fAviuH4J-400.jpeg 400w, https://kim.grytoyr.io/img/u-fAviuH4J-800.jpeg 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
    &lt;figcaption&gt;A cold 1.5 year old Kento getting warmed.&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/vBE3dWJjXg-400.avif 400w, https://kim.grytoyr.io/img/vBE3dWJjXg-800.avif 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/vBE3dWJjXg-400.webp 400w, https://kim.grytoyr.io/img/vBE3dWJjXg-800.webp 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/vBE3dWJjXg-400.jpeg&quot; alt=&quot;A 2 year old Kento.&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;1066&quot; srcset=&quot;https://kim.grytoyr.io/img/vBE3dWJjXg-400.jpeg 400w, https://kim.grytoyr.io/img/vBE3dWJjXg-800.jpeg 800w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
    &lt;figcaption&gt;A 2 year old Kento.&lt;/figcaption&gt;
  &lt;/figure&gt;
    &lt;/div&gt;
&lt;p&gt;The name &lt;strong&gt;Kento&lt;/strong&gt; is Japanese and has several meanings;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Smart person, cure for depression, happiness, rising up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I´ll probably post more pictures of him as time goes by, but at the very least he has now been introduced.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Project Music 2025</title>
    <link href="https://kim.grytoyr.io/blog/project-music/" />
    <updated>2025-04-11T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/project-music/</id>
    <content type="html">&lt;p&gt;I&#39;ve been a Spotify Premium subscriber for many, many years. I can&#39;t say I&#39;ve had any problems with their apps or service, there&#39;s just something about these «access to everything for a small monthly amount» services that I don&#39;t like. It’s easy to get lost in endless playlists, and forget what it means to connect with an album.&lt;/p&gt;
&lt;p&gt;Back in ~2014 I used to buy my music on iTunes. Thinking back to this time, these are some of the things that stand out to me:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I listened more thoroughly to the music I bought.&lt;/li&gt;
&lt;li&gt;Buying a new album was a joyous activity.&lt;/li&gt;
&lt;li&gt;It felt right.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&#39;m going back to this model now. I haven&#39;t decided how to consume this music yet, but there seems to be a couple of good alternatives:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;iBroadcast&lt;/li&gt;
&lt;li&gt;Plex&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Either way, I’m looking forward to making music feel intentional again — something I own, explore, and cherish. I’ll share more once I’ve landed on a setup. For now, I’m just excited to rebuild my music collection, one album at a time.&lt;/p&gt;
&lt;h2 id=&quot;albums-i-d-like-to-buy&quot;&gt;Albums I&#39;d like to buy&lt;/h2&gt;
&lt;p&gt;Here&#39;s a non-exhaustive list of albums I&#39;m planning on buying, at least one each month:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;s&gt;&lt;a href=&quot;https://music.apple.com/no/album/aventine/681187053&quot;&gt;Agnes Obel – Aventine&lt;/a&gt;&lt;/s&gt; (bought: 12th of April, 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://music.apple.com/no/album/portrayals/1765337706&quot;&gt;Ane Brun – Portrayals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://music.apple.com/no/album/an-awesome-wave/1622205752&quot;&gt;alt-J – An Awesome Wave&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://music.apple.com/no/album/this-is-all-yours/1620183062&quot;&gt;alt-J – This Is All Your&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.qobuz.com/no-en/album/every-kingdom-ben-howard/0060252781434&quot;&gt;Ben Harper – Every Kingdom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://music.apple.com/no/album/this-empty-northern-hemisphere/316335828&quot;&gt;Gregory Alan Isakov – This Empty Northern Hemisphere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;&lt;a href=&quot;https://music.apple.com/no/album/deaf-heat-ep/828485268&quot;&gt;Marika Hackman – Deaf Heap EP&lt;/a&gt;&lt;/s&gt; (bought 12th of April, 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://music.apple.com/no/album/mezzanine-deluxe/1428684976&quot;&gt;Massive Attack – Mezzanine (Deluxe)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://music.apple.com/no/album/closing-time-remastered/1485071375&quot;&gt;Tom Waits – Closing Time (Remastered)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;...and so many more. I&#39;ll keep updating this list.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Back to basics – again..</title>
    <link href="https://kim.grytoyr.io/blog/back-to-basics/" />
    <updated>2025-04-08T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/back-to-basics/</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;I know...&lt;/strong&gt; I’ve made quite a few attempts to get this site looking, feeling, and working the way I want – but none have really stuck.&lt;/p&gt;
&lt;p&gt;So, I hereby declare this attempt number six — if we’re only counting the documented ones.&lt;/p&gt;
&lt;p&gt;If you&#39;re curious about the other times I&#39;ve changed my website platform, here you go:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kim.grytoyr.io/blog/going-static/&quot;&gt;Going static&lt;/a&gt; (2014)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kim.grytoyr.io/blog/new-website-platform/&quot;&gt;New website platform&lt;/a&gt; (2017)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kim.grytoyr.io/blog/going-wordpress-again/&quot;&gt;Going WordPress again&lt;/a&gt; (2020)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kim.grytoyr.io/blog/a-new-website-again/&quot;&gt;Website changes – again&lt;/a&gt; (2021)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kim.grytoyr.io/blog/oops-i-did-it-again/&quot;&gt;Oops, I did it again...&lt;/a&gt; (2022)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-new-rig&quot;&gt;The new rig&lt;/h2&gt;
&lt;p&gt;The new rig takes this site back to its basic roots: A pure static website. This time it&#39;s &lt;a href=&quot;https://www.11ty.dev&quot;&gt;Eleventy&lt;/a&gt; doing all the dirty work. I&#39;ve tried to keep the site as simple as possible, only using &lt;a href=&quot;https://tailwindcss.com&quot;&gt;Tailwind&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&#39;ve restored the content setup I had on my &lt;a href=&quot;https://kim.grytoyr.io/blog/new-website-platform/&quot;&gt;Hugo setup&lt;/a&gt;, except that I&#39;ve removed the &lt;code&gt;Diary&lt;/code&gt; section. You&#39;ll now find: &lt;a href=&quot;https://kim.grytoyr.io/blog/&quot;&gt;Posts&lt;/a&gt;, &lt;a href=&quot;https://kim.grytoyr.io/notes/&quot;&gt;notes&lt;/a&gt; and &lt;a href=&quot;https://kim.grytoyr.io/links/&quot;&gt;links&lt;/a&gt;. And some other static pages.&lt;/p&gt;
&lt;p&gt;The site is hosted by &lt;a href=&quot;https://devos.no/gronn-hosting&quot;&gt;Devos&lt;/a&gt;, my own company.&lt;/p&gt;
&lt;p&gt;I&#39;m planning on adding more things and keeping the site up-to-date this time. As always....&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>RNoAF Christmas Star 2022</title>
    <link href="https://kim.grytoyr.io/blog/christmas-star-2022/" />
    <updated>2022-12-09T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/christmas-star-2022/</id>
    <content type="html">&lt;p&gt;The Royal Norwegian Air Force practices formation flying every year in December. This year, they were schedule to fly over Bodø at 11:22 on December 8th. I managed to capture them with my zoom lens just a couple minutes after their scheduled arrival.&lt;/p&gt;
&lt;figure class=&quot;&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/MYHvF0I6Bv-400.avif 400w, https://kim.grytoyr.io/img/MYHvF0I6Bv-800.avif 800w, https://kim.grytoyr.io/img/MYHvF0I6Bv-1280.avif 1280w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/MYHvF0I6Bv-400.webp 400w, https://kim.grytoyr.io/img/MYHvF0I6Bv-800.webp 800w, https://kim.grytoyr.io/img/MYHvF0I6Bv-1280.webp 1280w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/MYHvF0I6Bv-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;731&quot; srcset=&quot;https://kim.grytoyr.io/img/MYHvF0I6Bv-400.jpeg 400w, https://kim.grytoyr.io/img/MYHvF0I6Bv-800.jpeg 800w, https://kim.grytoyr.io/img/MYHvF0I6Bv-1280.jpeg 1280w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
&lt;p&gt;It wasn&#39;t the greatest light for photographing moving aircrafts, but I managed to get a couple of photos that turned out somewhat okay.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Remember iEX history</title>
    <link href="https://kim.grytoyr.io/blog/remember-iex-history/" />
    <updated>2022-12-02T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/remember-iex-history/</id>
    <content type="html">&lt;p&gt;I&#39;m often finding myself crafting some of the most complex and ingenious stuff ever known to IEx men, only to find myself having to recreate it minutes later because I&#39;m now in a new IEx session. Annoying? Yes. Solvable? Yes! Here&#39;s how.&lt;/p&gt;
&lt;p&gt;We&#39;re all familiar with using &lt;code&gt;Ctrl+r&lt;/code&gt; for searching our shell history of crafty one-liners, right? Great. With that out of the box, let&#39;s see how we can achieve the same in iEX. It&#39;s quite simple, and it&#39;s well explained in the &lt;a href=&quot;https://hexdocs.pm/iex/IEx.html#module-shell-history&quot;&gt;IEx documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enabling it for single sessions can be done by starting IEx in the following way:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;iex &lt;span class=&quot;token parameter variable&quot;&gt;--erl&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-kernel shell_history enabled&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enabling it system-wide can be done by setting the following environment variable (Unix-like systems):&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ERL_AFLAGS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-kernel shell_history enabled&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, once you&#39;ve done this you can enjoy having all of your IEx history available using the arrow up and arrow down keys, as well as the Ctrl+r trick mentioned earlier.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Oops, I did it again...</title>
    <link href="https://kim.grytoyr.io/blog/oops-i-did-it-again/" />
    <updated>2022-10-05T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/oops-i-did-it-again/</id>
    <content type="html">&lt;p&gt;It has happened many times before, and this sure ain&#39;t going to be the last time. I&#39;ve jumped off the WordPress ship and over to the headless CMS ship.&lt;/p&gt;
&lt;p&gt;If you&#39;re curious about the other times I&#39;ve changed my website platform, here you go:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kim.grytoyr.io/blog/going-static/&quot;&gt;Going static&lt;/a&gt; (2014)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kim.grytoyr.io/blog/new-website-platform/&quot;&gt;New website platform&lt;/a&gt; (2017)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kim.grytoyr.io/blog/going-wordpress-again/&quot;&gt;Going WordPress again&lt;/a&gt; (2020)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kim.grytoyr.io/blog/a-new-website-again/&quot;&gt;Website changes – again&lt;/a&gt; (2021)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.and many more since the late 90s that I don&#39;t have any record of, sadly.&lt;/p&gt;
&lt;p&gt;This time I&#39;ve abandoned the WordPress ship, which was great, in favour of the hypermodern headless CMS ship. To be more concise, my website is now built using &lt;a href=&quot;https://prismic.io/&quot;&gt;Prismic.io&lt;/a&gt; and &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;. It&#39;s hosted on &lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I spend at least half of my time developing React applications. Being able to do the same with my own website, and client websites for that matter, suits me perfectly. The combination of any headless CMS (there are many great ones, and I&#39;d really like to try Sanity.io), Next.js and Vercel is truly a great developer experience.&lt;/p&gt;
&lt;p&gt;There are also some limitations. Some are specific to Prismic.io and some are more general. So far I&#39;ve been able to work around most of them without too much hassle.&lt;/p&gt;
&lt;p&gt;There you have it. Rest assure there will be a new post of this kind at some point.&lt;/p&gt;
&lt;p&gt;Until then, I hope you enjoy my new website.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PS:&lt;/strong&gt; You can use &lt;code&gt;Cmd+K&lt;/code&gt; or &lt;code&gt;Win+K&lt;/code&gt; to open the search palette which gives you easy access to all the content on this website.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>npaste-vscode updated</title>
    <link href="https://kim.grytoyr.io/blog/npaste-vscode-updated/" />
    <updated>2021-11-20T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/npaste-vscode-updated/</id>
    <content type="html">&lt;p&gt;I have written an encrypted pastebin for text and images called npaste. This post goes through the recent changes in the VSCode plugin for npaste.&lt;/p&gt;
&lt;p&gt;I’ve also created a plugin that allows you to quickly upload pastes from &lt;a href=&quot;https://kim.grytoyr.io/blog/sublime-text-3-creating-a-plugin/&quot;&gt;Sublime Text 3&lt;/a&gt;, which was the editor I was using at that point. I did also write a plugin for Visual Studio Code, but it was a bit rushed and I wasn’t very happy with it.&lt;/p&gt;
&lt;p&gt;Now there’s an update version of the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=kimgrytoyr.npaste&quot;&gt;npaste-vscode plugin&lt;/a&gt; with the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The commands for pasting is split into two: only the selected text or the current file.&lt;/li&gt;
&lt;li&gt;Updated dependencies.&lt;/li&gt;
&lt;li&gt;Changed default keyboard shortcuts to CTRL/CMD+ALT+, for pasting the selected text and CTRL/CMD+ALT+. for pasting the current file.&lt;/li&gt;
&lt;li&gt;Going forward I’m planning on rewriting the plugin completely, maybe using Typescript. There’s also one feature that npaste supports that could be very handy to have available in VSCode: Downloading a paste by its URL and opening it in a new file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Stay tuned for more information about this.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Going solo</title>
    <link href="https://kim.grytoyr.io/blog/going-solo/" />
    <updated>2021-10-24T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/going-solo/</id>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;The way to get started is to quit talking and begin doing.&lt;br&gt;
– Walt Disney&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For the last ten years, I’ve been working as an employed developer. If you have a look at my &lt;a href=&quot;https://cv.kim.grytoyr.io/&quot;&gt;CV&lt;/a&gt;, you’ll see that more than nine of these years have been spent at a local company called &lt;a href=&quot;https://info.ibooking.no/&quot;&gt;iBooking&lt;/a&gt;. Since February 2021 I’ve been hired as a backend developer at Dekode Interaktiv, doing WordPress integrations and such.&lt;/p&gt;
&lt;p&gt;During the last few years, my longing for starting my own company and employing myself as an independent consultant has been growing, day by day. And now, finally, it’s happening! From November 1st I’ll be working about two thirds of the time in my own company, &lt;a href=&quot;https://devos.no/&quot;&gt;Devos AS&lt;/a&gt;. The remaining third of my work time will be spent as an employee in a company called &lt;a href=&quot;https://info.trimpoeng.no/&quot;&gt;Trimpoeng&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’ve joined &lt;a href=&quot;https://brainbase.no/&quot;&gt;BrainBase&lt;/a&gt; , a network for independent IT consultants based in Norway. It’s useful both because it can be a place to find work and, evenly important, a place to socialise with and learn from other people in the same industry.&lt;/p&gt;
&lt;p&gt;The road ahead will be exciting and I’m looking forward to tackling all the challenges that surely will surface.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Nice weather = quality time</title>
    <link href="https://kim.grytoyr.io/blog/nice-weather-quality-time/" />
    <updated>2021-06-11T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/nice-weather-quality-time/</id>
    <content type="html">&lt;p&gt;Last week and especially last weekend, we had some really nice weather. We decided to spend most of the time outside on various adventures, most of them including bathing. Here are a few photos from the trips.&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/ELQYK-HLhA-400.avif 400w, https://kim.grytoyr.io/img/ELQYK-HLhA-800.avif 800w, https://kim.grytoyr.io/img/ELQYK-HLhA-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/ELQYK-HLhA-400.webp 400w, https://kim.grytoyr.io/img/ELQYK-HLhA-800.webp 800w, https://kim.grytoyr.io/img/ELQYK-HLhA-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/ELQYK-HLhA-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/ELQYK-HLhA-400.jpeg 400w, https://kim.grytoyr.io/img/ELQYK-HLhA-800.jpeg 800w, https://kim.grytoyr.io/img/ELQYK-HLhA-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/y1kRZczajY-400.avif 400w, https://kim.grytoyr.io/img/y1kRZczajY-800.avif 800w, https://kim.grytoyr.io/img/y1kRZczajY-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/y1kRZczajY-400.webp 400w, https://kim.grytoyr.io/img/y1kRZczajY-800.webp 800w, https://kim.grytoyr.io/img/y1kRZczajY-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/y1kRZczajY-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/y1kRZczajY-400.jpeg 400w, https://kim.grytoyr.io/img/y1kRZczajY-800.jpeg 800w, https://kim.grytoyr.io/img/y1kRZczajY-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/ITCC5-fmtT-400.avif 400w, https://kim.grytoyr.io/img/ITCC5-fmtT-800.avif 800w, https://kim.grytoyr.io/img/ITCC5-fmtT-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/ITCC5-fmtT-400.webp 400w, https://kim.grytoyr.io/img/ITCC5-fmtT-800.webp 800w, https://kim.grytoyr.io/img/ITCC5-fmtT-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/ITCC5-fmtT-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/ITCC5-fmtT-400.jpeg 400w, https://kim.grytoyr.io/img/ITCC5-fmtT-800.jpeg 800w, https://kim.grytoyr.io/img/ITCC5-fmtT-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/zas2fJblbq-400.avif 400w, https://kim.grytoyr.io/img/zas2fJblbq-800.avif 800w, https://kim.grytoyr.io/img/zas2fJblbq-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/zas2fJblbq-400.webp 400w, https://kim.grytoyr.io/img/zas2fJblbq-800.webp 800w, https://kim.grytoyr.io/img/zas2fJblbq-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/zas2fJblbq-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/zas2fJblbq-400.jpeg 400w, https://kim.grytoyr.io/img/zas2fJblbq-800.jpeg 800w, https://kim.grytoyr.io/img/zas2fJblbq-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/-DSJ22QRfm-400.avif 400w, https://kim.grytoyr.io/img/-DSJ22QRfm-800.avif 800w, https://kim.grytoyr.io/img/-DSJ22QRfm-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/-DSJ22QRfm-400.webp 400w, https://kim.grytoyr.io/img/-DSJ22QRfm-800.webp 800w, https://kim.grytoyr.io/img/-DSJ22QRfm-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/-DSJ22QRfm-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/-DSJ22QRfm-400.jpeg 400w, https://kim.grytoyr.io/img/-DSJ22QRfm-800.jpeg 800w, https://kim.grytoyr.io/img/-DSJ22QRfm-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/HRhWpjqwKP-400.avif 400w, https://kim.grytoyr.io/img/HRhWpjqwKP-800.avif 800w, https://kim.grytoyr.io/img/HRhWpjqwKP-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/HRhWpjqwKP-400.webp 400w, https://kim.grytoyr.io/img/HRhWpjqwKP-800.webp 800w, https://kim.grytoyr.io/img/HRhWpjqwKP-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/HRhWpjqwKP-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/HRhWpjqwKP-400.jpeg 400w, https://kim.grytoyr.io/img/HRhWpjqwKP-800.jpeg 800w, https://kim.grytoyr.io/img/HRhWpjqwKP-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/0n6fbZcJww-400.avif 400w, https://kim.grytoyr.io/img/0n6fbZcJww-800.avif 800w, https://kim.grytoyr.io/img/0n6fbZcJww-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/0n6fbZcJww-400.webp 400w, https://kim.grytoyr.io/img/0n6fbZcJww-800.webp 800w, https://kim.grytoyr.io/img/0n6fbZcJww-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/0n6fbZcJww-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/0n6fbZcJww-400.jpeg 400w, https://kim.grytoyr.io/img/0n6fbZcJww-800.jpeg 800w, https://kim.grytoyr.io/img/0n6fbZcJww-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>wp shell</title>
    <link href="https://kim.grytoyr.io/blog/wp-shell/" />
    <updated>2021-06-10T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/wp-shell/</id>
    <content type="html">&lt;p&gt;If you’re a WordPress backend developer and don’t use wp shell, you &lt;strong&gt;must&lt;/strong&gt; continue reading.&lt;/p&gt;
&lt;p&gt;I have this imaginary plugin that is used to fetch some data from a third-party service and store every item as a post of a custom post type. Now I need to figure out how something deep down in this very complex integration works, but there’s a problem: To be able to test it locally I’d have to start an import that will fetch GB’s of data that I don’t need. Only to simulate what happens when a specific function is being executed as part of that import. wp shell to the rescue!&lt;/p&gt;
&lt;p&gt;Let’s say that there’s an &lt;code&gt;&#92;ImaginaryPlugin&#92;format_description( string $description )&lt;/code&gt; function that is the function we’d like to test or debug. There’s also an &lt;code&gt;ImaginaryPlugin&#92;get_item( int $item_id )&lt;/code&gt; function that can be used to get an item. Testing it on an existing item is as simple as this:&lt;/p&gt;
&lt;pre class=&quot;language-php&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;$ wp shell

wp&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$item&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;ImaginaryPlugin&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;get_item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;123&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;id&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword type-declaration&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;name&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword type-declaration&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;Test&quot;&lt;/span&gt;
  &lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;description&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword type-declaration&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;This_is_a_test&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

wp&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;ImaginaryPlugin&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;format_description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string single-quoted-string&quot;&gt;&#39;description&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword type-declaration&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token string double-quoted-string&quot;&gt;&quot;This is a test&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Awesome! Being able to do this can make debugging or testing a breeze compared to actually testing things by refreshing the web page or running new imports over and over again.&lt;/p&gt;
&lt;p&gt;There are of course other ways to test this specific and rather bad example, but the point of this post still stands: wp shell is &lt;strong&gt;very&lt;/strong&gt; useful!&lt;/p&gt;
&lt;p&gt;In general, the whole WP CLI project is an addition to WordPress that I find extremely useful. If you’re not familiar with it, check it out: &lt;a href=&quot;https://wp-cli.org/&quot;&gt;https://wp-cli.org/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Interval running with Myworkout GO</title>
    <link href="https://kim.grytoyr.io/blog/interval-running-with-myworkout-go/" />
    <updated>2021-06-06T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/interval-running-with-myworkout-go/</id>
    <content type="html">&lt;p&gt;I happen to know some of the people involved with the app &lt;a href=&quot;https://myworkout.com/&quot;&gt;Myworkout GO&lt;/a&gt;. On their website, they claim the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do more than one 4×4 workout sessions per week to increase your cardiac capacity by +0,5% per week.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you do two a week you’ll keep the health of a 20 year-old until you are 70 years old.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’m in no position to claim that these statements are incorrect – or correct, for that matter. But I’m an optimist and I’d like to believe that it’s true. According to their own website, these statements are based on «25 years of research at the Norwegian University of Science and Technology».&lt;/p&gt;
&lt;p&gt;Anyhow, there’s no doubt that interval running is healthy and an efficient way to improve your health, so I’m giving it a shot. From next week, I’ll replace at least one of my &lt;a href=&quot;https://kim.grytoyr.io/blog/running-challenge&quot;&gt;weekly runs&lt;/a&gt; with a session of interval running, and we’ll see how that will affect my regular runs.&lt;/p&gt;
&lt;p&gt;If you’re interested in learning more about the Myworkout project, you can find their website here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://myworkout.com/en/&quot;&gt;https://myworkout.com/en/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>npaste – a simple paste bin</title>
    <link href="https://kim.grytoyr.io/blog/npaste-a-simple-paste-bin/" />
    <updated>2021-06-04T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/npaste-a-simple-paste-bin/</id>
    <content type="html">&lt;p&gt;At work, I often need to share secrets and other important information with my colleagues. We use Slack to communicate with each other, and that’s good enough for the most part. Now and then, we share secret stuff. Like, top secret. There are many paste bins on the internet that we could use, but I don’t really trust them for these things. So I created my own: &lt;strong&gt;npaste&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;npaste is a very simple paste bin that supports both images and text. It uses GPG to encrypt pastes before they are uploaded to the server. The encryption key is appended to the URL after a hashbang on the client uploading the paste, so the server never knows about the key. In the browser, the paste is decrypted using OpenGPG.&lt;/p&gt;
&lt;p&gt;The npaste cli client supports downloading pastes, both encrypted and non-encrypted. I haven’t spent much time perfecting the project, so contributions to it are very welcome. Let’s have a look at how it works!&lt;/p&gt;
&lt;h2 id=&quot;uploading-text&quot;&gt;Uploading text&lt;/h2&gt;
&lt;p&gt;Let’s say you have some super secret text that you’d like to share with your colleague. You store it in a file named &lt;code&gt;super-secret.txt&lt;/code&gt; and then run the following command:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;npaste &lt;span class=&quot;token parameter variable&quot;&gt;--encrypt&lt;/span&gt; --no-archive&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1h super-secret.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The npaste client will do all the dirty work and return a URL (it’s also copied to the clipboard automatically):&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;https://paste.yourdomain.com/68678632939f75e9bbd0a4f8&lt;span class=&quot;token comment&quot;&gt;#e61ac5c997098e59337b653a27fcff27&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By specifying the &lt;code&gt;--no-archive=1&lt;/code&gt; flag, you tell the server to physically delete this paste after it expires, as opposed to just archiving it. The &lt;code&gt;--age=1h&lt;/code&gt; flag tells the server to set the expiration of the paste to one hour in the future.&lt;/p&gt;
&lt;h2 id=&quot;uploading-images&quot;&gt;Uploading images&lt;/h2&gt;
&lt;p&gt;There’s really nothing else you’d have to do if you wanted to upload an image instead. The CLI script will take care of all the dirty work, so the command is exactly the same:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;npaste &lt;span class=&quot;token parameter variable&quot;&gt;--encrypt&lt;/span&gt; --no-archive&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-age&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;1h super-secret.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Behind the scenes, the image will be Base64 encoded before being encrypted, and in the browser it will be decoded after being decrypted.&lt;/p&gt;
&lt;h2 id=&quot;downloading-a-paste&quot;&gt;Downloading a paste&lt;/h2&gt;
&lt;p&gt;If someone sends you an npaste link and you’d like to download it to your computer, it’s as simple as this:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;npaste &lt;span class=&quot;token parameter variable&quot;&gt;--get&lt;/span&gt; https://paste.yourdomain.com/68678632939f75e9bbd0a4f8&lt;span class=&quot;token comment&quot;&gt;#e61ac5c997098e59337b653a27fcff27&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The CLI script will figure out that this paste needs to be decrypted and it will store it in a file with the same name as the paste ID. You can then open it in your editor of choice to edit it.&lt;/p&gt;
&lt;h2 id=&quot;contributions-are-welcome&quot;&gt;Contributions are welcome&lt;/h2&gt;
&lt;p&gt;If you’re interested in contributing to the project, feel free to do so. It lives over on my private Gitea server:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://src.grytoyr.io/kim/npaste/&quot;&gt;https://src.grytoyr.io/kim/npaste/&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Running update: Week 22</title>
    <link href="https://kim.grytoyr.io/blog/running-update-week-22/" />
    <updated>2021-06-01T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/running-update-week-22/</id>
    <content type="html">&lt;p&gt;Last week was a bit hectic, just like this week has been. So the update from the previous week is in a bit late, but here it is!&lt;/p&gt;
&lt;p&gt;I didn’t manage to run three times last week. The weather suddenly got really great, so I ended up spending most of my free time together with my family on various outdoors activities instead. Have a look!&lt;/p&gt;
&lt;div class=&quot;mt-8 flow-root&quot;&gt;
  &lt;div class=&quot;-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8&quot;&gt;
    &lt;div class=&quot;inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8&quot;&gt;
      &lt;table class=&quot;table min-w-full divide-y divide-slate-400&quot;&gt;
        &lt;thead&gt;
          &lt;tr&gt;
            &lt;th class=&quot;text-left&quot;&gt;Day&lt;/th&gt;
            &lt;th class=&quot;text-left&quot;&gt;Distance&lt;/th&gt;
            &lt;th class=&quot;text-left&quot;&gt;Duration&lt;/th&gt;
            &lt;th class=&quot;text-left&quot;&gt;Pace&lt;/th&gt;
          &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody class=&quot;divide-y divide-slate-300&quot;&gt;
          &lt;tr&gt;
            &lt;td&gt;Monday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Tuesday&lt;/td&gt;
            &lt;td&gt;3.68 km&lt;/td&gt;
            &lt;td&gt;22m29s&lt;/td&gt;
            &lt;td&gt;6:06&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Wednesday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Thursday&lt;/td&gt;
            &lt;td&gt;3.66 km&lt;/td&gt;
            &lt;td&gt;22m36s&lt;/td&gt;
            &lt;td&gt;6:10&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Friday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Saturday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Sunday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;SUM/AVG&lt;/td&gt;
            &lt;td&gt;7.34 km&lt;/td&gt;
            &lt;td&gt;45m15s&lt;/td&gt;
            &lt;td&gt;6:08&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There was a small setback this week in terms of speed, but nevertheless, it was two runs that I’m happy with. Let’s see how it goes next week!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Don’t expose your Docker ports</title>
    <link href="https://kim.grytoyr.io/blog/dont-expose-your-docker-ports/" />
    <updated>2021-06-01T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/dont-expose-your-docker-ports/</id>
    <content type="html">&lt;p&gt;Let’s say you have a couple of Docker containers that run your favorite applications. You’d like to deploy these to some random server on the interwebs, so you lock down your Ubuntu server using the default UFW firewall, launch your containers and start using your applications.&lt;/p&gt;
&lt;p&gt;You run &lt;code&gt;ufw status&lt;/code&gt; to make sure that everything’s locked down the way it should be. Good to go! Or?&lt;/p&gt;
&lt;p&gt;Not necessarily. You may be exposing your Docker applications to the whole world without even knowing it. There’s a long-running &lt;a href=&quot;https://github.com/moby/moby/issues/4737&quot;&gt;issue on Github&lt;/a&gt; explaining why. Here’s the short version: Docker is manipulating the &lt;code&gt;iptables&lt;/code&gt; rules behind the scenes, while UFW tells you everything’s fine. Luckily, &lt;a href=&quot;https://github.com/moby/moby/issues/4737#issuecomment-665819089&quot;&gt;the solution&lt;/a&gt; is simple. Add this snippet to the file &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt; and restart Docker:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;iptables&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For a Docker or DevOps expert, this is probably common knowledge. For many developers and hobby server maintainers, it’s probably not. Have this in mind when deploying Docker applications to a server that is accessible to the world.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Running update: Week 21</title>
    <link href="https://kim.grytoyr.io/blog/running-update-week-21/" />
    <updated>2021-05-30T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/running-update-week-21/</id>
    <content type="html">&lt;p&gt;During the &lt;a href=&quot;https://kim.grytoyr.io/blog/running-update-week-21/&quot;&gt;first week of Project Running&lt;/a&gt;, I ended up at an average pace of 6:13/km. My goal for the second week was first and foremost to complete three runs of at least three kilometers each, but in addition to that I had a bonus goal of increasing the average pace by 5%.&lt;/p&gt;
&lt;p&gt;Just like &lt;a href=&quot;https://genius.com/3927053&quot;&gt;4 Non Blondes&lt;/a&gt; back in the early 1990s, I realized quickly that this bonus goal of mine would be hard to achieve this week. But it was &lt;strong&gt;very close&lt;/strong&gt;. I reduced my average pace by almost 4%. Here’s how this week’s results ended up like.&lt;/p&gt;
&lt;div class=&quot;mt-8 flow-root&quot;&gt;
  &lt;div class=&quot;-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8&quot;&gt;
    &lt;div class=&quot;inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8&quot;&gt;
      &lt;table class=&quot;table min-w-full divide-y divide-slate-400&quot;&gt;
        &lt;thead&gt;
          &lt;tr&gt;
            &lt;th class=&quot;text-left&quot;&gt;Day&lt;/th&gt;
            &lt;th class=&quot;text-left&quot;&gt;Distance&lt;/th&gt;
            &lt;th class=&quot;text-left&quot;&gt;Duration&lt;/th&gt;
            &lt;th class=&quot;text-left&quot;&gt;Pace&lt;/th&gt;
          &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody class=&quot;divide-y divide-slate-300&quot;&gt;
          &lt;tr&gt;
            &lt;td&gt;Monday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Tuesday&lt;/td&gt;
            &lt;td&gt;3.70 km&lt;/td&gt;
            &lt;td&gt;22m28s&lt;/td&gt;
            &lt;td&gt;6:04&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Wednesday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Thursday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Friday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Saturday&lt;/td&gt;
            &lt;td&gt;3.66 km&lt;/td&gt;
            &lt;td&gt;21m36s&lt;/td&gt;
            &lt;td&gt;5:54&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Sunday&lt;/td&gt;
            &lt;td&gt;3.55 km&lt;/td&gt;
            &lt;td&gt;21m05s&lt;/td&gt;
            &lt;td&gt;5:56&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;SUM/AVG&lt;/td&gt;
            &lt;td&gt;10.91 km&lt;/td&gt;
            &lt;td&gt;21m43s&lt;/td&gt;
            &lt;td&gt;5:58&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I am very happy with this weeks results, even though I didn’t completely reach my goal. That goal was fetched out of thin air anyway, so I don’t care.&lt;/p&gt;
&lt;p&gt;I’ve heard lots of good things about interval running, so I’m considering replacing one or two of these weekly runs with interval runs. More on that in a later post.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Blind men and an elephant</title>
    <link href="https://kim.grytoyr.io/blog/blind-men-and-an-elephant/" />
    <updated>2021-05-30T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/blind-men-and-an-elephant/</id>
    <content type="html">&lt;p&gt;There exists this quite interesting parable that, in one of the many versions of it, goes like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A group of blind men heard that a strange animal, called an elephant, had been brought to the town, but none of them were aware of its shape and form. Out of curiosity, they said: “We must inspect and know it by touch, of which we are capable”. So, they sought it out, and when they found it they groped about it. The first person, whose hand landed on the trunk, said, “This being is like a thick snake”. For another one whose hand reached its ear, it seemed like a kind of fan. As for another person, whose hand was upon its leg, said, the elephant is a pillar like a tree-trunk. The blind man who placed his hand upon its side said the elephant, “is a wall”. Another who felt its tail, described it as a rope. The last felt its tusk, stating the elephant is that which is hard, smooth and like a spear.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.m.wikipedia.org/wiki/Blind_men_and_an_elephant&quot;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Following this event, the men, in some versions, started arguing and accusing each other of not telling the truth. In one of the versions, a sighted man entered the scene and described the elephant to all the blind men, who in turn learned that they were all partially correct and partially wrong.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;While one’s subjective experience is true, it may not be the totality of truth.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.m.wikipedia.org/wiki/Blind_men_and_an_elephant&quot;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What I take from this parable is that we should always be humble to the fact that there’s a lot we don’t know, and that we should try to seek more information before drawing any conclusions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The moral of the parable is that humans have a tendency to claim absolute truth based on their limited, subjective experience as they ignore other people’s limited, subjective experiences which may be equally true.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.m.wikipedia.org/wiki/Blind_men_and_an_elephant&quot;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Werner Heisenberg put it like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We have to remember that what we observe is not nature in itself, but nature exposed to our method of questioning.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.m.wikipedia.org/wiki/Werner_Heisenberg&quot;&gt;Werner Heisenberg&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Read more about this story on &lt;a href=&quot;https://en.m.wikipedia.org/wiki/Blind_men_and_an_elephant&quot;&gt;Wikipedia&lt;/a&gt;, and if you’re interested in more like this there’s also a rough equivalent of this parable in Western philosophy called &lt;a href=&quot;https://en.m.wikipedia.org/wiki/Allegory_of_the_cave&quot;&gt;Allegory of the cave&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Bodø developers – let’s meet!</title>
    <link href="https://kim.grytoyr.io/blog/bodo-developers-lets-meet/" />
    <updated>2021-05-26T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/bodo-developers-lets-meet/</id>
    <content type="html">&lt;p&gt;I am the organizer of a Meetup group called &lt;a href=&quot;https://www.meetup.com/Bodo-Dev-Meetup-Group/&quot;&gt;Bodø Dev&lt;/a&gt;. It was originally created for the &lt;a href=&quot;https://flutterhackathon.com/&quot;&gt;Flutter Hackathon 2019&lt;/a&gt;, which was a weekend event where the goal was to get together with local developers to create a Flutter app.&lt;/p&gt;
&lt;p&gt;We were five people gathered together in a local office where we, over the course of two days, created a Flutter app for showcasing apps – «&lt;a href=&quot;https://github.com/kimgrytoyr/flutter_hackathon_19&quot;&gt;Flutterific&lt;/a&gt;». Think of it as Tinder with apps instead of people. I wouldn’t say we learned too much during this weekend, but we had a great time meeting other local developers, eating pizza and getting to know the online Flutter community. All in all it was a success!&lt;/p&gt;
&lt;p&gt;As a person who have lived in Bodø for ten years, working professionally as a developer the whole time, I feel that there should be more local events and gatherings like the one we had back in 2019.&lt;/p&gt;
&lt;p&gt;There are of course events that I’m not aware of, and there are occasionally courses and presentations, but what I’d like to see more of is informal gatherings where developers just meet and share knowledge and experiences or just create something fun together – across companies.&lt;/p&gt;
&lt;p&gt;This is why I will try to get more people into the Bodø Dev meetup group and also try to organize more events like the Flutter Hackathon. One event that would be both fun and interesting to attend in this manner is the &lt;a href=&quot;https://ldjam.com/&quot;&gt;Ludum Dare&lt;/a&gt; game jam. I’ve attended this alone two times before, and it was really fun! Doing this together with other local developers would be even more fun.&lt;/p&gt;
&lt;h2 id=&quot;join-our-chat&quot;&gt;Join our chat&lt;/h2&gt;
&lt;p&gt;Together with two former colleagues of mine, I’ve created a Zulip server for the Bodø Dev group that we can use to discuss meetups and other relevant stuff. If you’re a developer based in Bodø, feel free to &lt;a href=&quot;https://kim.grytoyr.io/about&quot;&gt;contact me&lt;/a&gt; for an invitation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://chat.bododev.no/&quot;&gt;chat.bododev.no&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Running update: Week 20</title>
    <link href="https://kim.grytoyr.io/blog/running-update-week-20/" />
    <updated>2021-05-22T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/running-update-week-20/</id>
    <content type="html">&lt;p&gt;Last week I announced &lt;a href=&quot;https://kim.grytoyr.io/blog/running-challenge/&quot;&gt;Project Running&lt;/a&gt; – my own personal running challenge. In that post I promised myself and my impressively few, but dear, readers to post an update on my progress once a week. Here’s the first update!&lt;/p&gt;
&lt;div class=&quot;mt-8 flow-root&quot;&gt;
  &lt;div class=&quot;-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8&quot;&gt;
    &lt;div class=&quot;inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8&quot;&gt;
      &lt;table class=&quot;table min-w-full divide-y divide-slate-400&quot;&gt;
        &lt;thead&gt;
          &lt;tr&gt;
            &lt;th class=&quot;text-left&quot;&gt;Day&lt;/th&gt;
            &lt;th class=&quot;text-left&quot;&gt;Distance&lt;/th&gt;
            &lt;th class=&quot;text-left&quot;&gt;Duration&lt;/th&gt;
            &lt;th class=&quot;text-left&quot;&gt;Pace&lt;/th&gt;
          &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody class=&quot;divide-y divide-slate-300&quot;&gt;
          &lt;tr&gt;
            &lt;td&gt;Monday&lt;/td&gt;
            &lt;td&gt;3.68 km&lt;/td&gt;
            &lt;td&gt;23m33s&lt;/td&gt;
            &lt;td&gt;6:24&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Tuesday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Wednesday&lt;/td&gt;
            &lt;td&gt;3.67 km&lt;/td&gt;
            &lt;td&gt;22m51s&lt;/td&gt;
            &lt;td&gt;6:14&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Thursday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Friday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Saturday&lt;/td&gt;
            &lt;td&gt;3.66 km&lt;/td&gt;
            &lt;td&gt;22m01s&lt;/td&gt;
            &lt;td&gt;6:01&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;Sunday&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
            &lt;td&gt;-&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;SUM/AVG&lt;/td&gt;
            &lt;td&gt;11.01 km&lt;/td&gt;
            &lt;td&gt;22m36s&lt;/td&gt;
            &lt;td&gt;6:13&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To sum it up, I am satisfied with my effort and progress this week. My goal was merely to complete at least three runs, which I did without any problems. My goal for the coming week is to do exactly the same, and as a bonus I’m hoping to have an average pace that is about 5% faster than this week’s average pace.&lt;/p&gt;
&lt;p&gt;Stay tuned for more ground-breaking updates on this subject.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Running challenge</title>
    <link href="https://kim.grytoyr.io/blog/running-challenge/" />
    <updated>2021-05-17T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/running-challenge/</id>
    <content type="html">&lt;p&gt;I really enjoy running, but it’s not something I do consistently or very often. That’s something I’d like to change, so I’m hereby publicly announcing my own running challenge in the hope that doing this will force me to follow through.&lt;/p&gt;
&lt;p&gt;I’m so lucky to be living in an area of Bodø that has lots of trails that are very suitable for running. Just have a look at a few photos from some of my recent runs:&lt;/p&gt;
&lt;div class=&quot;image-grid&quot;&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/IjTA5LI0bC-400.avif 400w, https://kim.grytoyr.io/img/IjTA5LI0bC-800.avif 800w, https://kim.grytoyr.io/img/IjTA5LI0bC-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/IjTA5LI0bC-400.webp 400w, https://kim.grytoyr.io/img/IjTA5LI0bC-800.webp 800w, https://kim.grytoyr.io/img/IjTA5LI0bC-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/IjTA5LI0bC-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/IjTA5LI0bC-400.jpeg 400w, https://kim.grytoyr.io/img/IjTA5LI0bC-800.jpeg 800w, https://kim.grytoyr.io/img/IjTA5LI0bC-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/cldXBzm-dy-400.avif 400w, https://kim.grytoyr.io/img/cldXBzm-dy-800.avif 800w, https://kim.grytoyr.io/img/cldXBzm-dy-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/cldXBzm-dy-400.webp 400w, https://kim.grytoyr.io/img/cldXBzm-dy-800.webp 800w, https://kim.grytoyr.io/img/cldXBzm-dy-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/cldXBzm-dy-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/cldXBzm-dy-400.jpeg 400w, https://kim.grytoyr.io/img/cldXBzm-dy-800.jpeg 800w, https://kim.grytoyr.io/img/cldXBzm-dy-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/_Fj9zbAfzY-400.avif 400w, https://kim.grytoyr.io/img/_Fj9zbAfzY-800.avif 800w, https://kim.grytoyr.io/img/_Fj9zbAfzY-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/_Fj9zbAfzY-400.webp 400w, https://kim.grytoyr.io/img/_Fj9zbAfzY-800.webp 800w, https://kim.grytoyr.io/img/_Fj9zbAfzY-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/_Fj9zbAfzY-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/_Fj9zbAfzY-400.jpeg 400w, https://kim.grytoyr.io/img/_Fj9zbAfzY-800.jpeg 800w, https://kim.grytoyr.io/img/_Fj9zbAfzY-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;grid&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/s1cfbT5TXi-400.avif 400w, https://kim.grytoyr.io/img/s1cfbT5TXi-800.avif 800w, https://kim.grytoyr.io/img/s1cfbT5TXi-1200.avif 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/s1cfbT5TXi-400.webp 400w, https://kim.grytoyr.io/img/s1cfbT5TXi-800.webp 800w, https://kim.grytoyr.io/img/s1cfbT5TXi-1200.webp 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/s1cfbT5TXi-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;1200&quot; srcset=&quot;https://kim.grytoyr.io/img/s1cfbT5TXi-400.jpeg 400w, https://kim.grytoyr.io/img/s1cfbT5TXi-800.jpeg 800w, https://kim.grytoyr.io/img/s1cfbT5TXi-1200.jpeg 1200w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Every time I’m out running I’m thinking to myself: «This is awesome!» Despite that thought and feeling, it often goes a week or two until my next run. &lt;strong&gt;I’m about to change this.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-challenge&quot;&gt;The challenge&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Every week I will go for a run at least three times, and the run should be longer than three kilometers.&lt;/p&gt;
&lt;p&gt;Me, 16th of may 2021&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My average pace is now typically around 6-6,5 minutes per kilometer. My goal is to increase my average pace to 5 minutes per kilometer on a regular run. This should be doable within a reasonable amount of time.&lt;/p&gt;
&lt;p&gt;To document this I will post an update once a week with my runs embedded from &lt;a href=&quot;https://strava.com/&quot;&gt;Strava&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Test your API endpoints in VS Code with Thunderclient</title>
    <link href="https://kim.grytoyr.io/blog/test-your-api-endpoints-in-vs-code-with-thunderclient/" />
    <updated>2021-05-13T00:00:00Z</updated>
    <id>https://kim.grytoyr.io/blog/test-your-api-endpoints-in-vs-code-with-thunderclient/</id>
    <content type="html">&lt;p&gt;A couple of days ago I came across this extension for &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt; that lets you send HTTP request from within VS Code itself: &lt;a href=&quot;https://www.thunderclient.io/&quot;&gt;Thunderclient&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I do a lot of integrations and API related development in general, and I typically use &lt;a href=&quot;https://www.postman.com/&quot;&gt;Postman&lt;/a&gt; and/or &lt;a href=&quot;https://insomnia.rest/&quot;&gt;Insomnia&lt;/a&gt; for these kinds of things, but sometimes it can be really handy to do some quick testing without leaving the editor. I come from &lt;a href=&quot;https://www.vim.org/&quot;&gt;Vim&lt;/a&gt; where I used the &lt;a href=&quot;https://github.com/diepm/vim-rest-console&quot;&gt;Vim RESTConsole&lt;/a&gt; plugin, so this extension is a welcome addition to VS Code.&lt;/p&gt;
&lt;figure class=&quot;&quot;&gt;
    &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://kim.grytoyr.io/img/bcQhPsVQfQ-400.avif 400w, https://kim.grytoyr.io/img/bcQhPsVQfQ-800.avif 800w, https://kim.grytoyr.io/img/bcQhPsVQfQ-1280.avif 1280w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://kim.grytoyr.io/img/bcQhPsVQfQ-400.webp 400w, https://kim.grytoyr.io/img/bcQhPsVQfQ-800.webp 800w, https://kim.grytoyr.io/img/bcQhPsVQfQ-1280.webp 1280w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;img src=&quot;https://kim.grytoyr.io/img/bcQhPsVQfQ-400.jpeg&quot; alt=&quot;&quot; class=&quot;w-full&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;791&quot; srcset=&quot;https://kim.grytoyr.io/img/bcQhPsVQfQ-400.jpeg 400w, https://kim.grytoyr.io/img/bcQhPsVQfQ-800.jpeg 800w, https://kim.grytoyr.io/img/bcQhPsVQfQ-1280.jpeg 1280w&quot; sizes=&quot;(min-width: 768px) 100vw, 100vw&quot;&gt;&lt;/picture&gt;
  &lt;/figure&gt;
&lt;p&gt;Installing and configuring it is as simple as it gets. I believe this is a quite new plugin, so there may be some hiccups here and there, but I’ll definitely give it a go and see how it works.&lt;/p&gt;
</content>
  </entry>
</feed>