<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Alvin Bryan</title><description>Welcome to my RSS feed</description><link>https://alvin.codes/</link><item><title>The Public Domain</title><link>https://alvin.codes/writing/public-domain/</link><guid isPermaLink="true">https://alvin.codes/writing/public-domain/</guid><description>What do Winnie the Pooh, Dr Jekyll, and Peter Pan have in common?</description><pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Grid from &apos;../../../../components/Grid.astro&apos;;
import { Image } from &apos;astro:assets&apos;;
import eveningCool from &apos;./evening-cool.jpeg&apos;;
import snowyPath from &apos;./snowy-mountain-path.jpeg&apos;;
import hakone from &apos;./hakone-takahashi.jpeg&apos;;
import foxfires from &apos;./foxfires.jpg&apos;;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I envy the Japanese the extreme clarity that everything in their work has. It&apos;s never dull, and never appears to be done too hastily.&lt;br&gt;
Vincent van Gogh, &lt;a href=&quot;https://vangoghletters.org/vg/letters/let686/letter.html&quot;&gt;Letter to Theo, September 1888&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What do Winnie the Pooh, Dr Jekyll, and Peter Pan have in common?&lt;/p&gt;
&lt;p&gt;They&apos;re public, meaning there&apos;s no copyright with their characters. You can print and sell a Sherlock Holmes book. You can make a video game with Winnie The Pooh.&lt;/p&gt;
&lt;h2&gt;What&apos;s the public domain?&lt;/h2&gt;
&lt;p&gt;Some time after an artist passes away, all of their work becomes &quot;public.&quot; That means losing the copyright. Their work becomes free for everyone to enjoy, reproduce, modify, or do anything with.&lt;/p&gt;
&lt;p&gt;The terms &quot;artist&quot; and &quot;work of art&quot; apply in the broadest sense here. Anything that can be copyrighted like books, photographs, music, paintings, sculpture, etc will fall into the public domain, except trademarks. I tried to include various sources throughout the article to give you an idea.&lt;/p&gt;
&lt;p&gt;This varies by countries, with the US and Canada having some of the longest copyright period.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-from-rawpixel-id-3064808-jpeg.jpg&quot; alt=&quot;Otome Pass&quot; title=&quot;Otome Pass, Hakone by Hiroaki Takahashi, circa 1932&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Why should I care?&lt;/h2&gt;
&lt;p&gt;There&apos;s no reason a 1750 book should be the same price as a 2025 book, but that&apos;s happening. Publishers get away with it by creating new editions with &quot;a new foreword by [insert trendy author]&quot;. But the original text is often the same. Often, even the illustrations are the same.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./alice-in-wonderland.png&quot; alt=&quot;Alice in Wonderland&quot;&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s take Alice in Wonderland, illustrated&lt;/p&gt;
&lt;p&gt;If you wanted to read Alice in Wonderland, the illustrated version, and didn&apos;t know about the public domain, you might have gone to Amazon or a bookshop and bought it. It turns out you can get &lt;a href=&quot;https://standardebooks.org/ebooks/lewis-carroll/alices-adventures-in-wonderland/john-tenniel&quot;&gt;the same ebook for free online&lt;/a&gt;, with the same illustrations, completely legally.&lt;/p&gt;
&lt;h2&gt;But reading online is terrible?&lt;/h2&gt;
&lt;p&gt;More examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do you have 3 Shakespeare books to buy? Get a used e-reader instead. For less than $30 you&apos;ll be able to read all the classics for free. Forever.&lt;/li&gt;
&lt;li&gt;Want a Van Gogh poster in your house? Don&apos;t go to Amazon or Ikea, go to a local printer, download and print a high-resolution image. It will be cheaper and you&apos;ll support a local business.&lt;/li&gt;
&lt;li&gt;Do you want to gift &lt;em&gt;The Great Gatsby&lt;/em&gt; to someone you know has an e-reader? Buy another (copyrighted) book and write a link to the free ebook on a piece of paper. Now you&apos;re giving them two books.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And so on, you know where I&apos;m going with this.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./oasis-badlands-curtis-1905.png&quot; alt=&quot;Oasis&quot; title=&quot;📸 An oasis in the Badlands, by Edward S. Curtis, 1905&quot;&gt;&lt;/p&gt;
&lt;p&gt;{/* Lettre à Mr d&apos;assier Champollion? */}&lt;/p&gt;
&lt;p&gt;{/* A thousand miles up the nile, Amelia */}&lt;/p&gt;
&lt;h2&gt;A whole new world&lt;/h2&gt;
&lt;p&gt;I can&apos;t overstate how gigantic the public domain is. There&apos;s art from every corner of the world, books from every era, from Shakespeare to Japanese art via Grimm&apos;s fairy tales.&lt;/p&gt;
&lt;h3&gt;What about music?&lt;/h3&gt;
&lt;p&gt;Music is a bit trickier. With digital music, there are always two parts: The composition, and the performance. Someone has to record the song for you to hear it. And that recording is often more recent, and copyrighted.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Antonio_stradivari.jpeg&quot; alt=&quot;Stradivari&quot; title=&quot;Antonio Stradivari&quot;&gt;&lt;/p&gt;
&lt;h2&gt;How do I know if something is public domain?&lt;/h2&gt;
&lt;p&gt;Disclaimer: I&apos;m not a lawyer and this is not legal advice.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Generally&lt;/em&gt;, anything published &lt;em&gt;before&lt;/em&gt; this year minus 96 is free. In 2025, that&apos;s 1929. As a rule of thumb, you &lt;em&gt;should&lt;/em&gt; be safe with anything created before 1900. This varies by country so be careful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Except trademarks&lt;/strong&gt;, Coca-Cola was created in 1886 but their logo isn&apos;t public domain. Academic papers also seem to be in a legal grey area.&lt;/p&gt;
&lt;p&gt;Every year, on January 1st (known as Public Domain Day!) Duke University&apos;s School of Law publishes &lt;a href=&quot;https://web.law.duke.edu/cspd/publicdomainday/2023/&quot;&gt;a list of creations entering the public domain&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./lion-and-prey-bonheur-1847.png&quot; alt=&quot;Lion and Prey&quot; title=&quot;Lion and Prey by Rosa Bonheur, 1847&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Dangers&lt;/h2&gt;
&lt;p&gt;Corporations want to maximise their profits out of artists, even long after their death. Copyright lasted 56 years until 1976, when it was extended to 75 years. In 1998, lobbies got an extension to 95 years. All works of art from the 1920s were basically frozen for 20 years.&lt;/p&gt;
&lt;p&gt;Canada voted (in July 2022) to extend copyright, and that law should never have passed. Even Elon Musk agrees with this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Current copyright law in general goes absurdly far beyond protecting the original creator
Overzealous DMCA is a plague on humanity — &lt;a href=&quot;https://twitter.com/elonmusk/status/1524846562974875655&quot;&gt;Elon Musk&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think copyright should be based on revenue per derivative work. Meaning, if you&apos;ve made $50 million from a book, that&apos;s it for the book. But just the book, you still own the rights to other derivatives.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./charlotte-du-val-dognes-villers-1801.png&quot; alt=&quot;Portrait&quot; title=&quot;Marie-Denise Villers, Portrait of Charlotte du Val d&amp;#x27;Ognes, 1801&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Where to find Public Domain art&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ebooks, beautifully typeset on &lt;a href=&quot;https://standardebooks.org/&quot;&gt;Standard Ebooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ebooks, lots of them on &lt;a href=&quot;https://www.gutenberg.org/&quot;&gt;Project Gutenberg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;News, ebooks and illustrations from the &lt;a href=&quot;https://publicdomainreview.org/&quot;&gt;Public Domain Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sheet music from the &lt;a href=&quot;https://imslp.org/&quot;&gt;International Music Score Library Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;All the national libraries and museum websites that you can think of&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://pdimagearchive.org/&quot;&gt;Public Domain Image Archive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks for reading,
I hope you learned something new.&lt;/p&gt;</content:encoded></item><item><title>2024 in Review</title><link>https://alvin.codes/writing/2024-in-review/</link><guid isPermaLink="true">https://alvin.codes/writing/2024-in-review/</guid><description>Never again.</description><pubDate>Tue, 31 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I almost didn&apos;t write this. This was not a good year.&lt;/p&gt;
&lt;p&gt;The vast majority of the things I tried failed miserably. I was the sickest I&apos;ve ever been in June which lead me to cancel a major event. Plus many, many other similar things.&lt;/p&gt;
&lt;p&gt;The Contentful layoff started a horrible series of dominoes that I&apos;m still dealing with right now. Whoever makes hiring and layoff decisions will never know the real consequences of events like this.&lt;/p&gt;
&lt;p&gt;As I said, even if the majority of the year didn&apos;t work out, (thankfully!) there were some positives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I now have some wonderful new friends (🇮🇳 🇭🇺) that I hope will stay in my life for many years to come.&lt;/li&gt;
&lt;li&gt;I&apos;m extremely lucky to have found &lt;a href=&quot;https://www.getunleash.io/&quot;&gt;Unleash&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;CityJS London was fun.&lt;/li&gt;
&lt;li&gt;I had 5 days of absolute bliss in Oslo.&lt;/li&gt;
&lt;li&gt;Something new and exciting is planned for January 2025, and I want to believe it&apos;s a sign of the tide turning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To my old friends who have supported me, and keep supporting me, you know who you are. Thank you, I&apos;m forever grateful.&lt;/p&gt;
&lt;p&gt;If you want more details and/or want to help, &lt;a href=&quot;https://bsky.app/profile/alvin.codes&quot;&gt;DM me&lt;/a&gt;/&lt;a href=&quot;mailto:hello@alvin.codes&quot;&gt;email me&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>White Hippo Cartoons</title><link>https://alvin.codes/writing/moomin/</link><guid isPermaLink="true">https://alvin.codes/writing/moomin/</guid><description>An overview of the Scandi phenomenon and its creator.</description><pubDate>Sun, 13 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I love discovering things that I never heard about and turn out to be huge.&lt;/p&gt;
&lt;p&gt;Have you ever seen these characters?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Untitled.png&quot; alt=&quot;Untitled&quot;&gt;&lt;/p&gt;
&lt;p&gt;These are the Moomin. Behind these cute cartoons is a gigantic Scandi phenomenon.&lt;/p&gt;
&lt;h2&gt;What is it?&lt;/h2&gt;
&lt;p&gt;The Moomin are (originally) a series of illustrated children novels. They started out as individual comic strips in 1945.&lt;/p&gt;
&lt;p&gt;The characters have silly names like Snorkmaiden, Moomintroll, Snufkin, Moominpapa, and such. Not gonna lie, I find those names weird.&lt;/p&gt;
&lt;p&gt;It turns out that the moomin are a gigantic, worldwide success story.&lt;/p&gt;
&lt;h2&gt;How big is it?&lt;/h2&gt;
&lt;p&gt;It’s a &lt;strong&gt;huge franchise&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The characters were in a theatre play, and an opera. There&apos;s a store in London, there&apos;s even a freaking &lt;em&gt;theme park&lt;/em&gt; in Finland, and another one in Japan. There&apos;s a dedicated museum in Tampere.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./20221026_130421.jpg&quot; alt=&quot;&quot; title=&quot;The dedicated Moomin shop in Covent Garden, in London. One of the most expensive locations in Europe.&quot;&gt;&lt;/p&gt;
&lt;p&gt;On top of all of that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The books were translated into 55+ languages&lt;/li&gt;
&lt;li&gt;The annual retail value of Moomin: 720+ million EUR&lt;/li&gt;
&lt;li&gt;35+ Moomin shops and Moomin cafés exist globally, and expanding&lt;/li&gt;
&lt;li&gt;The TV series (Moominvalley) was sold to over 60 countries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://rightsandbrands.com/brands/moomin&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;How to read the books&lt;/h2&gt;
&lt;p&gt;The children novels are the most popular, but there are comic strips and young children’s picture books. I was primarily interested in the comics.&lt;/p&gt;
&lt;h3&gt;Comic strips&lt;/h3&gt;
&lt;p&gt;There are 2 ways to read the comic strips:&lt;/p&gt;
&lt;h4&gt;1. Large, black and white format.&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;./Untitled-1.png&quot; alt=&quot;Moomin Vol. 1 The Complete Tove Jansson Comic Strip Link &quot;&gt;&lt;/p&gt;
&lt;p&gt;The biggest comics are A4-sized books containing multiple stories.&lt;/p&gt;
&lt;p&gt;Each story is roughly 20 to 25 pages. A single album is about the same length as a Franco-Belgian comic like Tintin/Gaston.&lt;/p&gt;
&lt;h4&gt;2. Individual, color comic strips&lt;/h4&gt;
&lt;p&gt;The strips are small and sold individually in full-color books.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Untitled-2.png&quot; alt=&quot;Untitled&quot;&gt;&lt;/p&gt;
&lt;h2&gt;The Moomin books&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The books are not comic books&lt;/strong&gt;, they’re regular children novels with illustrations. The Moomin books don’t have volume numbers so if you want to read the books in chronological order, here’s the list.&lt;/p&gt;
&lt;p&gt;Ordered by &lt;em&gt;original&lt;/em&gt; publication date:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;The Moomins and the Great Flood&lt;/em&gt; (1945).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Comet in Moominland&lt;/em&gt; (1946).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Finn Family Moomintroll&lt;/em&gt; (1948).&lt;/li&gt;
&lt;li&gt;Exploits of Moominpappa (1950).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Moominsummer Madness&lt;/em&gt; (1954).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Moominland Midwinter&lt;/em&gt; (1957).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Tales from Moominvalley&lt;/em&gt; (1962).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Moominpappa at Sea&lt;/em&gt; (1965).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Moominvalley in November&lt;/em&gt; (1971).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;The Moomin Canon&lt;/h3&gt;
&lt;p&gt;When I first researched this, I saw “The Moomin Canon” mentioned in a few places on the Internet. The Moomin canon are the books that came out roughly between 1950 and 1970, &lt;em&gt;in English&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The canon starts at book 2, &lt;em&gt;Comet in Moominland&lt;/em&gt; and finishes at book 9, &lt;em&gt;Mooninvalley in November&lt;/em&gt;. The first book is missing because it was only translated into English much later.&lt;/p&gt;
&lt;h2&gt;Tove Janssen&lt;/h2&gt;
&lt;p&gt;Moreso than the Moomins universe, I found found the life of the author fascinating.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Untitled-3.png&quot; alt=&quot;Self-Portrait&quot; title=&quot;Self-Portrait, 1942&quot;&gt;&lt;/p&gt;
&lt;p&gt;☝️ &lt;a href=&quot;https://www.kansallisgalleria.fi/en/object/423294&quot;&gt;Athenum Art Museum&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tove Janssen (/ˈtuːve ˈjɑːnson/) is Finnish but grew up speaking Swedish. Her father fought in the Finnish war of independence which ended in 1919. She started working as a cartoonist in 1930. She has been in a same-sex relationship since 1956, which was technically illegal until 1971.&lt;/p&gt;
&lt;p&gt;She wrote the first Moomin book in 1945, during WW2.&lt;/p&gt;
&lt;p&gt;I much prefer her art compared to the stories, so here’s a sample of her work:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Untitled-4.png&quot; alt=&quot;A cover for Garm magazine&quot; title=&quot;A cover for Garm magazine, 1944&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Untitled-5.png&quot; alt=&quot;Mural&quot; title=&quot;A mural in Kotka, Finland&quot;&gt;&lt;/p&gt;
&lt;p&gt;She illustrated the Swedish versions of The Hobbit, and Alice in Wonderland.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Untitled-6.png&quot; alt=&quot;The Hobbit Cover&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Untitled-7.png&quot; alt=&quot;The Hobbit&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./Untitled-8.png&quot; alt=&quot;Untitled&quot;&gt;&lt;/p&gt;
&lt;p&gt;There you go, maybe you learned something new today.&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br&gt;
Alvin&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Further reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://uk.bookshop.org/a/72/9781908745934&quot;&gt;Notes from an island&lt;/a&gt;, a memoir written by Tove and her partner about buying an island and building an off-grid house on it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://uk.bookshop.org/a/72/9781908745491&quot;&gt;Sculptor&apos;s Daughter: A Childhood Memoir&lt;/a&gt;. Just that, a memoir.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.openculture.com/2020/10/the-sublime-alice-in-wonderland-illustrations-of-tove-janssen-creator-of-the-globally-beloved-moomins-1966.html&quot;&gt;The Sublime Alice in Wonderland Illustrations of Tove Jansson (1966) | Open Culture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.bl.uk/european/2021/11/tove-janssons-illustrations-for-carroll-and-tolkien.html&quot;&gt;Tove Jansson’s illustrations for Carroll and Tolkien - European studies blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/PhilipArdagh/status/1351504112379162630&quot;&gt;The World of Moominvalley&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>What made you want to stop coding?</title><link>https://alvin.codes/writing/devrel-coding/</link><guid isPermaLink="true">https://alvin.codes/writing/devrel-coding/</guid><description>The perennial question of coding and developer advocates.</description><pubDate>Tue, 02 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Oh, you&apos;re a developer advocate, what made you want to stop coding?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Someone first asked me this question at CascadiaJS 2022. I put an answer in &lt;a href=&quot;/writing/first-6-months-devrel&quot;&gt;my first 6 months recap&lt;/a&gt;, then it came up a few more times over the years. Now I think it shouldn&apos;t be buried in that article.&lt;/p&gt;
&lt;p&gt;This is part of a perennial set of questions in the industry: How much do developers advocate code? How much coding you should know before becoming a Developer Advocate?&lt;/p&gt;
&lt;p&gt;Anyway, this is my answer.&lt;/p&gt;
&lt;p&gt;I definitely didn’t stop coding. I feel like &lt;strong&gt;I code more as a developer advocate&lt;/strong&gt; than I did as a front-end/software engineer.&lt;/p&gt;
&lt;p&gt;It’s not true in the absolute, because going to events and writing articles lowers my total output. But, I spend more time &lt;em&gt;thinking about code&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;One of my responsibilities is to create tutorials and code samples that help developers use a product. Because of that, I have to be aware of how people code. That means keeping up with the latest developments in frameworks, runtimes and new features coming to programming languages. (Sveltekit had a major breaking change while I was building a starter, for example.)&lt;/p&gt;
&lt;p&gt;Maintaining code samples and starter kits is also my responsibility. It&apos;s a crucial part of a company&apos;s developer experience and it requires you to keep yourself up-to-date.&lt;/p&gt;</content:encoded></item><item><title>Gatsby to Astro</title><link>https://alvin.codes/writing/gatsby-to-astro/</link><guid isPermaLink="true">https://alvin.codes/writing/gatsby-to-astro/</guid><description>Why and how I migrated this website from Gatsby to Astro.</description><pubDate>Sat, 24 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;This is a nerdy post, it’s about how my website works under the hood. Last year, I moved this website from Gatsby to everyone’s favourite HTML framework: Astro.&lt;/p&gt;
&lt;h2&gt;Why Astro&lt;/h2&gt;
&lt;p&gt;I get a SSG like gatsby, with no JS by default, and none of the React issues.&lt;/p&gt;
&lt;h3&gt;Leave the React ecosystem&lt;/h3&gt;
&lt;p&gt;I wanted to leave the React ecosystem. When I first wrote my Gatsby blog, React was unstoppable. It was a good decision at the time, because that knowledge of Gatsby and Next.js helped to get jobs.&lt;/p&gt;
&lt;p&gt;As someone who likes making demos, I prefer to be as close to writing vanilla JS as possible. There are whole books dedicated to getting React to work with D3 or WebGL. I don’t have time for this on my website.&lt;/p&gt;
&lt;h3&gt;Import all the things&lt;/h3&gt;
&lt;p&gt;With Astro, I can keep all of my existing React components. I have a full-time job and I didn&apos;t want my rewrite to take 6 months.&lt;/p&gt;
&lt;p&gt;With Astro, you can import everything. I&apos;ve called it &quot;&lt;a href=&quot;https://www.contentful.com/blog/what-is-astro/&quot;&gt;the frameworks of all frameworks&lt;/a&gt;” for this reason. Right now, my interactive pages are built with Svelte, running alongside the exact same React components that I wrote for Gatsby 4 years ago.&lt;/p&gt;
&lt;h3&gt;Move to Remark&lt;/h3&gt;
&lt;p&gt;Gatsby and Astro both rely on a processor called Remark for markdown, I even made a &lt;a href=&quot;https://github.com/alvinometric/remark-inline-svg&quot;&gt;custom plugin&lt;/a&gt; for it. But Gatsby relies on another &lt;code&gt;gatsby-remark&lt;/code&gt; abstraction for its plugins. And a lot of these Gatsby-only plugins have gone stale.&lt;/p&gt;
&lt;p&gt;I could have moved my Gatsby site to MDX, but which fixes this problem, I couldn’t get it to work. And the people behind MDX refuse to support HTML comments which means that I would have to migrate many of my existing articles. Again, I don’t have time for this.&lt;/p&gt;
&lt;h3&gt;Telemetry&lt;/h3&gt;
&lt;p&gt;More than 3 years ago, &lt;a href=&quot;https://www.notion.so/Under-the-hood-Tech-1-a002cffb3e4d4052943a72d2e065030e?pvs=21&quot;&gt;I called out Gatsby&lt;/a&gt; for sending telemetry data from your computer. I talked to the Astro team about this, and they listened. Astro shows it clearly and makes opting out very easy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./telemetry.png&quot; alt=&quot;Telemetry&quot;&gt;&lt;/p&gt;
&lt;h2&gt;How I did it: Gatsby stuff&lt;/h2&gt;
&lt;p&gt;This a recap of everything, starting with things that are specific to Gatsby&lt;/p&gt;
&lt;h3&gt;Organise content with Markdown GraphQL request&lt;/h3&gt;
&lt;p&gt;My blog posts, book reviews and regular “markdown” pages were all organised via GraphQL requests, now I use &lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#importing-markdown&quot;&gt;&lt;code&gt;astro.glob&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Replace &lt;code&gt;gatsby-remark&lt;/code&gt; plugins&lt;/h3&gt;
&lt;p&gt;I used a Gatsby plugin called &lt;code&gt;gatsby-remark-autolink-headers&lt;/code&gt;, which lets you automatically create clickable links to an html anchor on your headings, just like GitHub does on Markdown files.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;{
  resolve: `gatsby-remark-autolink-headers`,
  options: {
    icon: `&amp;#x3C;svg aria-hidden=&quot;true&quot; data-icon=&quot;anchor&quot; width=&quot;24&quot; height=&quot;27&quot; viewBox=&quot;0 0 576 512&quot;&gt;&amp;#x3C;path fill=&quot;currentColor&quot; d=&quot;M12.971 352h32.394C67.172 454.735 181.944 512 288 512c106.229 0 220.853-57.38 242.635-160h32.394c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0l-67.029 67.029c-7.56 7.56-2.206 20.485 8.485 20.485h35.146c-20.29 54.317-84.963 86.588-144.117 94.015V256h52c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-52v-5.47c37.281-13.178 63.995-48.725 64-90.518C384.005 43.772 341.605.738 289.37.01 235.723-.739 192 42.525 192 96c0 41.798 26.716 77.35 64 90.53V192h-52c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h52v190.015c-58.936-7.399-123.82-39.679-144.117-94.015h35.146c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0L4.485 331.515C-3.074 339.074 2.28 352 12.971 352zM288 64c17.645 0 32 14.355 32 32s-14.355 32-32 32-32-14.355-32-32 14.355-32 32-32z&quot;/&gt;&amp;#x3C;/svg&gt;`,
    className: `heading-anchor`,
  },
},
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I solved it with:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;rehype-slug&lt;/code&gt; (to automatically add &lt;code&gt;id&lt;/code&gt; attributes to your headings)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rehype-autolink-headings&lt;/code&gt; (to create the links)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hast-util-from-html&lt;/code&gt; (to insert my custom icon).&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rehypePlugins: [
  rehypeSlug,
  [
    rehypeAutolinkHeadings,
    {
      behavior: &apos;prepend&apos;,
      content: fromHtml(
        &apos;&amp;#x3C;svg width=&quot;24&quot; height=&quot;27&quot; viewBox=&quot;0 0 576 512&quot;&gt;&amp;#x3C;path fill=&quot;currentColor&quot; d=&quot;M12.971 352h32.394C67.172 454.735 181.944 512 288 512c106.229 0 220.853-57.38 242.635-160h32.394c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0l-67.029 67.029c-7.56 7.56-2.206 20.485 8.485 20.485h35.146c-20.29 54.317-84.963 86.588-144.117 94.015V256h52c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-52v-5.47c37.281-13.178 63.995-48.725 64-90.518C384.005 43.772 341.605.738 289.37.01 235.723-.739 192 42.525 192 96c0 41.798 26.716 77.35 64 90.53V192h-52c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h52v190.015c-58.936-7.399-123.82-39.679-144.117-94.015h35.146c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0L4.485 331.515C-3.074 339.074 2.28 352 12.971 352zM288 64c17.645 0 32 14.355 32 32s-14.355 32-32 32-32-14.355-32-32 14.355-32 32-32z&quot;/&gt;&amp;#x3C;/svg&gt;&apos;,
      ),
      properties: { ariaHidden: true, tabIndex: -1, className: &apos;heading-anchor&apos; },
    },
  ],
],
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Captions&lt;/h3&gt;
&lt;p&gt;The built-in &lt;code&gt;gatsby-remark-images&lt;/code&gt; plugin let you add caption to your images using the title attribute in markdown, via the &lt;code&gt;showCaptions: &apos;title&apos;&lt;/code&gt; option.&lt;/p&gt;
&lt;p&gt;Here&apos;s what an image with a caption would look like, in markdown:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;![Alt text](./image-file.png &apos;this is the title attribute, which will be used as a caption&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Solution:&lt;br&gt;
I solved this with the &lt;code&gt;rehype-figure-title&lt;/code&gt; plugin.&lt;/p&gt;
&lt;h3&gt;Static directory&lt;/h3&gt;
&lt;p&gt;In Astro, the folder that is copied to the root of your live site for static files is the &lt;code&gt;./public/&lt;/code&gt; folder. There are 2 problems with this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In Gatsby it’s the &lt;code&gt;./static/&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;public/&lt;/code&gt; folder is actually where gatsby builds the files. So &lt;code&gt;public&lt;/code&gt; was part of in my &lt;code&gt;.gitignore&lt;/code&gt; .&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Solution:&lt;br&gt;
Astro lets you change its “public” directory with the &lt;code&gt;publicDir&lt;/code&gt; option in &lt;code&gt;astro.config.mjs&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;// in astro.config.mjs
{
  publicDir: &apos;./static&apos;,
  // rest of your config
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;How I did it: general React stuff&lt;/h2&gt;
&lt;h3&gt;Astro wants React code inside .jsx and not .js files&lt;/h3&gt;
&lt;p&gt;This was the first thing I had to do. I actually recommend doing this &lt;em&gt;before&lt;/em&gt; creating another branch for your refactor. I will try to do this in all my React projects moving because it’s more explicit.&lt;/p&gt;
&lt;p&gt;I renamed all my &lt;code&gt;.js&lt;/code&gt; react files to &lt;code&gt;.jsx&lt;/code&gt; using the &lt;code&gt;find&lt;/code&gt; command and &lt;a href=&quot;/writing/nifty-command-lines-rename&quot;&gt;the &lt;code&gt;rename&lt;/code&gt; CLI&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;find ./src/components/ -name &quot;_.js&quot; -type f -exec rename &apos;s/.js$/.jsx/&apos; -- {} \;
find ./src/templates/ -name &quot;_.js&quot; -type f -exec rename &apos;s/.js$/.jsx/&apos;  -- {} \;
find ./src/pages/ -name &quot;*.js&quot; -type f -exec rename &apos;s/.js$/.jsx/&apos; -- {} \;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Inline SVGs&lt;/h3&gt;
&lt;p&gt;I used inline svgs for my icons, which was powered by &apos;gatsby-plugin-react-svg’.&lt;/p&gt;
&lt;p&gt;For my React components, I went from&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;const Icon = ({ url, title, icon }) =&gt; {
  const svg = React.cloneElement(icon, {
    role: &apos;img&apos;,
    &apos;aria-hidden&apos;: &apos;true&apos;,
    width: &apos;24&apos;,
    height: &apos;24&apos;,
  });

   return (
     &amp;#x3C;a href={url} className=&quot;no-icon&quot; title={title} rel={rel}&gt;
      {icon}
     &amp;#x3C;/a&gt;
   );
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;// loading the icons as
import Feed from &apos;../assets/icons/rss.inline.svg?raw&apos;; // note the ?raw

const Icon = ({ url, title, icon }) =&gt; {
  const rel = url.includes(&apos;rss&apos;) ? &apos;me&apos; : &apos;me nofollow&apos;;

  return (
    &amp;#x3C;a
      href={url}
      className=&quot;no-icon&quot;
      title={title}
      rel={rel}
      dangerouslySetInnerHTML={{ __html: icon }}
    &gt;&amp;#x3C;/a&gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In Astro, all I had to do was this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;---
import mySvg from &quot;../image.svg?raw&quot;;
---

&amp;#x3C;Fragment set:html={mySvg} /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;React Helmet and programmatically updating &lt;code&gt;&amp;#x3C;head&gt;&lt;/code&gt; tags&lt;/h3&gt;
&lt;p&gt;This goes for Gatsby, Next.js, and everywhere else in the React ecosystem.&lt;/p&gt;
&lt;p&gt;I solved it using named slots&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&amp;#x3C;!DOCTYPE html&gt;
&amp;#x3C;html lang=&quot;en&quot;&gt;
  &amp;#x3C;head&gt;
    &amp;#x3C;meta charset=&quot;UTF-8&quot; /&gt;
    &amp;#x3C;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot; /&gt;
    &amp;#x3C;meta name=&quot;generator&quot; content={Astro.generator} /&gt;

		&amp;#x3C;!-- 👇 --&gt;
    &amp;#x3C;slot name=&quot;seo&quot; /&gt;
  &amp;#x3C;/head&gt;
  &amp;#x3C;body&gt;
    &amp;#x3C;div class={css.layout}&gt;
      &amp;#x3C;Header /&gt;
      &amp;#x3C;main&gt;
        &amp;#x3C;slot /&gt;
      &amp;#x3C;/main&gt;
      &amp;#x3C;Footer /&gt;
    &amp;#x3C;/div&gt;
  &amp;#x3C;/body&gt;
&amp;#x3C;/html&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And in children component&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&amp;#x3C;Layout&gt;
  // 👇
  &amp;#x3C;Seo slot=&quot;seo&quot; title=&quot;Welcome!&quot; /&gt;
  &amp;#x3C;canvas id=&quot;regl-canvas&quot;&gt;&amp;#x3C;/canvas&gt;
&amp;#x3C;/Layout&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CSS modules&lt;/h3&gt;
&lt;p&gt;In Gatsby, CSS modules were turned into camel case, in Astro they are imported differently.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-diff&quot;&gt;- &amp;#x3C;figure className={css.bookHeader}&gt;
+ &amp;#x3C;figure class={css[&apos;book-header&apos;]}&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Dynamic HTML classes and loops&lt;/h3&gt;
&lt;p&gt;I went from&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;// SplitText.jsx

const SplitText = ({ text, className }) =&gt; {
  useEffect(() =&gt; {
    const elements = document.querySelectorAll(`.${className} span`);
  });

  const spans = text.split(&apos;&apos;).map((letter, i) =&gt; (
    &amp;#x3C;span aria-hidden=&quot;true&quot; key={i}&gt;
      {letter}
    &amp;#x3C;/span&gt;
  ));

  return (
    &amp;#x3C;h1 className={className} aria-label={text}&gt;
      {spans}
    &amp;#x3C;/h1&gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;---
// SplitText.astro
const { text, className } = Astro.props;
---

&amp;#x3C;h1 class:list={[className, &apos;split&apos;]} aria-label={text}&gt;
  {
    text.split(&apos;&apos;).map((letter, i) =&gt; {
      return &amp;#x3C;span aria-hidden=&quot;true&quot;&gt;{letter}&amp;#x3C;/span&gt;;
    })
  }
&amp;#x3C;/h1&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Link components&lt;/h3&gt;
&lt;p&gt;Both Gastby and Next.js use a &lt;code&gt;&amp;#x3C;Link&gt;&lt;/code&gt; component rather than the usual &lt;code&gt;&amp;#x3C;a&gt;&lt;/code&gt; tag. Astro and Svelte don’t.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- &amp;#x3C;Link to=&quot;/blog&quot;&gt;Blog&amp;#x3C;/Link&gt;

* &amp;#x3C;a href=&quot;/blog&quot;&gt;Blog&amp;#x3C;/a&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;How I did it: Other random stuff&lt;/h2&gt;
&lt;h3&gt;Glslify&lt;/h3&gt;
&lt;p&gt;I use &lt;a href=&quot;https://github.com/glslify/glslify&quot;&gt;Glslify&lt;/a&gt; for all my 3D sketches. In the Gatsby site I used a babel plugin. I couldn’t find a Vite plugin but I found one for Rollup that works just as well.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;import glslify from &apos;rollup-plugin-glslify&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Dates in frontmatter&lt;/h3&gt;
&lt;p&gt;Gatsby was lenient with my frontmatter data. Sometimes my dates were in quotes, sometimes not. Because of the type checks that Astro performs on Content Collections, my front matter data had to be consistent.&lt;/p&gt;
&lt;p&gt;I ran a find-and-replace in VSCode, searching for this (with regular expressions enabled)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;date: &apos;(.*&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And replacing with&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;date: $1;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./search.png&quot; alt=&quot;Search&quot;&gt;&lt;/p&gt;
&lt;h2&gt;The not so glorious parts&lt;/h2&gt;
&lt;h3&gt;Dark Mode Flash&lt;/h3&gt;
&lt;p&gt;I remembered having to fix this exact problem when I added it to my Gatsby site. I used the same logic in the Astro site and for some reason I was still getting flashes.&lt;/p&gt;
&lt;p&gt;Luckily I found &lt;a href=&quot;https://axellarsson.com/blog/astrojs-prevent-dark-mode-flicker/&quot;&gt;a blog post by Axel Larsson&lt;/a&gt; with a one-line fix for this specific problem. I then opened &lt;a href=&quot;https://github.com/withastro/docs/pull/3526&quot;&gt;a PR to the Astro docs&lt;/a&gt; to fix it there too. (Sorry Axel, all that SEO traffic is gone now 😅)&lt;/p&gt;
&lt;h3&gt;RSS feed&lt;/h3&gt;
&lt;p&gt;I used the official &lt;a href=&quot;https://github.com/withastro/astro/tree/main/packages/astro-rss&quot;&gt;&lt;code&gt;@astrojs/rss&lt;/code&gt;&lt;/a&gt; &lt;a href=&quot;https://docs.astro.build/en/guides/rss/&quot;&gt;package&lt;/a&gt; to replace the official RSS plugin in Gatsby.&lt;/p&gt;
&lt;p&gt;What I liked: lets you specify what goes into your RSS feed, &lt;em&gt;much more explicitly&lt;/em&gt; than Gatsby.&lt;/p&gt;
&lt;p&gt;Disliked: It’s up to you to a find a way to create the HTML that goes into the RSS feed. They’re essentially asking for a full markdown → HTML pipeline, and it doesn’t let you use the existing Astro config. It’s a pain but in a way it forces your code to be DRY.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As usual with these things, it’s been more work than I thought it would be, and I couldn’t have done it without &lt;a href=&quot;https://erika.florist/&quot;&gt;Erika&lt;/a&gt; helping me. But I’m happy that I’m now free from the React ecosystem, and I can update my components bit by bit.&lt;/p&gt;
&lt;p&gt;Thanks for reading, I hope that was useful.&lt;/p&gt;</content:encoded></item><item><title>2023 in Review</title><link>https://alvin.codes/writing/2023-in-review/</link><guid isPermaLink="true">https://alvin.codes/writing/2023-in-review/</guid><description>A varied year filled with many experiences.</description><pubDate>Sun, 31 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;What a crazy year it&apos;s been. No matter how much happens, I always end the year with a bit of regret, a feeling that I could have done more. Not this year. I did &lt;em&gt;a ton&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Lots of travelling&lt;/h2&gt;
&lt;p&gt;I did &quot;revenge travel&quot; just like everyone else. I was lucky that I could combine personal travel with work travel around conferences and other events. I visited places that I knew and loved, and discovered others that I want to return to again. The world is a wonderful place.&lt;/p&gt;
&lt;p&gt;To put it concretely, I did the math for you (and me). So, in 2023, I did&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✈️ 19 flights&lt;/li&gt;
&lt;li&gt;😐 17 airports&lt;/li&gt;
&lt;li&gt;🏙️ 11 cities&lt;/li&gt;
&lt;li&gt;🌐 8 countries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I definitely don&apos;t plan to do as much in 2024, but I still have a list of destinations that I would love to cross. I can&apos;t make any plans right now, unfortunately, but this will be a special year to look back on.&lt;/p&gt;
&lt;h2&gt;Best of&lt;/h2&gt;
&lt;p&gt;I like doing these compilations. It&apos;s a genuinely useful practice to think about the content you consume in general, and it forces me to do it over an entire year.&lt;/p&gt;
&lt;h3&gt;🎥 TV/Cinema&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Mandalorian, Season 3&lt;/strong&gt;. What an amazing show. I picked the second season for my best of the year in 2022, and the third is nearly flawless (apart from one weird episode that made no sense). The show keeps delivering, The Mandalorian has given us more Star Wars than Obi-Wan and Andor, combined. The last episodes always has me feeling something special, despite watching it multiple times.&lt;/p&gt;
&lt;h3&gt;🎙️ Songs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Devil &amp;#x26; I Got Up to Dance a Slow Dance — Charlie Wilson&lt;/strong&gt;. This is from the soundtrack of the Billie Holiday movie, which I picked last year. I heard it again this year but I can&apos;t figure out where. Anyway, it&apos;s grandiose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Tango Never Lies — &lt;a href=&quot;https://www.francesmadden.com&quot;&gt;Frances Madden&lt;/a&gt;&lt;/strong&gt;. I discovered this fantastic Australian artist in London. I walked by a venue where she was going to perform, unfortunately I wasn&apos;t there on the day, She&apos;s one of my best music discoveries this year.&lt;/p&gt;
&lt;h3&gt;Albums&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Come From Away (Original Broadway Cast Recording)&lt;/strong&gt;. One of the AirBnbs I stayed at had an Apple TV and I discovered this musical. It&apos;s so good!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lover (Live from Paris) by Taylor Swift&lt;/strong&gt;. It&apos;s 2023 so we can&apos;t not talk abut Taylor Swift, right? This is a live album from 2020, I don&apos;t know what happened in Paris that night, but the performance is stunning.&lt;/p&gt;
&lt;h3&gt;Podcasts&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Psychology in Seattle: &lt;a href=&quot;https://www.spreaker.com/episode/how-to-not-get-tricked-by-the-internet--19600538&quot;&gt;How not get tricked by the Internet&lt;/a&gt;&lt;/strong&gt;. This episode gives a great framework to detect bad stuff on the Internet, but it&apos;s a masterclass on critical thinking too. This will become more and more relevant as AI plays a bigger role in the fabric of the Internet. A must-listen.&lt;/p&gt;
&lt;h2&gt;Best Purchase&lt;/h2&gt;
&lt;p&gt;Laundry Sheets&lt;/p&gt;</content:encoded></item><item><title>18 months in DevRel</title><link>https://alvin.codes/writing/devrel-18-months/</link><guid isPermaLink="true">https://alvin.codes/writing/devrel-18-months/</guid><description>What I did during my last 6 months as a Developer Advocate at Contentful.</description><pubDate>Tue, 14 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It’s now been 18 months since I started at Contentful. I enjoy writing these recaps, if anything it makes my performance reviews a lot easier. Before I started, I remember wondering what the day-to-day of developer advocates looked like, so hopefully this helps others in that situation.&lt;/p&gt;
&lt;h2&gt;Hit the stage again&lt;/h2&gt;
&lt;p&gt;On 🎃 Halloween day this year, I went up on stage for the first time since 2020. I spoke about creating your own maps, and had lots of fun. I did some live audience participation with Partykit, used d3.js to generate a video, and talked about projections. In other words, it was a very “me” talk.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./manchester-tech-festival.jpeg&quot; alt=&quot;Me on stage&quot;&gt;&lt;/p&gt;
&lt;p&gt;I gave the talk at the Manchester Tech Festival, inside the beautiful building of the People’s Museum.&lt;/p&gt;
&lt;h2&gt;Community writing program&lt;/h2&gt;
&lt;p&gt;We wanted to increase the cadence of technical articles for the Contentful blog, so we started a community writing program.&lt;/p&gt;
&lt;p&gt;I was in charge of the beta version of the program. We had a lot of things to iron out from a legal, financial and logistical perspective, namely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Content ownership and rights waivers&lt;/li&gt;
&lt;li&gt;How to pay people in a way that worked for us and was expedient&lt;/li&gt;
&lt;li&gt;Create an submission process&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m glad I did it, if anything I’m now an expert at spotting GPT-written content.&lt;/p&gt;
&lt;p&gt;The network that I built over this year proved to be invaluable for this. I met &lt;a href=&quot;https://atila.io/&quot;&gt;Atila Fassina&lt;/a&gt; in React Norway, then reached out to him for the program, then he wrote an article about &lt;a href=&quot;https://www.contentful.com/blog/react-server-components-concepts-and-patterns/&quot;&gt;React server components&lt;/a&gt; that was a massive success.&lt;/p&gt;
&lt;h2&gt;Fun demos&lt;/h2&gt;
&lt;p&gt;For React Advanced London, I channelled my inner Matt Deslauriers and created a controlled generative art demo that the attendees built throughout the day when visiting our booth.&lt;/p&gt;
&lt;p&gt;It was fun, and totally out of left field for a CMS company. We used this demo again for our booth at CityJS Berlin and people loved it.&lt;/p&gt;
&lt;h2&gt;Events&lt;/h2&gt;
&lt;p&gt;This year’s conference season started fading away in mid-June, and then restarted in earnest in September and October (I was at a 3 conferences in 4 days at one point).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EY + Netlify Hackathon&lt;/strong&gt; &lt;br&gt;
I attended a hackathon at EY’s offices in London, in partnership with Netlify and Contentful. We used Edge Functions to do A/B testing and made everything configurable in Contentful. It was great to meet my fellow internet citizens &lt;a href=&quot;https://mk.gg/&quot;&gt;Matt&lt;/a&gt; and &lt;a href=&quot;https://hawksworx.com/&quot;&gt;Phil&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contentful Storylines&lt;/strong&gt; &lt;br&gt;
Harshil and I had a booth at the event in London, and I organised a meetup the day before. The meetup was small, but the talks were of highest quality, with speakers that normally come with a high fee. Special thanks to &lt;a href=&quot;https://thewriting.dev/&quot;&gt;Akash&lt;/a&gt;, &lt;a href=&quot;https://guild.host/&quot;&gt;Taz&lt;/a&gt;, and &lt;a href=&quot;https://www.linkedin.com/in/mesout/&quot;&gt;Josh&lt;/a&gt; for coming along.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uncodebar&lt;/strong&gt; &lt;br&gt;
As I mentioned before, starting the partnership with &lt;a href=&quot;https://codebar.io/&quot;&gt;codebar&lt;/a&gt; was one of the best things I did this year. We continued to work together, and I participated in 2 of their 3 unconferences, in London and Barcelona.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;React Advanced London&lt;/strong&gt; &lt;br&gt;
I ran a booth with &lt;a href=&quot;https://www.chaffe.dev/&quot;&gt;Shane&lt;/a&gt; and &lt;a href=&quot;https://justreflections.bhekani.com/&quot;&gt;Bhekani&lt;/a&gt;, we even had a brief appearance on stage to announce the winner of the giveaway.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Civo Navigate&lt;/strong&gt; &lt;br&gt;
I know nothing about DevOps, so Civo Navigate was particularly fascinating to me.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DevRelCon London&lt;/strong&gt; &lt;br&gt;
We took advantage of DevRelCon in London to bring myself, &lt;a href=&quot;https://harshil.dev&quot;&gt;Harshil&lt;/a&gt; and &lt;a href=&quot;https://musicalwebdev.com/&quot;&gt;Brittany&lt;/a&gt; together.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our DevRel team worked with an agency on some new swag designed for developers. It was a success. We hardly ever had leftovers, and one of the attendees at React London told us &quot;you guys have the best merch.&quot;&lt;/p&gt;
&lt;p&gt;All in all, busy time, but very fun and varied. I spent way more time coding away, thinking, experimenting, while still doing plenty of event work.&lt;/p&gt;</content:encoded></item><item><title>A year as a Developer Advocate</title><link>https://alvin.codes/writing/devrel-1-year/</link><guid isPermaLink="true">https://alvin.codes/writing/devrel-1-year/</guid><description>What I did during my second 6 months as a Developer Advocate.</description><pubDate>Tue, 13 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;In 525,600 minutes &lt;br&gt;
how do you measure a year in the life? &lt;br&gt;
— Jonathan Larson, &lt;strong&gt;Rent&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As of May 2023, I have been a developer advocate for an entire year! 🥳🎉&lt;/p&gt;
&lt;p&gt;I feel so lucky that I get to do this job. Some days I wish I&apos;d done it earlier, but then I don&apos;t because I wouldn&apos;t have it any other way. I love working in this team so much.&lt;/p&gt;
&lt;p&gt;Compared to &lt;a href=&quot;/writing/first-6-months-devrel&quot;&gt;my first 6 months&lt;/a&gt;, this period was more dominated by events. I enjoy the variety so far.&lt;/p&gt;
&lt;h2&gt;Events and sponsorship&lt;/h2&gt;
&lt;p&gt;Last year, the DevRel budget was part of the company&apos;s overall marketing budget. In 2023, the DevRel team had a dedicated budget solely under our control.&lt;/p&gt;
&lt;p&gt;I ended up helping with planning, selection and curation of our dev events for 2023. I spent more time doing this than I anticipated, and it was fun to see another side of the business and talk to organisers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./20230323_091207.jpg&quot; alt=&quot;Sponsorship wall&quot;&gt;&lt;/p&gt;
&lt;p&gt;Between the last update and my one year anniversary, these are the events that I took part in (more to come):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Codebar&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Contentful was the Gold Sponsor at this year’s &lt;a href=&quot;https://festival.codebar.io&quot;&gt;codebar Festival&lt;/a&gt; in London. The keynote was included in the sponsorship but we decided to give it away.&lt;/li&gt;
&lt;li&gt;We helped &lt;a href=&quot;https://codebar.io/paris&quot;&gt;codebar Paris&lt;/a&gt; find a recurring venue and covered food for their workshops with our friends from Algolia.&lt;/li&gt;
&lt;li&gt;Helping a non-profit and people getting into the industry is one of the most rewarding part of my job. I know it sounds cliché, but it&apos;s true.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WASM I/O&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I&apos;ve always been more of a “generalist / &lt;a href=&quot;https://stephanango.com/hybridize&quot;&gt;hybrid&lt;/a&gt;” developer, so I wanted us to get into atypical communities for a headless CMS. Or, as &lt;a href=&quot;https://harshil.dev&quot;&gt;Harshil&lt;/a&gt; puts it, &quot;go where people don&apos;t know us.&quot;&lt;/li&gt;
&lt;li&gt;The sponsorship was last-minute (my fault) but it turned out really well. I definitely want to partner with this conference again.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CityJS&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Harshil, myself and a few other Contentful folks had a booth at CityJS London. We gave away a giant lego set, met loads of people, including some that I&apos;m still in touch with to this day.&lt;/li&gt;
&lt;li&gt;You&apos;ll be seeing us at more CityJS Conferences. We&apos;ll be in Athens and Berlin. Come to see us!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contentful Meetups&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;As of my one-year anniversary, organisation is in full swing for our first Contentful meetup of the year. The event will be in Stockholm at &lt;a href=&quot;https://www.meetup.com/contentful-user-meetup-stockholm-1/events/293123047/&quot;&gt;Valtech’s beautiful courtyard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We’re planning another event in London which will coincide with the Contentful Storylines Tour. Come around!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also attended a bunch of great developer events in the US and Canada.&lt;/p&gt;
&lt;h2&gt;Content&lt;/h2&gt;
&lt;p&gt;I produced a fair amount of content too, and I&apos;m definitely finding my stride.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Podcasts&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I was a guest on 2 more podcasts, and one of the episodes I recorded back in December went live.&lt;/li&gt;
&lt;li&gt;I’m about to record 2 more episodes with my largest podcasts to date (Smashing Magazine!).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blog Posts&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;I helped review a &lt;a href=&quot;https://www.contentful.com/blog/api-endpoint/&quot;&gt;bunch&lt;/a&gt; of articles for the Contentful blog.&lt;/li&gt;
&lt;li&gt;I&apos;m currently writing a &lt;a href=&quot;https://www.contentful.com/blog/what-is-astro/&quot;&gt;big article about Astro&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Outside of work, my first article for Smashing Magazine was published in December. It&apos;s an intro to &lt;a href=&quot;https://www.smashingmagazine.com/2022/12/guide-command-line-data-manipulation-cli-miller/&quot;&gt;command-line data manipulation&lt;/a&gt; and I&apos;m super happy about it. It&apos;s niche and broad at the same time, and most importantly, evergreen.&lt;/p&gt;
&lt;h2&gt;12 days of Contentful&lt;/h2&gt;
&lt;p&gt;This was my personal initiative and I&apos;m so happy I got the support to launch it. It was a fun experiment and pretty much looks like an MVP.&lt;/p&gt;
&lt;p&gt;It gives us a good foundation for what to expect for Christmas 2023, if I&apos;m allowed near the website again.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./12-days.jpg&quot; alt=&quot;12 Days&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Less coding&lt;/h2&gt;
&lt;p&gt;At conferences, people often ask me why I decided to &quot;stop coding&quot; by doing DevRel. I was always surprised at that because I still write code, even if it&apos;s obviously less than regular developers.&lt;/p&gt;
&lt;p&gt;That said, apart from releasing a new code project nearly every day in December, it&apos;s true that I didn&apos;t do a lot of coding during the last 6 months.&lt;/p&gt;
&lt;h2&gt;What I learned&lt;/h2&gt;
&lt;p&gt;I learned a lot more than I can think of right now, especially around DevRel as a discipline.&lt;/p&gt;
&lt;h3&gt;Great design makes great content&lt;/h3&gt;
&lt;p&gt;It feels obvious but I think great design really makes developer content shine. All the design details that go in everything that Vercel launches or the Astro CLI make a massive difference.&lt;/p&gt;
&lt;h3&gt;Booths are a skill&lt;/h3&gt;
&lt;p&gt;I had to do conference booths both as an sponsor and as an attendee, and it&apos;s definitely a specific skill.&lt;/p&gt;</content:encoded></item><item><title>Friendly conference questions</title><link>https://alvin.codes/writing/conference-questions/</link><guid isPermaLink="true">https://alvin.codes/writing/conference-questions/</guid><description>How to use breakout discussions to make asking questions at conferences more friendly.</description><pubDate>Wed, 05 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nearly every time I attended a tech conference, either as a speaker or an attendee, questions felt a bit awkward. I once saw a solution that improves the experience for everyone. It would be great to see this replicated everywhere.&lt;/p&gt;
&lt;h2&gt;For the speaker&lt;/h2&gt;
&lt;p&gt;As a speaker, conference questions meant both fear and excitement.&lt;/p&gt;
&lt;p&gt;On one hand, I’m always excited about questions. Questions mean the audience is interested, and help me see what I didn’t articulate clearly, what people understood.&lt;/p&gt;
&lt;p&gt;On the other hand, there’s always a bit of stress. The feeling that there might be a guy in the audience who wants to use the Q&amp;#x26;A to show off. What happens is, that person will ask a trick question only to demonstrate their superior knowledge to the crowd.&lt;/p&gt;
&lt;p&gt;Now, not knowing all the answers is perfectly fine. Being a speaker only means your talk proposal was accepted, it doesn’t make you an expert. Still, it&apos;s not fun to get grilled in front of an entire amphitheatre.&lt;/p&gt;
&lt;h2&gt;For the audience&lt;/h2&gt;
&lt;p&gt;For attendees, questions often occurs in one of two ways. It can be either a staff member running around with a microphone to give to whoever was selected to ask a question. Or, in a more organised fashion, there’s a microphone on a stand and people queue to ask their questions.&lt;/p&gt;
&lt;p&gt;This can be problematic for attendees too. Most people aren’t used to hearing their voice in a microphone, and the feeling of 200 eyes looking at you is intimidating. Consequently, some audience members don’t speak.&lt;/p&gt;
&lt;h2&gt;The solution: Breakout discussions + online async&lt;/h2&gt;
&lt;p&gt;The solution that I saw at a few conferences: breakout discussions.&lt;/p&gt;
&lt;p&gt;Here’s how breakout discussions work (also called “discussion slots” or “discussion rooms”): After the talks, each speaker gets a corner of the room where people can ask their questions directly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This space for discussion happens during the break, so no one misses out on the next talk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For attendees&lt;/strong&gt;, the questions are less intimidating without the pressure of 200 people hearing them. Subsequent conversations flowed more naturally, and so did follow-ups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For speakers&lt;/strong&gt;, the experience is like a one-to-one conversation rather than one-to-many. Less stress about getting things wrong, mishearing or misunderstanding the question.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./breakout-discussions.inline.svg&quot; alt=&quot;Breakout discussions&quot;&gt;&lt;/p&gt;
&lt;p&gt;These informal breakout discussions create a casual, down-to-earth atmosphere where everyone is relaxed. If you’re an organiser, I’d encourage you to try this.&lt;/p&gt;
&lt;p&gt;For everyone else, have you seen other formats that make conference questions more friendly? If so, I’d be curious to hear it.&lt;/p&gt;
&lt;p&gt;Thank you to &lt;a href=&quot;https://harshil.dev/&quot;&gt;Harshil&lt;/a&gt; and &lt;a href=&quot;https://musicalwebdev.com/&quot;&gt;Brittany&lt;/a&gt; for reading drafts of this.&lt;/p&gt;</content:encoded></item><item><title>Privacy and security, quickly</title><link>https://alvin.codes/writing/privacy-security-quickly/</link><guid isPermaLink="true">https://alvin.codes/writing/privacy-security-quickly/</guid><description>A simple list of best practices for online privacy and security.</description><pubDate>Mon, 27 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A simple list of best practices for online privacy and security. Each item comes with an explanation and an immediate step you can take.&lt;/p&gt;
&lt;h2&gt;1 Password manager&lt;/h2&gt;
&lt;p&gt;The first, and most important: Use a password manager. &lt;a href=&quot;https://infosec.exchange/@epixoip/109585049354200263&quot;&gt;Don’t use LastPass&lt;/a&gt;. A password manager creates a unique password for your online accounts and helps manage your logins. For each website that you reuse a password on, the possibility of that password getting leaked and stolen increases. Password managers also monitor leaks and will try to tell you if one of your password is compromised.&lt;/p&gt;
&lt;p&gt;But why would someone hack me? What happens is people don’t hack &lt;em&gt;you.&lt;/em&gt; What happens is some database with unprotected passwords gets leaked, then hackers get the accounts, then they try the details on every service to see if it works. That’s why reusing passwords is a bad idea.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How&lt;/strong&gt;: Use &lt;a href=&quot;https://bitwarden.com/&quot;&gt;BitWarden&lt;/a&gt;, it’s free. Pay for it if you can, or use &lt;a href=&quot;https://1password.com/&quot;&gt;1Password&lt;/a&gt; (not version 8 though, it’s terrible).&lt;/p&gt;
&lt;h2&gt;2 Virtual debit cards&lt;/h2&gt;
&lt;p&gt;Virtual cards are temporary debit cards that you can use to pay online. You can have more than one associated with the same account. A virtual card has 2 main purposes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Security: Just like unique passwords, a virtual card protect the actual credit card details from being stolen. And the card can be deactivated more easily than a physical card.&lt;/li&gt;
&lt;li&gt;Subscriptions: Each virtual cards can have custom expiration dates. So if you want to watch a show on Apple TV and use the 7-day trial, you can create a virtual card that expires before the end of the trial. Then you won’t get charged accidentally if you forget to cancel.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;How&lt;/strong&gt;: Your bank might offer virtual cards, I know that &lt;a href=&quot;https://monzo.com/&quot;&gt;Monzo&lt;/a&gt; and &lt;a href=&quot;https://wise.com/&quot;&gt;Wise&lt;/a&gt; do it in the UK, as does &lt;a href=&quot;https://n26.com/&quot;&gt;N26&lt;/a&gt; in the EU and &lt;a href=&quot;https://privacy.com/&quot;&gt;privacy.com&lt;/a&gt; in the US.&lt;/p&gt;
&lt;h2&gt;3 Encrypt your hard drive&lt;/h2&gt;
&lt;p&gt;The quickest of the bunch. Encrypting your hard drive only takes a few minutes, but it ensures that someone can’t get access to the data on your computer if you lose it. On macOS, it’s under &lt;code&gt;Security &amp;#x26; Privacy&lt;/code&gt; → &lt;code&gt;FileVault&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;4 Get a VPN&lt;/h2&gt;
&lt;p&gt;A VPN is a software that routes all your Internet traffic through servers. A VPN encrypts your connection, masks your IP and protects your DNS. This is &lt;em&gt;essential&lt;/em&gt; for digital nomads and others who need to rely on public Wifi in coffee shops, hotels, airports, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How&lt;/strong&gt;: ⚠️ There’s a lot of scam in the VPN industry, be careful. I would only recommend &lt;a href=&quot;https://protonvpn.com/&quot;&gt;ProtonVPN&lt;/a&gt;, &lt;a href=&quot;https://mullvad.net/&quot;&gt;Mullvad&lt;/a&gt;, &lt;a href=&quot;https://www.ivpn.net/&quot;&gt;IVPN&lt;/a&gt;, and &lt;a href=&quot;https://vpn.mozilla.org/&quot;&gt;Mozilla VPN&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;5 Make backups&lt;/h2&gt;
&lt;p&gt;It’s annoying, I know. The cheapest way to make backups is to buy a physical hard drive and put 10 mins in your calendar every month to do it.&lt;/p&gt;
&lt;p&gt;Otherwise, you can use an encrypted cloud storage service like &lt;a href=&quot;https://www.sync.com/&quot;&gt;sync.com&lt;/a&gt;, &lt;a href=&quot;https://tresorit.com/&quot;&gt;Tresorit&lt;/a&gt;, or &lt;a href=&quot;https://protonmail.com/drive&quot;&gt;Proton Drive&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In general, if you spend a day or more working on an offline document (like a keynote presentation), it’s a good practice to back it up at the end of the day.&lt;/p&gt;
&lt;h2&gt;6 Use Signal&lt;/h2&gt;
&lt;p&gt;When you use Facebook messenger, or Instagram/snap DMs, your messages are stored in plain text (at least by default). Just like with passwords, sometimes a database is breached, and everyone’s data gets leaked. The solution is encrypted messaging.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How&lt;/strong&gt;: Encrypted messaging apps like &lt;a href=&quot;https://signal.org/&quot;&gt;Signal&lt;/a&gt;, &lt;a href=&quot;https://getsession.org/&quot;&gt;Session&lt;/a&gt;, and &lt;a href=&quot;https://www.whatsapp.com/&quot;&gt;WhatsApp&lt;/a&gt; encrypt your messages, meaning they can’t read them.&lt;/p&gt;
&lt;p&gt;These services don’t keep the messages either, so even if they got hacked no one could read them either. (Although WhatsApp does share &lt;a href=&quot;/writing/metadata&quot;&gt;metadata&lt;/a&gt; which is why I recommend Signal.)&lt;/p&gt;</content:encoded></item><item><title>L&amp;D budgets for web people</title><link>https://alvin.codes/writing/education-budget/</link><guid isPermaLink="true">https://alvin.codes/writing/education-budget/</guid><description>Some of us are lucky enough to work for companies that offer an “education stipend” as a benefit. Here are some tips to make the most of it.</description><pubDate>Thu, 26 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Some of us are lucky enough to work for companies that offer an “education stipend” as a benefit. Every employee gets a budget every year to spend on improving themselves, also called an L&amp;#x26;D (Learning and Development) budget.&lt;/p&gt;
&lt;p&gt;What usually happens is that all you do is “Eh, I&apos;ll get Pluralsight” but you just watch 3 videos in the year. Then, December arrives and you panic because you realise your budget is about to expire.&lt;/p&gt;
&lt;p&gt;I’ve been pretty good at getting value out of my budget last year so I’ll try to give you some tips to make the most of yours. This list will be updated.&lt;/p&gt;
&lt;h2&gt;1. Categories&lt;/h2&gt;
&lt;p&gt;Here are some common categories of products that you can use your education budget on&lt;/p&gt;
&lt;h3&gt;Yearly subscriptions&lt;/h3&gt;
&lt;p&gt;It’s easier for the accountants and for your manager to receive as few invoices as possible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/plus&quot;&gt;MDN Plus&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/&quot;&gt;Smashing Magazine&lt;/a&gt; (I wrote one article for the magazine but I&apos;m not affiliated).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.kobo.com/plus&quot;&gt;Kobo Plus&lt;/a&gt; if you can get it.&lt;/li&gt;
&lt;li&gt;Audiobooks. I’d use &lt;a href=&quot;http://Libro.fm&quot;&gt;Libro.fm&lt;/a&gt; (🇺🇸/🇨🇦) or &lt;a href=&quot;https://xigxag.co.uk/&quot;&gt;XigXag&lt;/a&gt; (🇬🇧, 🇪🇺) if possible.&lt;/li&gt;
&lt;li&gt;A language learning app like &lt;a href=&quot;https://www.babbel.com/&quot;&gt;Babbel&lt;/a&gt;, DuoLingo, etc&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Individual Books&lt;/h3&gt;
&lt;p&gt;There&apos;s a whole section with the &lt;a href=&quot;/reading&quot;&gt;books I read&lt;/a&gt; on this website, but here are a few books relevant to our industry.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.littleblackdatabook.com/&quot;&gt;The Little Black Book of Data&lt;/a&gt; by Kyle Taylor.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/printed-books/understanding-privacy/&quot;&gt;Understanding Privacy&lt;/a&gt; by Smashing Magazine.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rachelignotofskydesign.com/the-history-of-the-computer&quot;&gt;The History of the Computer&lt;/a&gt; by Rachel Ignotofsky.&lt;/li&gt;
&lt;li&gt;Anything from &lt;a href=&quot;https://abookapart.com/collections/books&quot;&gt;A Book Apart&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Anything from &lt;a href=&quot;https://www.oreilly.com/&quot;&gt;O&apos;Reilly&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. Example scenarios&lt;/h2&gt;
&lt;h3&gt;If your budget is $500/500€&lt;/h3&gt;
&lt;p&gt;Obviously, you do what you want! These are just ideas 😄&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Either&lt;/strong&gt;&lt;br&gt;
A national conference ($250-300) + travel ($100-150) + a subscription (~$100)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;or&lt;/strong&gt;&lt;br&gt;
A local conference ($250-300) + a workshop/one-day course ($100-150) + a subscription (~$100)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;or&lt;/strong&gt;&lt;br&gt;
A virtual conference ($100) + a workshop/one-day course ($100-150) + a subscription (~$100) + books ($100)&lt;/p&gt;
&lt;h3&gt;If your budget is $1000/1000€&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Either&lt;/strong&gt;&lt;br&gt;
An international conference ($500-600) + travel ($300-400) + a subscription (~$100)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;or&lt;/strong&gt;&lt;br&gt;
A national conference ($250-300) + travel ($100-150) + a workshop ($100-150) + one-day course ($100-150) + 2 subscriptions (~$200) + whatever’s left on books.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;or&lt;/strong&gt;&lt;br&gt;
A virtual conference ($100) + a workshop/one-day course ($100-150) + 2 subscriptions + books ($100)&lt;/p&gt;
&lt;p&gt;You get the idea! I could go on but it’s &lt;em&gt;your budget&lt;/em&gt; at the end of the day, so it’s up to you.&lt;/p&gt;</content:encoded></item><item><title>2022 in Review</title><link>https://alvin.codes/writing/2022-in-review/</link><guid isPermaLink="true">https://alvin.codes/writing/2022-in-review/</guid><description>A year of highs and lows</description><pubDate>Sat, 31 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;What a year!&lt;/p&gt;
&lt;p&gt;The previous year was exhausting. We moved house 4 times, while expectations about the future kept changing. Everything looked promising, then it didn&apos;t. 2022 was different. Tiring too, but different.&lt;/p&gt;
&lt;h2&gt;A year of highs and lows&lt;/h2&gt;
&lt;p&gt;2022 was a year with lots of fun. I&apos;m still part of the Covid cautious crew, but it was a year of &lt;a href=&quot;/writing/first-6-months-devrel#events&quot;&gt;travel&lt;/a&gt;, seeing old friends, meeting new faces, and discovery. This year was also the first time I had a health scare. Like the previous 2 years weren&apos;t enough, I learned again that health truly is paramount. I&apos;m lucky that I can still count on the EU healthcare system, because good luck with that in the UK. Healthcare there has been defunded and run to the ground.&lt;/p&gt;
&lt;p&gt;I left a fantastic job at Dow Jones/The Wall Street Journal in the spring because I needed time off from the previous 2 years. I took time off, and went on a road trip. At the same time, &lt;a href=&quot;/writing/developer-advocate-journey&quot;&gt;my job search came to fruition&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Overall, apart from the health problems, this was a memorable year. My goal for next year to have as much fun as this year.&lt;/p&gt;
&lt;h2&gt;Best of&lt;/h2&gt;
&lt;p&gt;Continuing the tradtion, here we go.&lt;/p&gt;
&lt;h3&gt;🎥 TV/Cinema&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Jesus Christ Superstar (Musical)&lt;/strong&gt;. With Jon Legend and Sara Bareilles. What a show! The intro is one of the most rock&apos;n&apos;roll things I had seen in a while.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Billions, season 6&lt;/strong&gt;. I loved season 6. It wasn&apos;t as strong as season 2-4, but what can I say, it&apos;s my favourite TV show. I feel like you could tell that the original writers were working on another show at the same time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The United States vs. Billie Holiday&lt;/strong&gt; A brilliant movie from Johann Hari and Spike Lee. It&apos;s not a fun watch, but it talks about important subjects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taylor Swift: Miss Americana (Netflix)&lt;/strong&gt; This documentary has changed my perspective on Taylor Swift. I was stuck on the stereotype that the media had decided for me and it was so wrong. She&apos;s been at the top for this long, for a reason.&lt;/p&gt;
&lt;h3&gt;Albums&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Hadestown (Original Broadway Cast Recording)&lt;/strong&gt;: One of my favourite musical albums of all time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Great Irish Songbook by Dervish&lt;/strong&gt;: A great album of &lt;a href=&quot;/books/best-loved-irish-ballads&quot;&gt;irish folk songs&lt;/a&gt; with a different artist for every song.&lt;/p&gt;
&lt;h3&gt;🎙️ Songs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Move on by Jake Gyllenhaal (from Sunday in the Park)&lt;/strong&gt;. Superb performance, Jake Gyllenhaal really can sing, but AnnaLeigh Ashford smashes it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Better days by Dermot Kennedy&lt;/strong&gt;. Dermot Kennedy is a world-class singer, and this is my favourite song. Check out the acoustic version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Single City by Michael Mott (feat Lauren Allred)&lt;/strong&gt;. I&apos;ve been impressed by Lauren Allred since hearing her on &lt;a href=&quot;/writing/2018-in-review#cinema&quot;&gt;The Greatest Showman&lt;/a&gt;. This is a beautiful piano ballad about NYC that anyone who lived in a major city can relate to.&lt;/p&gt;
&lt;h3&gt;Podcast&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Plain English — Why Are Teenagers So Sad and Anxious?&lt;/strong&gt;: Explores the consequences of social media, and other recent changes we experienced in the modern world. &lt;a href=&quot;https://www.theringer.com/2022/4/22/23036468/why-are-american-teenagers-so-sad-and-anxious&quot;&gt;Listen here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strong songs: Wedding Song (Hadestown)&lt;/strong&gt;: The episode that kickstarted my deep dive into musicals this year. &lt;a href=&quot;https://strongsongspodcast.com/episode/wedding-song-from-hadestown&quot;&gt;Listen here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Basic Folk: Anais Mitchell&lt;/strong&gt;: Discovered another fun music podcast, the host is fantastic. The episode is with the writer of Hadestown. &lt;a href=&quot;https://basicfolk.com/basic-folk-152-anais-mitchell-track-x-track/&quot;&gt;Listen here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Joe Rogan and The Ethics of Apology — Making Sense&lt;/strong&gt;: An interesting question about the ethics of the Internet.&lt;/p&gt;
&lt;h2&gt;Best Purchase&lt;/h2&gt;
&lt;p&gt;A CASIO CDP-S100 digital piano. I&apos;m still playing 4-chord songs, but I had so much fun with it. It allowed me to learn so much about music in general.&lt;/p&gt;
&lt;h2&gt;Resolutions&lt;/h2&gt;
&lt;p&gt;Experience more of life, it&apos;s pretty good.&lt;br&gt;
Replace &quot;but&quot; with &quot;and&quot;&lt;/p&gt;</content:encoded></item><item><title>My first 6 months as a Developer Advocate</title><link>https://alvin.codes/writing/first-6-months-devrel/</link><guid isPermaLink="true">https://alvin.codes/writing/first-6-months-devrel/</guid><description>I’ve been a developer advocate full-time at Contentful for 6 months. I feel extremely fortunate. I love this job so much. There’s an unsaid tradition to write a blog post when you cross the 6-month milestone, so here we go.</description><pubDate>Wed, 07 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been a developer advocate full-time at Contentful for 6 months. I feel extremely fortunate. I love this job so much. There’s an unsaid tradition to write a blog post when you cross the 6-month milestone, so here we go.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toc&quot;&gt;from-heading: 1
to-heading: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;What’s a developer advocate?&lt;/h2&gt;
&lt;p&gt;As a Developer Advocate your job is to raise awareness and create a positive image of a brand/product with developers. Concretely, you do that by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creating educational content that helps developers (tutorials, demo apps, podcasts, open source projects, etc) often featuring said product/brand/API, but not always.&lt;/li&gt;
&lt;li&gt;Taking part in developer community events in the largest sense, where you can meet your customers and understand their problems.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What&apos;s the difference between a developer advocate and …&lt;/h2&gt;
&lt;p&gt;A Developer Experience Engineer? A Developer Relations engineer? (ahem) A Developer Evangelist?&lt;/p&gt;
&lt;p&gt;It’s all the same job. Or not, it depends on the company. There are real semantic differences, Developer Experience is often focused on tooling, but in practice I saw offers with many titles for the exact same job.&lt;/p&gt;
&lt;p&gt;Now onto the fun bit, here&apos;s what I&apos;ve been up to for my first 6 months.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;#CascadiaJS group shot!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;— Tiger Oakes (@Not_Woods) &lt;a href=&quot;https://twitter.com/Not_Woods/status/1565133317829455872&quot;&gt;September 1, 2022&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;What I did&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Blog posts
&lt;ul&gt;
&lt;li&gt;Wrote 2 articles for the Contentful blog. An &lt;a href=&quot;https://www.contentful.com/blog/2022/06/28/alvin-bryan-joins-the-contentful-developer-relations-team/&quot;&gt;intro&lt;/a&gt; post and another one &lt;a href=&quot;https://www.contentful.com/blog/create-bot-rss-webhooks-mastodon-twitter-alternative/&quot;&gt;about Mastodon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Edited/provided tech review on &lt;a href=&quot;https://www.contentful.com/blog/deserializing-json-in-swift-5-and-contentful/&quot;&gt;various&lt;/a&gt; articles&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Created 2 turnkey technology starter repos for:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.contentful.com/react-tutorial/&quot;&gt;React + Contentful&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.contentful.com/sveltekit-starter-guide/&quot;&gt;Sveltekit + Contentful&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Met my colleague &lt;a href=&quot;https://harshil.dev/&quot;&gt;Harshil&lt;/a&gt; in London and my manager Jen in Seattle. Our whole team met in London for the first time in October&lt;/li&gt;
&lt;li&gt;I was a guest on &lt;a href=&quot;/speaking&quot;&gt;2 podcasts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Attended developer events in London and &lt;a href=&quot;https://2022.cascadiajs.com/&quot;&gt;CascadiaJS&lt;/a&gt; in Oregon&lt;/li&gt;
&lt;li&gt;Organised the first IRL &lt;a href=&quot;https://beta.guild.host/events/contentful-london-developer-qcysws&quot;&gt;Contentful Developer Meetup&lt;/a&gt; since 2019 in London
&lt;ul&gt;
&lt;li&gt;Found a venue and arranged the logistics around it&lt;/li&gt;
&lt;li&gt;Reached out to speakers for talks&lt;/li&gt;
&lt;li&gt;Tried my best to make sure my US colleagues had a nice time&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Made an interactive version of a diary from 1887 with Sveltekit, MapLibre, and Contentful: &lt;a href=&quot;https://rtw.voyage/&quot;&gt;https://rtw.voyage/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;The company&lt;/h3&gt;
&lt;p&gt;After 6 months, I feel like I identify with both Contentful and its audience.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The company was founded by 2 devs. And they both want Contentful employees to have a good time. Sasha (co-founder, COO) remembers dragging his feet to an office, and doesn’t want that for us.&lt;/li&gt;
&lt;li&gt;Contentful is a remote-first startup with more than &lt;strong&gt;750 people&lt;/strong&gt; from &lt;strong&gt;70+ nations&lt;/strong&gt; distributed around the world. As an expat, I’m among friends.&lt;/li&gt;
&lt;li&gt;The audience is mainly front-end engineers like me.&lt;/li&gt;
&lt;li&gt;I love working as part of the Developer Relations team. We’re all aligned on our mission to help developers. We all understand and appreciate everyone’s ways of working. And we’re all fans of musical theatre 💃. &lt;a href=&quot;https://www.stefanjudis.com/&quot;&gt;Stefan&lt;/a&gt; did a fantastic job hiring us.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Happy Halloween y&apos;all 🎃&lt;/p&gt;
&lt;p&gt;From the &lt;a href=&quot;https://twitter.com/contentful&quot;&gt;@contentful&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/DevRel&quot;&gt;#DevRel&lt;/a&gt; team &lt;a href=&quot;https://twitter.com/Gamergrrl99&quot;&gt;@Gamergrrl99&lt;/a&gt; &lt;a href=&quot;https://twitter.com/musicalwebdev&quot;&gt;@musicalwebdev&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hola_alvin&quot;&gt;@hola_alvin&lt;/a&gt; &lt;a href=&quot;https://twitter.com/harshil1712&quot;&gt;@harshil1712&lt;/a&gt; and me!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./halloween-contentful-zoom.png&quot; alt=&quot;The Contentful Developer Advocacy team&quot;&gt;&lt;/p&gt;
&lt;p&gt;— Jen Sable Lopez (@jennita) &lt;a href=&quot;https://twitter.com/jennita/status/1587116255844397056&quot;&gt;October 31, 2022&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;What I learned and what surprised me&lt;/h2&gt;
&lt;h3&gt;The importance of the right product&lt;/h3&gt;
&lt;p&gt;I got lucky with Contentful. When I was researching developer advocacy, one advice I found online was to find the right product. This is so true.&lt;/p&gt;
&lt;p&gt;As a DevRel, you’ll be immersed in your product. You’ll be using it and talking about it all the time. That’s what developer advocacy is. Critically, you’ll be thinking about &lt;strong&gt;&lt;em&gt;problems in the adjacent domain&lt;/em&gt;&lt;/strong&gt; of your product.&lt;/p&gt;
&lt;p&gt;The good thing is, all sorts of companies need developer advocates. It’s still staggering to me how many software developers and companies there are. The bad thing is, companies vary greatly in terms of size and target audience. For example, a DevRel at Unity (game engine) and Cisco (networking) will have the same job title, but completely different audience demographics.&lt;/p&gt;
&lt;h3&gt;Lots of trust and autonomy&lt;/h3&gt;
&lt;p&gt;As Developer Advocates at Contentful, we have a lot more trust than I anticipated. If I had the same level of autonomy with a product and a target audience that I didn’t understand as much, it would have been harder. Maybe a bit demotivating? Again, this highlights the importance of finding the right product for a first developer advocate role.&lt;/p&gt;
&lt;h2&gt;Events&lt;/h2&gt;
&lt;p&gt;Since spring 2022, conferences have been back in person. There were a lot of them. Public speaking is what DevRel is known for, and what attracts many to the job. I love travelling like everyone else, but doing talks was never the main motivation for me.&lt;/p&gt;
&lt;h3&gt;Events and the C word (Covid)&lt;/h3&gt;
&lt;p&gt;I&apos;m not hiding that I&apos;m one of those “Covid cautious” people. I still wear a mask when indoors and surrounded by strangers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s so true, so many people are coming back with Covid from conferences. It&apos;s really unfortunate. — &lt;a href=&quot;https://www.svelteradio.com/episodes/the-svelte-documentary-is-out&quot;&gt;Svelte Radio, Episode 47&lt;/a&gt;, about 21:52&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Seeing that a few people caught Covid in conferences in 2021, I mentioned early on in the &lt;a href=&quot;/writing/developer-advocate-journey&quot;&gt;application process&lt;/a&gt; that in-person events were probably a “no.” I wanted to be upfront about this. Most companies I talked to said that wasn&apos;t a problem. Still, I realise that I’m extremely lucky to be part of a team that accepts this.&lt;/p&gt;
&lt;p&gt;Despite that, I still went to events. It was incredible.&lt;/p&gt;
&lt;p&gt;I met with a lot of people in-person (outdoors) during the conference season. I got the chance to hang out with those that I admire (Anjana, Tejas, Swyx, and Charlie) and meet many more (like my favourite Canadians).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Plus photos&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./cascadiaJS_photo.jpeg&quot; alt=&quot;Conference attendees standing in front of a venue on a sunny day&quot;&gt;&lt;/p&gt;
&lt;p&gt;— Tiger Oakes (@Not_Woods) &lt;a href=&quot;https://twitter.com/Not_Woods/status/1565133527158767616&quot;&gt;September 1, 2022&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’m so excited for the initiatives we have in store for 2023. We have &lt;a href=&quot;https://ctfl-devrel-12-days.netlify.app/&quot;&gt;one last project for 2022&lt;/a&gt; to go out with a bang.&lt;/p&gt;
&lt;p&gt;Onwards for another 6 months!&lt;/p&gt;</content:encoded></item><item><title>How I became a developer advocate</title><link>https://alvin.codes/writing/developer-advocate-journey/</link><guid isPermaLink="true">https://alvin.codes/writing/developer-advocate-journey/</guid><description>When I meet developers, “How did you become a developer advocate?” is the question that I get asked the most. This is the long answer.</description><pubDate>Tue, 15 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When I meet developers, “How did you become a developer advocate?” is the question that I get asked the most. The short answer is “well, I applied 😄,” and the long answer is this article.&lt;/p&gt;
&lt;p&gt;Before I go on, because this is the Internet, this just a recap of how it worked out for me.&lt;/p&gt;
&lt;p&gt;From this point on, I’ll use the terms “DevRel” and “developer advocate” interchangeably.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toc&quot;&gt;from-heading: 1
to-heading: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1. Leaving a great job&lt;/h2&gt;
&lt;p&gt;Before I started applying, my day job was at Dow Jones, the company that owns The Wall Street Journal, MarketWatch and originally created the stock market index (DJI). I was a Lead Engineer on one of the internal editorial tools. For anyone interested in DataViz, working there is huge.&lt;/p&gt;
&lt;p&gt;On top of the prestige associated with the organisation, my team (the Editorial Tools team) was incredible. They took a chance on me as a lead. They allowed me to step up and be in charge of a product, and I was the only team member based in Europe. I am so thankful to my manager, and every one of my colleagues.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./wsj-office.jpg&quot; alt=&quot;The WSJ&amp;#x27;s office in NYC&quot; title=&quot;The entrance to the WSJ&amp;#x27;s office in NYC, that unfortunately I never went to. [Source](https://www.flickr.com/photos/johngonefishing/32745943965)&quot;&gt;&lt;/p&gt;
&lt;p&gt;I wholeheartedly recommend Dow Jones as a place to work. As a company that was office-only before the pandemic, they adapted to remote work very well.&lt;/p&gt;
&lt;p&gt;How do you leave a job like this? By spring 2022, I really started feeling the toll of the previous 2 years. I knew I had it easy as a remote worker but this didn&apos;t make the news cycle irrelevant either.&lt;/p&gt;
&lt;p&gt;I started feeling the first symptoms of burnout, and my team and manager supported me fully.&lt;/p&gt;
&lt;h2&gt;2. The decision to get into DevRel&lt;/h2&gt;
&lt;p&gt;I wanted to rest after an intense period, so I only looked for part-time jobs. Developer Relations wasn&apos;t a priority, even if the career path had been brewing in my mind for a while. Then I saw a job ad from a company that I loved.&lt;/p&gt;
&lt;p&gt;This company was hiring a Developer Advocate to work remotely from anywhere in the world, and &lt;strong&gt;part-time&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I poured my heart and soul into a cover letter. One of my best friends even said something like “I never cared about a job enough to write a letter like this.”&lt;/p&gt;
&lt;p&gt;I applied, it didn’t work out, but decided to continue.&lt;/p&gt;
&lt;h2&gt;3. Finding suitable companies&lt;/h2&gt;
&lt;p&gt;Back in the glorious days of 2021, a lot of developer startups had raised a lot of money.&lt;/p&gt;
&lt;p&gt;Many companies were thinking “Right, we got $5 million in a seed round, let&apos;s go!” And want to hire a DevRel. There were a lot of developer advocate jobs, so finding ads wasn’t difficult. As someone new to developer advocacy, I had to think hard about the right company &lt;em&gt;for me&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I realised that I didn’t want to be &lt;em&gt;the first Developer Advocate&lt;/em&gt; at a company.&lt;/p&gt;
&lt;p&gt;I didn’t want that for the following reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;You have to set up everything&lt;/strong&gt;. All the metrics, how you measure things, what success looks like to leadership, etc. I had experience on the execution side, not the management side.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Work-life balance&lt;/strong&gt;. In DevRel, we talk about the 3 Cs: Code, Content, and Community. If you&apos;re the first developer advocate, these 3 things are your job, and they can easily turn into 3 full-time jobs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus&lt;/strong&gt;. I don&apos;t like juggling tons of things at the same time.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So, I was looking for a company with an established DevRel function.&lt;/p&gt;
&lt;h2&gt;4. The application process&lt;/h2&gt;
&lt;p&gt;My job search happened during the fully-remote, post-2020 tech market. The future of work looked bright. The market was &lt;em&gt;hot,&lt;/em&gt; nothing like the economic recession we’re in now. With the criteria from step 3 in mind, I applied to a few places.&lt;/p&gt;
&lt;p&gt;I did 17 interviews in total with various companies until I accepted the offer from Contentful. The variety of people that I got to meet during these interviews was incredible. My interviewers tuned it from Ireland, Germany, Kenya, France, Canada, the US (including Hawaii) and the UK.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./spiral.inline.svg&quot; alt=&quot;spiral chart&quot;&gt;&lt;/p&gt;
&lt;p&gt;Contentful started off with a great first impression.&lt;/p&gt;
&lt;p&gt;I saw the job on a Saturday morning, didn’t want to apply during the weekend so I applied on Monday. The &lt;em&gt;next morning&lt;/em&gt;, &lt;a href=&quot;https://www.linkedin.com/in/andreea-tilvan/&quot;&gt;Andreea&lt;/a&gt; sent me a calendar link to schedule a screening call, less than 24 hours after I applied.&lt;/p&gt;
&lt;p&gt;To this day, this is still the fastest HR response I ever received. The rest of the hiring process was smooth sailing. I was hired straight after my panel interview, which had never happened to me before either. Andreea was also the first person from Contentful that I ever met in person.&lt;/p&gt;
&lt;p&gt;I did 5 interviews on average per application.&lt;/p&gt;
&lt;h2&gt;Advice to companies looking for developer advocates&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Stop saying “remote” when you mean “US, remote”&lt;/strong&gt; &lt;br&gt;
There’s a whole world out there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don’t ask people to work for free&lt;/strong&gt; &lt;br&gt;
For one of my applications, I was asked to analyse the current DevRel strategy and propose initiatives/solutions. It felt like working for free and it wasn&apos;t nice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask people to show off&lt;/strong&gt; &lt;br&gt;
&quot;Show us something you&apos;ve built that you like&quot; is the best way to conduct a panel interview. A few companies did this, and it was great for both parties.&lt;/p&gt;</content:encoded></item><item><title>Tips to remember latitude and longitude</title><link>https://alvin.codes/writing/latitude-longitude/</link><guid isPermaLink="true">https://alvin.codes/writing/latitude-longitude/</guid><description>I like coding maps, but would always mix up latitude and longitude. I came up with some tips to remember them.</description><pubDate>Sun, 16 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;We&apos;re just two lost souls&lt;br&gt;
swimming in a fishbowl&lt;br&gt;
— Pink Floyd, &lt;strong&gt;Wish You Were Here&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I like coding maps, but I would always mix up latitude and longitude. I tried the mnemonics (like, latitudes = ladder) but none of them ever worked.&lt;/p&gt;
&lt;p&gt;Here are a couple of tips to remember latitude and longitude.&lt;/p&gt;
&lt;h2&gt;1. X/Y coordinates&lt;/h2&gt;
&lt;p&gt;Tip #1: The simplest, but not the easiest, is to memorise this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latitude is y and longitude is x.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./map-x-y.inline.svg&quot; alt=&quot;On a map latitude is the y axis and longitude is the x axis.&quot;&gt;&lt;/p&gt;
&lt;p&gt;That’s it, Latitude is the y axis and longitude is the x axis.&lt;/p&gt;
&lt;p&gt;I tried that but would still mix them up at times. So I came up with the next tip.&lt;/p&gt;
&lt;h2&gt;2. The long side of a world map&lt;/h2&gt;
&lt;p&gt;Tip #2: If you think of a world map, usually it’s a rectangle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &lt;em&gt;long&lt;/em&gt; side (the largest side) is the longitude.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./map-longitude.inline.svg&quot; alt=&quot;The long side is longitude&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Orientation&lt;/h2&gt;
&lt;p&gt;The point at 0,0 is the intersection of the Equator and the Meridian of Greenwich. The greater the distance to them, the greater the latitude/longitude. East of the meridian gives you a positive longitude value, and west gives you a negative one. Same for north/south of the Equator.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For example&lt;/strong&gt;: &lt;br&gt;
Prague has a larger longitude (14.43) than Paris (2.35) because it&apos;s further east. The same goes for negative values going west. San Francisco has a larger longitude (-122) than Washington, D.C. (-77) because it&apos;s further west.&lt;/p&gt;
&lt;p&gt;The word &quot;parallels&quot; is also used to describe the lines of latitude. In Canada, the expression &quot;north of 60th&quot; refers to the northern territories.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./lat-long-orientation.inline.svg&quot; alt=&quot;orientation&quot;&gt;&lt;/p&gt;
&lt;p&gt;Here are the rounded coordinates (in the order latitude, longitude) of some popular cities to help you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;London&lt;/strong&gt;: 51.501, -0.118 (Greenwich is in London, hence the zero longitude)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sydney&lt;/strong&gt;: -33.865, 151.210&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokyo&lt;/strong&gt;: 35.653, 139.839&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Singapore&lt;/strong&gt;: 1.290, 103.852&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Los Angeles&lt;/strong&gt;: 34.052, -118.244&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oslo&lt;/strong&gt;: 59.911, 10.758&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🇬🇧 A fun fact for people in the UK, Edinburgh&apos;s main train station is &lt;em&gt;further west&lt;/em&gt; (55.95, -3.18) than Liverpool&apos;s (53.40, -2.97).&lt;/p&gt;
&lt;p&gt;I hope it helps, good luck!&lt;/p&gt;</content:encoded></item><item><title>Layoffs</title><link>https://alvin.codes/writing/layoffs/</link><guid isPermaLink="true">https://alvin.codes/writing/layoffs/</guid><description>My past layoff, what I wish I knew, and some tips if you&apos;ve been laid off too.</description><pubDate>Fri, 30 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s summer 2022, there are huge rounds of layoffs all across the tech industry. I know the feeling, I&apos;ve been laid off too. Here’s how it happened to me a few years ago, and what I wish I knew.&lt;/p&gt;
&lt;h2&gt;My past layoff&lt;/h2&gt;
&lt;p&gt;My layoff happened a few years ago. I&apos;m deliberately keeping the details vague.&lt;/p&gt;
&lt;p&gt;On a Friday afternoon, my manager sent me a meeting invitation for Monday, at 10am. I thought “Oh that’s weird” but didn’t think of it afterwards.&lt;/p&gt;
&lt;p&gt;On Monday, I turned up and… someone from HR was in the meeting. I instantly knew.&lt;/p&gt;
&lt;p&gt;I remember saying “Oh... Is this bad news?”&lt;/p&gt;
&lt;p&gt;“Yes, I’m afraid so…” My manager said.&lt;br&gt;
“Is it just me?”&lt;br&gt;
“No…”&lt;/p&gt;
&lt;p&gt;I was told that I was let go, along with other people in my department. My manager was explicit that &lt;strong&gt;I did nothing wrong&lt;/strong&gt;. He received an email out of the blue from his manager saying “these people will lose their jobs.” So my conscience was clear. (Sometimes, managers &lt;em&gt;have to choose&lt;/em&gt; who will be laid off, horrible stuff.)&lt;/p&gt;
&lt;p&gt;After that, I received messages from others who were affected. One of us even saw it coming. Later, the wider team met, and we shared the news.&lt;/p&gt;
&lt;p&gt;It sent a shock to my system that still reverberates to this day.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I wasn’t prepared for this layoff&lt;/strong&gt;. When it happened, for the first time in my career, the thought of changing jobs felt distant.&lt;/p&gt;
&lt;h2&gt;Taboos and Shame&lt;/h2&gt;
&lt;p&gt;I’ve heard some people feel a strong sense of shame when they get laid off. Probably a side effect of attaching too much of your self-worth to your profession. I’m lucky that &lt;strong&gt;I never felt ashamed&lt;/strong&gt;. It&apos;s largely due to how my layoff worked out. It wasn&apos;t &lt;em&gt;only me&lt;/em&gt; who got let go, otherwise I would have felt differently.&lt;/p&gt;
&lt;p&gt;There&apos;s this massive taboo about looking at other jobs while having one. It kinda feels like installing Tinder while you&apos;re with someone. “I love my job, why would I even think about applying elsewhere?” was my line of thinking. So here’s the painful lesson that I had to learn:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Always have an exit strategy.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Exit strategy&lt;/h2&gt;
&lt;p&gt;From this point on, I’ve always had an exit strategy. Here are a few questions to help you with yours. It’s what I wish someone had told me before I got laid off.&lt;/p&gt;
&lt;h3&gt;1. Can you send an updated CV to someone tomorrow?&lt;/h3&gt;
&lt;p&gt;This is a better recommendation than “always have an up to date CV.” Realistically if you’re happy in a job, you won’t always think of that. However, you should be able to send your CV to someone today or tomorrow. That means:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You know where your CV is&lt;/li&gt;
&lt;li&gt;It’s in a file format that you can open&lt;/li&gt;
&lt;li&gt;It will take you less than an hour to update&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;None of these were true for me when I got the call.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;2. Online presence&lt;/h3&gt;
&lt;p&gt;Make sure your online presence is or can be updated. In other words create the accounts, or buy the domains, right now.&lt;/p&gt;
&lt;p&gt;For devs and designers: How’s your website? Does it have 4 blog articles from 2017 on it?&lt;/p&gt;
&lt;p&gt;For everyone else, how’s your LinkedIn? If you don’t have one, it’s not too late.&lt;/p&gt;
&lt;h3&gt;3. Have a list of companies&lt;/h3&gt;
&lt;p&gt;Every time you see a company that looks cool to you, add them in a note somewhere. In the frenzy of the layoff, you probably won’t think of every place you could apply to.&lt;/p&gt;
&lt;p&gt;The more specialised you are, the more important this is.&lt;/p&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;p&gt;So, now what?&lt;/p&gt;
&lt;h3&gt;If there are many of you, organise&lt;/h3&gt;
&lt;p&gt;Losing contact with a social group that you spend 8 hours with can be isolating. If several people are also let go, keep in touch and organise.&lt;/p&gt;
&lt;p&gt;There are successful precedents. In 2016, the SEO company Moz laid off 60 employees. The workers made a website and took to twitter with #HireMoz, and some companies responded. In 2022, when Shopify laid off more than 1000 people, the former employees also made &lt;a href=&quot;https://weworkedatshop.com/&quot;&gt;a website&lt;/a&gt; with a directory and (soon) a job board.&lt;/p&gt;
&lt;h3&gt;Take control&lt;/h3&gt;
&lt;p&gt;A layoff is a business decision that was inflicted upon you. Make sure this is clear in your mind, and take control of the narrative. Announce your layoff on social media, get ready to talk about it.&lt;/p&gt;
&lt;p&gt;For example:
“Yeah so I guess, you know, I&apos;m no longer working from [startup x] where I used to work for 2 years. Yeah, it was a layoff.”&lt;/p&gt;
&lt;p&gt;vs
”Myself, along with 100 other people were laid off because of bad cash flow. I’m now looking for an opportunity in [job type]”&lt;/p&gt;
&lt;p&gt;The 2nd one will land way better in an interview. And it will help you mentally.&lt;/p&gt;
&lt;h3&gt;Take it easy&lt;/h3&gt;
&lt;p&gt;A job change is significant. Your job represents many hours of your day, and a big proportion of your social interactions. Your friends know it, your family knows it. Then, it all disappears.&lt;/p&gt;
&lt;p&gt;Take it easy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set fixed hours to apply. This depends on what works best for you. If applying on Sunday nights make you less fearful of the week ahead, then go for it.&lt;/li&gt;
&lt;li&gt;Talk to friends. The upside is you now have more time on your hands. Call that friend that you always meant to call. Don’t talk about the layoff, talk about your life, their life, movies, whatever.&lt;/li&gt;
&lt;li&gt;Understand that it might take a while.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s it! I will remember my first layoff for the rest of my life. It won’t be easy but there’s light at the end of the tunnel. Good luck!&lt;/p&gt;</content:encoded></item><item><title>Learning to code in time of crisis</title><link>https://alvin.codes/writing/learning-to-code/</link><guid isPermaLink="true">https://alvin.codes/writing/learning-to-code/</guid><description>Whether you’ve been laid off, struggling to make ends meet with the crazy inflation or dissatisfied with your current job, you may have wondered: Could I work in tech?</description><pubDate>Sat, 13 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I wrote the first draft of this article in March 2020. Today, 2 years later we’re in another &quot;unprecedented&quot; economic crisis, again.&lt;/p&gt;
&lt;p&gt;Whether you’ve been laid off, struggling to make ends meet with the crazy inflation or dissatisfied with your current situation, you may have wondered: Could I work in tech?&lt;/p&gt;
&lt;p&gt;The good news is: You can, and it’s free or low cost. I can&apos;t say that of many career paths.&lt;br&gt;
The bad news is: It might take a while because the economy is upside town.&lt;/p&gt;
&lt;p&gt;But it&apos;s possible, and you&apos;re not alone! As much as you think your case is unusual, plenty of people went from very random jobs to coding, like &lt;a href=&quot;https://learntocodewith.me/podcast/glass-blower-to-software-developer-michael-pimentel/&quot;&gt;glassblowing&lt;/a&gt;, &lt;a href=&quot;https://learntocodewith.me/podcast/from-frying-chicken-to-working-at-google-danny-thompson/&quot;&gt;chicken frying&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/sticklercarla?lang=en&quot;&gt;Broadway acting&lt;/a&gt;. In this article, I&apos;ll answer common questions that people asked me on this topic.&lt;/p&gt;
&lt;h2&gt;Is it easy to find a job?&lt;/h2&gt;
&lt;p&gt;There&apos;s good and bad, like everything else.&lt;/p&gt;
&lt;h3&gt;👍 A world of (remote) opportunities&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Remote work is the default for developers now&lt;/strong&gt;. You don&apos;t need to move to a big city to get started. Most companies will allow you to work remotely if you ask. If not, it&apos;s probably not worth applying.&lt;/p&gt;
&lt;p&gt;Some of the “big tech” behemoths (google, apple) want their employees to work from shiny offices, mostly &lt;a href=&quot;https://appletogether.org/hotnews/thoughts-on-office-bound-work&quot;&gt;against their will&lt;/a&gt;. Mayors encourage them because their property taxes are tied to the value of offices. This is irrelevant for you, you&apos;re unlikely to get your first job in &quot;big tech.&quot;&lt;/p&gt;
&lt;p&gt;The recession(s) will affect us all. But if you can do your job from anywhere, for a company anywhere in your timezone or further, that&apos;s an advantage on other jobs.&lt;/p&gt;
&lt;h3&gt;👍 A culture of skills, not credentials&lt;/h3&gt;
&lt;p&gt;Caveat: This varies by country.&lt;/p&gt;
&lt;p&gt;If you want to make movies for a living, you can go to film school, learn and get a degree. Chances are you will come out with a student project. The other option is to learn on the Internet, and create your own film projects.&lt;/p&gt;
&lt;p&gt;The tech industry works similarly. If you can prove that you can do the work, no one will ask you for a degree or certificate.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./vicious-circle-hiring.inline.svg&quot; alt=&quot;The Vicious Circle of Hiring&quot;&gt;&lt;/p&gt;
&lt;p&gt;We can create our own experience, which is rare, and we’re lucky.&lt;/p&gt;
&lt;h3&gt;👎 The competition&lt;/h3&gt;
&lt;p&gt;Now onto the bad news. I wrote this in the summer of 2022, and the combo of a crazy tech market in 2021, irresponsible startups and a sudden economic downturn lead to &lt;em&gt;a ton&lt;/em&gt; of layoffs.&lt;/p&gt;
&lt;p&gt;Many &lt;em&gt;experienced coders&lt;/em&gt; are out of a job, so the market will be difficult for everyone, for a while.&lt;/p&gt;
&lt;p&gt;Even in “normal times,” coding is a competitive industry. There are lots of young people with lots of time who are happy to code 24/7. You might think “How could I possibly stand a chance against that?” Your advantage is you&apos;re more than a coding machine. You bring life experiences that alongside your coding skills make you interesting.&lt;/p&gt;
&lt;h2&gt;How soon can I find a job?&lt;/h2&gt;
&lt;p&gt;YouTube and Twitter are full of people telling stories of “Zero to engineer in 3 months — and so can you! Buy my course”&lt;br&gt;
This is just like any Internet advice, e.g., “I lost 10 kgs in 2 months — and so can you! Buy my course.”&lt;/p&gt;
&lt;p&gt;Whether or not you find a coding job (and when) is influenced by market conditions, which you cannot control. Unfortunately, I can’t give you a clear answer. I would focus on learning the basics, and creating a body of work. I know it’s boring but I don’t want to give you a false hope.&lt;/p&gt;
&lt;h2&gt;What is code?&lt;/h2&gt;
&lt;p&gt;Here&apos;s an analogy that stuck with me:&lt;/p&gt;
&lt;p&gt;Coding is like playing with Lego bricks in your mind.&lt;/p&gt;
&lt;p&gt;With Lego, you can only use a restricted set of primitives (bricks) to build &lt;em&gt;something&lt;/em&gt; (a boat). With code, that restricted set of primitives is called a programming language, and what you create is called programs, or software.&lt;/p&gt;
&lt;p&gt;It looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let width = 400;
let height = 400;

function setup() {
  createCanvas(width, height, WEBGL);
}

function draw() {
  background(250);

  rotateZ(frameCount * 0.01);
  rotateX(0.6);
  rotateY(0.4);
  box(70);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Is Coding the same as IT?&lt;/h3&gt;
&lt;p&gt;No, IT and coding still get conflated, but they are different jobs. Here&apos;s my explanation of the difference between IT and coding. 👇&lt;/p&gt;
&lt;p&gt;IT uses software to help people create with their computers.&lt;br&gt;
Coders use computers to create programs/software.&lt;/p&gt;
&lt;p&gt;Let me say it again: Coders/Designers work &lt;em&gt;with&lt;/em&gt; computers to create things like Netflix, WhatsApp and other apps, games, etc.&lt;/p&gt;
&lt;h3&gt;Do you need to be good at math to code?&lt;/h3&gt;
&lt;p&gt;Absolutely not! I had to learn 95% of math as an adult. I hated math as a teenager so the most basic stuff like sine and cosine never entered my brain. All you need is to be able to use numbers (e.g., calculate a 20% discount).&lt;/p&gt;
&lt;p&gt;I know many people who do computer graphics professionally and couldn&apos;t solve a quadratic equation to save their lives. And graphics is as math-heavy as coding gets, apart from Artificial Intelligence/Machine Learning.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ideally, each of us would be fluent in working with the mathematical techniques of asymptotic analysis. And ideally, each of us would be rich and good looking as well. &lt;br&gt;
— &lt;strong&gt;The Algorithm Design Manual&lt;/strong&gt;, 2nd Ed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Where to start?&lt;/h2&gt;
&lt;p&gt;For me, the best place to write your first lines of code is &lt;a href=&quot;https://www.khanacademy.org/computing/computer-programming&quot;&gt;Khan Academy’s course.&lt;/a&gt; That should give you a good idea of what coding is like.&lt;/p&gt;
&lt;h3&gt;Some tips&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;You&apos;ll have &lt;em&gt;unlearn&lt;/em&gt; a lot, that&apos;s OK! The industry moves fast.&lt;/li&gt;
&lt;li&gt;Don&apos;t worry about what you want to do exactly yet. You&apos;ll carve your own path after landing a job.&lt;/li&gt;
&lt;li&gt;If someone mentions &quot;Learn React&quot; to you as a beginner, run away. React is &lt;a href=&quot;https://twitter.com/swyx/status/1526777408094732288&quot;&gt;confusing, even to experienced engineers&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Good luck! The world is weird again and it’s disheartening, but I will be happy to have you as a colleague if you decide to embark on this journey.&lt;/p&gt;
&lt;p&gt;Cheers&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;PS: If you think you might be too old, here’s a &lt;a href=&quot;https://www.youtube.com/watch?v=UFYJ2DE9wlM&quot;&gt;video of Masako Wakamiya&lt;/a&gt;. At 81, she couldn&apos;t find a good mobile game for people her age. So she learned to code and made one.&lt;/p&gt;
&lt;p&gt;Thank you so much to Josh for reading drafts of this.&lt;/p&gt;</content:encoded></item><item><title>How ethical alternatives succeed: a Signal case study</title><link>https://alvin.codes/writing/signal-ethical-case-study/</link><guid isPermaLink="true">https://alvin.codes/writing/signal-ethical-case-study/</guid><description>In January 2021, Signal was only known by journalists and privacy geeks. In a few days, it topped the charts and was on everyone&apos;s phones. Why?</description><pubDate>Sat, 08 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Here&apos;s a story about the tick that beat the giant with a trick&lt;br&gt;
— Smith and Thell, &lt;strong&gt;Goliath&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In January 2021, Signal was only known by journalists and privacy geeks. In a matter of days, it topped the charts and was on everyone&apos;s phones.&lt;/p&gt;
&lt;p&gt;How did that happen?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Signal was an overnight success that was years in the making. The app had all the components that any ethical&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, alternative product needs to succeed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Zero or low switching cost, which means:
&lt;ol&gt;
&lt;li&gt;A seamless transition process&lt;/li&gt;
&lt;li&gt;Feature parity, almost&lt;/li&gt;
&lt;li&gt;Intuitive design&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Issues with the status quo, i.e., a villain. The reason to switch has to be well-known and &lt;em&gt;relatable&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Street credentials. If shouldn&apos;t be &lt;em&gt;just you&lt;/em&gt; recommending the alternative.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;What&apos;s the deal with WhatsApp and Signal?&lt;/h2&gt;
&lt;p&gt;WhatsApp, owned by Facebook/Meta is one of the main secure messaging apps. Signal is a similar app run by a non-profit with a small team. Interestingly, it was the Signal team that implemented WhatsApp&apos;s encryption.&lt;/p&gt;
&lt;p&gt;These apps coeixsted for a while. WhatsApp was the mainstream app that almost everyone used, and Signal was the unknown that only journalists and privacy geeks used. Until everything changed.&lt;/p&gt;
&lt;p&gt;One day, on January 2021 WhatsApp sent a notification to its users regarding a new privacy policy. The notification said that from 8th February, WhatsApp would start sharing data with its parent company (Facebook). The Internet started writing about the changes, and people started switching to Signal. A snowball effect ensued.&lt;/p&gt;
&lt;h3&gt;The overnight success&lt;/h3&gt;
&lt;p&gt;Signal became the &lt;a href=&quot;https://twitter.com/signalapp/status/1347699781326438404&quot;&gt;most downloaded app&lt;/a&gt; in the App Store in India, Germany, France, Austria, Finland, Hong Kong, and Switzerland. The downloads went from &lt;strong&gt;246,000 the week before&lt;/strong&gt; the WhatsApp change to &lt;a href=&quot;https://www.bbc.co.uk/news/technology-55684595&quot;&gt;&lt;strong&gt;8.8 million the week after&lt;/strong&gt;&lt;/a&gt;. Facebook even &lt;a href=&quot;https://twitter.com/signalapp/status/1348079223701794819&quot;&gt;bought ads&lt;/a&gt; for the word &quot;signal&quot; to prevent people from downloading it. 3 months after the initial incident, Facebook &lt;a href=&quot;https://signal.org/blog/the-instagram-ads-you-will-never-see/&quot;&gt;closed Signal&apos;s Instagram account&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This overnight success is attributed to Elon Musk &lt;a href=&quot;https://twitter.com/elonmusk/status/1347165127036977153&quot;&gt;advising people to &quot;use Signal&quot; on Twitter&lt;/a&gt;. While it made a &lt;em&gt;gigantic&lt;/em&gt; difference, I don&apos;t think that&apos;s why it worked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If Elon tweets &quot;use Linux&quot; tomorrow, no one will care. Why did &quot;use Signal&quot; work so well?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;I. Zero or low switching cost&lt;/h2&gt;
&lt;p&gt;Convenience is everything.&lt;/p&gt;
&lt;h3&gt;1) A seamless transition process.&lt;/h3&gt;
&lt;p&gt;There are 4 steps to get on WhatsApp: Download the app, give it a phone number, wait for the text, and give it access to your contacts. That&apos;s it. For Signal, it&apos;s the exact same process. If Signal asked you to create an account, wait for a confirmation email, type a bio, enter a location, refer a friend, use a two-factor code, &lt;em&gt;plus the other 4 steps&lt;/em&gt;, I wouldn&apos;t be writing this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It should be as easy as possible to transition to the alternative&lt;/strong&gt;. Otherwise people won&apos;t bother.&lt;/p&gt;
&lt;h3&gt;2) Feature parity, almost.&lt;/h3&gt;
&lt;p&gt;Open-source developers tend to pay too much attention to the specifics. In our case, Signal didn&apos;t have &lt;em&gt;exactly&lt;/em&gt; the same features as WhatsApp. You couldn&apos;t search Emojis by their name, it didn&apos;t support group calls with more than 5 people, and the group admin features were limited. But it had most of the features that most people wanted.&lt;/p&gt;
&lt;p&gt;It offered, all in all, a user experience that was &lt;em&gt;similar enough&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Today, not only did Signal add all these missing features, it did so without sacrificing security and privacy. Continuing on my example with group calls, Signal now support group calls with up to 40 participants. That required &lt;a href=&quot;https://signal.org/blog/how-to-build-encrypted-group-calls/&quot;&gt;a lot of engineering&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;3) Intuitive design&lt;/h3&gt;
&lt;p&gt;The design of the the product must be pleasant, and easy to use. &lt;strong&gt;You should never have to learn a new app&lt;/strong&gt;. Signal had a simple design without bells and whistles.&lt;/p&gt;
&lt;h2&gt;II. Issues with &quot;the status quo&quot;&lt;/h2&gt;
&lt;p&gt;Why would you switch when the current product works?&lt;/p&gt;
&lt;p&gt;Claims like &quot;It&apos;s Photoshop but open source&quot; are terrible. They&apos;re appealing for developers but not the average person. &quot;Photoshop without Adobe&apos;s pesky installer&quot; is much better.&lt;/p&gt;
&lt;p&gt;In Signal&apos;s case, Edward Snowden had recommended Signal for years. But humans are narrative creatures. We need a story to justify our behaviour. Issues have to be clear and resonate with people. It&apos;s not only chanting the merits of your alternative, it&apos;s about showing how ugly the status quo is.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./data-linked-comparison-forbes.png&quot; alt=&quot;Comparing the data that various messaging apps link to their users. Signal links no data&quot; title=&quot;This image (from a series of [Forbes article](https://www.forbes.com/sites/zakdoffman/2021/01/03/whatsapp-beaten-by-apples-new-imessage-update-for-iphone-users/?sh=71d4d53a3623)s) was everywhere on social media. Pretty obvious stuff.&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WhatsApp was associated with security and privacy, but Facebook wasn&apos;t&lt;/strong&gt;. That&apos;s what made people quit. The villain of the story became obvious.&lt;/p&gt;
&lt;h3&gt;III. Street credentials&lt;/h3&gt;
&lt;p&gt;The most discouraging problem with new social apps is &quot;nobody I know uses that.&quot; This creates a self-defeating downward spiral that keeps the user base low.&lt;/p&gt;
&lt;p&gt;Signal had just enough notoriety that it wasn&apos;t &lt;em&gt;completely&lt;/em&gt; unknown. After Elon Musk&apos;s tweet, other &lt;a href=&quot;https://twitter.com/KTTunstall/status/1349054688977588224&quot;&gt;celebrities&lt;/a&gt; joined the fun. Signal&apos;s founder and CEO was invited on The Joe Rogan Experiment, one of the biggest podcasts in the world.&lt;/p&gt;
&lt;p&gt;As a result of that, Signal became a known quantity. When people asked their friends and families about this &quot;signal thing,&quot; someone had heard of it somewhere.&lt;/p&gt;
&lt;h2&gt;What now?&lt;/h2&gt;
&lt;p&gt;There were multiple factors that contributed towards Signal&apos;s success. But the main takeaway is this: Make a great alternative product, and don&apos;t compromise.&lt;/p&gt;
&lt;p&gt;If you&apos;re an early user of giving feedback about a new app, demand no less than a great UX. Don&apos;t worry about the small stuff. Don&apos;t nitpick about a feature if most people don&apos;t need it.&lt;/p&gt;
&lt;p&gt;If you&apos;re a creator/developer, nail the core product, then reach out. I&apos;m as jaded of the marketing logo wall as everyone else, but the beginnings are always tough. I get it, it&apos;s easy to forget UX glitches when you&apos;re too close to the product. And it&apos;s much more fun to work on a coding problem than crafting a compelling marketing message.&lt;/p&gt;
&lt;p&gt;My hope is to see this success is replicated. More competition is better for consumers, well, most of the time. Remember when there was only one TV subscription service?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Thank you to &lt;a href=&quot;https://www.jeremiahlee.com/&quot;&gt;Jeremiah Lee&lt;/a&gt; and &lt;a href=&quot;https://kevq.uk/&quot;&gt;Kev Quirk&lt;/a&gt; for reviewing drafts of this article.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;I use &quot;ethical&quot; in a broad sense. In a market where the status quo has nefarious side effects, an ethical alternative is a similar product that improves on that. For example, a biodegradable cup is an ethical alternative to a plastic cup. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>2021 in Review</title><link>https://alvin.codes/writing/2021-in-review/</link><guid isPermaLink="true">https://alvin.codes/writing/2021-in-review/</guid><description>Another weird, exhausting year</description><pubDate>Sat, 01 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;What a year, right?&lt;/p&gt;
&lt;p&gt;It was an exhausting year for me. A lot of uncertainty still remains.&lt;/p&gt;
&lt;p&gt;On the physical front, I moved houses 4 times (during a pandemic), which was no fun at all. I hope that I&apos;m done with boxes and suitcases. On the plus side, time flows by when you&apos;re busy.&lt;/p&gt;
&lt;p&gt;On the mental side of things, I&apos;m as tired of the pandemic as everyone else. But I&apos;m extremely thankful to be in one piece. I&apos;m in good health, I&apos;ve not been ill, and I&apos;m aware how great that is.&lt;/p&gt;
&lt;p&gt;Vaccination has changed the game. I&apos;m very lucky to have gone from zero to triple vaccination in one year. That said, the risk of Long Covid still feels real. Real enough that I&apos;ve still not been indoors and unmasked with strangers.&lt;br&gt;
Update 2022: &lt;a href=&quot;https://twitter.com/NBedera/status/1488610428397580290&quot;&gt;This Thread by Dr. Nicole Bedera&lt;/a&gt; is a great explanation of my current feelings on the topic.&lt;/p&gt;
&lt;p&gt;I have been indoors and unmasked with friends though, fortunately. It turns out that you can eat outside for most of the year, even in rainy European countries.&lt;/p&gt;
&lt;p&gt;To continue the tradition, here&apos;s my best of the year again. I can&apos;t believe it&apos;s my 4th &quot;&lt;a href=&quot;/tags/reviews&quot;&gt;Year in Review&lt;/a&gt;&quot; article. I&apos;ve explored more subjects than ever this year, the Internet is amazing.&lt;/p&gt;
&lt;h2&gt;Best of 2021&lt;/h2&gt;
&lt;h3&gt;🎥 Cinema&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Dig&lt;/strong&gt;: I would never expect to be so enthralled by a 2-hour movie about an archeological dig during WW2. This film deserves oscars. For Carey Mulligan, the lead actress; for Archie Barnes, the child actor; for the photography; for the music. Best Picture and best Sound at the very least. It also manages to captures the ambient tension of the war. It&apos;s beautiful, it&apos;s somber, it&apos;s philosophical at times, I loved it. 10/10.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shang-Chi and the Legend of the 10 Rings&lt;/strong&gt;: I wasn&apos;t excited about this one at first. I saw the trailer, and the hip-hop and fast editing didn&apos;t appeal to me. But I &lt;em&gt;loved it&lt;/em&gt; when came out for free on Disney+. I watched it twice in like 7 days. The story is great, the characters are great, and the fight scenes are spectacular.&lt;/p&gt;
&lt;p&gt;Squid Game anyone? 🐙&lt;/p&gt;
&lt;h3&gt;Albums&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Hotel TV by Lawrence&lt;/strong&gt;: I discovered the Lawrence siblings this year from Jon Bellion. Jon is one of my favourite artists (featured in last year’s review) and he was a producer on their latest album called &lt;em&gt;Hotel TV&lt;/em&gt;. It&apos;s funky, and Gracie&apos;s vocals are outstanding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;That&apos;s life by Willie Nelson&lt;/strong&gt;: So, Willie Nelson made a jazz album. &lt;em&gt;That&apos;s life&lt;/em&gt; is a tribute to Frank Sinatra, and it&apos;s very good. It’s Willie’s 71st album. Let that sink in for a bit. Enjoy!&lt;/p&gt;
&lt;h3&gt;🎙️ Podcast&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Miracle in Galway Bay — RTÉ Radio 1&lt;/strong&gt;: This is one of the best audio documentaries I heard in a long time. It&apos;s about a rescue mission in Galway bay. Sara and Ellen head out on paddleboards, and then don&apos;t come back (happy ending, don&apos;t worry 🙌). It&apos;s riveting, I just couldn&apos;t stop listening. &lt;a href=&quot;https://www.rte.ie/radio/doconone/1237733-miracle-in-galway-bay&quot;&gt;Listen Here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where the Streets Have No Name — Behind the Song&lt;/strong&gt;: Behind the Song is a fantastic new podcast that I discovered this year. It goes into the origins of songs and their performers, in less than 15 minutes. Some episodes don&apos;t have enough music, unfortunately. My favourite episode was on &lt;em&gt;Where the Streets Have No Name&lt;/em&gt;. &lt;a href=&quot;https://podcasts.apple.com/us/podcast/behind-the-song-u2-where-the-streets-have-no-name/id1437006895?i=1000504511246&quot;&gt;Listen Here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The story of “The Central Park Karen” — Honestly&lt;/strong&gt;: What a shock. This is a very important episode that investigates the damages of cancel culture on people&apos;s lives, beyond the headlines. &lt;a href=&quot;https://www.honestlypod.com/podcast/episode/256bac0b/the-real-story-of-the-central-park-karen&quot;&gt;Listen here&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Best Purchase&lt;/h3&gt;
&lt;p&gt;A skipping rope, it paid itself off 10 times over already.&lt;/p&gt;
&lt;h2&gt;Resolutions&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;New year&apos;s resolution:&lt;/p&gt;
&lt;p&gt;✅ Don&apos;t set unrealistic expectations for yourself when we&apos;re still in a global pandemic and everything is very uncertain.&lt;/p&gt;
&lt;p&gt;— Mind (&lt;a href=&quot;https://twitter.com/MindCharity&quot;&gt;@MindCharity&lt;/a&gt;), &lt;a href=&quot;https://twitter.com/MindCharity/status/1477337948605534209&quot;&gt;Jan 1, 2022&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Onwards to another strange year!&lt;/p&gt;</content:encoded></item><item><title>Arranging objects in 2D and 3D</title><link>https://alvin.codes/writing/arranging-2d-3d/</link><guid isPermaLink="true">https://alvin.codes/writing/arranging-2d-3d/</guid><description>Neat visual arrangements made with code</description><pubDate>Fri, 01 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;No matter how many (thousand) times you wrote a particular piece of code, you &lt;em&gt;always&lt;/em&gt; have to it look up. I&apos;ve been there so many times.&lt;/p&gt;
&lt;p&gt;My brain forgets most snippets that involve lots of &lt;code&gt;Math.sin&lt;/code&gt; and others. Anything like &lt;code&gt;((2 * i) / numItems) * PI&lt;/code&gt;. Unfortunately, that&apos;s what a lot of &quot;creative coding&quot; is about.
Fortunately, my brain can do association, like &quot;I know I wrote this code in &lt;em&gt;that&lt;/em&gt; project.&quot;&lt;/p&gt;
&lt;p&gt;I now have too many creative code algorithms across too many projects. So I&apos;ve collected them in this article.&lt;/p&gt;
&lt;p&gt;All snippets are language-agnostic, framework-agnostic and valid JavaScript.&lt;/p&gt;
&lt;h2&gt;2D&lt;/h2&gt;
&lt;h3&gt;Arrange in a 2D grid&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// arrange items in a horizontal grid from left to right
let gridSize = 5;
let itemSize = 60;
let numItems = 17;

for (let i = 0; i &amp;#x3C; numItems; i++) {
  // from left to right
  let gx = i % gridSize;
  let gy = Math.floor(i / gridSize);
  // swap gx and gy to arrange in a vertical grid from top to bottom
  // gx = Math.floor(i / gridSize);
  // gy = i % gridSize
  let x = gx * itemSize;
  let y = gy * itemSize;
  // 4px spacing
  rect(x, y, itemSize - 4, itemSize - 4);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./arrange-in-grid.svg&quot; alt=&quot;Squares arranged in a grid&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Arrange in a circle&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let numItems = 8;
let radius = 100;
for (let i = 0; i &amp;#x3C;= numItems; i++) {
  // I love this line
  let angle = ((2 * i) / numItems) * Math.PI;
  let x = Math.cos(angle) * radius;
  let y = Math.sin(angle) * radius;
  ellipse(x, y, 20, 20);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./arrange-in-circle.svg&quot; alt=&quot;./arrange-in-circle.svg&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Arrange on a half circle&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let numItems = 7;
let radius = 100;
// use this value to offset the angle and rotate your semicircle
let angleOffset = 0;
for (let i = 0; i &amp;#x3C; numItems; i++) {
  let t = i / Math.max(1, numItems - 1);
  let angle = Math.PI * t + angleOffset;
  let x = Math.cos(angle) * radius;
  let y = Math.sin(angle) * radius;
  ellipse(x, y, 20, 20);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./arrange-in-semicircle.svg&quot; alt=&quot;./arrange-in-semicircle.svg&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Make a spiral&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let turns = 3; // How many revolutions
let radius = 100;
// How close we want the points to be, as an angle in radians, smaller is closer
let tightness = 0.2;
let full = Math.PI * 2 * turns;

for (let angle = 0; angle &amp;#x3C; full; angle += tightness) {
  let r = radius * (angle / full);
  let x = Math.cos(angle) * r;
  let y = Math.sin(angle) * r;
  ellipse(x, y, 4, 4);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./arrange-in-spiral.svg&quot; alt=&quot;./arrange-in-spiral.svg&quot;&gt;&lt;/p&gt;
&lt;h2&gt;3D&lt;/h2&gt;
&lt;h3&gt;Random points on the surface of a sphere&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let radius = 100;

for (let i = 0; i &amp;#x3C; 1000; i++) {
  // random θ and φ — spherical coordinate stuff 🤷‍♂️
  let theta = random(0, Math.PI * 2);
  let phi = random(-Math.PI / 2, Math.PI / 2);

  let x = radius * Math.sin(theta) * Math.cos(phi);
  let y = radius * Math.sin(theta) * Math.sin(phi);
  let z = radius * Math.cos(theta);
  point(x, y, z);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./arrange-around-sphere.svg&quot; alt=&quot;./arrange-around-sphere.svg&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Random points &lt;em&gt;in&lt;/em&gt; a sphere&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (let i = 0; i &amp;#x3C; 1000; i++) {
  let phi = Math.random() * (2 * Math.PI);
  let costheta = Math.random() * 2 - 1;
  let u = Math.random();

  let theta = Math.acos(costheta);
  // Math.cbrt is part of ES2015
  let r = radius * Math.cbrt(u);

  let x = r * Math.sin(theta) * Math.cos(phi);
  let y = r * Math.sin(theta) * Math.sin(phi);
  let z = r * Math.cos(theta);
  point(x, y, z);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./arrange-in-sphere.svg&quot; alt=&quot;./arrange-in-sphere.svg&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Create a cube of cubes!&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;let xCount = 4;
let yCount = 4;
let zCount = 4;
let boxSize = 20;

for (let k = 0; k &amp;#x3C; zCount; k++) {
  for (let j = 0; j &amp;#x3C; yCount; j++) {
    for (let i = 0; i &amp;#x3C; xCount; i++) {
      let size = boxSize + 7; // add a bit of spacing around each cube
      let halfWayX = (size * xCount) / 2;
      let halfWayY = (size * yCount) / 2;
      let halfWayZ = (size * zCount) / 2;

      if (xCount % 2 != 0) halfWayX -= size / 2;
      if (yCount % 2 != 0) halfWayY -= size / 2;
      if (zCount % 2 != 0) halfWayZ -= size / 2;

      let x = size * i - halfWayX;
      let y = size * j - halfWayY;
      let z = size * k - halfWayZ;
      box(x, y, z, boxSize, boxSize, boxSize);
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;./cubes.png&quot; alt=&quot;./cubes.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you&apos;re curious how these images were generated, the code is available &lt;a href=&quot;https://github.com/alvinometric/arranging-2d-3d&quot;&gt;in this repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Suggestions welcome! I want to keep updating this post with cool visuals, and I would love your help. Please keep suggestions to spatial stuff though. We collectively wrote enough bubble sorts.&lt;/p&gt;</content:encoded></item><item><title>Things I don’t know</title><link>https://alvin.codes/writing/things-i-dont-know-2021/</link><guid isPermaLink="true">https://alvin.codes/writing/things-i-dont-know-2021/</guid><description>Here are the (coding-related) things I don&apos;t know, as of 2021. In an effort to help junior developers feel more comfortable.</description><pubDate>Mon, 16 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s the 2018 Christmas break. Dan Abramov, a respected engineer in the web community, wrote a blog post that I loved. The title was &lt;a href=&quot;https://overreacted.io/things-i-dont-know-as-of-2018/&quot;&gt;Things I Don’t Know as of 2018&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The idea was &quot;we can admit our knowledge gaps without devaluing our expertise&quot;. Since then, many coders wrote their own versions of the blog post, sharing their own gaps. It was a collective effort to help junior developers feel more comfortable.&lt;/p&gt;
&lt;p&gt;I didn&apos;t have a website then. With the role of front-end engineers getting &lt;a href=&quot;https://css-tricks.com/the-great-divide/&quot;&gt;more ambiguous&lt;/a&gt; by the day, it&apos;s time for me to do my part. Here are the (coding-related) things I don&apos;t know, as of 2021.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Terraform and other &lt;em&gt;Infrastructure as code&lt;/em&gt; (IaC) tools&lt;/strong&gt;&lt;br&gt;
My experience with configuring servers is something like &quot;How powerful is it? Does it Scale? How does it scale?&quot; I reach for an &lt;a href=&quot;https://sre.google/&quot;&gt;SRE&lt;/a&gt; otherwise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;&lt;br&gt;
I can make my app run in a Docker container on my computer. I can expect it to behave (roughly) the same way in other computers. When it comes to getting that container to talk to other containers in a coordinated manor, I can&apos;t help you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eigenvalues and Eigenvectors&lt;/strong&gt;&lt;br&gt;
That&apos;s the limit of my linear algebra. I have a rough idea of how eigenvalues and vectors relate to a transformation. I&apos;ve not yet understood how to use them in practice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Functional languages&lt;/strong&gt;&lt;br&gt;
I never touched Haskell or F# and don&apos;t get the hype around Clojure. And don&apos;t get me started about other ML-style &quot;compile-to-js&quot; languages. Monads and functors look like spelling mistakes to me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signal processing&lt;/strong&gt;&lt;br&gt;
That&apos;s a field in and of itself, but managing audio is an important part of Game Development (my first love). Maybe I used Discrete Cosine Transforms for textures once? Oscilloscopes, oscillators and waveforms are mostly painful memories of boring physics classes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;98% of AWS&lt;/strong&gt;&lt;br&gt;
AWS offers more than 100 services. I&apos;ve used Lambdas (serverless functions), S3 (file storage), EC2 (servers), and Cloudfront (caching). I can tell you that there are a few &quot;AI-oriented&quot; services that will do stuff like text-to-speech, or handwriting recognition. I probably couldn&apos;t name 20 of those services.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C++&lt;/strong&gt;&lt;br&gt;
To me, &lt;em&gt;clang&lt;/em&gt; is an onomatopoeia for metal hitting the ground. For C++ people, that&apos;s a compiler. I can probably use the &lt;em&gt;modern&lt;/em&gt; version of C++ in a tool like OpenFrameworks. I don&apos;t know anything that relates to binaries or make code run across compilers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Go and Rust&lt;/strong&gt;&lt;br&gt;
Which programming language I&apos;ll learn next changes every week. I&apos;m excited about both. I like that Go has strong conventions and a comprehensive standard library. I love that the Rust Game Development community is very active. Lots of wonderful command-line tools and engines are coming out in Rust.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;sed&lt;/code&gt;.&lt;br&gt;
I know my way around &lt;code&gt;xargs&lt;/code&gt; and wrote a series of articles about &lt;a href=&quot;/writing/nifty-command-lines-intro&quot;&gt;my favourite command line tools&lt;/a&gt;. Yet the syntax of these two commands is undecipherable to me. I tried but &lt;code&gt;grep &quot;e$&quot; logs.txt | sed &apos;s\*(.*\)/\2, \1/&apos;&lt;/code&gt; just doesn&apos;t work. Also, what does a &quot;streaming text editor&quot; even mean?&lt;/p&gt;
&lt;p&gt;There are more, no doubt. But these have come up at various points in my career/learning journey.&lt;/p&gt;
&lt;p&gt;If you&apos;re a developer/designer/doctor and think Imposter Syndrome is a problem in your industry, share your list too. Humility is underrated.&lt;/p&gt;</content:encoded></item><item><title>What’s the problem with metadata?</title><link>https://alvin.codes/writing/metadata/</link><guid isPermaLink="true">https://alvin.codes/writing/metadata/</guid><description>Big, data-hungry companies claim that the collection of metadata is harmless. That&apos;s not true.</description><pubDate>Mon, 05 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A friend asked me over the weekend: &quot;What&apos;s wrong with WhatsApp?&quot; If messages are encrypted, what&apos;s the big deal? That&apos;s a fair question. The answer reveals a larger problem. The problem with companies (in this case, Facebook) collecting metadata &lt;em&gt;around&lt;/em&gt; your data.&lt;/p&gt;
&lt;p&gt;Let&apos;s see why this is dangerous.&lt;/p&gt;
&lt;h2&gt;What&apos;s a metadata anyway?&lt;/h2&gt;
&lt;p&gt;Data-hungry companies often defend themselves with this misleading statement: &quot;It&apos;s OK, it&apos;s just metadata.&quot;&lt;/p&gt;
&lt;p&gt;Well, what&apos;s a metadata? It&apos;s data that&apos;s about other data. For example: In a chat app, if the message is the primary data, then the metadata could be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The time of the message&lt;/li&gt;
&lt;li&gt;Who you&apos;re talking to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Something like &quot;Ben sends 1 message to Jack today at 18.33&quot;&lt;/p&gt;
&lt;p&gt;It&apos;s not OK at all.&lt;/p&gt;
&lt;h2&gt;Why are metadata dangerous?&lt;/h2&gt;
&lt;p&gt;Metadata collection is harmful to privacy. A single piece of metadata may be harmless, but the more metadata you have, the more complex and precise a picture of you emerges. Additionally, metadata come from a variety of sources.&lt;/p&gt;
&lt;p&gt;Let&apos;s go back to our example&lt;/p&gt;
&lt;p&gt;&quot;Ben sends 1 message to Mark today at 18.33&quot;&lt;/p&gt;
&lt;p&gt;That&apos;s pretty innocuous, right ?&lt;/p&gt;
&lt;p&gt;But when Ben sent the message, WhatsApp (and by extension, Facebook) collected its location. If Ben sends 5 messages over 10 minutes without changing location, Facebook knows Ben isn&apos;t moving too much.&lt;/p&gt;
&lt;p&gt;It turns out, Ben is sitting in a waiting room. Waiting to see a discernment counsellor. That&apos;s a therapist for people &lt;em&gt;thinking&lt;/em&gt; about divorce. Ben wants to work on himself to save his marriage.&lt;/p&gt;
&lt;p&gt;Facebook knows who Ben is married to already. They know it from an Instagram story of the wedding posted by one of Ben&apos;s contacts (even if Ben himself isn&apos;t on Instagram).&lt;/p&gt;
&lt;p&gt;Now, from this metadata (his location), Facebook can guess that Ben&apos;s marriage isn&apos;t doing well.&lt;/p&gt;
&lt;p&gt;Before Ben even left the waiting room, his wife Sarah received an ad&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; for a divorce lawyer. 15 minutes later, Sarah sees another ad for a dating app.&lt;/p&gt;
&lt;p&gt;You see, even a series &quot;simple metadata&quot; can reveal a lot about you.&lt;/p&gt;
&lt;p&gt;This is not limited to Facebook. Anyone with metadata about you can run very complex algorithms and profit from it.&lt;/p&gt;
&lt;p&gt;If your bank starts speaking about &quot;sharing data with trusted partners,&quot; please opt-out, immediately. Now you know how they can make money from your location and card purchases.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Facebook sells information to advertisers everywhere on the Internet, not just on its platform. So Ben&apos;s wife can see the ad anywhere on the Internet, even if she&apos;s not on Facebook. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>Software engineering and barriers to entry</title><link>https://alvin.codes/writing/software-engineering-barriers-to-entry/</link><guid isPermaLink="true">https://alvin.codes/writing/software-engineering-barriers-to-entry/</guid><description>In the past decade, job titles for people who code have shifted from &quot;developer&quot; to &quot;engineer.&quot; This could do more harm than good if we&apos;re not careful.</description><pubDate>Mon, 24 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the past decade, job titles for people who code have shifted from &quot;developer&quot; to &quot;engineer.&quot; This could do more harm than good if we&apos;re not careful.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toc&quot;&gt;from-heading: 1
to-heading: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;I. According to the company, place and time, titles change.&lt;/h2&gt;
&lt;p&gt;Let&apos;s start with an example outside the tech industry: In Canada, the government official dealing with finance is the Minister of Finance. In the UK, that&apos;s called the Chancellor. Same job, different job title.&lt;/p&gt;
&lt;p&gt;Back to the tech industry now. In a 2010 job ad &lt;a href=&quot;https://web.archive.org/web/20100104044221/http://wikimediafoundation.org/wiki/Job_openings/Software_Developer&quot;&gt;for Wikipedia&lt;/a&gt;, the job title was &quot;software developer.&quot; Today, &lt;a href=&quot;https://web.archive.org/web/20210115010909/https://wikimediafoundation.org/about/jobs/&quot;&gt;the same job ad&lt;/a&gt; for the same website says &quot;software engineer.&quot;&lt;/p&gt;
&lt;p&gt;The job hasn&apos;t changed much, but the job title did.&lt;/p&gt;
&lt;p&gt;I already hear the crowds: &quot;But code is complex now! There&apos;s state, design systems, caching, container orchestration, complicated stuff! Code today is real engineering!&quot;&lt;/p&gt;
&lt;p&gt;Enter: ✨ The Games Industry ✨&lt;/p&gt;
&lt;p&gt;The gaming industry is the perfect example why these titles make no sense. At Ubisoft, people working on 3D rendering are &quot;graphics programmers.&quot; While people doing DevOps within the same company are &quot;DevOps Engineers.&quot;&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The graphics programmer&apos;s &lt;a href=&quot;https://web.archive.org/web/20211202191721/https://www.ubisoft.com/en-us/company/careers/search/743999790002517-senior-graphics-programmer-snowdrop-&quot;&gt;job description&lt;/a&gt; includes &quot;3D mathematics, rendering algorithms, and data structures.&quot; This is as much engineering as a complex back-end.&lt;/p&gt;
&lt;p&gt;Secondly, solo game developers aren&apos;t calling themselves engineers despite the fact they very much have to think long term about finances, marketing, managing contractors, etc.&lt;/p&gt;
&lt;p&gt;Don&apos;t get me wrong, some applications like Figma &lt;em&gt;are&lt;/em&gt; feats of engineering. No doubt about that.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./slack-notification-flow.png&quot; alt=&quot;A complicated flow chart of the steps that Slack takes before sending a notification&quot; title=&quot;How Slack decides [whether to send you a notification](https://slack.engineering/reducing-slacks-memory-footprint/). Another feat of engineering.&quot;&gt;&lt;/p&gt;
&lt;p&gt;But not all code is a large-scale, multi-million-user app.&lt;/p&gt;
&lt;h2&gt;II. Gatekeeping and dumb requirements&lt;/h2&gt;
&lt;p&gt;Anything that creates imaginary divisions like &quot;you&apos;re not a real coder/engineer unless you can do [x]&quot; is wrong. If you make money writing code, you&apos;re a professional coder/developer/engineer. That&apos;s it. End of the story.&lt;/p&gt;
&lt;p&gt;These stupid assumptions gave us whiteboard interviews. Today, everyone agrees that writing a bubble sort on a whiteboard with a pen is useless for people who code with keyboards, screens and Google.&lt;/p&gt;
&lt;p&gt;70% of developers are &lt;a href=&quot;https://insights.stackoverflow.com/survey/2021#developer-profile-developer-roles&quot;&gt;either front-end or back-end developers&lt;/a&gt;. Most (if not all) of the complex parts can be learned on the job and don&apos;t require a background in computer science. Unlike medicine and traditional engineering, you can &lt;em&gt;start&lt;/em&gt; a career without that knowledge.&lt;/p&gt;
&lt;p&gt;As a colleague jested: &quot;Y&apos;all aren’t real coders until you edit a &lt;code&gt;etc/hosts&lt;/code&gt; file from your terminal with a blindfold.&quot;&lt;/p&gt;
&lt;h2&gt;Cultural and legal matters&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Software Engineers ... drive trains.
— Wes Bos, &lt;a href=&quot;https://syntax.fm/show/194/potluck-gatsby-vs-next-is-google-home-spying-on-you-flat-file-cms-css-frameworks-hosting-client-sites-more&quot;&gt;Syntax.fm Episode 194&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In a lot of countries (Canada, France, Brazil, etc.), an Engineer is what&apos;s called a protected title.&lt;/p&gt;
&lt;p&gt;That means, you need a specific degree accredited by a &lt;a href=&quot;https://en.wikipedia.org/wiki/Regulation_and_licensure_in_engineering&quot;&gt;governing board&lt;/a&gt; to use the title of engineer. You need the degree and with a license, just like doctors. Some places even even have a full-on &lt;a href=&quot;https://en.wikipedia.org/wiki/Ritual_of_the_Calling_of_an_Engineer&quot;&gt;ritual&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But luckily for us in tech, if you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to an online school&lt;/li&gt;
&lt;li&gt;Read, practice and take a few months off to study&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s possible to become a &quot;junior software engineer.&quot; Granted, you need the money to study, but it&apos;s much more accessible than a law degree.&lt;/p&gt;
&lt;p&gt;I&apos;m not done. On top of being a protected title, &quot;engineer&quot; is also a masculine noun in many languages.&lt;/p&gt;
&lt;p&gt;There&apos;s some &lt;a href=&quot;https://www.people.fas.harvard.edu/~banaji/research/publications/articles/2007_Nosek_ERSP.pdf&quot;&gt;contested research&lt;/a&gt;&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; that found that 72% of participants showed stronger associations of &lt;em&gt;science&lt;/em&gt; with &lt;em&gt;male&lt;/em&gt; and
&lt;em&gt;humanities&lt;/em&gt; with &lt;em&gt;female.&lt;/em&gt; Even if the research is biased, that&apos;s still a lot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./google-translate-finnish-bias.png&quot; alt=&quot;&quot; title=&quot;These stereotypes remain prevalent. In [Finnish](https://translate.google.com/?sl=auto&amp;#x26;tl=en&amp;#x26;text=Diane%20on%2035-vuotias.%20H%C3%A4n%20ty%C3%B6skentelee%20insin%C3%B6%C3%B6rin%C3%A4%20teknologia%20yhti%C3%B6ss%C3%A4.%20H%C3%A4n%20pit%C3%A4%C3%A4%20ruoanlaitosta.&amp;#x26;op=translate), Google Translate associates &amp;#x22;working as an engineer&amp;#x22; with the masculine. AlgorithmWatch [found more examples of this](https://algorithmwatch.org/en/google-translate-gender-bias/).&quot;&gt;&lt;/p&gt;
&lt;h2&gt;&quot;Software&quot;&lt;/h2&gt;
&lt;p&gt;What happens if you ask people on the street something like: &quot;Give me 2 software names?&quot;&lt;/p&gt;
&lt;p&gt;I bet the answers will be something like&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft word&lt;/li&gt;
&lt;li&gt;Skype&lt;/li&gt;
&lt;li&gt;Some operating system (Android, etc)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Despite zero research to back this, I reckon most people don&apos;t think of &lt;em&gt;Snapchat&lt;/em&gt;, &lt;em&gt;Tiktok&lt;/em&gt;, or &lt;em&gt;Fortnite&lt;/em&gt; as their first example of &quot;Software.&quot;&lt;/p&gt;
&lt;p&gt;There&apos;s a lot more fun and playfulness to coding than the boring 90s software stereotypes. Modern coders can work on so many cool projects: Mobile apps, IOT devices, games, even (lord forbid) cryptocurrencies.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Why write all this? My point is that the tech industry &lt;em&gt;already&lt;/em&gt; struggles with diversity. Any layer of elitism will make the problem worse.&lt;/p&gt;
&lt;p&gt;We need to reduce the barriers to entry for everyone with the &lt;em&gt;capacity&lt;/em&gt; to work as engineers.&lt;/p&gt;
&lt;p&gt;I&apos;ll leave you with a personal note. Throughout my career, I&apos;ve been lucky to meet a few renowned coders (in person, RIP meetups). They had a large following, peer recognition, and/or open-source projects used by millions.&lt;/p&gt;
&lt;p&gt;Not a single one introduced themselves as engineer.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;This is bound to be misinterpreted, so here&apos;s a pre-emptive Q&amp;#x26;A.&lt;/p&gt;
&lt;h3&gt;Should I talk to HR and change my job title?&lt;/h3&gt;
&lt;p&gt;Keep your job title, you&apos;re already in the industry.&lt;/p&gt;
&lt;h3&gt;Should I start calling myself a programmer?&lt;/h3&gt;
&lt;p&gt;It&apos;s complicated and I don&apos;t have all the answers. &quot;I make a web app at [company]&quot; is much better intro than &quot;I&apos;m a lead engineer.&quot;&lt;/p&gt;
&lt;h3&gt;We&apos;re hiring juniors, should we change the job ad?&lt;/h3&gt;
&lt;p&gt;The job description is the most important.&lt;br&gt;
In the description try to talk less about your team&apos;s &quot;12-factor apps&quot; but more about how you help each other write solid code. If it&apos;s &lt;em&gt;easy&lt;/em&gt; to change the job description from something like &quot;junior React Engineer&quot; to &quot;entry-level developer&quot; or similar, then great. It&apos;s not a big deal if not.&lt;/p&gt;
&lt;h3&gt;Who are you to write this?&lt;/h3&gt;
&lt;p&gt;Nobody. As prescriptive as it may sound, I&apos;m just trying to make this industry more welcoming.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Nothing against Ubisoft, it happens everywhere. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;Look for &quot;Gender – science/humanities stereotypes&quot; in the paper. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>Manage your personal knowledge with a second brain</title><link>https://alvin.codes/writing/second-brains-personal-knowledge/</link><guid isPermaLink="true">https://alvin.codes/writing/second-brains-personal-knowledge/</guid><description>About the problem that 𐃏Roam Research, Obsidian, Logseq, and others try to solve.</description><pubDate>Fri, 16 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Let&apos;s say you just booked tickets to Iceland.&lt;/p&gt;
&lt;p&gt;You remember an amazing documentary about it from 2 years ago. It would be perfect to help you plan your journey. There was a section on a small town you wanted to visit. What was the name of that town? What was the name of that documentary? Was it on Netflix? You wish you had a reference somewhere. Why is this so hard to find?&lt;/p&gt;
&lt;p&gt;This article is about a system to make your daily discoveries useful for your future self. A way to manage your personal knowledge. A &quot;second brain&quot; of sorts. I will also detail my own workflow.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toc&quot;&gt;from-heading: 1
to-heading: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;What&apos;s a &quot;second brain&quot;?&lt;/h2&gt;
&lt;p&gt;A second brain is a way to store the relevant information you consume today so that it&apos;s accessible in the future. Your personal, concise, messy Wikipedia. Nothing to do with the enteric nervous system.&lt;/p&gt;
&lt;p&gt;This is the concept of personal knowledge management. It&apos;s mainstream now because of apps like 𐃏Roam , Notion and Obsidian, but it&apos;s not new. The &lt;a href=&quot;https://en.wikipedia.org/wiki/Personal_knowledge_management#References&quot;&gt;fundamental papers&lt;/a&gt; were all written before 2010.&lt;/p&gt;
&lt;p&gt;The term comes from &lt;em&gt;Building a Second Brain&lt;/em&gt;, an expensive course by Tiago Forte aimed at &quot;creators/artists&quot; that was turned into &lt;a href=&quot;https://uk.bookshop.org/a/72/9781800812215&quot;&gt;a book&lt;/a&gt;. Not everyone creates content, but everyone consumes information, including you. That&apos;s why I wrote this. A few things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;As much as I find the name &quot;second brain&quot; bizarre (I&apos;d prefer &quot;second memory&quot;, or something else less organic) it&apos;s easier than &lt;em&gt;personal knowledge management system&lt;/em&gt;. 🥱&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You &lt;strong&gt;don&apos;t need a fancy app&lt;/strong&gt;. The original &lt;em&gt;Second Brain&lt;/em&gt; course used Evernote and neither Roam, Logseq, Obsidian, nor Notion existed back then. Any &lt;a href=&quot;/writing/note-taking-apps&quot;&gt;note-taking app&lt;/a&gt; is good enough to create the second brain that you want.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is a lot of Internet crap about this subject. People are selling courses, templates, e-books. You don&apos;t need any of that.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Why have a system of notes?&lt;/h2&gt;
&lt;p&gt;You spend a lot of time consuming information. Whether it&apos;s news articles, TV or documentaries. As much as 34GB &lt;em&gt;per day&lt;/em&gt; &lt;a href=&quot;https://ijoc.org/index.php/ijoc/article/view/1566/743&quot;&gt;according to estimates pre-smartphones&lt;/a&gt;. It&apos;s definitely a lot more now.&lt;/p&gt;
&lt;p&gt;Not everything that you read and watch will be worth remembering. And even if you went to bed intensely thinking about one thing, you&apos;ll forget it. Our brains are deceptive.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./forgetting-curve.inline.svg&quot; alt=&quot;The forgetting curve&quot;&gt;&lt;/p&gt;
&lt;p&gt;This system helps us in three areas:&lt;/p&gt;
&lt;p&gt;To &lt;strong&gt;remember&lt;/strong&gt;. Store all your fleeting, disjointed bits of interesting information for future use. Create a knowledge base that&apos;s tailored to you.&lt;/p&gt;
&lt;p&gt;To &lt;strong&gt;connect&lt;/strong&gt; what&apos;s currently on your mind with what you consumed previously.&lt;/p&gt;
&lt;p&gt;To &lt;strong&gt;create value&lt;/strong&gt;. This one is easy to misinterpret. You create value for yourself by saving time and organising information in a way that makes sense to you. It&apos;s also great for recommendations.&lt;/p&gt;
&lt;h2&gt;Guidelines&lt;/h2&gt;
&lt;p&gt;Now that you want a second Brain/personal knowledge management system, how do you make it?&lt;/p&gt;
&lt;p&gt;These are my own guidelines based on the original &lt;a href=&quot;https://fortelabs.co/blog/the-10-principles-of-building-a-second-brain/&quot;&gt;operating principles&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Low friction&lt;/strong&gt;. Make it easy to capture interesting tidbits as they enter your mind.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick and messy&lt;/strong&gt;. Don&apos;t worry about the quality of the notes, get into a habit of making them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not set in stone&lt;/strong&gt;. Taxonomy is hard. Categories become abstract and irrelevant. Try to see where the information would fit with your goals. And re-organise everything as soon as it stops making sense.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Next steps&lt;/h3&gt;
&lt;p&gt;Now, where do we go from here? To recap.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get a &lt;em&gt;fast&lt;/em&gt; app on your phone and computer.&lt;/li&gt;
&lt;li&gt;Start taking notes.&lt;/li&gt;
&lt;li&gt;Keep in mind the guidelines above.&lt;/li&gt;
&lt;li&gt;Don&apos;t stop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or, read on for my complete second-brain/personal knowledge workflow and my method to centralise information from a variety of sources.&lt;/p&gt;
&lt;p&gt;👇&lt;/p&gt;
&lt;h3&gt;My workflow&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./workflow.inline.svg&quot; alt=&quot;My workflow&quot;&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ll repeat that again, it&apos;s not about the app. My workflow does a lot and it&apos;s specific to my needs but I hope you&apos;ll enjoy this.&lt;/p&gt;
&lt;h2&gt;Desktop: Obsidian&lt;/h2&gt;
&lt;p&gt;Many supercharged notes apps hit the market recently. The main contenders are Roam (and Logseq), Notion and Obsidian. I chose &lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt; because it&apos;s &lt;strong&gt;free&lt;/strong&gt; and not cloud-based.&lt;/p&gt;
&lt;p&gt;Obsidian works with files on your computer. It sounds like Paleolithic times before Google Docs when we used Word files, but it doesn&apos;t compare. It&apos;s polished and seamless. This approach gives us 3 advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Speed&lt;/strong&gt;. Your notes don&apos;t come from servers that can go down or become slow. It&apos;s always fast.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Longevity&lt;/strong&gt;. Startups come and go, but text files will always be around.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Price&lt;/strong&gt;. Maintaining servers that serve millions of people is hard and costly. Obsidian doesn&apos;t need to. It will always be cheaper than cloud-based alternatives.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How it works&lt;/h3&gt;
&lt;p&gt;Roam and Obsidian are built on the idea of connecting your notes. You add &lt;code&gt;[[backlinks]]&lt;/code&gt; to your text and create &lt;a href=&quot;https://help.obsidian.md/How+to/Internal+link&quot;&gt;relationships&lt;/a&gt; between your notes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./obsidian-graph.png&quot; alt=&quot;The relationship between the notes, shown as a series of connections&quot; title=&quot;Your connected notes create a network that allows you to visualise how they relate to each other.&quot;&gt;&lt;/p&gt;
&lt;p&gt;👉 My &lt;a href=&quot;/obsidian-setup&quot;&gt;keyboard shortcuts, and syntax guide for Obsidian&lt;/a&gt;.
💎 Great &lt;a href=&quot;https://joschuasgarden.com/&quot;&gt;public digital garden&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;When to use tags and backlinks&lt;/h3&gt;
&lt;p&gt;One of the first questions that came up was &quot;&lt;code&gt;#tags&lt;/code&gt; vs. &lt;code&gt;[[backlinks]]&lt;/code&gt;.&quot; You can make both appear in your connection graph, so they&apos;re functionally the same.&lt;/p&gt;
&lt;p&gt;I struggled with this, but now here&apos;s how I decide: You can &lt;strong&gt;remove&lt;/strong&gt; tags and the note still makes sense, not backlinks. Example:&lt;/p&gt;
&lt;p&gt;&quot;In this podcast episode, &lt;code&gt;[[Sam Harris]]&lt;/code&gt; said &apos;I feel you, the UK&apos;s weather is perpetual October.&apos; &lt;code&gt;#uk&lt;/code&gt;&quot;&lt;/p&gt;
&lt;p&gt;With the tag removed and the backlink turned into normal text, you get:&lt;/p&gt;
&lt;p&gt;&quot;In this podcast episode, Sam Harris said &apos;I feel you, the UK&apos;s weather is perpetual October.&apos; &quot;&lt;/p&gt;
&lt;p&gt;(He never said that.)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Tags can also be &quot;nested&quot;, meaning you can have &quot;sub-tags.&quot; For example, you can have a generic &lt;code&gt;#restaurants&lt;/code&gt; tag and your favourite restaurants tagged under &lt;code&gt;#restaurants/favourite&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;How I put highlights from books and articles into Obsidian&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;For Books&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;I have a Kobo. I sync my book highlights with Obsidian every time I publish &lt;a href=&quot;/reading&quot;&gt;a new book note&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For online articles&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&quot;https://www.instapaper.com/&quot;&gt;Instapaper&lt;/a&gt;, and export my highlights to Markdown files for Obsidian periodically using the API. It&apos;s the only paid product in my entire workflow.&lt;/p&gt;
&lt;p&gt;I try to adopt a &quot;one in, two out&quot; habit with my Instapaper reading list. Otherwise, it grows too quickly. And content at the bottom of the list gets drowned out by newer, shinier articles.&lt;/p&gt;
&lt;h2&gt;Second brains on mobile&lt;/h2&gt;
&lt;p&gt;In my experience, epiphanies happen after a shower or during a meal or when you&apos;re walking around. Not when you&apos;re on your computer. That&apos;s why it&apos;s important that you can store the epiphanies in your second brain when they occur.&lt;/p&gt;
&lt;h3&gt;Easiest way (but paid)&lt;/h3&gt;
&lt;p&gt;Get the Obsidian app for Android and iOS. Pay $10/month for Obsidian Sync. Your notes sync between your mobile and your desktop.&lt;/p&gt;
&lt;h3&gt;Harder way (but free)&lt;/h3&gt;
&lt;p&gt;Host your notes in a Github repository and use &lt;a href=&quot;https://gitjournal.io/&quot;&gt;Git Journal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&apos;s a bit convoluted to set up, but that&apos;s inherent to how Git works. The tutorial is very good. I set it up so that it only has access to &lt;em&gt;just one&lt;/em&gt; repo. It works great for me.&lt;/p&gt;
&lt;p&gt;Note that you can store your notes in a git repository as an additional backup strategy on top of Obsidian sync.&lt;/p&gt;
&lt;h2&gt;End&lt;/h2&gt;
&lt;p&gt;There you go! You learned all about second brains/personal knowledge management. Now go, make your own system, and don&apos;t get derailed by the specifics. It&apos;s all about what works &lt;em&gt;for you&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br&gt;
Alvin&lt;/p&gt;
&lt;p&gt;Thank you to &lt;a href=&quot;https://www.emgoto.com/&quot;&gt;Emma goto&lt;/a&gt;, &lt;a href=&quot;https://iainsmith.me&quot;&gt;Iain Smith&lt;/a&gt;, &lt;a href=&quot;https://www.halldorstefans.com/&quot;&gt;Halldór Stefánsson&lt;/a&gt;, Rishabh Rawat and &lt;a href=&quot;https://herbertlui.net&quot;&gt;Herbert Lui&lt;/a&gt; for reviewing drafts of this article.&lt;/p&gt;</content:encoded></item><item><title>Why I love Audio Drama</title><link>https://alvin.codes/writing/audio-drama/</link><guid isPermaLink="true">https://alvin.codes/writing/audio-drama/</guid><description>Delving into audio dramas, one of my best discoveries from 2019. Includes my favourites</description><pubDate>Wed, 03 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Audio dramas are one of my best discoveries from 2019. They&apos;re like audiobooks acted out with sound effects. An audio drama is like a movie in your ears. Except longer, more immersive, and even good for your eyes.&lt;/p&gt;
&lt;p&gt;They&apos;ve existed for a while and I frequently listen to adaptations from the 1980s, more on that later.&lt;/p&gt;
&lt;p&gt;I absolutely love them.&lt;/p&gt;
&lt;h2&gt;What&apos;s an audio drama?&lt;/h2&gt;
&lt;p&gt;An audio drama is a gem from the golden age of radio. Before books were adapted for TV and we got series, theatre plays and books were adapted for radio. That&apos;s how we got radio dramas.&lt;/p&gt;
&lt;p&gt;Back in the day, everyone was in on it. &lt;em&gt;The Hitchhiker&apos;s Guide to the Galaxy&lt;/em&gt; was first created as a drama for BBC in 1978. &lt;em&gt;The Adventures of Tintin&lt;/em&gt; had radio episodes 3 times a week &lt;a href=&quot;https://translate.google.com/translate?hl=en&amp;#x26;sl=auto&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.ina.fr%2Fcontenus-editoriaux%2Farticles-editoriaux%2Fles-aventures-de-tintin%2F&amp;#x26;sandbox=1&quot;&gt;between 1959 et 1963&lt;/a&gt;. In Norway, radio theatre started in &lt;strong&gt;1927&lt;/strong&gt; at NRK and &lt;a href=&quot;https://en.wikipedia.org/wiki/Radioteatret&quot;&gt;hasn&apos;t stopped since&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Notice I&apos;ve been using the term &lt;em&gt;radio&lt;/em&gt; drama. For the rest of this article, I&apos;ll consider Radio Drama, Radio Theatre, Audio Fiction, and Audio Theatre under &quot;Audio Drama.&quot; The semantics feel pointless now that everything is distributed digitally.&lt;/p&gt;
&lt;h3&gt;Audio Drama vs. full-cast Audiobooks&lt;/h3&gt;
&lt;p&gt;Let&apos;s just get the technical bits out of the way. There are 2 differences between audio drama and full-cast audiobooks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Audio dramas are &lt;em&gt;adapted&lt;/em&gt; and &lt;em&gt;abridged&lt;/em&gt; (historically for radio).&lt;/li&gt;
&lt;li&gt;They have much richer music and sound.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It gets unclear nowadays because audiobooks productions keep getting bigger and more polished. But for me that&apos;s still a good way to make the distinction.&lt;/p&gt;
&lt;h3&gt;Funny legacy&lt;/h3&gt;
&lt;p&gt;Ian Holm, who played Bilbo in The Lord of the Rings trilogy, first played Frodo in the BBC adaptation in 1981.
Show The hobbit song vs Minds Eye in 1973.
&quot;It&apos;s a bird, it&apos;s a plane&quot; comes from &lt;em&gt;The Adventures of Superman&lt;/em&gt;, a drama by WOR New York in 1940.&lt;/p&gt;
&lt;h2&gt;Short and sweet&lt;/h2&gt;
&lt;p&gt;The first major benefit for me is how much shorter the adaptation is. For example with &lt;em&gt;Emma&lt;/em&gt; by Jane Austen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;17 hours for the &lt;a href=&quot;https://librivox.org/emma-dramatic-reading-by-jane-austen/&quot;&gt;Librivox&lt;/a&gt; full-cast (free and public domain) of the original text.&lt;/li&gt;
&lt;li&gt;8 hours for the Audible Original dramatisation.&lt;/li&gt;
&lt;li&gt;5 hours for the BBC Radio 4 dramatisation.&lt;/li&gt;
&lt;li&gt;9 hours and 24 minutes reading the book at 250 words per minute.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, that&apos;s between 3 and 7 hours of my time back. Just on one book.&lt;/p&gt;
&lt;p&gt;Even more examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Moby Dick&lt;/strong&gt;. The book is 213,546 words, a 13-hour read. The dramatised version is 2 hours.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Divine Comedy&lt;/strong&gt;. The book is 101,065 words, a 6-hour read. The drama is 2 hrs 50 mins.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bonus: I can enjoy classic literature&lt;/h3&gt;
&lt;p&gt;I&apos;m a remote programmer, all I do is process text on screens. After a day&apos;s work, there&apos;s only so much that I can read. Therefore most of the classic literature was always a no-go for me.&lt;/p&gt;
&lt;p&gt;When my brain&apos;s fried, I don&apos;t have the capacity to go through a hefty book with lots of descriptions like Moby Dick. With the dramatised version, I can experience its magic in a new, immersive way. And I can rest my eyes while doing that. It&apos;s a double win.&lt;/p&gt;
&lt;h2&gt;Forever Young&lt;/h2&gt;
&lt;p&gt;I watched &lt;em&gt;Whiplash&lt;/em&gt; with J. K. Simmons the other day. It was in the backlog for a while because people kept recommending it. Still, I had no clue when the film was made. And I went through most of it not knowing.&lt;/p&gt;
&lt;p&gt;Until this one scene came up. It&apos;s only a couple of seconds long, a clear shot of Miles Teller&apos;s phone on a bus. But that was it, I knew how old the film was. The phone was enough.&lt;/p&gt;
&lt;p&gt;Here&apos;s my point: Visual effects, fashion, and accessories in Film show their age &lt;em&gt;quickly&lt;/em&gt;. Sound effects, much less. Unless the sound quality is noticeably bad, the noises of the world don&apos;t change that much.&lt;/p&gt;
&lt;h2&gt;Production quality&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;An opportunity for a new world which exists in the mind of the listener.&lt;br&gt;
— &lt;a href=&quot;https://youtu.be/gIMCppos4bU?t=30&quot;&gt;Richard Armitage&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Two words: Casting and music. The performers in some productions are &lt;em&gt;stellar&lt;/em&gt;. I&apos;ve listened to dramas starring the best actors of our generation. My favourites feature Christopher Lee, Benedict Cumberbatch, Judi Dench, James McAvoy and lots of other names like this. One of John Hurt&apos;s last performance was an audio drama.&lt;/p&gt;
&lt;p&gt;The cast of &lt;a href=&quot;https://www.dccomics.com/blog/2020/05/13/the-sandman-audio-productions-cast-is-revealed&quot;&gt;The Sandman&lt;/a&gt; is a multi-million dollar production.&lt;/p&gt;
&lt;p&gt;Second, it&apos;s frequent to hear audio dramas with music that&apos;s 100% original and performed by a full orchestra.&lt;/p&gt;
&lt;h2&gt;Imagination and Immersion&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;There&apos;s an immediacy to Audio Drama, it can go straight into your head in a way that no other media can.&lt;br&gt;
— &lt;a href=&quot;https://www.bbc.co.uk/programmes/m000kp3m&quot;&gt;Neil Gaiman&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Radio dramas are the only medium (apart from books) that made me look around wondering where I was during reading/listening.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;There&apos;s also the role that your imagination plays.&lt;/p&gt;
&lt;p&gt;When you watch TV, you don&apos;t use your imagination at all. When you read a book, it&apos;s the opposite, you have to imagine everything. How people speak and look, the sound of rustling leaves, landscapes, you know, everything.&lt;/p&gt;
&lt;p&gt;Audio dramas sit in this happy middle in terms of imagination. They give you fragments as voice and sounds to help your mind do the rest of the work and create.&lt;/p&gt;
&lt;h3&gt;Now where do I start?&lt;/h3&gt;
&lt;p&gt;Here are some of my favourite audio dramas that I would recommend you.&lt;/p&gt;
&lt;p&gt;Neverwhere, by Neil Gaiman – BBC Radio 4&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.wolverinepodcast.com/episodes-season-1/&quot;&gt;Wolverine, the long night&lt;/a&gt; – Marvel and Stitcher studios&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Stardust, by Neil Gaiman – BBC Radio 4&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bigfinish.com/releases/v/the-invisible-man-1598&quot;&gt;The Invisible man&lt;/a&gt; – Big Finish&lt;/p&gt;
&lt;p&gt;Now open your ears to the worlds of old and new.&lt;/p&gt;
&lt;p&gt;Happy Listening,&lt;br&gt;
Alvin&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;I know, I know, they call it a podcast. It&apos;s distributed like one, but it&apos;s a really large audio drama production. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>Note-taking apps for the data conscious</title><link>https://alvin.codes/writing/note-taking-apps/</link><guid isPermaLink="true">https://alvin.codes/writing/note-taking-apps/</guid><description>My requirements for a notes app and a rundown of candidates.</description><pubDate>Mon, 08 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When I reconsidered my current note-taking process, I came up with a list of requirements for a notes app. Here a few apps that meet them.&lt;/p&gt;
&lt;p&gt;Spoiler Alert: Roam doesn&apos;t fit the bill.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toc&quot;&gt;from-heading: 1
to-heading: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;h3&gt;Features&lt;/h3&gt;
&lt;p&gt;I won&apos;t consider an app for note writing without these features. The apps listed here &lt;strong&gt;&lt;em&gt;all&lt;/em&gt;&lt;/strong&gt; have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloud sync between devices&lt;/strong&gt;. Because it&apos;s not 1999 anymore.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A mobile app&lt;/strong&gt;. Because the most insightful notes are written with wet or greasy hands. Usually after a shower or during a meal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dark mode&lt;/strong&gt;. Because if my little website can have it, they can too.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Data&lt;/h3&gt;
&lt;p&gt;Notes app contain a massive amount of personal data. Let&apos;s make sure it&apos;s protected and transferrable.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your data is protected from third-parties. It is not collected or analysed for marketing and the privacy policy is explicit.&lt;/li&gt;
&lt;li&gt;You can export your data.&lt;/li&gt;
&lt;li&gt;Your data is portable. You can switch to another provider easily (i.e., exports to Markdown or plain text).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Note-taking apps&lt;/h2&gt;
&lt;h3&gt;Bear&lt;/h3&gt;
&lt;p&gt;Price: &lt;strong&gt;$1.49 / month&lt;/strong&gt; or &lt;strong&gt;$14.99 / year&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;💚 &lt;strong&gt;Yay&lt;/strong&gt;: It looks sleek and beautiful, it&apos;s Markdown-first and the export is great. Made by a small company that &lt;a href=&quot;https://blog.bear.app/2020/01/celebrating-data-privacy-day-today-and-every-day/&quot;&gt;takes privacy seriously&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Nay&lt;/strong&gt;: Apple only (macOS/iOS). I would be OK with just a macOS app for the desktop, but I need my Android app.&lt;/p&gt;
&lt;p&gt;🔗 &lt;a href=&quot;https://bear.app/&quot;&gt;Download link&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Evernote&lt;/h3&gt;
&lt;p&gt;Price: &lt;strong&gt;Free&lt;/strong&gt; on 2 devices only. &lt;strong&gt;£4.99 / Month&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;💚 &lt;strong&gt;Yay&lt;/strong&gt;: Beautiful. Lots of integrations with Zapier and IFTTT help you build workflows with it. Folders and subfolders.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Nay&lt;/strong&gt;: No Markdown support. They use their own weird-ass HTML specification but it&apos;s easy enough to convert the export. Few things annoys me more than repeated marketing banners shouting &quot;TRY IT FREE.&quot;&lt;/p&gt;
&lt;p&gt;🔗 &lt;a href=&quot;https://evernote.com/&quot;&gt;Download link&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Notion&lt;/h3&gt;
&lt;p&gt;Price: &lt;strong&gt;Free&lt;/strong&gt; for individual use&lt;/p&gt;
&lt;p&gt;💚 &lt;strong&gt;Yay&lt;/strong&gt;: Beautiful, Powerful, and has folders (kinda). It&apos;s definitely the easiest way to organise things and make them look pretty. And it&apos;s free.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Nay&lt;/strong&gt;: The mobile app is so slow it&apos;s unreal. The desktop app is also too heavy. Copy-paste is a bit flaky. Their Markdown export is nonsensical but it&apos;s better than no export.&lt;/p&gt;
&lt;p&gt;🔗 &lt;a href=&quot;https://notion.so/&quot;&gt;Download link&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;StandardNotes&lt;/h3&gt;
&lt;p&gt;Price: &lt;strong&gt;$13.50 / month&lt;/strong&gt; or &lt;strong&gt;$81 / year&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is somewhat of an exception since the free version doesn&apos;t give you anything.&lt;/p&gt;
&lt;p&gt;💚 &lt;strong&gt;Yay&lt;/strong&gt;: The only app in this list with End-to-end encryption. There&apos;s a variety of writing modes. Very ethical company, take a look at &lt;a href=&quot;https://standardnotes.org/jobs&quot;&gt;their jobs page&lt;/a&gt; if you want to be inspired. You can publish your notes online directly for free using their blogging platform called &lt;a href=&quot;https://listed.to/&quot;&gt;Listed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Nay&lt;/strong&gt;: Dark mode only for paid version. It only exports to plain text files and not Markdown. By trying to do too much, none of the &quot;editors&quot; was good enough. I wanted to like this but I found the paid experience very clunky. They honoured their 30-day money back guarantee and gave me a refund.&lt;/p&gt;
&lt;p&gt;🔗 &lt;a href=&quot;https://standardnotes.org/&quot;&gt;Download link&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Simplenote&lt;/h3&gt;
&lt;p&gt;Price: &lt;strong&gt;Free&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;💚 &lt;strong&gt;Yay&lt;/strong&gt;: Beautiful, simple, and easy to use. The sync feature is super fast and reliable. The native apps on all platforms are light and fast too. It&apos;s made by Automattic (the creators of Wordpress) so you know your data is in good hands. And it&apos;s free.&lt;/p&gt;
&lt;p&gt;❌ &lt;strong&gt;Nay&lt;/strong&gt;: Your notes are stored in their database in plain text. Your data is only encrypted in transit. It&apos;s hard to organise lots of notes (please add folders!). Desktop writing experience could be improved.&lt;/p&gt;
&lt;p&gt;🔗 &lt;a href=&quot;https://simplenote.com/&quot;&gt;Download link&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Current setup&lt;/h2&gt;
&lt;p&gt;My current setup is a bit chaotic.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simplenote for &quot;quick notes&quot; like music to check out, groceries, etc.&lt;/li&gt;
&lt;li&gt;Notion for longer and more complex writing (like this article), other drafts and all my work stuff.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/writing/second-brains-personal-knowledge&quot;&gt;Obsidian as a &quot;second brain&quot;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For all the apps that I use for everything else, head over to &lt;a href=&quot;/uses&quot;&gt;my /uses page&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Why don&apos;t you include [app name] ?&lt;/h3&gt;
&lt;p&gt;Please see the requirements above :)&lt;/p&gt;
&lt;p&gt;If you think there&apos;s an app that I should include, please send me an email or a tweet. Similarly, if an app &lt;em&gt;shouldn&apos;t&lt;/em&gt; be here because I missed something, let me know too.&lt;/p&gt;
&lt;p&gt;Good luck!&lt;/p&gt;</content:encoded></item><item><title>What’s a digital garden?</title><link>https://alvin.codes/writing/digital-gardens/</link><guid isPermaLink="true">https://alvin.codes/writing/digital-gardens/</guid><description>Explorations and thoughts on digital gardens.</description><pubDate>Fri, 29 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Before we get too old&lt;br&gt;
Show me a garden that&apos;s bursting into life&lt;br&gt;
— Snow Patrol, &lt;strong&gt;Chasing cars&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There&apos;s a recent concept called a &quot;Digital Garden&quot; gaining popularity. In this article, I&apos;ll explain what digital gardens are and what I&apos;ve learned from them.&lt;/p&gt;
&lt;h2&gt;So, what&apos;s a digital garden?&lt;/h2&gt;
&lt;p&gt;Unfortunately (or not), it&apos;s not an allotment on Fortnite. You know, with carrots and stuff.&lt;/p&gt;
&lt;p&gt;A Digital garden is like a blog but ideologically different. Blog articles have a published date, tags, and some kind of editing process. Digital gardens don&apos;t, intentionally. If a blog is a magazine, then a digital garden is a public notebook.&lt;/p&gt;
&lt;p&gt;Posts in a digital garden range from in-the-moment notes to finished articles. The idea is to update your notes and &quot;grow&quot; them over time, hence the garden analogy. No publication date or nitpicking over writing.&lt;/p&gt;
&lt;p&gt;Another component of digital gardens is an emphasis on connecting your notes. Not all gardens implement that but it&apos;s not rare to see. Let’s also mention that it’s not an either-or scenario. Some people have &lt;em&gt;both&lt;/em&gt; a garden and a blog. Maybe one day you and I will, too.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./blogs-vs-gardens.inline.svg&quot; alt=&quot;Table comparing digital gardens and blogs, a reminder of the previous text&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Why they&apos;re great&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;More fun, less friction&lt;/strong&gt;. There are less expectations, so they&apos;re great if you struggle to put yourself out there. Or if being a perfectionist prevents you from ever publishing. Digital gardens are less serious, messier, and more intimate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;They forego chronological sorting&lt;/strong&gt;. The only value of chronological sorting is showing the latest article without effort. But people don&apos;t visit blogs every day anymore. Chronological sorting just makes it harder to find older articles, and this creates all sorts of problems.&lt;/p&gt;
&lt;h2&gt;The Lindy effect and publication dates.&lt;/h2&gt;
&lt;p&gt;Here&apos;s a problem: We consider older things on the Internet as &quot;probably outdated.&quot;&lt;/p&gt;
&lt;p&gt;There are valid reasons for this, because technology changes at break-neck speed. Software tutorials become useless faster than ever&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. &quot;HD&quot; 720p videos look terrible on today&apos;s 4K phones.&lt;/p&gt;
&lt;p&gt;The ultimate counter argument is a theory called &quot;the Lindy Effect.&quot;&lt;/p&gt;
&lt;p&gt;The Lindy effect states that the longer something non-perishable (like a book, a movie) has existed, the longer it should exist. If a book has been in print for 40 years, it should remain in print for &lt;em&gt;another&lt;/em&gt; 40 years. For obvious reasons, that doesn&apos;t apply if the surrounding context changes. For example, anything ever written about the DVD economy circa 2010.&lt;/p&gt;
&lt;p&gt;Here&apos;s what I&apos;m getting at here: &lt;strong&gt;Technologies fade but good ideas don&apos;t&lt;/strong&gt;. Applying &quot;old equals irrelevant&quot; to &lt;em&gt;all&lt;/em&gt; online articles can take you away from some wonderful writing.&lt;/p&gt;
&lt;p&gt;Digital gardens bypass the problem by removing publication dates altogether.&lt;/p&gt;
&lt;h2&gt;A whole new world&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./venn-gardens.inline.svg&quot; alt=&quot;Venn Diagram&quot;&gt;&lt;/p&gt;
&lt;p&gt;Reading about Digital Gardens had an unexpected side-effect for me.&lt;/p&gt;
&lt;p&gt;Gardens sits at this very interesting space between the worlds of Productivity, Blogging and Web/Software. Notes that you edit, evolve, and &lt;em&gt;connect&lt;/em&gt; fit with the concept of &quot;networked thought.&quot; There are new apps exploiting this like Roam Research, its open-source clone &lt;a href=&quot;https://logseq.com/&quot;&gt;Logseq&lt;/a&gt;, Obsidian and Notion (kinda) that keep popping up everywhere.&lt;/p&gt;
&lt;p&gt;I found that people with gardens often think about problems at the intersection of these fields. And it&apos;s a refreshing change from sterile CSS discussions or &quot;tabs vs. spaces.&quot;&lt;/p&gt;
&lt;h3&gt;Takeaways&lt;/h3&gt;
&lt;p&gt;Around 2010, it became trendy to use trade-related terms in web design. It was all about &quot;handcrafted&quot; websites, &quot;software craftsmanship&quot; and &quot;carved&quot; PSD files&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; done by so-called digital artisans.&lt;/p&gt;
&lt;p&gt;I now have a mild allergic reaction to verbs like &quot;tending&quot;, &quot;tilling&quot;, &quot;weeding&quot; or &quot;crafting&quot; in digital. Maybe that&apos;s why I have a &lt;code&gt;/writing&lt;/code&gt; and not &lt;code&gt;/garden&lt;/code&gt;? I&apos;d like to think it&apos;s for the following reasons.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A published date forces me to draw a line and stop re-writing. With the freedom to publish &quot;seedling&quot; articles I would endlessly update the same ones.&lt;/li&gt;
&lt;li&gt;There&apos;s something about knowing what you thought x years ago.&lt;/li&gt;
&lt;li&gt;I actually like obsessing over words.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Lessons&lt;/h3&gt;
&lt;p&gt;Finally, these are lessons I took from digital gardens:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Published doesn&apos;t and &lt;em&gt;shouldn&apos;t&lt;/em&gt; mean perfect&lt;/strong&gt;. I know from coding that your current best work will look odd a year later. &quot;Published&quot; means &quot;I&apos;m done thinking about this for a while.&quot;&lt;/li&gt;
&lt;li&gt;Re-visiting and updating things is fine.&lt;/li&gt;
&lt;li&gt;Create a curated, organised writing page (when I have more articles). Reverse chronological sorting is bad.&lt;/li&gt;
&lt;li&gt;Add a prominent search. (As above, I don&apos;t have enough articles yet.) Give your readers and yourself more freedom to explore.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As with most recommendations on the Internet, this works for &lt;em&gt;me&lt;/em&gt;, right &lt;em&gt;now&lt;/em&gt;. Your story is a different story.&lt;/p&gt;
&lt;h3&gt;I want a digital garden!&lt;/h3&gt;
&lt;p&gt;Great, remove your published dates and organise your articles. And publish more. That&apos;s all you need!&lt;/p&gt;
&lt;p&gt;If you want to go deeper into the rabbit hole I recommend checking out &lt;a href=&quot;https://github.com/mathieudutour/gatsby-digital-garden&quot;&gt;these NPM packages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I hope this motivates you to experiment with your own website or take the plunge into the world of digital gardening.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;There are exceptions, &lt;a href=&quot;https://www.gamasutra.com/view/feature/131313/advanced_character_physics.php&quot;&gt;this article about game physics&lt;/a&gt; is still referenced 17 years later. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;Yes we used Photoshop back then 😅. It was just a bit before the &quot;code ninja&quot; stuff started. Dark days. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>2020 in Review</title><link>https://alvin.codes/writing/2020-in-review/</link><guid isPermaLink="true">https://alvin.codes/writing/2020-in-review/</guid><description>2020, you know, what the hell.</description><pubDate>Thu, 31 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;There must be some kind of way outta here&lt;br&gt;
Said the joker to the thief&lt;br&gt;
— Bob Dylan, &lt;strong&gt;All Along the Watchtower&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2020, you know, what the hell.&lt;/p&gt;
&lt;p&gt;Like you, I could never imagine what this year would be. I remember going into it with a lot of anticipation. It started out so well. It was a point in time when many things would finally click into place. For obvious reasons, they didn&apos;t, the puzzle exploded instead. Now I don&apos;t have the right words.&lt;/p&gt;
&lt;p&gt;All I&apos;ll say is that it&apos;s been a tragedy, for too many. I know people who have lost a parent, a grandparent or both. It feels weird and inadequate to write about my year from a home office with all the horrors happening all around.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toc&quot;&gt;from-heading: 1
to-heading: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Achievements&lt;/h2&gt;
&lt;p&gt;As far as professional and personal achievements go this year, Ueno&apos;s CEO has &lt;a href=&quot;https://twitter.com/iamharaldur/status/1341383442852966400&quot;&gt;the best framework&lt;/a&gt;. My top 3 wins are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I’m&lt;/li&gt;
&lt;li&gt;Still&lt;/li&gt;
&lt;li&gt;Alive&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&apos;m also in good health, and I am &lt;em&gt;so glad&lt;/em&gt; and feeling incredibly lucky. I hope you are too.&lt;/p&gt;
&lt;p&gt;If you like reading people&apos;s &quot;year in review&quot; posts like I do, here&apos;s my tip for you: &lt;strong&gt;Don&apos;t&lt;/strong&gt;. Or rather, do it only if you can turn off social comparison&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; first. Then, ask yourself &quot;Is this going to make me feel bad?&quot; Like going into a lake that your friend said wasn&apos;t cold.&lt;/p&gt;
&lt;h2&gt;Best of 2020&lt;/h2&gt;
&lt;p&gt;What I &lt;em&gt;can&lt;/em&gt; write is a &quot;best of the year&quot; to continue &lt;a href=&quot;https://alvin.codes/tags/reviews&quot;&gt;my tradition&lt;/a&gt;. I&apos;ll try to help you escape with amazing entertainment that helped me escape too.&lt;/p&gt;
&lt;h3&gt;🎥 Cinema&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Disney Nature: Elephant&lt;/strong&gt;. The Disney Nature series is beautiful. The narrators are always unique and the images incredible. This is probably my favourite one. &lt;em&gt;Elephant&lt;/em&gt; surprised me on so many levels. What a remarkable animal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Call of the Wild&lt;/strong&gt;. I love Jack London&apos;s novels. White Fang is one of the earliest adventure books I read. This was the last film I saw in a cinema. It looks like I won&apos;t be going again for a couple of years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Klaus&lt;/strong&gt;: What a surprise. I&apos;m not big on Christmas movies, but &lt;em&gt;Klaus&lt;/em&gt; is something else. The art style alone makes it worth watching.&lt;/p&gt;
&lt;h3&gt;Series&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Last Kingdom&lt;/strong&gt;. Even Elon Musk says &lt;a href=&quot;https://twitter.com/elonmusk/status/1344033488698290176&quot;&gt;it&apos;s great&lt;/a&gt;. It&apos;s what I wanted Vikings to be.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Mandalorian&lt;/strong&gt;. I only started watching it this year. When it came out, I saw it only as a carrot on a stick to get people on Disney+. I was wrong, it&apos;s perfect. It&apos;s so much better than the new Star Wars trilogy (Episode VII-&gt;IX). The photography and art direction are flawless. The pacing is impeccable, the series is not too violent, and season 2 is a masterclass in diversity. I can&apos;t recommend it enough.&lt;/p&gt;
&lt;h3&gt;🎻 Audio drama&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;The mill on the floss&lt;/em&gt; by BBC Sounds&lt;/strong&gt;. Amazing at transporting you to another time and place. The producers have a brilliant ability to paint landscapes with words and sounds. The narration by Anna Maxwell-Martin is one of the best I&apos;ve heard. Listen &lt;a href=&quot;https://www.bbc.co.uk/sounds/series/m000h0fc&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Marvels&lt;/em&gt; by Marvel and Stitcher Studios&lt;/strong&gt;. I&apos;m not sure you would enjoy it if you haven&apos;t read the &lt;a href=&quot;/books/marvels&quot;&gt;graphic novel&lt;/a&gt;. The first episodes are vague and confusing. Even knowing the subject matter, I struggled to understand what was happening. Still, it&apos;s an immersive, spellbinding experience that I&apos;ve come to expect from Marvel and Stitcher. Listen &lt;a href=&quot;https://podcasts.apple.com/us/podcast/marvels/id1500634531&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;The invisible man&lt;/em&gt; by Big Finish&lt;/strong&gt;. Earned its place in my top. One of John Hurt&apos;s last performances. Get it &lt;a href=&quot;https://www.bigfinish.com/releases/v/the-invisible-man-1598&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;🎙️ Songs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Conversation with my wife — Jon Bellion&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Everyone (including me!) is doubling down on &quot;content creation&quot; and that comes with its own set of challenges. &lt;em&gt;Conversations with my Wife&lt;/em&gt; reminds us to think about what we want in our search of followers. And yes, there&apos;s a drop&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;. Watch it &lt;a href=&quot;https://www.youtube.com/watch?v=DtA6GdsdTs0&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Higher Love (Steve Winwood Cover) — Keith Urban&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Keith Urban&apos;s performance during the Global Citizen concert in support of Healthcare workers. His performance is on fire 🔥 🕺 🎶 . It has all the components of a good cover: Different, but recognisable, and he gives the song his own spin. Watch it &lt;a href=&quot;https://www.youtube.com/watch?v=DtA6GdsdTs0&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;🎙️ Podcast&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;The Knowledge Project #88 — Derek Sivers&lt;/strong&gt;. Derek is my new favourite writer/person and this is one of this best interviews. Listen &lt;a href=&quot;https://sive.rs/2020-06-fs&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Crazy One #100 — Rejecting life’s invisible scripts&lt;/strong&gt;. A great way to frame society&apos;s stupid expectations. Listen &lt;a href=&quot;http://thecrazy1.com/episode100/&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lex Fridman — Grant Sanderson&lt;/strong&gt;. They talk about what you should work on, Richard Feynman, education, and teaching. Listen &lt;a href=&quot;https://www.youtube.com/watch?v=U_6AYX42gkU&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Soundtracking with Edith Bowman #212 — Ewan McGregor&lt;/strong&gt;. Totally unexpected. If you like music, you&apos;ll love Soundtracking. Listen &lt;a href=&quot;https://audioboom.com/posts/7685713-episode-212-ewan-mcgregor-on-the-music-of-long-way-up-his-films&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Best Purchase&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Ring Fit Adventure&lt;/em&gt; for Nintendo Switch, no doubt.&lt;/p&gt;
&lt;h2&gt;Resolutions&lt;/h2&gt;
&lt;p&gt;Nope.&lt;/p&gt;
&lt;p&gt;Hang on here people! There&apos;s still a long way to go but the aftermath is a lot to be hopeful for. If you liked any of my articles this year, there are more coming soon, and they&apos;ll be a little different.&lt;/p&gt;
&lt;p&gt;Onwards to 2021,&lt;br&gt;
Alvin&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Social Comparison Theory, in psychology, states that we use other people to evaluate ourselves. This comparison influences our sense of self-worth. Bad idea. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;I was obsessed with Jon Bellion in 2017. The &lt;a href=&quot;https://www.youtube.com/watch?v=Nk5jkxOtFiY&quot;&gt;one-take acoustic&lt;/a&gt; version of &lt;em&gt;Human&lt;/em&gt; is unreal (including the moment he pauses to scratch his nose). &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;&quot;A drop&quot; (beat drop) is a point in a song where the rhythm, pace and energy shift. It works &lt;em&gt;really&lt;/em&gt; well in a live acoustic. Only learned the name recently. &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>Nifty command lines: tldr</title><link>https://alvin.codes/writing/nifty-command-lines-tldr/</link><guid isPermaLink="true">https://alvin.codes/writing/nifty-command-lines-tldr/</guid><description>Learn about other commands in a human-friendly way</description><pubDate>Wed, 25 Nov 2020 12:50:00 GMT</pubDate><content:encoded>&lt;p&gt; This post is part of the Nifty Command Lines series.&lt;/p&gt;
&lt;p&gt;There are a few reasons that computer terminals scare people (myself included):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Movie stereotypes of green terminals used by hoodie-wearing hackers in basements.&lt;/li&gt;
&lt;li&gt;How terminals try to &quot;help&quot; you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you ask me, the default help pages for commands (called &lt;code&gt;man&lt;/code&gt; pages for manual, go figure) aren&apos;t designed for humans. They make no sense and are impossible to browse.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tldr.sh/&quot;&gt;tldr pages&lt;/a&gt; try to fix that. The &lt;code&gt;tldr&lt;/code&gt; utility gives you a people-friendly list of examples to help you with a command.&lt;/p&gt;
&lt;p&gt;Example with the &lt;code&gt;rename&lt;/code&gt; command that we discussed in &lt;a href=&quot;/writing/nifty-command-lines-rename&quot;&gt;a previous article&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./tldr-rename-console-output.png&quot; alt=&quot;Console output of tldr pages with the rename command&quot;&gt;&lt;/p&gt;
&lt;p&gt;Compare that with the &lt;code&gt;man&lt;/code&gt; page, as follows:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;RENAME(1)                        User Contributed Perl Documentation

NAME
       rename - renames multiple files

VERSION
       version 1.600

SYNOPSIS
       rename [switches|transforms] [files]

       Switches:

       -0/--null (when reading from STDIN)
       -f/--force or -i/--interactive (proceed or prompt when overwriting)
       -g/--glob (expand &quot;*&quot; etc. in filenames, useful in WindowsX CMD.EXE)
       -k/--backwards/--reverse-order
       -l/--symlink or -L/--hardlink
       -M/--use=Module
       -n/--just-print/--dry-run
       -N/--counter-format
       -p/--mkpath/--make-dirs
       --stdin/--no-stdin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See how neat this is with &lt;code&gt;ffmpeg&lt;/code&gt;, a tool that&apos;s notoriously unfriendly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./tldr-ffmpeg-console-output.png&quot; alt=&quot;FFMPEG Console output&quot;&gt;&lt;/p&gt;
&lt;p&gt;Also, as opposed to &lt;code&gt;man&lt;/code&gt; pages, which require you to install a vim-like interface, tldr pages are easier to contribute to. Everything is in a &lt;a href=&quot;https://github.com/tldr-pages/tldr&quot;&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally, &lt;code&gt;tldr&lt;/code&gt; isn&apos;t limited to the command line. There&apos;s also a &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=bmuskalla.vscode-tldr&quot;&gt;VSCode Extension&lt;/a&gt;, an &lt;a href=&quot;https://github.com/konoui/alfred-tldr&quot;&gt;Alfred Workflow&lt;/a&gt; and even an iOS app.&lt;/p&gt;
&lt;p&gt;If you&apos;re convinced, install it with &lt;code&gt;brew install tldr&lt;/code&gt; on macOS and Linux.&lt;/p&gt;
&lt;p&gt;That&apos;s the end of the series! It introduced you to a few, well, nifty tools that I use quite often, and I hope that it will help you reach out to the terminal to save time.&lt;/p&gt;
&lt;p&gt;Thanks!&lt;/p&gt;</content:encoded></item><item><title>Nifty command lines: host</title><link>https://alvin.codes/writing/nifty-command-lines-host/</link><guid isPermaLink="true">https://alvin.codes/writing/nifty-command-lines-host/</guid><description>Domain records made less weird. Plus GitHub and Gitlab domain settings.</description><pubDate>Mon, 02 Nov 2020 10:28:00 GMT</pubDate><content:encoded>&lt;p&gt; This post is part of the Nifty Command Lines series.&lt;/p&gt;
&lt;p&gt;I&apos;ve been hosting my websites and my domains with different providers for a long time. Ergo for emails. In order to connect your domain to your provider or to your email address, you need do 🚨Domain Verification🚨. And that means doing a few obscure DNS operations like changing name servers and whatnot.&lt;/p&gt;
&lt;p&gt;You set this up on your domain registrar&apos;s website. It&apos;s usually hidden behind various clunky UIs. Frustrating is an understatement.&lt;/p&gt;
&lt;p&gt;Do you know what the worst part is? After you find the hidden thing, paste the random blob, and sear never to do it again, you can&apos;t tell for sure that it worked.&lt;/p&gt;
&lt;p&gt;That&apos;s where the &lt;code&gt;host&lt;/code&gt; command comes in. It lets you inspect the DNS records on your domain from your terminal. It probably does other stuff but that&apos;s all I ever needed. With this command, you can finally see what your wrangling with the UI did.&lt;/p&gt;
&lt;p&gt;Here are a few examples:&lt;/p&gt;
&lt;p&gt;Show TXT records&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;host -t txt alvin.codes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Show A records&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;host -t a alvin.codes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Show CNAME&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;host -t cname alvin.codes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Show Name Servers&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;host -t ns alvin.codes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;host&lt;/code&gt; command is similar to the &lt;code&gt;dig&lt;/code&gt; command, but it&apos;s a lot simpler and easier to remember. I know which one I prefer between typing &lt;code&gt;dig alvin.codes +noall +answer&lt;/code&gt; and &lt;code&gt;host -t a alvin.codes&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Bonus: Gitlab &amp;#x26; GitHub&lt;/h2&gt;
&lt;p&gt;Speaking of hidden settings... Here&apos;s a bonus for you. Here&apos;s what you need to do to connect Gitlab or Github pages to a custom domain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For Gitlab&lt;/strong&gt;, 2 things need to be set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A record set to &lt;code&gt;35.185.44.232&lt;/code&gt;. (Until their IP changes 🤷‍♂️.)&lt;/li&gt;
&lt;li&gt;A TXT record set to &lt;code&gt;gitlab-pages-verification-code=[Your Verification Code]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;For GitHub&lt;/strong&gt; you need to create a &lt;code&gt;CNAME&lt;/code&gt; file at the root of your repository. You can use with the GUI to set it up with the correct values for your domain.&lt;/p&gt;
&lt;p&gt;Then, you need to set the following A records:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Feel free to reach for this article next time you have a domain to set up, I sure will.&lt;/p&gt;
&lt;p&gt;Good luck,
Alvin&lt;/p&gt;</content:encoded></item><item><title>Nifty command lines: rename</title><link>https://alvin.codes/writing/nifty-command-lines-rename/</link><guid isPermaLink="true">https://alvin.codes/writing/nifty-command-lines-rename/</guid><description>Batch-rename your files quickly</description><pubDate>Tue, 27 Oct 2020 11:20:00 GMT</pubDate><content:encoded>&lt;p&gt; This post is part of the Nifty Command Lines series.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;rename&lt;/code&gt; command allows you rename multiple files at once. It makes complex operations like lowercasing accessible with a single line. For simpler operations, like changing extensions from &lt;code&gt;.PNG&lt;/code&gt; to &lt;code&gt;.png&lt;/code&gt;, I usually reach for the action in macOS Finder.&lt;/p&gt;
&lt;h3&gt;How does &lt;code&gt;rename&lt;/code&gt; work?&lt;/h3&gt;
&lt;p&gt;It lets you use regular expressions to batch-rename files. It looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;rename -f &apos;[regex]&apos; [files]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Dry run&lt;/h4&gt;
&lt;p&gt;You want to remember the &lt;code&gt;-n&lt;/code&gt; or &lt;code&gt;--dry-run&lt;/code&gt; option. It shows you what the resulting files will be without affecting them.&lt;/p&gt;
&lt;p&gt;Example: Replace double dashes with single ones.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;~/Export ❯❯❯ rename -f &apos;s/--/-/&apos; * -n
&apos;Example--1.png&apos; would be renamed to &apos;Example-1.png&apos;
&apos;Example--2.png&apos; would be renamed to &apos;Example-2.png&apos;
&apos;Example--3.png&apos; would be renamed to &apos;Example-3.png&apos;
&apos;Example--4.png&apos; would be renamed to &apos;Example-4.png&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;*&lt;/code&gt; in the command above means &quot;all files in the current folder.&quot; You can use glob patterns to target specific files.&lt;/p&gt;
&lt;p&gt;To rename only &lt;code&gt;.txt&lt;/code&gt; files, you&apos;d write &lt;code&gt;rename -f &apos;[regex]&apos; *.txt&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;Regular expressions&lt;/h4&gt;
&lt;p&gt;You write your regexes like this &lt;code&gt;s/[old]/[new]/&lt;/code&gt; or &lt;code&gt;y/[old]/[new]/&lt;/code&gt; without the square brackets.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;s/&lt;/code&gt; regexes are used for 1-to-1 character replacement, while &lt;code&gt;y/&lt;/code&gt; regexes are for complex replacements involving ranges&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. Here are some general examples.&lt;/p&gt;
&lt;p&gt;Replacing dashes with underscores: &lt;code&gt;rename -f &apos;s/-/_/&apos; *&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It gets really powerful when you can work on character ranges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rename -f &apos;y/a-z/A-Z/&apos; *&lt;/code&gt; turns all lowercase into uppercase.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rename -f &apos;y/A-Z/a-z/&apos; *&lt;/code&gt; turns all uppercase into lowercase.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Real-world examples&lt;/h4&gt;
&lt;p&gt;Turn filenames into URL-friendly &quot;slugs&quot; 🐌:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;rename -f &apos;y/A-Z /a-z-/&apos; *
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Remove the &lt;em&gt;last&lt;/em&gt; 𝒙 characters in a filename and replace them:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;rename &apos;s/.{𝒙}$/replacement/&apos; *
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Remove the 34 random characters that Notion&apos;s exporter adds to Markdown files:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;rename &apos;s/.{36}$/.md/&apos; *.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Installation&lt;/h4&gt;
&lt;p&gt;Install it with Homebrew or apt-get: &lt;code&gt;brew install rename&lt;/code&gt; or &lt;code&gt;apt-get install rename&lt;/code&gt;.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;If you want to dig into these (I never did), know that they&apos;re Perl regexes. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>Nifty command lines: tree</title><link>https://alvin.codes/writing/nifty-command-lines-tree/</link><guid isPermaLink="true">https://alvin.codes/writing/nifty-command-lines-tree/</guid><description>A cool way to show your files and folder structure</description><pubDate>Fri, 23 Oct 2020 10:15:00 GMT</pubDate><content:encoded>&lt;p&gt; This post is part of the Nifty Command Lines series.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;tree&lt;/code&gt; command is an easy way to print files and folder structures. Like you see in a lot of tutorials. Running it without arguments will print your files and folders.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;~/code-like-the-90s ❯❯❯ tree
.
├── css
│   └── main.css
├── img
│   └── bkg.png
├── index.html
└── script.js

2 directories, 4 files
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Ignoring&lt;/h3&gt;
&lt;p&gt;You can tell it to ignore directories with &lt;code&gt;tree -I [DirectoryName]&lt;/code&gt;. In most web scenarios, you&apos;ll want to ignore your npm packages, so &lt;code&gt;tree -I node_modules&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can exclude more than one folder by separating them with a pipe character.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;tree -I &apos;node_modules|.cache|test_*|public&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a must to ignore cache folders, build directories, etc.&lt;/p&gt;
&lt;h3&gt;Restricting output&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;-d&lt;/code&gt; flag restricts it to &lt;em&gt;only&lt;/em&gt; show your folders and hide files.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;~/c/nextjs-app ❯❯❯ tree -d
.
├── pages
│   └── api
├── public
└── styles

4 directories
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-P&lt;/code&gt; flag allows you to only show a certain type of files. For example, if you want to list your JavaScript files while ignoring npm packages.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;~/my-app ❯❯❯ tree -P &apos;*.js&apos; -I &apos;node_modules&apos;
.
├── public
└── src
    ├── App.js
    ├── App.test.js
    ├── index.js
    ├── serviceWorker.js
    └── setupTests.js

2 directories, 5 files
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, you can restrict how deep in the folder structure you want to crawl using the &lt;code&gt;-L&lt;/code&gt; flag. &lt;code&gt;tree -L 2&lt;/code&gt; will only go 2 levels deep.&lt;/p&gt;
&lt;p&gt;As usual, install it with Homebrew or apt-get: &lt;code&gt;brew install tree&lt;/code&gt; or &lt;code&gt;apt-get install tree&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;There you go! I&apos;ve used this command quite a lot to create documentation or get a sense of a new codebase. I hope it will be useful for you too.&lt;/p&gt;
&lt;p&gt;Cheers&lt;/p&gt;</content:encoded></item><item><title>Nifty command lines</title><link>https://alvin.codes/writing/nifty-command-lines-intro/</link><guid isPermaLink="true">https://alvin.codes/writing/nifty-command-lines-intro/</guid><description>In this series of articles, I&apos;ll share a few command-line tools that have been helpful to me.</description><pubDate>Thu, 22 Oct 2020 22:15:00 GMT</pubDate><content:encoded>&lt;p&gt;I remember when scary terminals became required for web programmers. You had to, &lt;em&gt;gasp&lt;/em&gt;, &lt;strong&gt;run commands&lt;/strong&gt; to do your work&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Later, I discovered that I relied on random websites for stuff that command line interfaces (CLIs) do better. Like, convert a font, compress a video, etc.&lt;br&gt;
If websites can break or start showing NSFW ads, CLIs have been around for years, if not decades. It&apos;s also easier to remember a command than a bookmark.&lt;/p&gt;
&lt;h3&gt;Series:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/writing/nifty-command-lines-tree&quot;&gt;Show your files and folders with &lt;em&gt;tree&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/writing/nifty-command-lines-rename&quot;&gt;Batch-rename files easily with &lt;em&gt;rename&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/writing/nifty-command-lines-host&quot;&gt;View your domain records with &lt;em&gt;host&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/writing/nifty-command-lines-tldr&quot;&gt;Human-friendly commands with &lt;em&gt;tldr&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Housekeeping&lt;/h3&gt;
&lt;p&gt;I recommend using &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew&lt;/a&gt; to install your command line tools. It works on macOS, Linux, and Windows using WSL2.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;No more double-clicking &lt;code&gt;index.html&lt;/code&gt;. Who said they miss FTP? Not me... &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>Under the hood: WebGL sketch</title><link>https://alvin.codes/writing/under-the-hood-webgl-sketch/</link><guid isPermaLink="true">https://alvin.codes/writing/under-the-hood-webgl-sketch/</guid><description>A daily log for the homepage graphics.</description><pubDate>Sat, 03 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is the daily log that I wrote back in, erm, &lt;em&gt;some&lt;/em&gt; years ago, when I tried doing &lt;a href=&quot;http://codevember.xyz/about&quot;&gt;Codevember&lt;/a&gt;. It&apos;s how the 3D WebGL graphics currently on the homepage came to be. I&apos;m using Regl 👑, as mentioned in my &lt;a href=&quot;/writing/under-the-hood-tech-stack#webgl&quot;&gt;Tech Stack article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The original sketch is still available &lt;a href=&quot;https://sour-selection.surge.sh/&quot;&gt;on this link&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;p&gt;I&apos;ve always felt weird about projects that encourage people to create and share works everyday. Projects like Codevember, Inktober or the all-so-toxic #100DaysOfCode. Any kind of peer pressure on carving time out of the weekend always felt uninclusive and unfair. That&apos;s why I never participate on weekends even when I can.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Y U NO THREE.js ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I gave Codevember a try in 2016. I had an absolutely horrible experience when trying to create quick sketches with Three.js. I was not alone in those frustrations. Here they are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The Examples folder&lt;/strong&gt;. A &lt;em&gt;lot&lt;/em&gt; of major features are actually a few rogue files buried in the /examples folder.&lt;/li&gt;
&lt;li&gt;&quot;&lt;strong&gt;The three.js way of thigs&lt;/strong&gt;.&quot; Every time I wanted to play with a new concept (e.g: instancing), I had to:
&lt;ul&gt;
&lt;li&gt;Understand the concept&lt;/li&gt;
&lt;li&gt;Rummage through the depths of the Internet to look at how to implement that undocumented feature in Three&lt;/li&gt;
&lt;li&gt;Make the example code that I found online work in an ES2015/modern environment that doesn&apos;t expect a stupid &lt;code&gt;THREE&lt;/code&gt; global variable.&lt;/li&gt;
&lt;li&gt;Actually implement it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In Regl, these are the steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understand the concept&lt;/li&gt;
&lt;li&gt;cmd/ctrl+f in &lt;a href=&quot;http://regl.party/api&quot;&gt;the docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Implement&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Daily log&lt;/h2&gt;
&lt;h3&gt;Day 1: Setup and simple torus 🛠️&lt;/h3&gt;
&lt;p&gt;Started out by setting up all the workflow. I&apos;m not too fond of the default &lt;a href=&quot;https://github.com/regl-project/regl-camera&quot;&gt;camera&lt;/a&gt;, so I leveraged &lt;a href=&quot;https://www.npmjs.com/package/orbit-controls&quot;&gt;orbit-controls&lt;/a&gt; and &lt;a href=&quot;https://www.npmjs.com/package/perspective-camera&quot;&gt;perspective-camera&lt;/a&gt; instead. The Regl tutorials and examples have been very useful too.&lt;/p&gt;
&lt;p&gt;The workflow is now only Browserify and Glslify. I think I found a good trade-off between convenience (no Webpack involved!) and speed of iteration.&lt;/p&gt;
&lt;h3&gt;Day 2: Multiple tori and Glslify 🙈&lt;/h3&gt;
&lt;p&gt;Figured out how to write reusable GLSL snippets. It usually works fine using a Babel plugin, but for some reason I couldn&apos;t get it to function today. But given that I&apos;m in a Browserify environment, I can directly use Glslify.&lt;/p&gt;
&lt;p&gt;Created several tori (that&apos;s the plural form of &quot;torus&quot;) with different arc lengths.&lt;/p&gt;
&lt;h3&gt;Day 3: Rotated tori 📐&lt;/h3&gt;
&lt;p&gt;Today I tried to rotate each torus in an intuitive way. Rotations in x, y, and z are a lot easier for me to wrap my head around/visualise compared to the traditional &lt;a href=&quot;https://simple.wikipedia.org/wiki/Pitch,_yaw,_and_roll&quot;&gt;yaw, pitch, roll&lt;/a&gt;. This is no airplane.&lt;/p&gt;
&lt;p&gt;After trying out a few matrix-based solutions I&apos;ve come up with an approach in the vertex shader which doesn&apos;t look as boilerplate-y as the other ones.&lt;/p&gt;
&lt;h3&gt;Day 4: Post-processing 🖼️&lt;/h3&gt;
&lt;p&gt;Implemented post-processing effects. It is done by drawing the scene to a frame buffer and manipulating it.&lt;/p&gt;
&lt;p&gt;I&apos;ve done a fair bit of fighting with one of the FBO examples. The version on the website and on GitHub look different, the code didn&apos;t run, but it all worked out in the end.&lt;/p&gt;
&lt;h3&gt;Day 5: Polish 💅&lt;/h3&gt;
&lt;p&gt;Played around with &lt;a href=&quot;https://mattdesl.com/&quot;&gt;Matt Deslaurier&lt;/a&gt;&apos;s &lt;a href=&quot;https://github.com/glslify/glsl-hash-blur&quot;&gt;GLSL hash blur&lt;/a&gt; module, and wanted to add toon shading with a &lt;em&gt;slightly&lt;/em&gt; grainy vignette around it. Then, one of those &quot;generative art happy accident&quot; occurred and resulted it what you&apos;re currently seeing, so I&apos;m going to leave it as it is!&lt;/p&gt;
&lt;h3&gt;Day 6: Toon shading 😈&lt;/h3&gt;
&lt;p&gt;So, I got toon shading to work based on a combination of things seen here and there, but mainly from Nathan Gordon&apos;s &lt;a href=&quot;https://medium.com/@gordonnl/wind-waker-graphics-analysis-a0b575a31127&quot;&gt;Zelda series&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Day 7: Clean-up! 🧹&lt;/h3&gt;
&lt;p&gt;My next step was going to be about adding an outline shader to the tori, but everything in the code started to a bit too tightly coupled and I&apos;d rather spend half an hour and waste &quot;a day&quot; now, than waste three days later down the line, it&apos;s boring but useful!&lt;/p&gt;
&lt;h3&gt;Back to the present&lt;/h3&gt;
&lt;p&gt;I&apos;m happy with how this turned out. Migrating the original codebase to this website was a smooth lift-and-shift process. This shows the strength of 👑 Regl and the stack.gl ecosystem, it&apos;s not always easy to reuse code that dates back many years.&lt;/p&gt;
&lt;h2&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This wouldn&apos;t have been possible without the open-source contributions of the following people:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mikola Lysenko, Eric Arnebäck and Jeremy Freeman, for creating &lt;a href=&quot;http://regl.party&quot;&gt;👑 Regl&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Matt Deslauriers and Hugh Kennedy for creating &lt;a href=&quot;http://stack.gl/&quot;&gt;stack.gl&lt;/a&gt;, many helpful modules and &lt;em&gt;for each&lt;/em&gt; module creating a standalone demo that &lt;em&gt;still works&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As always, feel free to let me know if you have any questions.&lt;/p&gt;</content:encoded></item><item><title>Under the hood: Tech Stack</title><link>https://alvin.codes/writing/under-the-hood-tech-stack/</link><guid isPermaLink="true">https://alvin.codes/writing/under-the-hood-tech-stack/</guid><description>Looking at the different technical choices I made for this website.</description><pubDate>Wed, 30 Sep 2020 11:25:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;&quot;What did I get myself into?&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I wondered that many times during the development process...&lt;/p&gt;
&lt;p&gt;Why on earth did I choose Gatsby, and bother with React, Remark, CSS Modules, and GraphQL? When I could just use the old Jekyll. In this article we&apos;ll have a look at my technical choices.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ This is now outdated, my website now runs on another framework named Astro. &lt;br&gt;
Read &lt;a href=&quot;https://alvin.codes/writing/gatsby-to-astro&quot;&gt;this article&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-toc&quot;&gt;from-heading: 1
to-heading: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Disclaimer: For brevity&apos;s sake I&apos;m assuming a fair amount of prior knowledge. If you would like me to expand, let me know &lt;a href=&quot;https://twitter.com/hola_alvin&quot;&gt;on Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Minimal tech lock-in&lt;/li&gt;
&lt;li&gt;High lighthouse score (95, at least)&lt;/li&gt;
&lt;li&gt;Try to reduce bundle size as much as possible&lt;/li&gt;
&lt;li&gt;The reading experience works without JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Checkout &lt;a href=&quot;/about-this-website&quot;&gt;this page&lt;/a&gt; for the full list of sources, attributions, and colophon.&lt;/p&gt;
&lt;h3&gt;Minimal tech lock-in&lt;/h3&gt;
&lt;p&gt;I don&apos;t want my site to rely on a specific technology too much. I don&apos;t use CSS-in-JS, I hardly use React hooks or component methods, and favour implicit declarations over &quot;Gatsby magic.&quot; Everything should be easy to reproduce with another generator.&lt;/p&gt;
&lt;p&gt;I feel like I made the right choice with Gatsby, and it boils down to two time-saving elements: &lt;em&gt;plugins&lt;/em&gt; and &lt;em&gt;built-ins&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Do you want a dark mode? Here&apos;s &lt;code&gt;gatsby-plugin-dark-mode&lt;/code&gt;. Crazy WebGL graphics with &lt;a href=&quot;https://github.com/glslify/glslify&quot;&gt;glslify&lt;/a&gt;? You&apos;ve got &lt;code&gt;gatsby-plugin-glslify&lt;/code&gt;. An RSS feed? Yep. Gatsby even optimises my images, and adds &lt;code&gt;aria-current&lt;/code&gt; to active links.&lt;/p&gt;
&lt;p&gt;On the Markdown side of the house, I dearly missed Jekyll&apos;s fantastic defaults, but again: Plugins!
&lt;a href=&quot;https://remark.js.org/&quot;&gt;Remark&lt;/a&gt; (the markdown processor) has itself a thriving ecosystem.&lt;br&gt;
See for yourself:&lt;/p&gt;
&lt;p&gt;I got footnotes&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;And the table of contents was auto-generated.&lt;/p&gt;
&lt;p&gt;I&apos;m also pleased that I didn&apos;t have to fiddle with Gatsby internals too much.&lt;/p&gt;
&lt;h3&gt;High Lighthouse score&lt;/h3&gt;
&lt;p&gt;If you don&apos;t believe me:&lt;br&gt;
Cmd + alt + I&lt;br&gt;
Cmd + shift + P&lt;br&gt;
Type &quot;lighthouse&quot;&lt;br&gt;
Click &quot;Generate Report&quot;&lt;/p&gt;
&lt;h3&gt;Hand-drawn images&lt;/h3&gt;
&lt;p&gt;I wanted to avoid the situation where you read in dark mode and BOOM 💥 you get a chart on a white background. To remedy this, the drawings change their line and background colours depending on the theme.&lt;/p&gt;
&lt;p&gt;The graphics are exported from &lt;a href=&quot;https://excalidraw.com/&quot;&gt;Excalidraw&lt;/a&gt; and automatically inserted as inline SVGs and optimised with SVGO.&lt;/p&gt;
&lt;p&gt;It turns out, it&apos;s even more efficient than using normal JPEGs!&lt;/p&gt;
&lt;p&gt;The JPEG of a &lt;em&gt;single&lt;/em&gt; drawing is about 100KB.
An SVG is less than 10KB. But that&apos;s without the font.
The font alone is 117 KB, which I stripped down to 38KB with a bit of subsetting magic.&lt;/p&gt;
&lt;p&gt;So 2 JPEGs = ~200Kb vs. 2 SVGs + 1 font = 58KB&lt;/p&gt;
&lt;p&gt;The more there are, the more worthwhile the savings.&lt;/p&gt;
&lt;h3&gt;Performance and Bundle size&lt;/h3&gt;
&lt;p&gt;Throughout the development process of this site I was ruthless when it comes to dependency sizes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I run every dependency through &lt;a href=&quot;https://www.npmjs.com/package/package-size&quot;&gt;package-size&lt;/a&gt; to make sure there isn&apos;t a smaller alternative, and that it&apos;s worth its cost.&lt;/li&gt;
&lt;li&gt;The fonts are compressed as Woff2 files, self-hosted and stripped of their unused glyphs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://preactjs.com/&quot;&gt;Preact&lt;/a&gt; is used to make the Gatsby/React runtime at least 30% smaller.&lt;/li&gt;
&lt;li&gt;Images use &lt;a href=&quot;https://developers.google.com/speed/webp/&quot;&gt;WebP compression&lt;/a&gt; with the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture#The_type_attribute&quot;&gt;&lt;code&gt;&amp;#x3C;picture&gt;&lt;/code&gt; element&lt;/a&gt; where possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WebGL sites tend to have needlessly large bundle sizes, here&apos;s my answer to that.&lt;/p&gt;
&lt;h2&gt;WebGL&lt;/h2&gt;
&lt;p&gt;This site was another excuse to experiment with 3D graphics, shaders and WebGL. Three.js was ruled out from the start because of its &lt;del&gt;ridiculously&lt;/del&gt; big JavaScript footprint. I tried to strip most features out of Babylon.Js but still, the bundle was enormous. I ended up using &lt;a href=&quot;http://regl.party&quot;&gt;Regl 👑&lt;/a&gt; which is way more lightweight but more low-level, (you have to write GLSL). It&apos;s &lt;a href=&quot;https://www.theguardian.com/us-news/ng-interactive/2016/nov/08/us-election-2016-results-live-clinton-trump&quot;&gt;battle-tested&lt;/a&gt;, has been stable for years&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;, and isn&apos;t changing any time soon.&lt;/p&gt;
&lt;p&gt;I&apos;m keeping an eye on &lt;a href=&quot;https://github.com/oframe/ogl&quot;&gt;OGL&lt;/a&gt; which is an even smaller WebGL library and even gives us a scene graph out-of-the-box, but the API isn&apos;t final yet.&lt;/p&gt;
&lt;p&gt;Here&apos;s how they compare (minified size):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt; 632.33 KB – Three.js v0.120.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt; 110.85 KB – Regl v1.6.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt; 98.39 KB – OGL v0.0.60&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Picking Regl over Three.js saves us 500kb, more than a &lt;em&gt;five-fold&lt;/em&gt; decrease in bundle size. Performance was also paramount. My goal was a smooth 60fps experience on my old budget Android.&lt;/p&gt;
&lt;p&gt;Thanks to Gatsby&apos;s code-splitting, the WebGL library is &lt;em&gt;only&lt;/em&gt; included in the homepage.&lt;/p&gt;
&lt;h3&gt;Homepage sketch&lt;/h3&gt;
&lt;p&gt;First, I wanted to create a fractal. They have always fascinated me, whether in code or in nature. There are a lot of fractals to choose from in 2D, but in 3D they&apos;re kind of hard. The only one that I could wrap my head around quickly was the Menger sponge.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./menger.jpg&quot; alt=&quot;Menger Sponge Fractal&quot; title=&quot;The 1st homepage sketch: 160 000 cubes forming a Menger sponge fractal&quot;&gt;&lt;/p&gt;
&lt;p&gt;After adding a bit of instancing magic, there it was. 60fps and all, except boring to look at. I tucked that code away and turned my attention to another piece of Math &amp;#x26; Magic that I had wanted to play with: attractors.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./nose-hoover.jpg&quot; alt=&quot;The Nosé-Hoover Attractor&quot; title=&quot;The 2nd homepage sketch: Cubes along a Nosé-Hoover attractor&quot;&gt;&lt;/p&gt;
&lt;p&gt;Despite running at 60fps it &quot;felt&quot; sluggish and became boring to look at.&lt;/p&gt;
&lt;p&gt;The final attempt at &lt;del&gt;shoehorning&lt;/del&gt; adding 3D graphics to this is what you can see on the homepage now.&lt;/p&gt;
&lt;h2&gt;Gatsby wish list&lt;/h2&gt;
&lt;p&gt;As with most things in development, there were a few surprises along the way, so here&apos;s my wish list for the Gatsby team:&lt;/p&gt;
&lt;h3&gt;Become evergreen by default&lt;/h3&gt;
&lt;p&gt;I wish Gatsby&apos;s relationship with older browsers was an &quot;opt-in&quot; one as opposed to &quot;opt-out.&quot; I prefer a lean website out of the box, with features like WebP enabled and Polyfills removed by default. I would rather &lt;em&gt;add&lt;/em&gt; backwards compatibility if necessary. (Right now you have to disable polyfills.)&lt;/p&gt;
&lt;h3&gt;Disparity in plugin quality&lt;/h3&gt;
&lt;p&gt;Gatsby makes it easy to find plugins, and to know which ones are maintained by the core team. Despite this, there is a &lt;em&gt;huge&lt;/em&gt; variance in the quality of the non-official plugins. I wish more things were parsed out of the plugin repository (like the number of open issues without a response) as some are still referenced despite deal-breaker issues.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-3&quot; id=&quot;user-content-fnref-3&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h3&gt;Telemetry&lt;/h3&gt;
&lt;p&gt;That should &lt;strong&gt;&lt;em&gt;absolutely&lt;/em&gt;&lt;/strong&gt; be disabled by default from the stable release.&lt;/p&gt;
&lt;p&gt;I understand the idea, but knowing that a seemingly innocuous CLI might transmit data when I&apos;m not explicitly asking it to is &lt;em&gt;scary&lt;/em&gt;, and sets a dangerous precedent. The logs may be &quot;anonymised&quot; but doing this is &lt;a href=&quot;https://protonmail.com/blog/truth-about-anonymized-data/&quot;&gt;extremely&lt;/a&gt; &lt;a href=&quot;https://gdpr.eu/data-anonymization-taxa-4x35/&quot;&gt;hard&lt;/a&gt; and a waste of time.&lt;/p&gt;
&lt;p&gt;If it&apos;s not disabled by default, then &quot;How to opt-out of telemetry&quot; should at the very least be part of the kick-start tutorial (like VSCode does) and not &lt;a href=&quot;https://www.gatsbyjs.org/docs/telemetry/&quot;&gt;buried&lt;/a&gt; in the documentation. I would even argue that the CLI should ask for again permission every once in a while.&lt;/p&gt;
&lt;h3&gt;Drop React altogether in favour of Preact.&lt;/h3&gt;
&lt;p&gt;I can only hope. I understand why Gatsby wants to to be compatible with all the existing React packages. But in my opinion you don&apos;t need that in a static-site generator. People won&apos;t use &lt;code&gt;react-emoji-picker&lt;/code&gt; in a Gatsby site. They need their website to be fast and lightweight.&lt;/p&gt;
&lt;p&gt;For now, I&apos;m thankful that the Preact plugin exists and is supported by the core team.&lt;/p&gt;
&lt;h3&gt;Final words&lt;/h3&gt;
&lt;p&gt;On top of everything mentioned above, I wrote scripts, GraphQL queries, learned about CSS grids, Exif data, and more. I feel like I&apos;ve come out of it as a better coder.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;h2 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Here&apos;s a rocket 🚀. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-2&quot;&gt;
&lt;p&gt;Mikola, the creator of Regl, even moved off-grid to a lava field at one point and no problem happened. &lt;a href=&quot;#user-content-fnref-2&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;user-content-fn-3&quot;&gt;
&lt;p&gt;Let me say it loud and clear: People are &lt;em&gt;not&lt;/em&gt; obligated to maintain everything they create. I&apos;m just asking Gatsby to help me identify which plugins are in fact, maintained. &lt;a href=&quot;#user-content-fnref-3&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 3&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</content:encoded></item><item><title>New Website!</title><link>https://alvin.codes/writing/hello-world/</link><guid isPermaLink="true">https://alvin.codes/writing/hello-world/</guid><description>Motivations and goals for this personal website.</description><pubDate>Fri, 25 Sep 2020 10:30:00 GMT</pubDate><content:encoded>&lt;p&gt;Let me start with this: Welcome!
This site has been in the works for a while. It was hard. Knowing what you want to be seen as, what you represent took a fair bit of self-reflection. I had a lot of fun and learnt a ton along the way.&lt;/p&gt;
&lt;p&gt;Personal websites are on the rise this year, and that&apos;s a blessing and a curse. More inspiration means more creative energy, but also more points of comparison and higher standards.&lt;/p&gt;
&lt;p&gt;So, here are the motivations behind this website.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toc&quot;&gt;from-heading: 1
to-heading: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Balancing the fun and the functional&lt;/h2&gt;
&lt;p&gt;I love computer graphics and WebGL, and have been playing with them for a while, but there was a problem: Written content. So far, I&apos;ve not seen a graphics-rich site that also offers a pleasant reading experience and good progressive enhancement. (If you have, send me links &lt;a href=&quot;https://alv.sh/twitter&quot;&gt;on Twitter&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This was my loose list of requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It works without JavaScript (including the hamburger menu!)&lt;/li&gt;
&lt;li&gt;I can play around with 3D graphics&lt;/li&gt;
&lt;li&gt;There&apos;s a dark mode&lt;/li&gt;
&lt;li&gt;It respects your motion preferences&lt;/li&gt;
&lt;li&gt;Recognisable and colourful branding&lt;/li&gt;
&lt;li&gt;Fun!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So far I think these have been met, but feel free to let me know if you think otherwise.&lt;/p&gt;
&lt;h2&gt;Owning your platform&lt;/h2&gt;
&lt;p&gt;Content ownership is the crux of the argument for personal websites. I&apos;d like to think that&apos;s why people are moving away from Medium, they want to own their community and their platform. Or it could just be the terrible mobile experience, there&apos;s that too.&lt;/p&gt;
&lt;p&gt;I plan to use this shiny new site to write about this more, but in short:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(•_•)
&amp;#x3C;)   )╯ Always
/    \

\(•_•)
(    (&gt;  Own
/    \

(•_•)
&amp;#x3C;)   )&gt;  Your Platform
/    \
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hat tip to &lt;a href=&quot;https://www.seanblanda.com/&quot;&gt;Sean Blanda&lt;/a&gt; for &lt;a href=&quot;https://www.alwaysownyourplatform.com/&quot;&gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Spreading the word&lt;/h2&gt;
&lt;p&gt;I&apos;m a talker. I never miss a good discussion and &lt;del&gt;pre-2020&lt;/del&gt; would stay past late at a pub when in the middle of a great conversation. You already see the problem there. Late in a crowded, dark place with David Hasselhoff blaring on speakers isn&apos;t ideal for good thinking.&lt;/p&gt;
&lt;p&gt;As a &lt;em&gt;personal&lt;/em&gt; website, I want to use this to pause, refine, and structure thoughts and opinions. Try to, you know, help move the needle. Does &quot;Inspire change&quot; sound cliché? Yes, moving along...&lt;/p&gt;
&lt;p&gt;There&apos;s also a practical benefit. It&apos;s much better to send a link to an article as opposed to re-writing the same answers when they come up randomly in Slack channels. I have 7 channels open right now, thanks for asking. That&apos;s too many.&lt;/p&gt;
&lt;h2&gt;Relevant &amp;#x26; long-term content&lt;/h2&gt;
&lt;p&gt;Our industry moves at a crazy pace. It&apos;s one of the reasons that prevented me from writing more in the past. There was a seemingly-endless number of articles that I could write, wanted to write, but knew would be irrelevant in a year.&lt;/p&gt;
&lt;p&gt;Now I want to focus on evergreen posts that should remain relevant for &lt;em&gt;at least&lt;/em&gt; 3 years after publication. Think of &lt;a href=&quot;https://v5.jasonsantamaria.com/articles/all-the-domains/&quot;&gt;All the Domains&lt;/a&gt; as opposed to &quot;How to do x in Angular v2.&quot;
I give you permission to hold me accountable to this longevity statement. Please don&apos;t create automatic reminders for that though.&lt;/p&gt;
&lt;h3&gt;Closing remarks&lt;/h3&gt;
&lt;p&gt;Thank you for taking the time to read this. If you feel like it, I would love any kind of feedback that could help improve this.&lt;/p&gt;
&lt;p&gt;Stay tuned for more.&lt;/p&gt;
&lt;p&gt;Alvin&lt;/p&gt;</content:encoded></item><item><title>2019 in Review</title><link>https://alvin.codes/writing/2019-in-review/</link><guid isPermaLink="true">https://alvin.codes/writing/2019-in-review/</guid><description>Another year in review. It&apos;s been a unique year in many respects.</description><pubDate>Tue, 31 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Another year in review. It&apos;s been a unique year in many respects. There were many changes, new adventures, and unexpected discoveries.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toc&quot;&gt;from-heading: 1
to-heading: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Brexit&lt;/h2&gt;
&lt;p&gt;It&apos;s been a roller-coaster for me and others whose lives have been uprooted or greatly influenced by Brexit.
It was all very different when I left for Canada. Back then, a potentially no-deal-inducing deadline was coming: March 31. Then it didn&apos;t work, we got 15 extra days to 14 April, then, &lt;em&gt;finally&lt;/em&gt; another year of respite.&lt;/p&gt;
&lt;p&gt;Today, sadly, Boris Johnson is the Prime Minister, the withdrawal argument was signed. The UK is entering the transition period to exit in January 2021.&lt;/p&gt;
&lt;p&gt;The only certainty is that a Norway-style Brexit won&apos;t happen. Otherwise, it&apos;s as up-in-the-air as it&apos;s ever been. We&apos;ll keep waiting, with our futures in the balance.&lt;/p&gt;
&lt;h2&gt;Lived in Canada&lt;/h2&gt;
&lt;p&gt;There is a lot to this. It&apos;s still too early to paint a good picture of it. I&apos;m still crystallising my thoughts on this subject.&lt;/p&gt;
&lt;h2&gt;Discovered Radio Drama&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/writing/audio-drama&quot;&gt;Dedicated blog post&lt;/a&gt; coming one day. They&apos;re amazing.&lt;/p&gt;
&lt;h2&gt;Goal tracking&lt;/h2&gt;
&lt;p&gt;Thanks to a wonderful episode of &lt;a href=&quot;https://syntax.fm&quot;&gt;Syntax.fm&lt;/a&gt; I started tracking goals and setting monthly targets for myself. My partner also adopted it.&lt;/p&gt;
&lt;p&gt;This gradually evolved into a solidified set of principles that I apply to a lot of things. It really helped me with various aspects of my life.&lt;/p&gt;
&lt;h2&gt;Best of 2019&lt;/h2&gt;
&lt;h3&gt;🎥 Cinema&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Avengers: Endgame&lt;/strong&gt;: We saw it on release day and got a giant pizza. I&apos;ve never seen a multiplex cinema so packed. During the film everyone cheered, clapped, celebrated, cried, all of it. Best audience experience in my entire life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blinded by the light&lt;/strong&gt;: As timely as it could be, and very well done. Some poignant and powerful cinematic shots that will stay with me for a long time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Song of the sea&lt;/strong&gt;: Just stunning. As a bonus you&apos;ll know how to pronounce Saoirse after watching it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to Train Your Dragon 3&lt;/strong&gt;: Interestingly, I thought this movie came out in 2018, it feels like a long time ago now. Let me say that the &lt;em&gt;How to Train your Dragon&lt;/em&gt; franchise is one of my favourites. These were the animated films that made me feel the strongest emotions in the past few years. I would take a Dragon&apos;s film over a Pixar if given the choice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Loving Vincent&lt;/strong&gt;: It’s incredible, every frame is hand-painted! Watching it doesn’t feel as weird as the trailer because a lot of scenes are black-and-white, which is easier on your eyes.&lt;/p&gt;
&lt;h3&gt;Artists&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Smith &amp;#x26; Thell&lt;/strong&gt; — A mix of &lt;em&gt;The Civil War&lt;/em&gt;, &lt;em&gt;Of Monsters Men&lt;/em&gt; and &lt;em&gt;The Lumineers&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;🎙️ Podcast&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Sam Harris #147 — Stephen Fry&lt;/strong&gt;: Listen &lt;a href=&quot;https://samharris.org/podcasts/147-stephen-fry/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sam Harris #163 — Ricky Gervais&lt;/strong&gt;: Listen &lt;a href=&quot;https://samharris.org/podcasts/163-ricky-gervais/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Syntax.fm #67 — Goal Setting&lt;/strong&gt;: Listen &lt;a href=&quot;https://syntax.fm/show/067/hasty-treat-goal-setting&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Podcraft — The 10 Commandments of Podcasting&lt;/strong&gt;: Listen &lt;a href=&quot;https://www.thepodcasthost.com/podcraft-podcast/10-commandments-of-podcasting/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Resolutions&lt;/h2&gt;
&lt;p&gt;Update 2020: It now pains me to read these, so I&apos;ve removed them.&lt;/p&gt;</content:encoded></item><item><title>2018 in Review</title><link>https://alvin.codes/writing/2018-in-review/</link><guid isPermaLink="true">https://alvin.codes/writing/2018-in-review/</guid><description>I write this review well into 2019 already, but who cares? This is mainly for myself, but I enjoy reading these and you probably do too.</description><pubDate>Sun, 10 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One night, while sipping a drink on the couch with friends, discussing the plays and musicals of the West End that I had enjoyed most, it struck me. Just &lt;em&gt;how much&lt;/em&gt; I relied on memory for life events and experiences.&lt;/p&gt;
&lt;p&gt;So here I am, writing my first year in review.&lt;/p&gt;
&lt;p&gt;We&apos;re well into 2019 already, but who cares? This is mainly for myself, but I enjoy reading these and you probably do too.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-toc&quot;&gt;from-heading: 1
to-heading: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;A fair bit of travelling&lt;/h2&gt;
&lt;p&gt;We visited 2 new countries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Romania&lt;/li&gt;
&lt;li&gt;Switzerland&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And a few new cities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New York&lt;/li&gt;
&lt;li&gt;Boston&lt;/li&gt;
&lt;li&gt;Glasgow&lt;/li&gt;
&lt;li&gt;Amsterdam&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was particularly intense between May and September, when we were on a plane about once a month, a first time for us.&lt;/p&gt;
&lt;h3&gt;🗽 New York City&lt;/h3&gt;
&lt;p&gt;My first time in New York was definitely something to remember, so much that it warrants its own section here. The epic moments were as epic as predicted, but I was not prepared to see the current state of America&apos;s infrastructure.&lt;/p&gt;
&lt;p&gt;After hearing about it as a paradise unlike any other place, I did not expect to see so many trash bags on sidewalks, decrepit buildings, and ancient public transports.&lt;/p&gt;
&lt;p&gt;I would never have thought that visiting NYC would make me appreciate London more. A lot more, in fact.&lt;/p&gt;
&lt;p&gt;A colleague once told me that &quot;America is like a third-world country for public transport&quot;. I assumed it was an exaggeration, but I can tell you that it was definitely less than a third of what I expected.&lt;/p&gt;
&lt;p&gt;Now, don&apos;t get me wrong, except for some parts that really didn&apos;t hold up to the standards I was expecting, it &lt;em&gt;is&lt;/em&gt; unlike any other place.
Despite all that, there&apos;s a buzz, a vibrancy, something exceptional there.
I am looking forward to visiting again.&lt;/p&gt;
&lt;h2&gt;A lot of conference talks&lt;/h2&gt;
&lt;p&gt;I was on a plane or a train for a presentation at least once every other month between September 2017 and July 2018 😵. This was the year with the highest number of conference talks for me, I gave 5 talks between March and July, and there were all new, very different presentations touching on several subjects. No slide decks were reused.&lt;/p&gt;
&lt;p&gt;It was exciting, stressful, tiring, nerve-wracking, and surreal.&lt;/p&gt;
&lt;p&gt;Speaking in front of a large audience at respected tech conferences was also an important milestone for me and I am glad it worked out the way it did. These events were responsible for very happy moments that will stay with me for a long time.&lt;/p&gt;
&lt;h2&gt;Moved to Canada 🇨🇦&lt;/h2&gt;
&lt;p&gt;Oh, boy, what an emotional roller-coaster that was.&lt;/p&gt;
&lt;p&gt;From the moment our visas started progressing to the moment we touched the ground, there was always something in the back of our minds that was causing us stress.&lt;/p&gt;
&lt;p&gt;We&apos;re glad it&apos;s over, and will wait to see the four seasons before forming an opinion.&lt;/p&gt;
&lt;p&gt;The winter is, different, but there&apos;s something to be said about the sun &lt;strong&gt;not&lt;/strong&gt; setting at 3.30pm.&lt;/p&gt;
&lt;h2&gt;Started listening to podcasts&lt;/h2&gt;
&lt;p&gt;There&apos;s always a bit of a balance when choosing what to include in these kind of posts. Podcasts have had a very positive and far-reaching impact on my daily life, and filled a void that existed but couldn&apos;t really be comprehended.&lt;/p&gt;
&lt;p&gt;The very first podcasts that I actually listened to somewhat regularly (probably once a week) were &lt;a href=&quot;http://www.unfinished.bz/&quot;&gt;Unfinished Business&lt;/a&gt;, &lt;a href=&quot;https://shoptalkshow.com/&quot;&gt;Shop Talk Show&lt;/a&gt; and &lt;a href=&quot;https://happymonday.simplecast.fm/&quot;&gt;Happy Monday&lt;/a&gt;, back in 2014, before that industry was as big as it is today. Does that make me a podcast hipster? Maybe.&lt;/p&gt;
&lt;p&gt;But then I stopped pretty quickly, because I made the stupid mistake to try to listen to them at work, and couldn&apos;t (still can&apos;t) listen to something that requires my attention while doing anything work-related.&lt;/p&gt;
&lt;p&gt;So, why now ?&lt;/p&gt;
&lt;p&gt;I get bored &lt;em&gt;very&lt;/em&gt; quickly, which is the reason why I never enjoyed running, after 20 minutes or so, my attention falters, even if my body can keep up, I just want to do something else.&lt;/p&gt;
&lt;p&gt;It&apos;s only this year that I realised that mindless tasks were &lt;em&gt;perfectly&lt;/em&gt; suited for this, and podcasts are now my companion for many, &lt;em&gt;many&lt;/em&gt; activities, ranging from shopping to household chores.&lt;/p&gt;
&lt;p&gt;This also obviously made walking more than 20 minutes for something mundane (like going to the post office) annoying, but not anymore. I am now looking forward to walking places, excited about what the next podcast would teach me.&lt;/p&gt;
&lt;p&gt;Thanks to podcasts, I feel smarter, more informed, more connected with the world, and less alone in a busy street or shop.&lt;/p&gt;
&lt;p&gt;I will also be forever grateful to JO for introducing me to the &quot;intellectual dark web.&quot;&lt;/p&gt;
&lt;h2&gt;Best of 2018&lt;/h2&gt;
&lt;h3&gt;🎥 Cinema&lt;/h3&gt;
&lt;p&gt;Oh, there were a lot of great films this year, but two definitely stood out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Avengers, Infinity war&lt;/strong&gt;: Immensely anticipated, it&apos;s start of the conclusion of years of great Marvel movies, the action and the pace was great, and the visuals too, and the shock that everyone was left with at the end.&lt;/p&gt;
&lt;p&gt;The cinema room was &lt;em&gt;silent&lt;/em&gt; during the first credits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Greatest Showman&lt;/strong&gt;: Weirdly, I wasn&apos;t super excited about this one initially, until someone from my family wholeheartedly recommended it.&lt;/p&gt;
&lt;p&gt;I started looking into it a bit more, and realised that &lt;em&gt;none other&lt;/em&gt; than Pasek &amp;#x26; Paul were behind the music. Needless to say, I watched it not long after. It&apos;s definitely the film that made me feel the strongest emotions this year.&lt;/p&gt;
&lt;h3&gt;🎙️ Songs&lt;/h3&gt;
&lt;p&gt;2018 was a very interesting year for me musically, I definitely took the time to explore more genres.&lt;/p&gt;
&lt;p&gt;Without a doubt, the best song that I discovered in 2018 was:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Waving Through the Window&lt;/strong&gt; — Pasek &amp;#x26; Paul for Dear Evan Hansen&lt;/p&gt;
&lt;p&gt;This song has grace, power, and and incredible amount of depth as it depicts the world of someone with social anxiety.&lt;/p&gt;
&lt;p&gt;I cannot wait to see the musical, it&apos;s definitely at the top of my list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;These Days&lt;/strong&gt; — Rudimental with Jess Glynne, Macklemore &amp;#x26; Dan Caplen&lt;/p&gt;
&lt;p&gt;A story of transition into adulthood, broken dreams and the one that got away, told using a very unusual mix of styles.&lt;/p&gt;
&lt;p&gt;I describe this song as &quot;The &lt;em&gt;Closer&lt;/em&gt; of 2018.&quot; As Billboard said in 2016, it manages to &quot;capture the millennial zeitgeist in brilliantly infectious fashion.&quot;&lt;/p&gt;
&lt;h3&gt;Artists&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Sara Bareilles&lt;/strong&gt; — I learned how to play the main turnaround of &lt;em&gt;Love Song&lt;/em&gt; a long time ago, but my knowledge of her repertoire was limited to this song and &lt;em&gt;King of Anything&lt;/em&gt;, which are great catchy songs.&lt;/p&gt;
&lt;p&gt;It&apos;s only during this year that I discovered the full extent of her work, from the score of Waitress to an autobiographical book. (Which is best enjoyed as an &lt;a href=&quot;/books/sounds-like-me/&quot;&gt;audiobook narrated and sung by Sara&lt;/a&gt;, obviously).&lt;/p&gt;
&lt;p&gt;I find myself always coming back to the &quot;soothing end&quot; of her work, with &lt;em&gt;Manhattan&lt;/em&gt;, &lt;em&gt;She Used to be mine&lt;/em&gt; and &lt;em&gt;Gravity&lt;/em&gt; becoming regular companions of nightly walks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Foy Vance&lt;/strong&gt; — I had heard his name because he was collaborating with Ed Sheeran a while back. The fact that there is a &lt;em&gt;Foy Vance&lt;/em&gt; and a &lt;em&gt;Vance Joy&lt;/em&gt; in my playlists was certainly noteworthy (yes, that&apos;s a one-letter difference).&lt;/p&gt;
&lt;p&gt;Some of this solo guitar work did not inspire me as much, but his piano songs are astonishing. &lt;em&gt;Bangor Town&lt;/em&gt; is a beautiful display of raw talent.&lt;/p&gt;
&lt;h2&gt;Resolutions&lt;/h2&gt;
&lt;p&gt;It&apos;s a bit unfair to talk about new years resolutions now that we&apos;re 20% into 2019, but during the mandatory conversation on New Year&apos;s Eve, this is what I recall mentioning.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fitness&lt;/strong&gt;: I&apos;m still a long way from being satisfied on that front, and Canada made it unbelievably harder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Communication&lt;/strong&gt;: Whether it&apos;s written or spoken, it&apos;s been clear that I need to work on it, let&apos;s make it a priority this year.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What an incredible period of time this has been, now this is March 2019 already, so I&apos;ll see you all next time 👋&lt;/p&gt;</content:encoded></item><item><title>Weak References in JavaScript</title><link>https://alvin.codes/writing/weak-references-in-js/</link><guid isPermaLink="true">https://alvin.codes/writing/weak-references-in-js/</guid><description>Looking at Weak and Strong references in JavaScript. It&apos;s a concept front-end developers are not used to.</description><pubDate>Wed, 11 May 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ES6 introduced &lt;code&gt;WeakMaps&lt;/code&gt; and &lt;code&gt;WeakSets&lt;/code&gt;, which brings weak and strong references to JavaScript, a concept front-enders are not particularly used to.
If you&apos;re working on games, you have to pay very close attention to how memory and performance is managed.&lt;/p&gt;
&lt;p&gt;I&apos;m using &lt;code&gt;WeakMap&lt;/code&gt; here as an example, but it&apos;s the same for &lt;code&gt;WeakSet&lt;/code&gt; too. The main difference between &lt;code&gt;Map&lt;/code&gt; and &lt;code&gt;Set&lt;/code&gt; is that the latter only keeps unique values.&lt;/p&gt;
&lt;p&gt;According to Wikipedia:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In computer programming, a weak reference is a reference that does not protect the referenced object from collection by a garbage collector, unlike a strong reference.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That actually, surprisingly, makes a lot of sense! Wikipedia got me used to definitions like &lt;code&gt;Coroutines are computer program components that generalize subroutines for non-preemptive multitasking by allowing execution to be suspended and resumed&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Alright, what a &lt;code&gt;WeakMap&lt;/code&gt; does, compared to a good old &lt;code&gt;Map&lt;/code&gt; or &lt;code&gt;{}&lt;/code&gt; is each individual key element in the set can be garbage-collected when they are not referenced somewhere else:&lt;/p&gt;
&lt;p&gt;If this is the content of a regular &lt;code&gt;Map&lt;/code&gt; / &lt;code&gt;{}&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const bigObject = {
  id: &apos;spritesheet-1&apos;,
  data: [
    /* gigantic array with a lot of stuff */
  ],
  description: &apos;hello bla bla&apos;,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And you&apos;re only using it in the code like this&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const spritesheetID = bigObject.id;
// the gigantic array in myMap.data is in memory
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;em&gt;whole object&lt;/em&gt; and the gigantic array will remain in memory and will &lt;em&gt;not&lt;/em&gt; be CGed until it or its references are destroyed.&lt;/p&gt;
&lt;p&gt;Whereas if you use a weak map anything that isn&apos;t being used in your program will be garbage-collected.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// create a WeakMap from the big object
const weakMap = new WeakMap(Object.entries(bigObject));

// gigantic array is garbage-collected
const spritesheetID = weakMap.get(&apos;id&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you could manually &lt;code&gt;delete&lt;/code&gt; the keys of the object that you don&apos;t use, but this trick saves you having to keep track of your usage because this isn&apos;t C++.&lt;/p&gt;
&lt;p&gt;People have also found other ways to use this with promises and more in &lt;a href=&quot;http://stackoverflow.com/questions/29413222/what-are-the-actual-uses-of-es6-weakmap&quot;&gt;this Stackoverflow thread&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That&apos;s all for this post, it&apos;s a simple concept but needed clarification for me so I thought I might as well share it.&lt;/p&gt;</content:encoded></item></channel></rss>