<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Thor Galle</title><description>Thor&apos;s posts and &quot;now&quot; entries.</description><link>https://thorgalle.me/</link><language>en</language><copyright>cc-by-nc-nd 4.0 | 2026 | Thor Galle</copyright><item><title>Now - July 20, 2026</title><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Family:&lt;/strong&gt; At the end of 2025, I became the dad of a very cute and energetic little boy! Taking care of him is getting more fun by the week, but it&amp;#39;s also the reason I haven&amp;#39;t logged much here &lt;em&gt;*checks notes*&lt;/em&gt; for more than a year.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Today&amp;#39;s big thing:&lt;/strong&gt; For the last ~4 months, I&amp;#39;ve started using agentic AI for programming, both personally and professionally. I think I&amp;#39;m in the late majority of active users? I&amp;#39;m AI-positive despite some reservations, and my attitude towards it has been shifting over the last year. It&amp;#39;s something to write more about soon.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WTMG:&lt;/strong&gt; Our work at WTMG is riding a ever-growing wave of community activity, which is motivating. We&amp;#39;ve been shipping meaningful improvements in the last months, most notably an Android/iOS app. Also, check out this cool new map that shows where you can travel with WTMG! &lt;a href=&quot;https://welcometomygarden.org/every15km&quot;&gt;https://welcometomygarden.org/every15km&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Projects:&lt;/strong&gt; Being a fairly fresh dad has taken a toll on the time I have available for projects, but AI is changing what I can do with the little time I do find. I&amp;#39;ve been tooling on this website and on Readup. I hope to report more on this soon!&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><link>https://thorgalle.me/now/2026/07/20</link><guid isPermaLink="false">/now/2026/07/20</guid></item><item><title>Apple’s latest petulant reaction to the DMA</title><description>Apple recently released the second iteration of their reaction to DMA concerns after continued fines. I&apos;m not too impressed. </description><pubDate>Sat, 28 Jun 2025 14:23:04 GMT</pubDate><content:encoded>&lt;p&gt;Two days ago, in reaction to a &lt;a href=&quot;https://ec.europa.eu/commission/presscorner/detail/en/ip_25_1085&quot; rel=&quot;noreferrer&quot;&gt;€500 EU DMA fine from April&lt;/a&gt;, Apple updated their &lt;a href=&quot;https://developer.apple.com/support/communication-and-promotion-of-offers-on-the-app-store-in-the-eu/&quot; rel=&quot;noreferrer&quot;&gt;rules for external payments&lt;/a&gt; in EU App Store storefronts, among &lt;a href=&quot;https://developer.apple.com/support/dma-and-apps-in-the-eu/#payment-options&quot; rel=&quot;noreferrer&quot;&gt;other changes&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;the-reason-for-the-fine&quot;&gt;The reason for the fine&lt;/h2&gt;&lt;p&gt;But why were they fined in the first place? Quoting from the fine announcement, this is what they should have allowed, in a nutshell:&lt;/p&gt;&lt;blockquote&gt;Under the DMA, app developers distributing their apps via Apple&apos;s App Store should be able to inform customers, free of charge, of alternative offers outside the App Store, steer them to those offers and allow them to make purchases.&lt;/blockquote&gt;&lt;p&gt;The problem; in January last year, Apple introduced their first set of changes to supposedly comply with the EU DMA regulation. The changes &quot;allowed&quot; external payments providers, but extra fees of 10-27% and reporting requirements made them barely financially interesting for developers. Additionally, they enforced scary-looking intermediate screens and restrictions that made external payment systems look unappealing to end-users. &lt;/p&gt;&lt;figure class=&quot;kg-card kg-image-card kg-card-hascaption&quot;&gt;&lt;img src=&quot;https://thorgalle.me/_astro/CleanShot-2025-06-27-at-17.09.37@2x_1kMpXl.webp&quot; class=&quot;kg-image&quot; alt=&quot;Left scare screen title: This app doesn&apos;t support the App Store&apos;s private and secure payment system. Right title: You&apos;re about to go to an external website. Apple is not responsible for the privacy or security of purchases made on the web.&quot; loading=&quot;lazy&quot; width=&quot;1416&quot; height=&quot;1310&quot; srcset=&quot;https://thorgalle.me/_astro/CleanShot-2025-06-27-at-17.09.37@2x_Z1n9KHu.webp 600w, https://thorgalle.me/_astro/CleanShot-2025-06-27-at-17.09.37@2x_ZgXfbI.webp 1000w, https://thorgalle.me/_astro/CleanShot-2025-06-27-at-17.09.37@2x_1kMpXl.webp 1416w&quot; sizes=&quot;(min-width: 720px) 720px&quot;&gt;&lt;figcaption&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;Scare screens before the updates. Left: when using another payment provider in-app. Right: when linking out to a payment flow on another website&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Finally, they also lowered the (artificially high) prices of their own integrated payment flows in EU storefronts in order to out-compete the new external payment options before they were even established.&lt;/p&gt;&lt;p&gt;Needless to say, the EU did not like it.&lt;/p&gt;&lt;h2 id=&quot;the-recent-changes&quot;&gt;The recent changes&lt;/h2&gt;&lt;p&gt;Did Apple solve the problem two days ago, and does it now comply with the spirit of the DMA? I don&apos;t think so.&lt;/p&gt;&lt;p&gt;They made an already complex situation even more hideously complicated.&lt;/p&gt;&lt;p&gt;There are some improvements for developers, but they carry sizable grains of salt:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If you&apos;re OK with tanking your app&apos;s discoverability potential in the App Store, and with disabling automatic app updates for users, you may save some of Apple&apos;s fees, thanks to a &lt;a href=&quot;https://developer.apple.com/help/app-store-connect/reference/store-services-tiers&quot; rel=&quot;noreferrer&quot;&gt;new and degraded &quot;Store Services Tier 1&quot;&lt;/a&gt; option with lower costs.&lt;/li&gt;&lt;li&gt;It looks like you can now communicate about alternative payment options &lt;em&gt;for free&lt;/em&gt; everywhere in-app, as long they are not &quot;actionable&quot; links. (I’m not entirely sure about this, I’m taking this conclusion from the exclusion from fees for non-actionable links in the &lt;em&gt;“StoreKit External Purchase Link Entitlement (EU)&amp;nbsp;Addendum”&lt;/em&gt;).&lt;/li&gt;&lt;li&gt;If you&apos;re not a small business who is exempt from these fees anyway, and you have users who have long-running subscriptions, or who make payments after 6 months, you may save 2% &quot;Initial acquisition fee&quot; after 6 month&apos;s of a user&apos;s usage.&lt;/li&gt;&lt;li&gt;Strict design and reporting restriction on outbound links URLs got lifted. &lt;/li&gt;&lt;li&gt;The warning screens for linking out look considerably less scary, to the point of almost being neutral (see below).&lt;/li&gt;&lt;/ul&gt;&lt;figure class=&quot;kg-card kg-image-card kg-card-hascaption&quot;&gt;&lt;img src=&quot;https://thorgalle.me/_astro/image_1CxRPs.webp&quot; class=&quot;kg-image&quot; alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;471&quot;&gt;&lt;figcaption&gt;&lt;span style=&quot;white-space: pre-wrap;&quot;&gt;The new intermediate screens before Apple allows you to link out.&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;However, the large picture remains the same:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Apple keeps charging significant fees of 10-20% and asks for complex procedures to integrate external payment flows, which combined with the fees of external payment providers, makes the option barely competitive with Apple&apos;s own offering.&lt;/li&gt;&lt;li&gt;Apple keeps its petulant attitude towards EU regulation. They clearly don’t want to engage in good faith to create a level playing field for app distribution &amp;amp; monetization. They propose hideously complex schemes and degraded experiences as a countermeasure to losing the profits stemming from their ecosystem power. &lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;meanwhile-in-the-us&quot;&gt;Meanwhile in the US&lt;/h2&gt;&lt;p&gt;Just one month ago, developers of apps for the US storefront got a much better and simpler deal last month thanks to a &lt;a href=&quot;https://techcrunch.com/2025/05/02/apple-changes-us-app-store-rules-to-let-apps-redirect-users-to-their-own-websites-for-payments/&quot; rel=&quot;noreferrer&quot;&gt;judge&apos;s angered reaction&lt;/a&gt; to Apple&apos;s non-compliant behavior after a ruling in the Epic Games v. Apple lawsuit. Today, in the US, linking out to other payment providers, &lt;em&gt;with clickable &amp;amp; actionable links&lt;/em&gt;, is simply allowed, without extra fees or restrictions. Spotify &lt;a href=&quot;https://newsroom.spotify.com/2025-05-01/following-landmark-court-ruling-spotify-submits-new-app-update-to-apple-to-benefit-u-s-consumers/&quot; rel=&quot;noreferrer&quot;&gt;immediately made grateful use&lt;/a&gt; of this new provision.&lt;/p&gt;&lt;h2 id=&quot;my-take-on-all-this&quot;&gt;My take on all this&lt;/h2&gt;&lt;p&gt;I’ve been following the related interactions between Apple and regulators in the last years, and as you might have noticed, I fall in the camp that supports the intent of the DMA and equivalent ideas around the world.&lt;/p&gt;&lt;p&gt;Apple and Google, but mostly Apple, have too much power over all aspects of their respective ecosystems. They hold de facto monopolies over the huge markets established by their mobile operating systems. Markets which were perhaps niche and innovative 15 years ago have today become essential to the service industry globally.&lt;/p&gt;&lt;p&gt;I understand that they are owed some fee for providing their services and platforms, but until now, they have been able to charge whatever they want, raking in enormous profits. They charge fees on all sides: large markups on their devices (or Google Service licenses in the case of Android), one-time fees for developers, and commissions on all transactions related to apps. They have also established strong ecosystem lock-in effects which makes it nearly impossible for other marketplaces, operating systems, and payment service providers to enter the market. The result: less innovation from third-party developers and higher costs for consumers.&lt;/p&gt;&lt;p&gt;Regulatory force is warranted to open up these ecosystems for the public good.&lt;/p&gt;&lt;p&gt;Ethically, I’d compare it to the concept of a patent. A patent allows a company to profit exclusively from an innovation for a limited period of time (20 years or so), but after that, it is opened up so the world can freely build upon the innovation. Apple and Google should be given credit for having established these markets, and they have received plenty. Now, they need to give space for new ideas to flourish.&lt;/p&gt;&lt;p&gt;In this fight with the EU regulation, they seem to be testing boundaries, decreasing their defenses against profit loss just enough to hopefully be deemed compliant on paper, but not actually caring to help establish a competitive market for apps &amp;amp; app services.&lt;/p&gt;&lt;h2 id=&quot;the-right-direction&quot;&gt;The right direction?&lt;/h2&gt;&lt;p&gt;In a competitive marketplace, sideloading apps and using alternative payment providers should be allowed to be as easy, convenient and affordable as using the default ones, or better. The fees and procedures that Apple continues to impose still don’t make this a reality. Therefore, I’m not convinced Apple will avoid another fine this time around.&lt;/p&gt;&lt;p&gt;Whatever the final outcome though, we can state that the process is painful.&lt;/p&gt;&lt;p&gt;At &lt;a href=&quot;https://welcometomygarden.org&quot; rel=&quot;noreferrer&quot;&gt;WTMG&lt;/a&gt;, we’ve been planning to build a new mobile app. I’d personally like to support the intent of the DMA by making use of the alternative options it has helped create, but this is not an easy decision. Apple tries its utter best to make alternative options look as unappealing as possible for all parties involved. Moreover, the rules are a moving target due to the legal back &amp;amp; forth, which does not help to make a go-to-market plan, especially for a super small team like us. &lt;/p&gt;&lt;p&gt;Small steps were taken in the right direction however. On the alternative marketplaces side, promising changes seem to be coming early next year, which will make them easier to use. I hope that with more dialogue (and perhaps fines), Apple will eventually concede to its responsibilities.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2025/apples-latest-petulant-reaction-to-the-dma</link><guid isPermaLink="false">/posts/2025/apples-latest-petulant-reaction-to-the-dma</guid></item><item><title>Now - January 23, 2025</title><pubDate>Thu, 23 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;We moved countries! 🚚&lt;/strong&gt;: a lot has happened since I last logged something here. At the end of November, we moved from Finland to Belgium. It became a tumultuous multi-day undertaking despite long preparations, but luckily we could count on the support of a handful of great friends, who I want to warmly thank once again! 🙏 Helsinki waved us goodbye with some snowfall, and it&amp;#39;s been good to be back in Belgium. In mid-February we will settle into our new long-term Brussels apartment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I&amp;#39;ve been in India 🇮‍🇳&lt;/strong&gt;: for almost a month now, for family matters (a wedding, birth, ...), and a small vacation next week (Sri Lanka). Escaping the West-European winter for a while, and entering the realm of the merciless mosquitoes. It&amp;#39;s probably also been my longest stretch of out-of-home remote work so far, and I&amp;#39;m happy with what we&amp;#39;ve achieved last month. The period before hadn&amp;#39;t been easy with our moving preparations, and my colleagues having welcomed a newborn.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emulation &amp;amp; projects 🎮&lt;/strong&gt;: to cope with the intense fall and winter period of 2024, I let off steam with a temporary obsession for handheld retro gaming. I got &lt;em&gt;XU Mini M&lt;/em&gt; &amp;amp; &lt;em&gt;Retroid Pocket 5&lt;/em&gt; consoles and re-indulged into childhood favorites such as &lt;em&gt;Pokemon FireRed&lt;/em&gt;, &lt;em&gt;WipEout Pulse&lt;/em&gt; and &lt;em&gt;Shaun White Snowboarding&lt;/em&gt; (PSP). More recently the free-time pendulum swung back into the project sphere, and I built a new version of my &lt;a href=&quot;https://thorgalle.me/projects/no-feed&quot;&gt;2018 &amp;quot;No Feed&amp;quot; prototype&lt;/a&gt;. The angle is slightly different now: I primarily wanted to keep an eye on the things shared by close friends and family without opening algorithmic social media home feeds. This time, I&amp;#39;m using a headless Chromium browser to periodically scrape the social feeds of people, which lets my system know when there is new a new post. Only then, and at my desired frequency, will the system generate a new item in an RSS feed; displaying a list of first names and links to account pages to check. It ties into my habit of opening my RSS feed reader daily. After the first tests I&amp;#39;m optimistic: it helps me keep in touch with close ones, nothing more, nothing less!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;About this feed&lt;/strong&gt;: if you&amp;#39;re reading this in an feed reader (cool!), I just fixed a bug which lead to all my blog post&amp;#39;s Atom &lt;code&gt;guid&lt;/code&gt;s being the same JS function code. That function had to be called to produce the correct &lt;code&gt;guid&lt;/code&gt; - whoopsie. This might mean that you&amp;#39;ll see duplicates of my posts, my apologies for that. I&amp;#39;ll try to ensure this is a one-time thing.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><link>https://thorgalle.me/now/2025/01/23</link><guid isPermaLink="false">/now/2025/01/23</guid></item><item><title>Big website update</title><description>Today, I can report from my shiny new Ghost editor that over the last few weeks, I&apos;ve integrated months and even years of plans and ideas into my personal website.

Being one of those people with a few too many projects at any moment in time, it has been difficult to not spend time on advancing whatever project strikes my fancy, but instead work on the meta project that describes and links to whatever I do online (and offline).

I&apos;ve long admired regular bloggers such as Ben Werdmuller, Juha-Mat</description><pubDate>Fri, 20 Sep 2024 15:18:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, I can report from my shiny new &lt;em&gt;Ghost&lt;/em&gt; editor that over the last few weeks, I&apos;ve integrated months and even years of plans and ideas into my personal website.&lt;/p&gt;&lt;p&gt;Being one of those people with a few too many projects at any moment in time, it has been difficult to &lt;em&gt;not &lt;/em&gt;spend time on advancing whatever project strikes my fancy, but instead work on the meta project that describes and links to whatever I do online (and offline).&lt;/p&gt;&lt;p&gt;I&apos;ve long admired regular bloggers such as &lt;a href=&quot;https://werd.io/&quot; rel=&quot;noreferrer&quot;&gt;Ben Werdmuller&lt;/a&gt;, &lt;a href=&quot;https://hamatti.org/blog/&quot; rel=&quot;noreferrer&quot;&gt;Juha-Matti Santala&lt;/a&gt; and &lt;a href=&quot;https://simonwillison.net/&quot; rel=&quot;noreferrer&quot;&gt;Simon Willison&lt;/a&gt;, rich digital gardens such as &lt;a href=&quot;https://xxiivv.com/&quot; rel=&quot;noreferrer&quot;&gt;XXIIVV&lt;/a&gt; and &lt;a href=&quot;https://maggieappleton.com/&quot; rel=&quot;noreferrer&quot;&gt;Maggie Appleton&apos;s&lt;/a&gt;, but also creative and fun websites of Indie Web aficionados like &lt;a href=&quot;https://hacdias.com/&quot; rel=&quot;noreferrer&quot;&gt;Henrique Dias&lt;/a&gt; and &lt;a href=&quot;https://aaronparecki.com/&quot; rel=&quot;noreferrer&quot;&gt;Aaron Parecki&lt;/a&gt;. I&apos;ve been wanting something like that, and I&apos;ve been inching towards it over the last years. Today, I think I&apos;ve made a big step forward by adding a /now page, RSS feeds, a new home page, and more.&lt;/p&gt;&lt;h2 id=&quot;where-it-came-from&quot;&gt;Where it came from&lt;/h2&gt;&lt;p&gt;To understand where the site is today, it might be helpful to know how my website evolved over the last years. The base of my current website started in 2020. I wanted a simple website at the time. I chose the static-site generation framework Gatsby JS. It started off with some static pages and templates in React, and Markdown blog posts sourced from Contentful. We can question today whether this is indeed a simple&lt;em&gt; &lt;/em&gt;setup, but at least the result is static&lt;em&gt;, &lt;/em&gt;which was a welcome and big departure from my previous personal site effort from 2016, a PHP monolith built with Grav CMS.&lt;/p&gt;&lt;p&gt;Over the next few years, not much happened to it. I migrated the code base from Gatsby v2, to v3, v4, and eventually, v5. I wrote a few blog posts, but I mostly linked to posts I wrote on other blogs and platforms (Medium, Dev.to, ...). I migrated my Markdown posts over to the &lt;a href=&quot;https://www.contentful.com/developers/docs/concepts/rich-text/&quot; rel=&quot;noreferrer&quot;&gt;Contentful Rich Text&lt;/a&gt; format when it became available. In hindsight, I didn&apos;t use the features it offered much.&lt;/p&gt;&lt;p&gt;In early 2023 however, I expanded my ambition. I merged in a &quot;portfolio database&quot; experiment using a self-hosted &lt;a href=&quot;https://strapi.io/&quot;&gt;Strapi&lt;/a&gt; headless CMS instance, leading to the &lt;a href=&quot;https://thorgalle.me/projects/&quot;&gt;/projects page&lt;/a&gt;. Earlier this year, I added &lt;a href=&quot;https://thorgalle.me/notes/&quot;&gt;a /notes page&lt;/a&gt; using an Obsidian vault.&lt;/p&gt;&lt;p&gt;Over the last month, I&apos;ve expanded further upon all these concepts, and added new content to my website, too.&lt;/p&gt;&lt;h2 id=&quot;changelog&quot;&gt;Changelog&lt;/h2&gt;&lt;h3 id=&quot;a-new-homepage&quot;&gt;A new homepage&lt;/h3&gt;&lt;p&gt;Most visibily, I have a rethought home page. Where I previously only had an introduction, and a flat list of my blog posts, I now have:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;an extract from my new Now page&lt;/li&gt;&lt;li&gt;a summary of my last posts on Readup, rendered client-side by fetching data from a custom proxy made with on Deno Edge&lt;/li&gt;&lt;li&gt;a more limited listing of my most recent blog posts&lt;/li&gt;&lt;li&gt;some decoration in the form of photos I took (mostly older ones)&lt;/li&gt;&lt;li&gt;a list of my most recent projects&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This homepage is more dynamic, and I hope it will give a richer impression of what I do. For its layout, I&apos;ve been inspired mostly by &lt;a href=&quot;https://rsms.me/https://rsms.me/&quot; rel=&quot;noreferrer&quot;&gt;Rasmus Andersson&apos;s website&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;a-now-page&quot;&gt;A /now page&lt;/h3&gt;&lt;p&gt;I joined the movement of people who write now pages! I&apos;ve been seeing the concept on more and more websites, such as &lt;a href=&quot;https://json.blog/&quot; rel=&quot;noreferrer&quot;&gt;json.blog&lt;/a&gt;, ...  and I like the idea.&lt;/p&gt;&lt;h3 id=&quot;rss-feeds&quot;&gt;RSS feeds&lt;/h3&gt;&lt;p&gt;This is a major one! I&apos;ve gotten very much into consuming RSS/Atom feeds over the last months, advocating for them to be available on other sites, and due to this, I&apos;ve been feeling embarrassed that my own site didn&apos;t have a feed.&lt;/p&gt;&lt;p&gt;That omission is finally fixed.&lt;/p&gt;&lt;h3 id=&quot;writing-in-ghost&quot;&gt;Writing in Ghost&lt;/h3&gt;&lt;p&gt;My writing process (for the limited posts I&apos;ve published) has been messy and scattered. Usually, I document research and write in various Notion pages. I love their minimal yet intuitive Markdown-inspired WYSIWYG editor. I would then painstakingly copy over a post and its assets into a Contentful entry, which would be published via site rebuild triggered by a webhook.&lt;/p&gt;&lt;p&gt;I wanted a more direct way to write and publish. I tried a few options, but I settled on using a self-hosted instance of &lt;a href=&quot;https://ghost.org/&quot; rel=&quot;noreferrer&quot;&gt;Ghost&lt;/a&gt; as a headless CMS. I really appreciate the focused, auto-saving editor they&apos;ve put together. I ensured publishing is smooth by rebuilding the site with a webhook.&lt;/p&gt;&lt;p&gt;Ghost will just be used for my posts though. My project descriptions are still written in Strapi (I like to have custom, structured, yet editable data there, which is not all focused on writing). My &lt;a href=&quot;https://thorgalle.me/notes&quot; rel=&quot;noreferrer&quot;&gt;notes&lt;/a&gt; are written directly in Obsidian, because I want the notes to be a public knowledge management system, and Obsidian is built for editing and searching such a repository.&lt;/p&gt;&lt;h3 id=&quot;more-quality-of-life-improvements&quot;&gt;More quality-of-life improvements&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;I&apos;m now &lt;a href=&quot;https://joinmastodon.org/verification&quot; rel=&quot;noreferrer&quot;&gt;&lt;strong&gt;Mastodon-verified&lt;/strong&gt;&lt;/a&gt; (that was the easiest of all changes on this page)&lt;/li&gt;&lt;li&gt;I created and added a favicon!&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;reflection&quot;&gt;Reflection&lt;/h2&gt;&lt;p&gt;Of course, I&apos;m not &lt;em&gt;done &lt;/em&gt;now&lt;em&gt;. &lt;/em&gt;My personal website will never be done, as my wishes for it will change over time, just like I change over time. There are even still things I&apos;d like to improve on my site &lt;em&gt;right now&lt;/em&gt;, but I will accept that it will always be a work-in-progress, and that I don&apos;t have to jump straight away on every imperfection, perceived or real.&lt;/p&gt;&lt;p&gt;The main next thing I&apos;m after is an /ideas page. I&apos;ve tracked some of my ideas, and ideas to contribute to projects, in a Notion database for years. I&apos;d love to publish some of these, especially after seeing the project &lt;a href=&quot;https://aboutideasnow.com/&quot; rel=&quot;noreferrer&quot;&gt;aboutideasnow&lt;/a&gt;.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2024/big-website-update</link><guid isPermaLink="false">/posts/2024/big-website-update</guid></item><item><title>Does Mozilla have its priorities straight?</title><description>A reaction to a toot ridiculing Mozilla&apos;s investments into GenAI, analytics, and ads.</description><pubDate>Wed, 18 Sep 2024 17:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, I saw a seemingly sarcastic &lt;a href=&quot;https://mamot.fr/@ploum/113157578720371648&quot;&gt;toot from ploum&lt;/a&gt;&amp;nbsp;about&amp;nbsp;&lt;a href=&quot;https://www.mozilla.org/en-US/careers/listings/&quot;&gt;Mozilla&apos;s career page&lt;/a&gt;&amp;nbsp;listing a considerable number of jobs for&amp;nbsp;&lt;em&gt;Gen AI-&lt;/em&gt;,&amp;nbsp;&lt;em&gt;analytics-&lt;/em&gt;&amp;nbsp;and&amp;nbsp;&lt;em&gt;ad-&lt;/em&gt;related roles:&lt;/p&gt;&lt;figure class=&quot;kg-card kg-embed-card&quot;&gt;&lt;iframe src=&quot;https://mamot.fr/@ploum/113157578720371648/embed&quot; class=&quot;mastodon-embed&quot; style=&quot;max-width: 100%; border: 0&quot; width=&quot;400&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;&lt;script src=&quot;https://mamot.fr/embed.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;&lt;/figure&gt;&lt;p&gt;He contrasted this with&amp;nbsp;&lt;a href=&quot;https://www.theverge.com/2024/9/18/24248142/mozilla-will-shut-down-its-mastodon-server-on-december-17th&quot;&gt;Mozilla’s announcement yesterday&lt;/a&gt;&amp;nbsp;of shutting down their Mastodon instance. The responses were an outpour of disappointment and criticism towards Mozilla.&lt;/p&gt;&lt;p&gt;I started writing a threaded response, and realized it should probably be a blog post instead, so, here we go!&lt;/p&gt;&lt;p&gt;In short, much of the criticism I read about on Mozilla seems valid, but I don&apos;t know if the critics have a much better plan than complaining. We should consider if we&amp;nbsp;&lt;em&gt;actually&lt;/em&gt;&amp;nbsp;know what&apos;s best for Mozilla and Firefox.&lt;/p&gt;&lt;h2 id=&quot;mastodon-and-meh-products&quot;&gt;Mastodon, and &quot;meh&quot; products&lt;/h2&gt;&lt;p&gt;To start, I understand the sarcasm to some degree. In particular, I&apos;d appreciate&amp;nbsp;&lt;em&gt;more&lt;/em&gt;, not less, investment in the fediverse. The fediverse is a beacon of hope for a more independent and open web, something I thought Mozilla cared about too. Mozilla supporting Mastodon as an alternative for X, Threads and BlueSky sounded logical when they launched the initiative in early 2023. Then again, if they have less than 300 daily active users today, I also understand that the service was considered a failure not worth maintaining.&lt;/p&gt;&lt;p&gt;The question then becomes: did they invest enough in the experiment? Probably not. Beyond a few announcements in the beginning, I didn&apos;t hear much about Mozilla Social. Even in Mozilla&apos;s&amp;nbsp;&lt;a href=&quot;https://web.archive.org/web/20240118175942/https://www.mozilla.org/en-US/firefox/products/&quot;&gt;&quot;All Products&quot; page from January this year&lt;/a&gt;, I can&apos;t find a single mention of the instance. Compare this to Vivaldi, which is promoting its Mastodon instance launched in November 2022 prominently &lt;a href=&quot;https://vivaldi.net/&quot; rel=&quot;noreferrer&quot;&gt;on its website&lt;/a&gt; and in its browser. We can also ask if they should have even started the experiment, as opposed to taking on a support role. They could have helped to popularize the concept of the fediverse itself, referring to other servers, while supporting the work of existing moderation communities.&lt;/p&gt;&lt;p&gt;Mozilla had already been criticized several times over for investing in products with questionable added value, or equally, killing liked products. In September 2020, Mozilla&amp;nbsp;&lt;a href=&quot;https://screenrant.com/mozilla-firefox-send-firefox-notes-shutting-down-explained/&quot;&gt;killed&lt;/a&gt; Mozilla Send, a service I had used and liked. Before that, there was the Lightbeam extension, Firefox OS, and many more (&lt;a href=&quot;https://killedbymozilla.com/&quot;&gt;the list&lt;/a&gt;&amp;nbsp;is sizeable, but nowhere near&amp;nbsp;&lt;a href=&quot;https://killedbygoogle.com/&quot;&gt;Google&apos;s track record&lt;/a&gt;&amp;nbsp;of killing products).&amp;nbsp;&lt;/p&gt;&lt;p&gt;Among its current suite of products, Mozilla is pushing a VPN service and a password breach Monitor. I too am asking; does the world really need these services? There are already VPN services aplenty, many of which focus on privacy, and Monitor is a feature implemented by virtually every password manager. These also aren&apos;t adding much value in my opinion.&lt;/p&gt;&lt;h2 id=&quot;firefox-neglected&quot;&gt;Firefox neglected?&lt;/h2&gt;&lt;p&gt;One critique I glean from the toot, which&lt;a href=&quot;https://www.zdnet.com/home-and-office/networking/the-fall-of-firefox-mozillas-once-popular-web-browser-slides-into-irrelevance/&quot;&gt;&amp;nbsp;reappears&lt;/a&gt;&amp;nbsp;often, is that with these distractions, Mozilla is taking much-needed investments away from Firefox, the one product they have that is precious and unique. It&apos;s the only major browser with an engine that doesn&apos;t have its roots in WebKit, and the only one not owned by a trillion dollar corporation. And, importantly, it has issues that need addressing.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://readup.org/comments/endlerdev/the-dying-web/Dop0j5&quot;&gt;As a web user, I recently switched by back to Firefox&lt;/a&gt;&amp;nbsp;after years on Google Chrome (of all browsers), and while I&apos;m planning to stick with it, I also have to use Firefox in conjunction with the Chromium-based Vivaldi browser because of...&lt;/p&gt;&lt;ul&gt;&lt;li&gt;decent performance in more complex web apps (so far I&apos;ve noticed issues in&amp;nbsp;&lt;a href=&quot;https://penpot.app/&quot;&gt;Penpot&lt;/a&gt;, and, not surprisingly, Google Earth, Google Maps and Google Meet)&lt;/li&gt;&lt;li&gt;desktop-integrated Progressive Web Apps (bringing back PWA support is the &lt;a href=&quot;https://connect.mozilla.org/t5/ideas/bring-back-pwa-progressive-web-apps/idi-p/35&quot; rel=&quot;noreferrer&quot;&gt;second-most upvoted&amp;nbsp;issue&lt;/a&gt; with 2278 upvotes&amp;nbsp;in the Mozilla Ideas forum)&lt;/li&gt;&lt;li&gt;some specific developer tools, like&amp;nbsp;&lt;a href=&quot;https://mastodon.social/@davidlantner/113040231429691674&quot;&gt;Snippets&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;https://stackoverflow.com/a/64615976&quot;&gt;JS/CSS coverage reports&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Firefox works well for most of my daily browsing, but just isn&apos;t up-to-par for some use-cases. This is to say that I too would be happy with more improvements to Firefox&apos; performance and core web feature set, so I can just use one browser (while&amp;nbsp;&lt;a href=&quot;https://endler.dev/2024/the-dying-web/&quot;&gt;acknowledging&lt;/a&gt;&amp;nbsp;that the problems it has aren&apos;t only Firefox&apos; fault).&lt;/p&gt;&lt;h2 id=&quot;genai-analytics-ads&quot;&gt;GenAI, analytics, ads&lt;/h2&gt;&lt;p&gt;With this in mind, seeing a list of jobs in the realms of&amp;nbsp;&lt;em&gt;GenAI&lt;/em&gt;,&amp;nbsp;&lt;em&gt;analytics&lt;/em&gt;&amp;nbsp;and&amp;nbsp;&lt;em&gt;ads&amp;nbsp;&lt;/em&gt;make it look like improving the Firefox core browsing experience is not enough of a priority of Mozilla, which I understand is disappointing.&lt;/p&gt;&lt;p&gt;For fairness, it should be noted that out of&amp;nbsp;&lt;a href=&quot;https://www.mozilla.org/en-US/careers/listings/&quot;&gt;35 current openings&lt;/a&gt;, 6 have &apos;gen&apos; in it, 3 &apos;ads&apos;, and 2 &apos;analytics&apos;. That&apos;s 11/35. There is still a majority of job openings that is&amp;nbsp;&lt;em&gt;not&lt;/em&gt;&amp;nbsp;focused on domains considered problematic by critics on Mastodon.&lt;/p&gt;&lt;p&gt;However, I also think critics jump to conclusions too quickly when seeing these words. It is important to evaluate all these job ads in the context of...&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Mozilla consistently receiving 80%+ of its revenue in the last years through a default search engine deal&amp;nbsp;&lt;em&gt;with Google.&amp;nbsp;&lt;/em&gt;That&apos;s an awkwardly existential amount of funding to get from a big player with a different ideology around tech and browsers. I can imagine that many at Mozilla are uncomfortable with this, and would like to find alternative sources of revenue.&lt;/li&gt;&lt;li&gt;Firefox‘ market share is small and dwindling. Clearly, whatever they have been trying in the last decade(s) (that wasn&apos;t a deal with Google), hasn&apos;t been working well.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Here&apos;s my take on these roles.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Advertisement roles:&amp;nbsp;&lt;/strong&gt;I suppose these roles are at least partially related to the ecosystem around the recently released &quot;&lt;a href=&quot;https://support.mozilla.org/en-US/kb/privacy-preserving-attribution&quot;&gt;Privacy-Preserving Attribution&lt;/a&gt;&quot;, and perhaps too to the sponsored Search Suggestions that have existed for a long time.&lt;/p&gt;&lt;p&gt;If I’d have to choose on what to promote, Mozilla’s spin on attribution sounds like a better plan for privacy than Google&apos;s &quot;Privacy Sandbox&quot; which can still&amp;nbsp;&lt;a href=&quot;https://front-end.social/@benschwarz/113127311078023574&quot;&gt;expose interests of individuals&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Mozilla is probably trying to check if they can sell their own ad insights. It might be one path to more independence (from Google), but I don’t like it much, because it also represents one step further on the slippery slope of surveillance capitalism.&lt;/p&gt;&lt;p&gt;Regarding the search suggestions; this is also one of the main sources of revenue of Vivaldi. I see a double standard in finding that normal, versus berating Mozilla for it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;GenAI:&amp;nbsp;&lt;/strong&gt;there is much cynicism and negativity around GenAI on the fediverse, and much of it is warranted. GenAI has huge costs in terms of energy, is kept artificially cheap and ad-free for consumers in a classic bait-and-switch scheme, is dangerously misunderstood, is trained in unethical ways, and is proliferating huge swaths of garbage on the internet. It is overhyped, plugged into products without much thought, and therefore it is a bubble that will pop. There is much to dislike. But unlike the blockchain hype, GenAI also has a serious core of real, obvious value and concrete applications. This core isn&apos;t going anywhere. It reminds me of the dot-com bubble. This bubble also burst, but eventually came to fruition more gradually with the rise of e-commerce and big web tech through the 2000s and 2010s. I see something similar happening with GenAI, with an even faster turnaround. There might be a market correction, but this thing will keep going.&lt;/p&gt;&lt;p&gt;Mozilla investing in GenAI may seem like one of those anti-Firefox distractions, but some forms of GenAI will persist in the main competitors of Firefox.&amp;nbsp;&lt;a href=&quot;https://arc.net/max&quot;&gt;Summarizing pages&lt;/a&gt;&amp;nbsp;will become a table-stakes feature, just like Chrome made in-browser translation a table-stakes feature (and it took Firefox a long time to provide a halfway decent alternative).&lt;/p&gt;&lt;p&gt;These will become the next &quot;missing features&quot; that make many &lt;em&gt;more&lt;/em&gt; people run away from Firefox. Browsers aren&apos;t only used by tech enthusiasts and privacy nuts. Nurses use browsers, as do bus drivers, lawyers, cooks, ...&amp;nbsp;&lt;em&gt;everyone on the internet uses browsers.&lt;/em&gt;&amp;nbsp;People are getting increasingly hooked on cheap or free GenAI, and Firefox needs to be able to sell a narrative tomorrow to the average browser user that is focused on privacy, but that also doesn&apos;t come with too many concessions on features. Therefore, building GenAI expertise early on might not be that crazy after all; because going about it in privacy-friendly way, like they did with machine translation, will be a serious challenge.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Analytics:&amp;nbsp;&lt;/strong&gt;it&apos;s no secret that Firefox has included various forms of telemetry, to the dismay of many. I believe privacy-preserving analytics aren&apos;t evil per se, and are helpful for sensible, data-driven product decisions. For example, my company is proudly running&amp;nbsp;&lt;a href=&quot;https://plausible.io/&quot;&gt;Plausible&lt;/a&gt;, which is really helpful for us. At Firefox&apos; scale, you might need some people whose responsibility it is to work with analytics. I hope they keep it anonymous, however.&lt;/p&gt;&lt;h2 id=&quot;to-conclude&quot;&gt;To conclude&lt;/h2&gt;&lt;p&gt;Mozilla and Firefox might not have displayed a coherent or successful vision for a private and open web in the last few years, but I don’t think it helps to just be sarcastic about their attempts to find alternative sources of revenue in a privacy-preserving way, and their attempts to anticipate what&apos;s next for browsers.&lt;/p&gt;&lt;p&gt;What would you do to grow the market share of Firefox, while becoming more independent of Google? To protect the diversity of browser engines, and the open web? It&apos;s probably not easy.&lt;/p&gt;&lt;p&gt;Yes, it is awkward that the millionaire CEO got a fat million dollar raise in 2022, a mere year after 25% of Mozilla&apos;s workforce was laid off, but being outraged at their Silicon Valley salaries also doesn&apos;t help much. Mozilla should have the cash ready to acquire and retain good people to work on their mission (&lt;a href=&quot;https://www.wired.com/story/meredith-whittaker-signal/&quot; rel=&quot;noreferrer&quot;&gt;just like Signal&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;I hope that Mozilla will find a way to re-focus on the unique value they can provide to the web, and will find a sustainable model for doing so. There is still much to cherish about Firefox and Mozilla, like Gecko, Enhanced Tracking Protection, MDN, ... and the alternatives are still far out. So let&apos;s try to stay constructive.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2024/does-mozilla-have-its-priorities-straight</link><guid isPermaLink="false">/posts/2024/does-mozilla-have-its-priorities-straight</guid></item><item><title>Now - September 8, 2024</title><pubDate>Sun, 08 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Weather &amp;amp; activity&lt;/strong&gt;: temperatures have been hovering around 20°C, which is surprisingly warm for this time of the year. Regardless, fall colors are starting to appear. When it arrives, autumn comes hard and fast in Helsinki, and is also gone in an instant. We&amp;#39;ll probably stop our weekly outdoor basketball sessions soon, and will move to indoor badminton. We rediscovered the sport last year, and I&amp;#39;m already looking forward to starting again!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Website work:&lt;/strong&gt; as I&amp;#39;m writing this, I&amp;#39;m working on a sizeable extension of this personal website. I&amp;#39;ve had concrete plans for a while: &lt;ul&gt;
&lt;li&gt;to add my recent projects and Readup activity on the home page&lt;/li&gt;
&lt;li&gt;to add a &lt;a href=&quot;https://nownownow.com/about&quot;&gt;Now&lt;/a&gt; page which also features partially on the home page&lt;/li&gt;
&lt;li&gt;to move my blog posts to a separate page, and perhaps, &lt;/li&gt;
&lt;li&gt;to add in some old photography to spice up the look!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also &lt;em&gt;really&lt;/em&gt; have to add RSS feeds. I&amp;#39;ve gotten very much into RSS consumption over the last months, and I&amp;#39;d love to provide it myself.&lt;/p&gt;
&lt;p&gt;Building your own website is fun, but it also takes time. Today, I started by upgrading my two-year-old Strapi CMS deployment from v4.2.2 to v4.25.10, to take advantage of some new layout features. &lt;a href=&quot;https://docs.strapi.io/dev-docs/migration-guides&quot;&gt;Eight migration guides&lt;/a&gt;, &lt;a href=&quot;https://github.com/strapi/documentation/pull/2199&quot;&gt;one docs PR&lt;/a&gt;, and many hours later, my Strapi is better shape than it ever has been.&lt;/p&gt;
</content:encoded><link>https://thorgalle.me/now/2024/09/08</link><guid isPermaLink="false">/now/2024/09/08</guid></item><item><title>Now - August 7, 2024</title><pubDate>Wed, 07 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;WTMG:&lt;/strong&gt; despite a good overall response rate from hosts listed on &lt;a href=&quot;https://welcometomygarden.org/explore&quot;&gt;our WTMG map&lt;/a&gt;, it sometimes happens that an often-contacted host is not responding anymore. The annoying experience of being ignored is on top of the list of the feedback we receive from travellers. This month, we want to set up sustainable procedures to soft-unlist abandoned accounts.&lt;/p&gt;
&lt;p&gt;Until now, we&amp;#39;ve unlisted abandoned accounts once per year, with a crude admin script. This time, we&amp;#39;re defining nuanced conditions for these accounts, based on their recent response rate, response time, and more. To implement these, I&amp;#39;m writing the largest SQL queries I&amp;#39;ve ever written, CTE-galore 😄. Using them, we will be able to do a meaningful, semi-automated cleanup more regularly.&lt;/p&gt;
&lt;p&gt;This is also the first application of the Postgres replica of our Firestore, which I might write more about later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;WWII:&lt;/strong&gt; it was hard to miss that this year marks the 80th birthday of many significant events of World War II. To learn more about its causes and effects, I&amp;#39;ve been listening to &lt;a href=&quot;https://www.noiser.com/d-day-the-tide-turns&quot;&gt;&lt;em&gt;D-Day: The Tide Turns&lt;/em&gt;&lt;/a&gt;, &lt;a href=&quot;https://www.noiser.com/adolf-hitler-rise-and-downfall&quot;&gt;&lt;em&gt;Adolf Hitler: Rise and Downfall&lt;/em&gt;&lt;/a&gt;, two excellent podcasts from the &lt;em&gt;Noiser network&lt;/em&gt;. I can strongly recommend both so far! They&amp;#39;re both engrossing and informative, exploring background factors, as well as driving the narrative of major events with apt sound effects. I also started reading &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Diary_of_a_Young_Girl&quot;&gt;&lt;em&gt;Anne Frank&amp;#39;s diary&lt;/em&gt;&lt;/a&gt; (the &lt;a href=&quot;https://archive.org/details/anne_frank_diaries&quot;&gt;original publication in Dutch&lt;/a&gt;), and I picked up &lt;a href=&quot;https://en.wikipedia.org/wiki/Battlefield_V&quot;&gt;Battlefield V&lt;/a&gt; during a sale. That last one is more for entertainment than for learning, but it is inspired on some lesser-known events of WWII, including &lt;a href=&quot;https://en.wikipedia.org/wiki/Norwegian_heavy_water_sabotage&quot;&gt;the sabotage of Vemork heavy water plant&lt;/a&gt;, which I&amp;#39;ve learned, after reading the previous Wikipedia article, was a grim and eventually impressive series of daring operations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Readup:&lt;/strong&gt; I&amp;#39;m still dreaming about &lt;a href=&quot;https://thorgalle.me/projects/readup&quot;&gt;Readup&lt;/a&gt;’s potential, particularly about how it might relate to the fediverse. I recently read the &lt;a href=&quot;https://www.w3.org/TR/webmention/&quot;&gt;Webmention&lt;/a&gt; spec (I think it&amp;#39;s the first W3C spec I read from start to finish!). It would be cool to send out webmentions with Readup, but I&amp;#39;m wondering how many sites support it. I also started working on some glue code to put my most recent Readup posts on my site here.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><link>https://thorgalle.me/now/2024/08/07</link><guid isPermaLink="false">/now/2024/08/07</guid></item><item><title>Meta&apos;s Threads on the Fediverse</title><pubDate>Sun, 10 Mar 2024 18:27:00 GMT</pubDate><content:encoded>&lt;p&gt;A &lt;a href=&quot;https://werd.io/2024/the-fediverse-is-really-happening&quot;&gt;short post&lt;/a&gt; from Ben Werdmuller made me aware that Threads is widening tests of its hopefully-upcoming integration with ActivityPub, the microblogging protocol that underpins much of the fediverse, including Mastodon.&lt;/p&gt;
&lt;p&gt;It’s been exactly one year since Meta confirmed that it was “exploring a standalone decentralized social network for sharing text updates” (&lt;a href=&quot;https://www.theregister.com/2023/03/11/meta_twitter_rival/&quot;&gt;source&lt;/a&gt;), eight months since Threads was launched, and two months since their &lt;a href=&quot;https://www.theverge.com/2023/12/13/24000120/threads-meta-activitypub-test-mastodon&quot;&gt;first public tests with ActivityPub started&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ben titled his post “The fediverse is really happening”, implying that the fediverse is not &lt;em&gt;really&lt;/em&gt; happening right now, before Threads, or any other big social media platform, actually joins it.&lt;/p&gt;
&lt;p&gt;I follow this sentiment somewhat. The fediverse has been happening for some communities for a long time, but it hasn’t been happening on a larger scale. I think Threads joining the fediverse is good, and I know many don’t agree with this. Here’s my perspective.&lt;/p&gt;
&lt;h2 id=&quot;the-fediverse-has-been-happening&quot;&gt;The fediverse has been happening!&lt;/h2&gt;
&lt;p&gt;The fediverse has been &lt;em&gt;happening&lt;/em&gt; for a long time, and increasingly so in the last year, with all the drama around X. As a techie, I only &lt;a href=&quot;https://indieweb.social/@thorgal&quot;&gt;joined&lt;/a&gt; a small year ago, after having being fairly inactive on mainstream social media for years.&lt;/p&gt;
&lt;p&gt;I’ve since been having a great time in my small, hand-crafted internet bubble on Mastodon. I mostly &lt;a href=&quot;https://indieweb.social/@thorgal/following&quot;&gt;follow&lt;/a&gt; fellow web developers and indie web enthusiasts, along with a &lt;a href=&quot;https://mastodon.online/@philipdutre&quot;&gt;former professor&lt;/a&gt; of mine, and accounts of organizations that I think are worth following.&lt;/p&gt;
&lt;p&gt;Mastodon &amp;#x26; ActivityPub are already great for tech-adjacent communities, and, as far as I’ve seen, for communities that care less about a wide reach, and more about decentralization, online privacy, and the ability to control and self-moderate their own instances (one example being LGBTQ+ communities). For these communities, the fediverse has already been &lt;em&gt;really happening.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The concept of federated servers and applications works really well for niche communities. The grassroots, interpersonal, non-corporate retro feel, often combined with a thematic focus of servers, is also what constitutes most of the appeal for me. I enjoy accessing my “non-algorithmic” Mastodon feed through various clients: &lt;a href=&quot;https://indieweb.social/about&quot;&gt;indieweb.social&lt;/a&gt;’s default web client with &lt;a href=&quot;https://github.com/ronilaukkarinen/mastodon-bird-ui&quot;&gt;Bird UI&lt;/a&gt;, &lt;a href=&quot;https://elk.zone/&quot;&gt;Elk&lt;/a&gt;, &lt;a href=&quot;https://www.raycast.com/SevicheCC/mastodon&quot;&gt;Raycast&lt;/a&gt;, Mastodon’s iOS app, all using Mastodon’s open API.&lt;/p&gt;
&lt;p&gt;However, I recognize that Mastodon, Pixelfed and Lemmy are still niche technologies supported by a niche protocol.&lt;/p&gt;
&lt;h2 id=&quot;webmail-all-over-again&quot;&gt;Webmail all over again?&lt;/h2&gt;
&lt;p&gt;The question is: when is the fediverse &lt;em&gt;really&lt;/em&gt; happening, on a global scale? You could argue that it’s only &lt;em&gt;really&lt;/em&gt; happening when it exits its current niche, and is used as widely as incumbent &amp;#x26; centralized social media alternatives like X or TikTok. From looking at estimates today on Wikipedia, the account count of Mastodon servers still represents less than 10% of Threads’ account count, while having existed for six more years.&lt;/p&gt;
&lt;p&gt;Decentralization and federation present inevitable technical and conceptual hurdles. I believe it’s improbable for the fediverse to “really*”* happen in a global sense to without a company like Meta repackaging it as a simple and centralized service.&lt;/p&gt;
&lt;p&gt;There is perhaps one other technology where big corporations repackaged an existing open technology, and then managed to distribute it widely: email.&lt;/p&gt;
&lt;p&gt;The analogy with email is helpful, because email has had a long history of being an niche technology used in the military, academia, and business. Then, in the 2000s, big corporate webmail providers like Gmail, Yahoo and Hotmail brought it into the homes of “the public”. It wasn’t only easy to create a new email address with a free inbox, you also didn’t have to install any special software to access this inbox. Email practically got equated with the single web service you used to access it.&lt;/p&gt;
&lt;p&gt;In a &lt;a href=&quot;https://ar.al/2022/11/09/is-the-fediverse-about-to-get-fryed-or-why-every-toot-is-also-a-potential-denial-of-service-attack/&quot;&gt;2022 blog post&lt;/a&gt; arguing for more decentralization on the fediverse, Aral Balkan stated this development was bad for email, because it centralized power over email (an open system) to a few entities:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Have you ever heard of a little old email instance called Gmail? (Or perhaps the term &lt;a href=&quot;https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish&quot;&gt;“embrace, extend, extinguish?”&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Do you know what happens to your email if Google says (rightly or wrongly) that you’re spam? No one sees your email.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There is something here: in practice, email isn’t anymore the decentralized dream it once was believed to be. But, I’m not as pessimistic about ActivityPub following the email precedent. I’m more on the optimistic side.&lt;/p&gt;
&lt;p&gt;First, we can ponder the counterfactual: would email have reached the ubiquitous adoption it has today without being carried by webmail providers? The simplicity of Hotmail made it possible for me and my primary school classmates to use email on our parent’s computers before we were ten years old.&lt;/p&gt;
&lt;p&gt;By analogy, Threads could introduce millions of people to the fediverse. Many will never understand or care about the difference between @threads.net and @mastodon.social, but some (millions!) will, and they will realize that they can join independent ActivityPub servers too.&lt;/p&gt;
&lt;p&gt;Secondly, I think email, in its current state of oligopoly, is still in a better shape than social siloes like Instagram, Snapchat and TikTok that can’t talk to each other at all. When several big platforms are interconnected, there is at least some healthy diversity. And the more interconnected they become, the harder it is for them to break out without alienating their userbase.&lt;/p&gt;
&lt;p&gt;Finally, I don’t believe the dreaded “extinguish” phase presents a real danger to the status quo, or to the intrinsic, relatively slow growth of ActivityPub. Here’s a quote from &lt;a href=&quot;https://blog.joinmastodon.org/2023/07/what-to-know-about-threads/&quot;&gt;a post on the Mastodon blog&lt;/a&gt; by founder Eugen Rochko, published on July 5th, 2023, the day that Threads launched (emphasis mine):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There was a time when users of Facebook and users of Google Talk were able to chat with each other and with people from self-hosted XMPP servers, before each platform was locked down into the silos we know today. What would stop that from repeating? Well, &lt;strong&gt;even if Threads abandoned ActivityPub down the line, where we would end up is exactly where we are now.&lt;/strong&gt; XMPP did not exist on its own outside of nerd circles, while ActivityPub enjoys the support and brand recognition of Mastodon.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As mentioned before, ActivityPub and Mastodon already have found a home in niche communities. I personally am not planning to leave my niche. I’m avoiding corporate algorithmic feeds out of principle, and from a mental health perspective. I have been doing so for some five years now, and I don’t expect my motivations to change soon.&lt;/p&gt;
&lt;p&gt;If I can stay in my hand-picked, ad-free, “algorithm-less” Mastodon feed with 90% Mastodon accounts and 10% Threads or Bluesky accounts; I will be happy.&lt;/p&gt;
&lt;p&gt;If, after three years, Threads decides to kill its ActivityPub integration, I will be a little bit sad for a while, but mostly still happy, because I mostly want to stay in touch with people who follow the same principles as I do (and are thus on Mastodon, and not on Threads).&lt;/p&gt;
&lt;h2 id=&quot;practicalities&quot;&gt;Practicalities&lt;/h2&gt;
&lt;p&gt;But how will Threads integrate with ActivityPub, in practice?&lt;/p&gt;
&lt;p&gt;From &lt;a href=&quot;https://indieweb.social/@evanprodromou@threads.net/112056448550748474&quot;&gt;Evan Prodromou’s first test post&lt;/a&gt;, as part of a closed beta, it seems that Meta’s ActivityPub implementation works only in one direction today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Participating accounts on Threads can be seen and followed by followees from the wider fediverse.&lt;/li&gt;
&lt;li&gt;Replies from participating Threads accounts can also be seen by the wider fediverse.&lt;/li&gt;
&lt;li&gt;… but if the wider fediverse replies to a Threads posts, those replies won’t be visible in Threads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This single direction limits the usefulness of the integration today, but better interoperability should come gradually. From &lt;a href=&quot;http://plasticbag.org/archives/2024/01/how-threads-will-integrate-with-the-fediverse/&quot;&gt;a blog post from January by Tom Coates&lt;/a&gt; who met with the team integrating Threads with ActivityPub:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;let’s talk about the roadmap they laid out, which is as follows:
&lt;strong&gt;December 2023&lt;/strong&gt;
A user will be able to opt in via the Threads app to have their posts &lt;em&gt;visible&lt;/em&gt; to Mastodon clients. People would be able to reply and like those posts using their Mastodon clients, but those replies and likes would not be visible within the Threads application. Threads users would not be able to follow or see posts published across Mastodon servers, or reply to them or like then.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Early 2024&lt;/strong&gt;  (Part One) – the Like counts on the Threads app would combine likes from Mastodon and Threads users&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Early 2024&lt;/strong&gt; (Part Two) – replies posted on Mastodon servers would be visible in the Threads application&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Late 2024&lt;/strong&gt; – A “mixed” Fediverse and Threads experience where you will be able to follow Mastodon users within Threads, and reply to them and like them&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TBD&lt;/strong&gt; – Full blended interoperability between Threads and Mastodon&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am yet to read this post fully at the time of writing, but it looks optimistic!&lt;/p&gt;
&lt;p&gt;I think we’re slowly moving towards an interesting, new, social media world order.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2024/meta-threads-on-the-fediverse</link><guid isPermaLink="false">/posts/2024/meta-threads-on-the-fediverse</guid></item><item><title>My default apps in 2024</title><description>Following a list that&apos;s been traveling around the internet, here are the apps I&apos;m using in 2024</description><pubDate>Sat, 24 Feb 2024 10:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Inspired by &lt;a href=&quot;https://danhannigan.dev/post/default-apps-2023/&quot;&gt;Dan Hannigan’s entry of last November&lt;/a&gt; (which was in turn inspired by several others), I’m making a list of the main apps that I use today, and reflecting a little on them too.&lt;/p&gt;
&lt;p&gt;Before we dive in:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;App lists are ordered from most to least frequently used.&lt;/li&gt;
&lt;li&gt;I’m adding the categories “Photo Storage &amp;#x26; Viewing” &amp;#x26; “Video editing”, because those apps deserve a shoutout 🙂&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h1 id=&quot;my-default-apps-in-2024&quot;&gt;My default apps in 2024&lt;/h1&gt;
&lt;p&gt;📨 &lt;strong&gt;Mail Client:&lt;/strong&gt; Mail (iOS), Gmail web client (macOS).&lt;/p&gt;
&lt;p&gt;📮 &lt;strong&gt;Mail Server:&lt;/strong&gt; Gmail&lt;/p&gt;
&lt;p&gt;📝 &lt;strong&gt;Notes:&lt;/strong&gt; TextEdit (macOS), Notion (personal &amp;#x26; work), Apple Notes, Obsidian.&lt;/p&gt;
&lt;p&gt;✅ &lt;strong&gt;To-Do:&lt;/strong&gt; Apple Reminders, Notion.&lt;/p&gt;
&lt;p&gt;📷 &lt;strong&gt;Photo Shooting:&lt;/strong&gt; iPhone 11 Pro&lt;/p&gt;
&lt;p&gt;🎨 &lt;strong&gt;Photo Editing:&lt;/strong&gt; iOS Photos, &lt;a href=&quot;https://www.gimp.org/&quot;&gt;GIMP&lt;/a&gt;, some tools in SetApp, &lt;a href=&quot;https://www.darktable.org/&quot;&gt;Darktable&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🖼️ &lt;strong&gt;Photo Storage &amp;#x26; Viewing&lt;/strong&gt; Apple Photos, &lt;a href=&quot;https://memories.gallery/&quot;&gt;Nextcloud Memories&lt;/a&gt;, &lt;a href=&quot;https://www.photoprism.app/&quot;&gt;PhotoPrism&lt;/a&gt;, Google Photos (for shares)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🎥 Video Editing:&lt;/strong&gt; Kdenlive, iMovie&lt;/p&gt;
&lt;p&gt;📆 &lt;strong&gt;Calendar:&lt;/strong&gt; Apple Calendar (Mac), Google Calendar (iOS)&lt;/p&gt;
&lt;p&gt;📁 &lt;strong&gt;Cloud File Storage:&lt;/strong&gt; Nextcloud (self-hosted), Google Drive, iCloud.&lt;/p&gt;
&lt;p&gt;📖 &lt;strong&gt;RSS:&lt;/strong&gt; &lt;a href=&quot;https://www.freshrss.org/&quot;&gt;FreshRSS&lt;/a&gt;, just switched from &lt;a href=&quot;https://readwise.io/read&quot;&gt;Readwise Reader&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🙍🏻‍♂️ &lt;strong&gt;Contacts:&lt;/strong&gt; macOS Contacts synced with Google&lt;/p&gt;
&lt;p&gt;🌐 &lt;strong&gt;Browser:&lt;/strong&gt; Google Chrome&lt;/p&gt;
&lt;p&gt;💬 &lt;strong&gt;Chat:&lt;/strong&gt; Signal (preferred), Slack (work), WhatsApp (by necessity), Apple Messages, Facebook Messenger, Discord.&lt;/p&gt;
&lt;p&gt;🔖 &lt;strong&gt;Bookmarks:&lt;/strong&gt; Notion&lt;/p&gt;
&lt;p&gt;📑 &lt;strong&gt;Read It Later:&lt;/strong&gt; &lt;a href=&quot;https://readup.org/&quot;&gt;Readup&lt;/a&gt;, &lt;a href=&quot;https://netnewswire.com/&quot;&gt;NetNewsWire&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📜 &lt;strong&gt;Word Processing:&lt;/strong&gt; Google Docs, Apple Pages&lt;/p&gt;
&lt;p&gt;📈 &lt;strong&gt;Spreadsheets:&lt;/strong&gt; Google Sheets, Apple Numbers&lt;/p&gt;
&lt;p&gt;📊 &lt;strong&gt;Presentations:&lt;/strong&gt; Google Slides (it’s been a while)&lt;/p&gt;
&lt;p&gt;🛒 &lt;strong&gt;Shopping Lists:&lt;/strong&gt; Reminders&lt;/p&gt;
&lt;p&gt;🍴 &lt;strong&gt;Meal Planning:&lt;/strong&gt; &lt;a href=&quot;https://www.mealime.com/&quot;&gt;Mealime&lt;/a&gt;; including &lt;a href=&quot;https://thorgalle.me/articles/mealime-siri-integration/&quot;&gt;my Siri integration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;💰 &lt;strong&gt;Budgeting and Personal Finance:&lt;/strong&gt; &lt;a href=&quot;https://www.firefly-iii.org/&quot;&gt;Firefly III&lt;/a&gt;, Google Sheets&lt;/p&gt;
&lt;p&gt;📰 &lt;strong&gt;News:&lt;/strong&gt; Readup, FreshRSS.&lt;/p&gt;
&lt;p&gt;🎵 &lt;strong&gt;Music:&lt;/strong&gt; Spotify&lt;/p&gt;
&lt;p&gt;🎤 &lt;strong&gt;Podcasts:&lt;/strong&gt; Spotify (every weekday: &lt;a href=&quot;https://www.vrt.be/vrtmax/podcasts/vrt-nws/h/het-kwartier/&quot;&gt;Het Kwartier&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;🔐 &lt;strong&gt;Password Management:&lt;/strong&gt; 1Password, moving to Bitwarden &amp;#x26; Vaultwarden&lt;/p&gt;
&lt;p&gt;🧑‍💻 &lt;strong&gt;Code Editor:&lt;/strong&gt; &lt;a href=&quot;https://github.com/vscode-neovim/vscode-neovim&quot;&gt;VS Code with neovim&lt;/a&gt;, vim&lt;/p&gt;
&lt;p&gt;✈️ &lt;strong&gt;VPN:&lt;/strong&gt; Self-hosted WireGuard PiVPN, ClearVPN (from SetApp), Google One VPN&lt;/p&gt;
&lt;h1 id=&quot;some-commentary&quot;&gt;Some commentary&lt;/h1&gt;
&lt;h2 id=&quot;foss--google&quot;&gt;FOSS + Google&lt;/h2&gt;
&lt;p&gt;Fifteen years ago, and for about a decade, I was mostly using Linux on computers. This is where my familiarity with GIMP, Darktable, and Kdenlive comes from. I also only owned Android smartphones throughout that time, and had no budget for software subscriptions. Google’s services worked well cross-platform, and were “free”, so I came to use many of them. I still do today!&lt;/p&gt;
&lt;h2 id=&quot;enter-apple&quot;&gt;&lt;strong&gt;Enter Apple&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;After I started working professionally with design tools in 2017, and appreciating a stable desktop more, Apple increased its footprint on my tech use step-by-step, both in hardware &amp;#x26; software.&lt;/p&gt;
&lt;p&gt;Here’s a timeline of when I got my Apple hardware:&lt;/p&gt;
&lt;p&gt;2010: iPod (Nano, 5th gen)&lt;/p&gt;
&lt;p&gt;2017: MacBook (MBP, 13”)&lt;/p&gt;
&lt;p&gt;2020: iPhone (iPhone 11 Pro)&lt;/p&gt;
&lt;p&gt;2022: iPad (6th gen); new M1 MBP&lt;/p&gt;
&lt;p&gt;2023: Apple Watch (Series 9)&lt;/p&gt;
&lt;p&gt;Because of the ecosystem effects, I started using Apple services more. But I kept Google services and a suite of other independent software around, because of cross-platform compatibility, and a feeling of unease with a full Apple lock-in.&lt;/p&gt;
&lt;p&gt;How do I feel today about Apple today, in short? It’s a love-hate relationship.&lt;/p&gt;
&lt;p&gt;On the positive side, it’s absolutely amazing that a &lt;a href=&quot;https://thorgalle.me/articles/upgrading-an-aging-imac/&quot;&gt;Late 2009 (!!) 27” iMac&lt;/a&gt; is still in daily use by my parents for web browsing, web TV, office &amp;#x26; email. It still has software and hardware that looks great and works well today. Its speaks to a culture of top-notch design across the stack to make this possible. I also think the work they’ve done recently with things like Focus Modes is a necessary evolution in tech.&lt;/p&gt;
&lt;p&gt;Conversely, I absolutely hate Apple’s often-repeated anti-consumerist behavior: their recent plan to petulantly &lt;a href=&quot;https://open-web-advocacy.org/blog/its-official-apple-kills-web-apps-in-the-eu/&quot;&gt;kill PWA’s in the EU&lt;/a&gt;. The impossibility of using Sidecar to extend your display to an iPad connected to a different iCloud account (even if you have access to, and can “trust” said iPad). And so many more…&lt;/p&gt;
&lt;h2 id=&quot;towards-self-hosting--independent-vendors&quot;&gt;Towards self-hosting &amp;#x26; independent vendors&lt;/h2&gt;
&lt;p&gt;More recently, I’ve become more averse to &lt;em&gt;any&lt;/em&gt; Big Tech provider, especially Google, and especially for personal use. It’s a long-term goal to eventually replace whatever Big Tech services possible with self-hosted or reliable, independent alternatives. My main motivation is to keep control and ownership of my data and freedom in my computing, but cost savings and privacy concerns also play a role.&lt;/p&gt;
&lt;p&gt;I’m not rushing this transition though. Practicality remains important.&lt;/p&gt;
&lt;p&gt;In terms of &lt;strong&gt;photo management,&lt;/strong&gt; I’ve recently pushed forward a years-long effort to archive and organize family and personal photos while minimizing Big Tech’s involvement.&lt;/p&gt;
&lt;p&gt;It started with fragmented backups on external hard drives and computers, a personal Digikam collection, a 15-year-old Synology NAS, and a handful of Google Photos shares. I’ve now brought this together in two systems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a shared family library using
&lt;a href=&quot;https://www.photoprism.app/&quot;&gt;PhotoPrism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;a personal photo collection on Nextcloud with
&lt;a href=&quot;https://memories.gallery/&quot;&gt;Nextcloud Memories&lt;/a&gt;
(also as a service to other family members 🙂)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These apps (and modern single-board computers) are truly amazing. Both services are hosted on a single Raspberry Pi 4 8GB with 4TB of USB-attached SSD storage, and they are a joy to use. They do not match the Big Tech cloud services on all metrics of usability, but they bring the essence of the feature set: easy access on any device, high capacity, and fast-ish results. And all this without having features you like at the mercy of business decisions, without succumbing to surveillance tech, and without having your photo experiences held hostage by perpetually increasing monthly subscriptions. It takes maintenance work, but I like it.&lt;/p&gt;
&lt;h2 id=&quot;what-has-changed-recently&quot;&gt;What has changed recently&lt;/h2&gt;
&lt;p&gt;In the department of &lt;strong&gt;news &amp;#x26; reading,&lt;/strong&gt; I’ve recently cancelled my &lt;a href=&quot;https://readwise.io/read&quot;&gt;Readwise Reader&lt;/a&gt; subscription, which I had kept for several months. I like the app and “all-in-one reader” concept, and mostly used it for RSS intake &amp;#x26; highlighting. But I just didn’t use it enough. I still kept reading on &lt;a href=&quot;https://readup.org/&quot;&gt;Readup&lt;/a&gt;, and highlighting in Notion, despite having another paid reading app.&lt;/p&gt;
&lt;p&gt;I’m refocussing on open solutions. Two weeks ago, I experimented with NewsBlur and FreshRSS, and decided to set up &lt;a href=&quot;https://www.freshrss.org/&quot;&gt;FreshRSS&lt;/a&gt; on my Raspberry Pi, with the &lt;a href=&quot;https://netnewswire.com/&quot;&gt;NetNewsWire&lt;/a&gt; client on all iDevices. So far, I really like it! I’ve never been this actively using RSS. And it fits together nicely with Readup.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2024/default-apps-2024</link><guid isPermaLink="false">/posts/2024/default-apps-2024</guid></item><item><title>A Mealime - Siri integration</title><description>This integration allows you to add items to your Mealime grocery list using a Siri voice command.</description><pubDate>Sat, 04 Mar 2023 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For several years I’ve used the meal planner &amp;#x26; grocery list app &lt;a href=&quot;https://www.mealime.com/&quot;&gt;Mealime&lt;/a&gt;. It’s great, since it neatly combines both concepts in a slick app.&lt;/p&gt;
&lt;p&gt;However, there was one thing that I have always sorely missed in the app: being able to say “Hey Siri, add apples [or whatever] to my grocery list”, without pulling my phone out.&lt;/p&gt;
&lt;p&gt;This feature stayed out, and I kept having occasions where I wanted it to be there.&lt;/p&gt;
&lt;p&gt;So, built it myself:&lt;/p&gt;
&lt;p&gt;&lt;video controls src=&quot;https://thorgalle.me/content-media/posts/assets/mealime-siri-integration/img_0627.mp4&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Do you have a Mealime account, a little bit of technical know-how, and would you also like to be able to do this?&lt;/p&gt;
&lt;p&gt;You can set this up yourself relatively easily, without coding. I included instructions &lt;a href=&quot;https://github.com/th0rgall/mealime-groceries&quot;&gt;on the open-source GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How it works&lt;/h2&gt;
&lt;p&gt;The solution consists of, (1) a Shortcut, and (2), a small server application.&lt;/p&gt;
&lt;h3 id=&quot;1-the-shortcut&quot;&gt;1. The Shortcut&lt;/h3&gt;
&lt;p&gt;In the video, “Add groceries” is a simple iOS/ipadOS/macOS Shortcut that listens to what you want to add. It then sends this text verbatim to the &lt;code&gt;/add&lt;/code&gt; endpoint on the server application. The shortcut fits onto one screenshot:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Mealime iOS shortcut&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1370&quot; height=&quot;1976&quot; src=&quot;https://thorgalle.me/_astro/image.DNL0LqA0_tR3Kz.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;When I say “Hey Siri, Add groceries”, the Shortcuts gets invoked.&lt;/p&gt;
&lt;h3 id=&quot;2-the-server-application&quot;&gt;2. The server application&lt;/h3&gt;
&lt;p&gt;The server application was a Node.js application that I recently rewrote in &lt;a href=&quot;https://deno.land/&quot;&gt;Deno&lt;/a&gt;. When starting it, you supply the server application with your Mealime username &amp;#x26; password.&lt;/p&gt;
&lt;p&gt;The server does two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It receives the request from the Shortcut. It does some basic processing on it to recognize multiple items in your query (”apples AND pears”), as well as the product category an item belongs to (”Produce”). For this, it uses a static
&lt;a href=&quot;https://github.com/th0rgall/mealime-groceries/blob/main/src/products.yaml&quot;&gt;YAML database file&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;After the request has been processed, it uses the Mealime username and password to simulate the user logging in on the (old) Mealime web app. From there, it simulates that same user adding the requested items, and voilà!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The server application can run anywhere where Deno runs, but in particular, it works for free and out-of-the-box on &lt;a href=&quot;https://deno.com/deploy&quot;&gt;Deno Deploy&lt;/a&gt;. There are also &lt;a href=&quot;https://github.com/th0rgall/mealime-groceries/pkgs/container/mealime-groceries&quot;&gt;Docker images&lt;/a&gt; available.&lt;/p&gt;
&lt;h2 id=&quot;caveats&quot;&gt;Caveats&lt;/h2&gt;
&lt;p&gt;It works well enough (and I use it often!), but not everything is dandy in this integration.&lt;/p&gt;
&lt;h3 id=&quot;shortcut-invocation-limitations&quot;&gt;&lt;strong&gt;Shortcut invocation limitations&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;What unfortunately doesn’t work when invoking the shortcut, are the following more natural and direct expressions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Hey Siri, add apples and pears to my grocery list” → this will add it to Reminders&lt;/li&gt;
&lt;li&gt;“Hey Siri, add apples and pears to my Mealime grocery list” → this will make Siri attempt to contact the actual Mealime app, which doesn’t have support for it (“Sorry, you’ll need to continue that in the app”)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;incomplete-product-database&quot;&gt;Incomplete product database&lt;/h3&gt;
&lt;p&gt;The integration can determine the section a product belongs to (”Produce”, “Baking &amp;#x26; Spices”, …), but this process currently has limitations, as it is &lt;a href=&quot;https://github.com/th0rgall/mealime-groceries#adding-more-product-mappings&quot;&gt;based on a static mapping file&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It might be possible to reverse-engineer the search function of the Mealime app, and in that way support all the product-to-section mappings that Mealime understands. However, I didn’t feel this was worth the effort. I only looked at the endpoints used in the web app, where you have to manually specify to which category you want to add your product:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Mealime grocery list modal&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1370&quot; height=&quot;506&quot; src=&quot;https://thorgalle.me/_astro/6Q8MWp-image.VrHPV29n_Z1Xpxb4.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;possibility-that-it-breaks&quot;&gt;Possibility that it breaks&lt;/h3&gt;
&lt;p&gt;The web app that I simulate will likely be replaced with a new version that is coming up, at some point in the future:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Mealime new version&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1370&quot; height=&quot;675&quot; src=&quot;https://thorgalle.me/_astro/7o1tHv-image.AaezFo2R_Z1BMWEQ.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately, this new web app does not have the feature yet of manually adding items to your grocery list. I hope it still comes, or that Mealime makes an official Siri integration!&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2023/mealime-siri-integration</link><guid isPermaLink="false">/posts/2023/mealime-siri-integration</guid></item><item><title>The Page of Judgement</title><description>I made a web page that organizes tweets about good and bad company experiences. Here&apos;s why. </description><pubDate>Sat, 30 Oct 2021 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Before social media, complaining was harder&lt;/strong&gt;. If you wanted to point out a company’s bad practice, you had to use a private channel to contact the customer service department. You may have been able to publicly make a statement if the nature of your grievance was widely relatable, and you had the energy and stature to get your grievance published in a newspaper. But mostly, your complaint was a private matter.&lt;/p&gt;
&lt;p&gt;Social media changed this. When Facebook and Twitter reached mass adoption, companies suddenly needed to be in the space where so many existing and potential customers were. They started printing the F-logo and blue bird onto their packaging, jumping on these new marketing channels and buying ads en masse. But these were platforms! They worked in many directions: customers could also reach companies more easily. And what they said could be seen by everyone.&lt;/p&gt;
&lt;p&gt;As a customer today I do my research online. Next to internet searching, I may look up a company’s Facebook or Twitter account, and see what other people are asking and telling on those page. What kinds of issues people report, and the responsiveness of companies to these people affects their brand in my eyes. Lousy demonstrated service will detract me. Companies can get away with less - bad experiences spread faster.&lt;/p&gt;
&lt;p&gt;The flip side is that good experiences can spread quickly too, and some lucky companies can get a lot of free marketing this way with (viral) user-generated content. In any case, I think faster feedback loops for companies are a win for society.&lt;/p&gt;
&lt;p&gt;Today I’m publishing my personal contribution to the feedback-o-sphere of the internet: &lt;a href=&quot;https://thorgalle.me/tweets&quot;&gt;The Page of Judgement&lt;/a&gt;, a living collection of tweets about both good and bad experiences I’ve had with products and companies over the years.&lt;/p&gt;
&lt;p&gt;Often they are trifling issues, bug reports and feature requests. Sometimes they’re vague annoyances or happy surprises. Quite regularly, they got a response from a company spokesperson - and sometimes a small discussion even ensued.&lt;/p&gt;
&lt;p&gt;This organized tweet collection is yet another perspective on my personal data. We generate so many messages, tweets and posts daily. Incumbent social media companies know what to do with this: use it to understand people, and monetize that understanding by selling personalized ads. But whether past personal data can have value in the present and future, &lt;em&gt;for oneself&lt;/em&gt;, is a matter of constant experimentation that I like to tinker with.&lt;/p&gt;
&lt;p&gt;I will reference this list to remember what I publicly “liked” and “disliked”. Maybe someone on the internet finds it fascinating as well.&lt;/p&gt;
&lt;p&gt;One insight strikes me so far: I’m praising more online than complaining. Let that be a guiding rule for the future!&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2021/the-page-of-judgement</link><guid isPermaLink="false">/posts/2021/the-page-of-judgement</guid></item><item><title>More about me</title><description>An introduction of myself, updated until 2022.</description><pubDate>Sun, 23 May 2021 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;👋 Hello internet, I’m Thor!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This introduction used to be on my&lt;/em&gt; &lt;em&gt;/about page&lt;/em&gt;*. I updated it a few times during 2021 and 2022, but today it’s in need of a full rewrite. I’ve put the last version up here for archival.*&lt;/p&gt;
&lt;p&gt;&lt;em&gt;- Thor, September 16th, 2024&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I’m a 20-something he/him dude living in Helsinki. Here’s a little more about me.&lt;/p&gt;
&lt;p&gt;If you just want to contact me, &lt;a href=&quot;https://thorgalle.me/contact&quot;&gt;click here&lt;/a&gt;. If you only care about my professional story, well, &lt;a href=&quot;https://thorgalle.me/work&quot;&gt;here you go&lt;/a&gt;!&lt;/p&gt;
&lt;h2 id=&quot;-the-name&quot;&gt;🔨 The Name&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;Thorgal&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1256&quot; height=&quot;465&quot; src=&quot;https://thorgalle.me/_astro/image.BXhcrQL6_Z2m0nuR.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;First things first. About my name: yes. It directly refers to &lt;a href=&quot;https://en.wikipedia.org/wiki/Thor&quot;&gt;the almighty god&lt;/a&gt;. Indirectly, it is an apt wordplay from my dad on one of his favorite comic book series: &lt;a href=&quot;https://en.wikipedia.org/wiki/Thorgal&quot;&gt;Thorgal&lt;/a&gt; (Thor Galle, Thorgal, get it?). I hold no grudge, it’s a great series.&lt;/p&gt;
&lt;h2 id=&quot;-the-formative-years&quot;&gt;🇧🇪 The Formative Years&lt;/h2&gt;
&lt;p&gt;Thorgal is also a Belgian series, which brings me to the start of my story: I lived most of my 20-something years in &lt;a href=&quot;https://www.openstreetmap.org/relation/196311&quot;&gt;Leuven, Belgium&lt;/a&gt;. I grew up there happily, went to a fun &lt;a href=&quot;https://en.wikipedia.org/wiki/C%C3%A9lestin_Freinet&quot;&gt;Freinet&lt;/a&gt; primary school (no homework!), a proper Catholic high school (homework!), and finally, a &lt;a href=&quot;https://en.wikipedia.org/wiki/KU_Leuven&quot;&gt;world-renowned university&lt;/a&gt; for my bachelors’ in Computer Science.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Naamsestraat - 20190418_110225.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;https://thorgalle.me/_astro/20190418_110225.FUSmBR87_1WCyQ6.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;All that in the same cozy medieval university town. Thus, when graduating from my bachelor’s in 2018, I felt the urge to expand my horizons.&lt;/p&gt;
&lt;h2 id=&quot;-the-nordic-years&quot;&gt;🇫🇮🇸🇪 The Nordic Years&lt;/h2&gt;
&lt;p&gt;I left my dear Belgium, 2500 km &lt;a href=&quot;https://www.instagram.com/explore/tags/thepedalchoiceog/&quot;&gt;by bike&lt;/a&gt;, to pursue an European master’s program in Human-Computer Interaction &amp;#x26; Design, &lt;a href=&quot;https://masterschool.eitdigital.eu/human-computer-interaction-and-design&quot;&gt;at EIT Digital&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My studies brought me to &lt;a href=&quot;https://www.aalto.fi/en&quot;&gt;Aalto University&lt;/a&gt; near Helsinki (Finland) for a year, and &lt;a href=&quot;https://www.kth.se/en/&quot;&gt;KTH Royal Institute of Technology&lt;/a&gt; in Stockholm (Sweden) for another.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Helsinki from plane - 20190417_201602.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;350&quot; src=&quot;https://thorgalle.me/_astro/20190417_201602.CNZetRsV_1ThoDs.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the summer of 2019 I interned at &lt;a href=&quot;https://columbiaroad.com&quot;&gt;Columbia Road&lt;/a&gt; in Helsinki, a digital sales consultancy. I liked the job and stayed on, taking the job with me to Stockholm, where they had just opened a new office. I lived and worked in Stockholm for two years (more &lt;a href=&quot;https://thorgalle.me/work#Columbia-Road&quot;&gt;about that work here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In the summer of 2021, I moved back to Helsinki for reasons of ❤️. This coincided with me becoming the Product Lead of reallyreadit, inc., the company behind &lt;a href=&quot;https://thorgalle.me/projects/readup&quot;&gt;Readup&lt;/a&gt; - a role I held for half a year, until funding ran out. Readup was a labor of love, which is why the platform still exists today, maintained by its community (including me). Afterwards, I worked for half a year as a freelance developer and designer via my own firm BitHarmony.&lt;/p&gt;
&lt;p&gt;In the autumn of 2022, I became the Chief Technologist of Slowby, the Belgian social enterprise behind &lt;a href=&quot;https://thorgalle.me/projects/welcome-to-my-garden&quot;&gt;Welcome To My Garden&lt;/a&gt;. While still living in Helsinki and working remotely most of the time, this has brought me back closer to Belgium. In these fast-paced times, it’s incredibly rewarding to help thousands of slow travellers and hosts connect with each other, and to build tools to help them plan their journeys.&lt;/p&gt;
&lt;h2 id=&quot;-hobbies&quot;&gt;🧶 Hobbies&lt;/h2&gt;
&lt;p&gt;I like to read regularly, which I often do online &lt;a href=&quot;https://readup.org/@thorgalle&quot;&gt;on Readup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I find &lt;strong&gt;languages&lt;/strong&gt; fascinating. I’m currently fluent in Dutch (native) and English. I’m also able to hold a decent conversation in Swedish and French, though I’m not getting much practice as of late. I enjoy hacking on language-learning technology, so I was lucky to be able to do my master’s thesis on this topic, at &lt;a href=&quot;https://thorgalle.me/work/#Sprakkraft&quot;&gt;Språkkraft&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In general, I like scratching my own technological itches, and doing fun stuff with my personal data (see &lt;a href=&quot;https://thorgalle.me/projects#projects&quot;&gt;my projects&lt;/a&gt;). I also think we could collectively do much more interesting things with our personal data. In 2020 I gave &lt;a href=&quot;https://2020.openbelgium.be/blogpost/big-tech-has-your-data-come-get-it&quot;&gt;a talk about getting your personal data from big tech &amp;#x26; doing something with it&lt;/a&gt;. This ties in with an interest in productivity apps and knowledge management tools. My personal &lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt; has become massive since I started it in 2019. I’m looking for ways to publish some notes here in long-lasting, self-owned Markdown.&lt;/p&gt;
&lt;h2 id=&quot;️-sports&quot;&gt;🤾‍♂️ Sports&lt;/h2&gt;
&lt;p&gt;I enjoy being active, but as someone who also enjoys sitting in front of a computer; there’s always the goal of being &lt;em&gt;more&lt;/em&gt; active.&lt;/p&gt;
&lt;p&gt;🧗🏼‍♂️ In my teens, &lt;strong&gt;wall climbing&lt;/strong&gt; and bouldering represented a considerable part of my week. Since higher education, I’ve had on &amp;#x26; off relationship with the sport. The practice never turned super serious; so I’m stuck at a ~6c grade. Bouldering can be an very fun problem solving, away from the computer.&lt;/p&gt;
&lt;p&gt;🏃🏼‍♂️ I’m &lt;strong&gt;running regularly&lt;/strong&gt; for all the good reasons. No races yet, though my first half marathon seems to be approaching. Also, &lt;a href=&quot;https://readup.org/comments/wired/to-run-my-best-marathon-at-age-44-i-had-to-outrun-my-past&quot;&gt;I’m in no hurry here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;🚴‍♀️ A very Belgian thing to do: &lt;strong&gt;road cycling&lt;/strong&gt;. I miss the days where I’d zoom through the fields of Flanders. I’ve also done my fair share of tour cycling, the most intrepid one being a one-month, 2500km trip that took me from Leuven to Helsinki in 2018. A different beast entirely, but a glorious one. Here’s a collection of &lt;a href=&quot;https://www.instagram.com/explore/tags/thepedalchoiceog/&quot;&gt;Instagram posts&lt;/a&gt; from then.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;There, now I shouldn’t be a total stranger anymore! Feel free to poke around further on this site, or get in touch. You can find me &lt;a href=&quot;https://readup.org/@thorgalle&quot;&gt;in the comments&lt;/a&gt; on Readup, or intermittently on &lt;a href=&quot;https://twitter.com/th0rgall&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/thorgalle/&quot;&gt;LinkedIn&lt;/a&gt;. You can reach me at thorgalle &lt;at&gt; gmail &lt;dot&gt; com.&lt;/dot&gt;&lt;/at&gt;&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2021/more-about-me</link><guid isPermaLink="false">/posts/2021/more-about-me</guid></item><item><title>A regex puzzle: match a, b, or a and b</title><pubDate>Fri, 10 Apr 2020 14:27:00 GMT</pubDate><content:encoded>&lt;p&gt;For a project I’m parsing a textual representation of a time duration. I stumbled on an interesting regex problem while doing that.&lt;/p&gt;
&lt;p&gt;Concretely, I’m parsing these indications on my Audible library page of how long I’ve listened to an audiobook. I want to extract the hours and/or minutes from this duration.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;audible-example.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1286&quot; height=&quot;760&quot; src=&quot;https://thorgalle.me/_astro/audible-example.BTitPFVu_Z11WKTh.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This was my first regex attempt : &lt;code&gt;/(\d{1,2})h(?:\s?(\d{1,2})m)?/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;regex-first-attempt.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1976&quot; height=&quot;786&quot; src=&quot;https://thorgalle.me/_astro/regex-first-attempt.DZwUW2B1_ZKrMJl.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://regex101.com/r/Eyyyv3/1&quot;&gt;Regex 101 link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It seemed to work well. But as the regex nerd might see, I soon encountered a bug when there was less than one hour left: the hours had disappeared, and my regex didn’t account for that.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;regex-no-match.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1976&quot; height=&quot;786&quot; src=&quot;https://thorgalle.me/_astro/regex-no-match.BqVTvs-K_10DJGx.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://regex101.com/r/Eyyyv3/2&quot;&gt;Regex 101 link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So how to solve this issue?&lt;/p&gt;
&lt;p&gt;A first idea is to make the hour part and minute part optional with the &lt;code&gt;?&lt;/code&gt; operator:&lt;/p&gt;
&lt;p&gt;/(?:(\d{1,2})\s&lt;em&gt;h)?\s&lt;/em&gt;(?:\s?(\d{1,2})\s*m)?/&lt;/p&gt;
&lt;p&gt;This seems to work. And it does, given that the input string is always exactly in the format “8h 2m left”.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;first-fix-works.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1976&quot; height=&quot;786&quot; src=&quot;https://thorgalle.me/_astro/first-fix-works.DCmF9aoh_bNki7.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://regex101.com/r/RynwxI/1/tests&quot;&gt;Regex 101 unit test link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But one “issue”: this regex isn’t robust in the input it accepts.&lt;/p&gt;
&lt;p&gt;If any characters are added before or behind, it will fail. Because &lt;strong&gt;it also matches the empty string&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;See this test, note the space in front of the &lt;code&gt;8m&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;regex-first-fix-nomatch.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1964&quot; height=&quot;780&quot; src=&quot;https://thorgalle.me/_astro/regex-first-fix-nomatch.D2gQoGyM_Z288sgU.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://regex101.com/r/Ap7C83/1/tests&quot;&gt;Regex 101 link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Why? Because the regex &lt;code&gt;a?b?&lt;/code&gt; matches either &lt;code&gt;a&lt;/code&gt; or &lt;code&gt;b&lt;/code&gt;, but matching nothing is also OK! And for the quick thinkers: &lt;code&gt;a|b&lt;/code&gt; would in this case not be a solution, because there are capturing groups in a and b.&lt;/p&gt;
&lt;p&gt;I’m abstracting &lt;code&gt;a&lt;/code&gt; as the hour-matcher and &lt;code&gt;b&lt;/code&gt; as the minute matcher here.&lt;/p&gt;
&lt;p&gt;That’s the problem that intrigued me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How can you match ‘a’, ‘b’, or ‘a and b’ while preserving the same single capturing groups in a and b?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I took this as a regex puzzle and came up with some solutions:&lt;/p&gt;
&lt;h3 id=&quot;solution-1-brute-force-with-code&quot;&gt;Solution 1: Brute force with code&lt;/h3&gt;
&lt;p&gt;The first solution is not really a regex solution: use a &lt;strong&gt;global&lt;/strong&gt; flag on the previous regex, and then to write code to scan for “valid” matches. Empty string matches are discarded, only a filled match is kept.&lt;/p&gt;
&lt;p&gt;Works, but I’m looking for a regex-only solution.&lt;/p&gt;
&lt;h3 id=&quot;solution-2-brute-force-regex&quot;&gt;Solution 2: Brute force regex&lt;/h3&gt;
&lt;p&gt;A straightforward regex solution is this: &lt;code&gt;a|b|ab&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;But I didn’t like this. Because I have a capturing group in both a and b, and by duplicating &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; into &lt;code&gt;ab&lt;/code&gt;, that means I’d also duplicate the capturing groups.&lt;/p&gt;
&lt;p&gt;Then we go from this simple scenario:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;match group 1 contains hours&lt;/li&gt;
&lt;li&gt;match group 2 contains minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To this more complicated one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;match group 1 contains hours &lt;em&gt;if&lt;/em&gt; the string is an hour-only string like ‘8h left’&lt;/li&gt;
&lt;li&gt;match group 2 contains minutes &lt;em&gt;if&lt;/em&gt; the string is a minute-only string like ‘8h left’&lt;/li&gt;
&lt;li&gt;match group 3 contains hours &lt;em&gt;if&lt;/em&gt; the string is combined hour-minute string like ‘8h 3m left’&lt;/li&gt;
&lt;li&gt;match group 4 contains minutes &lt;em&gt;if&lt;/em&gt; the string is combined hour-minute string like ‘8h 3m left’&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That means the code handling the regex match would need if/else logic to deal with these scenarios. A compromise you might take, but I’m looking for a “regex-only” solution.&lt;/p&gt;
&lt;h3 id=&quot;solution-3-explicitly-not-matching-an-empty-string&quot;&gt;Solution 3: Explicitly &lt;em&gt;not&lt;/em&gt; matching an empty string?&lt;/h3&gt;
&lt;p&gt;We could solve this if we could tell the regex that it can &lt;em&gt;never&lt;/em&gt; match an empty string somehow.&lt;/p&gt;
&lt;p&gt;I tried to look around for this briefly, but couldn’t find anything that worked.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://stackoverflow.com/questions/19127384/what-is-a-regex-to-match-only-an-empty-string&quot;&gt;this StackOverflow thread&lt;/a&gt; and let me know if you make it work :)&lt;/p&gt;
&lt;h3 id=&quot;solution-4-only-match-when-something-good-lies-ahead&quot;&gt;Solution 4: Only match when something good lies ahead&lt;/h3&gt;
&lt;p&gt;This is the solution that finally worked for me: a &lt;strong&gt;positive lookahead&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This piece of regex &lt;code&gt;(?=\d{1,2}\s*(?:h|m))&lt;/code&gt; in front of the rest tells the matcher that it should look ahead for something with one or two digits and a ‘h’ or ‘m’. Only when it finds this in front of itself, it can start with the real matching and capturing groups.&lt;/p&gt;
&lt;p&gt;It can be abstracted as &lt;code&gt;(?=a|b)a?b?&lt;/code&gt;, but my concrete implementation takes some shortcuts there.&lt;/p&gt;
&lt;p&gt;This solution has the robustness against spaces and only 2 capturing groups. I added the global flag in this example to demonstrate what it does:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;full-regex.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1976&quot; height=&quot;786&quot; src=&quot;https://thorgalle.me/_astro/full-regex.3ghX2pYZ_Z2qzySS.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://regex101.com/r/nkcZmV/1&quot;&gt;this regex101&lt;/a&gt; for the full regex.&lt;/p&gt;
&lt;p&gt;The regex does not support the notion of “days” or “seconds”, or epxressions like “less than one minute”. I hope these will not appear in the Audible page :)&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2020/regex-puzzle-either-and</link><guid isPermaLink="false">/posts/2020/regex-puzzle-either-and</guid></item><item><title>✅ Voc Enhancer&apos;s first feature request</title><pubDate>Sun, 09 Jun 2019 21:43:00 GMT</pubDate><content:encoded>&lt;p&gt;A while ago, a new review came in for &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/vocabulary-com-enhancer/&quot;&gt;Vocabulary.com Enhancer&lt;/a&gt;, an extension I made that adds functionality like translations to the popular English word learning site &lt;a href=&quot;https://vocabulary.com&quot;&gt;vocabulary.com&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;very useful! can you add the pronunciation button to the “list page”? thank you!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;̶ Yao Xiao, May 19 2019, &lt;a href=&quot;https://chrome.google.com/webstore/detail/vocabularycom-enhancer/diddacjdgklfjgnlmknacnakjcgdiegn&quot;&gt;Chrome&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Reason enough for me to jump back in the development! I feel it’s important to maintain the extension and help users where necessary, especially now that 150 people are using it daily. That’s the only way it will stay relevant, grow and provide more value.&lt;/p&gt;
&lt;p&gt;The pronunication button is now there in v0.6, enjoy Yao! And being back in it, I tackled one more task.&lt;/p&gt;
&lt;h3 id=&quot;upping-that-ux-&quot;&gt;Upping that UX ✨&lt;/h3&gt;
&lt;p&gt;For another feature of the extension, a collection of links to external services in a list of saved words, I was annoyed by the repeated icons to external services: they were bloating the page. The words should stay the main content of the page, and this was not the case.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;duplication.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1712&quot; height=&quot;948&quot; src=&quot;https://thorgalle.me/_astro/duplication.B6nKYDhI_1vzfQc.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The solution:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;piggyback.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1690&quot; height=&quot;254&quot; src=&quot;https://thorgalle.me/_astro/piggyback.C2oUsAYT_Zup85q.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now the icon row is collapsible and collapsed by default to avoid visual bloat. I had some fun (and trouble) implementing CSS animations in inline-blocks 🙃. Here’s a little demo of this functionality (or disguised advertisement for Google Define, &lt;a href=&quot;https://youglish.com&quot;&gt;youglish&lt;/a&gt;, and the &lt;a href=&quot;urbandictionary.com&quot;&gt;Urban Dictionary&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;video controls src=&quot;https://thorgalle.me/content-media/posts/assets/voc-enhancer-0-6-update/enhancer-collapse-demo-1.mp4&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Some trade-offs &amp;#x26; decisions I made while designing this change:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A horizontal collapse with a triangle icon ▸ is not common. They are mostly used to hide and show a vertical content container, like a review with spoilers. In this case, the three-dot “More” burger menu would have been the more standard design pattern. I still chose the horizontal collapse, just because it was fun to implement and to experiment with it.&lt;/li&gt;
&lt;li&gt;The “link” 🔗 icon to the left is slightly messy. Omitting it looks better, but it does add necessary meaning to the open/hide triangle button.&lt;/li&gt;
&lt;li&gt;To open the link configuration, the standard settings ⚙️ icon was used because it was available in the existing font symbol set of the site. Otherwise, an editing pen symbol would have been more fitting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I still want to see how I can visually tune the menu so it looks more organized. If a proper UI designer is reading this, feel free to send help! Feedback is also welcome, always.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2019/voc-enhancer-0-6-update</link><guid isPermaLink="false">/posts/2019/voc-enhancer-0-6-update</guid></item><item><title>Sleep Visualization</title><pubDate>Sun, 26 May 2019 18:22:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;sleepviz.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2878&quot; height=&quot;1610&quot; src=&quot;https://thorgalle.me/_astro/sleepviz.C1ovAkTt_22Wo9n.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Last week I spent some hours on visualizing my sleep pattern. It is based on 99 days of manually tracked data (yes!). This is a first part of a much larger data tracking project in progress. &lt;a href=&quot;https://web.thorgalle.me/sleepviz1/&quot;&gt;See a rendered full screen version here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Stylistically I used a minimalistic color scheme that could’ve come straight from Hundred Rabbits&lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. Obviously, this visualization still misses a legend or visual cues to give meaning to the elements. But maybe the air of mystery around my actual sleep/wake times is not too bad ;)&lt;/p&gt;
&lt;h3 id=&quot;a-little-legend&quot;&gt;A little legend:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Each vertical white line represents a night, time goes from left to right.&lt;/li&gt;
&lt;li&gt;The top red dots are wake-up times. The higher the earlier.&lt;/li&gt;
&lt;li&gt;The bottom white dots are sleep times. The lower the later.&lt;/li&gt;
&lt;li&gt;The dotted lines are stay-awake-in-bed times - somehow I found this data interesting - maybe because I want to reduce that time 🙃&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Technically I had fun implementing a parser that could understand my ambiguous notes on sleep &amp;#x26; wake times. I used an Airtable&lt;sup&gt;&lt;a href=&quot;#user-content-fn-2&quot; id=&quot;user-content-fnref-2&quot; data-footnote-ref=&quot;&quot; aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; spreadsheet with a row for every day and columns for sleep and wake times. The format is not consistent though. I could write “2&lt;/p&gt;&lt;div&gt;&lt;/div&gt;” to mean a bed time at 2&lt;div&gt;&lt;/div&gt; AM the next day, or “11” to mean 11 PM that same day. &lt;a href=&quot;https://momentjs.com/&quot;&gt;Moment.js&lt;/a&gt; was helpful. For the visualization itself I  used the JS vector interface library &lt;a href=&quot;http://paperjs.org/&quot;&gt;paper.js&lt;/a&gt; just to try it out. It’s great for what it does - more advanced than the &lt;a href=&quot;https://p5js.org&quot;&gt;p5.js&lt;/a&gt; library I had used before. But I might still replace it it with D3.js as the latter offers more tools for working with data dynamically, as I used in a similar project &lt;a href=&quot;http://thorgalle.me/articles/movieviz&quot;&gt;for visualizing the movies I’ve seen&lt;/a&gt;.&lt;p&gt;&lt;/p&gt;
&lt;p&gt;You might already be able to spot that starting a 9 to 5 job had an effect on my sleep stability the last weeks. To be continued!&lt;/p&gt;
&lt;section data-footnotes=&quot;&quot; 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;&lt;a href=&quot;https://100r.co/&quot;&gt;Hundred Rabbits&lt;/a&gt; is an 2-person artistic collective making tools, games, recipes, and videos on board of a sailboat. Hundred Rabbits is cool, check them out. &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;&lt;a href=&quot;http://airtable.com/&quot;&gt;Airtable.com&lt;/a&gt; is spreadsheets on steroids. Google Sheets but better, with a nice auto-generated API. My &lt;a href=&quot;https://en.wikipedia.org/wiki/Net_Promoter&quot;&gt;Net Promoter Score&lt;/a&gt; is skyrocketing here. &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><link>https://thorgalle.me/posts/2019/sleep-visualization</link><guid isPermaLink="false">/posts/2019/sleep-visualization</guid></item><item><title>6 Reasons Why Finland&apos;s Student Restaurants Are Wonderful</title><description>Exploring the nice properties of student restaurants in Helsinki and Finland in general. What makes them so good?</description><pubDate>Thu, 09 May 2019 15:35:00 GMT</pubDate><content:encoded>&lt;p&gt;If there is one thing I love about studying in Helsinki, it’s the student restaurants. As a vegetarian I can relish in abundant, healthy and varied meals for ridiculously low prices. What makes it so good here?&lt;/p&gt;
&lt;h2 id=&quot;1-greens-go-first-&quot;&gt;1. Greens go first 🌱&lt;/h2&gt;
&lt;p&gt;In many things, Finland distinguishes itself by balancing the free market with strong government support where necessary. For student food this is no different. Finlands’ social security institution &lt;a href=&quot;https://www.kela.fi/web/en/meal-subsidy&quot;&gt;Kela&lt;/a&gt; provides private catering companies with a € 1.94 subsidy &lt;em&gt;per student meal&lt;/em&gt;. To enjoy this support, caterers need to comply with a long list of requirements.&lt;/p&gt;
&lt;p&gt;One requirement is a salad as part of every meal. Mostly that means the local vegetable staples: lettuce, carrots and some form of cabbage. But I regularly find protein-rich foods such as beans and chickpeas too. And sometimes even pasta dishes complete with sundried tomatoes can be scooped from one of the salad trays. Other times there’s also fruit. In the winter there were canned mango pieces or quarter oranges, now I regularly had watermelon pieces.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;salad2.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2016&quot; height=&quot;1370&quot; src=&quot;https://thorgalle.me/_astro/salad2.C6jR2aix_29mEGA.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Salads can be topped off with an assortment of dressings and seeds depending on the restaurant. One restaurant even has breadcrumbs and fried onions to go with soup or salad.&lt;/p&gt;
&lt;p&gt;By requirement, the salad bar comes &lt;em&gt;before&lt;/em&gt; the main meal. This is a prime example of &lt;a href=&quot;https://en.wikipedia.org/wiki/Nudge_theory&quot;&gt;nudging&lt;/a&gt;, it invites the visitors to include more vegetables and legumes on their plate before taking the main meal. A welcome change for student’s health and the environment!&lt;/p&gt;
&lt;h2 id=&quot;2affordable-meals-for-everyone-&quot;&gt;2.Affordable meals for &lt;em&gt;everyone&lt;/em&gt; 💰&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;meal-composition.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1272&quot; height=&quot;867&quot; src=&quot;https://thorgalle.me/_astro/meal-composition.vw-LTXAZ_Z1qYUMF.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;For everyone. Yes, also for you, you miserable gluten and lactose intolerant vegan who can’t have nuts either. There’s something for you.&lt;/p&gt;
&lt;p&gt;The meal offering is varied and there’s plenty of choice. All student restaurants in Helsinki provide a € 2.6 main meal with either meat/fish or a vegetarian option.  At the date of writing there was &lt;em&gt;Chicken tikka masala&lt;/em&gt; in Aalto Valimo, the CS building had &lt;em&gt;Tuna fish lasgnette&lt;/em&gt; while vegetarian resto Kipsari served &lt;em&gt;Brazilian vegetable curry with caribian rice &amp;#x26; peas&lt;/em&gt;: there’s something for everyone.&lt;/p&gt;
&lt;p&gt;Most restaurants offer a choice between the standard meal and a slightly more expensive à la carte meal for € 4.95. These meals are fancy dishes in fixed, smaller portions. Some restaurants also always have a pizza to choose at that price point: American pan-pizza or flat bottom? You choose. You still can take the previously mentioned salad of course. Oh, before I forget to mention, in some restaurants a salad-only meal is € 1.80.&lt;/p&gt;
&lt;h2 id=&quot;3-a-personalized-meal-finder-&quot;&gt;3. A personalized meal finder 🔍&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://kanttiinit.fi/&quot;&gt;Kanttiinit.fi&lt;/a&gt;, a handy web app lists all the meal options in the different campuses around Helsinki. It’s &lt;a href=&quot;https://github.com/Kanttiinit&quot;&gt;open-source&lt;/a&gt; and made by students.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;kanttiinit.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2880&quot; height=&quot;1686&quot; src=&quot;https://thorgalle.me/_astro/kanttiinit.BjoY1aOE_2nxbUF.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;With Kanttiinit it’s easy to find what you like. You can highlight menu items that fit your taste, for example by selecting &lt;em&gt;vegan&lt;/em&gt; and marking that you like &lt;em&gt;mushrooms&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Here’s my configuration:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;highlights.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1516&quot; height=&quot;1064&quot; src=&quot;https://thorgalle.me/_astro/highlights.t0ooJOEL_ZWxW9q.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;More importantly, &lt;strong&gt;you can also filter by allergens&lt;/strong&gt;, gluten- and lactose contents. This reflects the clear physical labels that are present next to every food item in the student restaurants: a critical feature to make the lives of students with intolerances more comfortable.&lt;/p&gt;
&lt;h2 id=&quot;4-add-ons-included-&quot;&gt;4. Add-ons included 👌&lt;/h2&gt;
&lt;p&gt;The student canteens need to fullfill two other requirements: meals include &lt;strong&gt;at least one glass of milk and students can have bread à volonté.&lt;/strong&gt; However, some restaurants also provide oat and soy drinks next to regular milk to take everyone into account.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;bread2.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2016&quot; height=&quot;1512&quot; src=&quot;https://thorgalle.me/_astro/bread2.CPZFDbtt_Z11XykH.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The bread offering varies daily with white bread, baguette-style breads and raisin-breads. The traditional Finnish dark rye bread can always be found. Butter is a requirement too, but regularly other tasteful toppings such as beetroot hummus are offered as an alternative.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;bread-topping.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2016&quot; height=&quot;1421&quot; src=&quot;https://thorgalle.me/_astro/bread-topping.DrSfQGfx_Z2b08pq.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Finally, restaurants also have &lt;strong&gt;sauces and spices&lt;/strong&gt; that can be added onto the meal. I see many students putting tabasco on meals that they find too bland. Otherwise there is salt, pepper, balsamico, olive oil, sweet-sour sauce, … you name it!&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;addons-toppings.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1656&quot; height=&quot;1213&quot; src=&quot;https://thorgalle.me/_astro/addons-toppings.DkXDfSU9_Z1OPrIC.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;5-almost-all-you-can-eat-&quot;&gt;5. (Almost) All You Can Eat 🍽&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;mario-bread.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2000&quot; height=&quot;1240&quot; src=&quot;https://thorgalle.me/_astro/mario-bread.CwNlxLwI_XRYeY.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Whether you’re trying to gain weight on a heavy workout program or going for a light lunch, you can get just that the amount of food you need. &lt;strong&gt;You fill your plate yourself.&lt;/strong&gt; You can’t go back to get more salad or a main meal, but as long as you can fit what you want on one plate you’re good. In contrast, the bread bars are practically buffet-style. I often go back for a pumpkin hummus sandwich.&lt;/p&gt;
&lt;p&gt;I have to be honest. I over-ate many, many times. But at least I over-ate on tasty vegetables!&lt;/p&gt;
&lt;h2 id=&quot;6-competition-for-good-&quot;&gt;6. Competition for good 🥊&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;restaurants.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1700&quot; height=&quot;1008&quot; src=&quot;https://thorgalle.me/_astro/restaurants.Anu0gvdV_ZVHa1b.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;There is not only choice of meals, there’s also choice of &lt;em&gt;restaurants&lt;/em&gt;. My campus here is about 15,000 people big yet it has &lt;strong&gt;13 different student restaurants&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Caterers here try to win students by putting their signature on their offering. This diversity is for the benefit of students, who can pick what he or she likes. For example, the Swedish student union’s restaurant &lt;a href=&quot;https://www.taffa.fi/home&quot;&gt;Täffä&lt;/a&gt; serves a classic smoked salmon every Friday. &lt;a href=&quot;https://www.fazerfoodservices.com/food-services/fazer-food--co/&quot;&gt;Fazer Food&amp;#x26;Co&lt;/a&gt;, a large food company in Finland, started a &lt;a href=&quot;https://www.fazerfoodservices.com/food-services/fazer-introduces-a-new-wicked-rabbit-vegetarian-food-concept/&quot;&gt;&lt;em&gt;Wicked Rabbit&lt;/em&gt;&lt;/a&gt; line in 2017 with the most abundant vegetarian and vegan meals. It reminds me of exclusive vegetarian restaurants in Belgium - except 4 times cheaper. My favorite still is &lt;a href=&quot;http://www.kipsari.com/&quot;&gt;Kipsari&lt;/a&gt;, an independent vege/vegan restaurant originally founded in 1960 (!) by students. They’re small, personal and offer plates with the best flavors from Europe and Asia. But it doesn’t stop there. Internationally known caterer Sodexo is also present and even a lone franchisee of the Subway chain has its place.&lt;/p&gt;
&lt;p&gt;Next to that, restaurants &lt;em&gt;care&lt;/em&gt; more. They are feedback machines at most places. A few months ago we could fill in a feedback form in exchange for a little desert. It’s not just a gimmick, they also act on it. A recurring complaint for Fazer Food&amp;#x26;Co in last fall was that they were not offering 2.6 euro vegetarian meals. This semester there has been one every day.&lt;/p&gt;
&lt;p&gt;They don’t only care about students, they care about the environment too. Many restaurants resell leftover food for reduced prices at the end of the day, with an extra reduction when you bring your own container. And I encountered one where no lunch trays were used. A bit annoying, but it would reportedly save 4000-4500 KWh of power, 12 000 liter of water and 15KG of soap.&lt;/p&gt;
&lt;h2 id=&quot;️--a-dream-come-true&quot;&gt;☁️🥗👼 … a dream come true?&lt;/h2&gt;
&lt;p&gt;Needless to say, I’ve had an amazing experience when it comes to eating here as a student. The Finns sometimes complain about their restaurants, but I’m sure that’s only because they don’t know otherwise. As a vegetarian/vegan it’s amazing how many options there are! The salad alone would often be enough for me.&lt;/p&gt;
&lt;p&gt;Two years ago in Leuven (Belgium) I co-founded &lt;a href=&quot;http://greenofficeforkuleuven.be/projects/goecolicious&quot;&gt;GO Ecolicious&lt;/a&gt;, a student group at the &lt;a href=&quot;http://greenofficeforkuleuven.be/&quot;&gt;Green Office for KU Leuven&lt;/a&gt; that promoted ecological food in said university. Vegetarian meals at the monopolist student caterer &lt;a href=&quot;https://www.alma.be/&quot;&gt;Alma&lt;/a&gt; were poor and overpiced. Lactose, gluten and other allergens were not properly labeled, always present in the food and vegan meals were never an option. We lobbied for small changes but got little satisfactory response. The futuristic vision we had there is just a reality in Helsinki. It makes me happy to see that it’s possible, but also pains me that Alma is still behaving in prehistoric ways.&lt;/p&gt;
&lt;p&gt;So what makes that Alma can not or does not implement these vital changes? In a next article I’ll compare the Finnish system to the Belgian system with Alma’s case specifically. Stay tuned!&lt;/p&gt;
&lt;p&gt;Thor Galle&lt;/p&gt;
&lt;p&gt;Text &amp;#x26; images licensed under &lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&gt;CC-BY-SA 4.0&lt;/a&gt;&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2019/6-reasons-why-finland&apos;s-student-restaurants-are-wonderful</link><guid isPermaLink="false">/posts/2019/6-reasons-why-finland&apos;s-student-restaurants-are-wonderful</guid></item><item><title>Disinformation documentaries</title><pubDate>Wed, 10 Apr 2019 10:33:00 GMT</pubDate><content:encoded>&lt;p&gt;Today I watched &lt;a href=&quot;https://www.vrt.be/vrtnu/a-z/pano/2019/pano-s2019a9/&quot;&gt;an interesting documentary&lt;/a&gt; (in Dutch) from Flemish public television about Russian disinformation in the US and Europe. Among the cases it explores are Russian blaming of Belgian F-16 fighters for killing civilians in Syria and the defamation of a Finnish reporter that investigated Russian interference in Finland.&lt;/p&gt;
&lt;p&gt;The techniques used to disinform are not new however. While social media is the prevalent medium today, masses have been misled or centuries by parties that have incentive to do so. It reminded me of &lt;a href=&quot;https://www.imdb.com/title/tt3675568/&quot;&gt;Merchants of Doubt&lt;/a&gt;, a 2014 feature-length documentary that tells the stories of the tobacco industry fighting medical counterpressure with lies, and climate change deniers tainting scientific consensus with fake science.&lt;/p&gt;
&lt;p&gt;The main takeaway is that sowing lies causes people to doubt truths spread in the mainstream media. Little false discourse is necessary to achieve a sufficient level of confusion about eg. climate change. When people are confused, they stick to what they want to believe and ignore information that disconfirms their beliefs (see &lt;a href=&quot;https://en.wikipedia.org/wiki/Cognitive_dissonance&quot;&gt;cognitive dissonance&lt;/a&gt;). That is the goal of the disinformers.&lt;/p&gt;
&lt;p&gt;These documentaries remain relevant today with climate change denier Trump in office and the Russians doing their thing as we speak. They teach us to be wary of counter-information, wherever it may come from. Recommended to watch!&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2019/disinformation-documentaries</link><guid isPermaLink="false">/posts/2019/disinformation-documentaries</guid></item><item><title>Creating a movie visualization</title><description>An interactive visualization of all the movies I&apos;ve seen since 2015</description><pubDate>Mon, 18 Mar 2019 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;movieviz.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1031&quot; src=&quot;https://thorgalle.me/_astro/movieviz.B4-MqjF5_QKDVC.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;I created a visualization of all the movies and series I have seen since 2015. &lt;strong&gt;You can see it in a browser&lt;/strong&gt; &lt;a href=&quot;http://web.thorgalle.me/movieviz/&quot;&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;mini-usage-guide&quot;&gt;Mini usage guide:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;It has two views. One shows the movies stacked by release date, the other one shows them stacked by the week that I watched them. Toggle these views from the menu left above or by pressing “R” or “W”.&lt;/li&gt;
&lt;li&gt;See movie details and maybe my mini-review by clicking/tapping a movie.&lt;/li&gt;
&lt;li&gt;Highlight my favorites by click the menu option or pressing “F”.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What follows is a little history of the project.&lt;/p&gt;
&lt;h2 id=&quot;watch-list-frenzy-&quot;&gt;Watch list frenzy 🤓&lt;/h2&gt;
&lt;p&gt;In early 2015 I started keeping a “watch list” with movies and series that were recommended to me in conversations. Some of those I really liked, so soon after I added a “watched” section. With this I could easily do my part in helping others find good content.&lt;/p&gt;
&lt;p&gt;And so it happened that, &lt;strong&gt;for 4 years&lt;/strong&gt;, I faithfully kept noting down the movies I watched. The list looked like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;watchedlist.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1392&quot; height=&quot;338&quot; src=&quot;https://thorgalle.me/_astro/watchedlist.DV1Uk1oY_Z2iQjMQ.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;In early 2018, while taking a data visualization course, I got the idea to visualize these movies on a timeline. I started by writing a script that parsed my textual movie annotations and converted these to a structured format, readable by a program.&lt;/p&gt;
&lt;p&gt;With my fledgling knowledge of the visualization framework &lt;a href=&quot;https://d3js.org/&quot;&gt;D3.js&lt;/a&gt; I got as far as to visualize a dot for every day that I watched a film on a horizontal time scale. Terrific!&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;dots.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1622&quot; height=&quot;310&quot; src=&quot;https://thorgalle.me/_astro/dots.DqUNGtf2_Z1wuLyC.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;But then life threw other things on my plate. I left it there and forgot about the idea.&lt;/p&gt;
&lt;h2 id=&quot;movie-visualization-reborn-️&quot;&gt;Movie Visualization: Reborn ⚡️&lt;/h2&gt;
&lt;p&gt;Exactly a year later, I found myself browsing through old project folders. I bumped on the visualized movie dots and got excited again. My studies in Finland are a bit more flexible, so there was time to spare for this project.&lt;/p&gt;
&lt;p&gt;I built on the previous work and leveraged my newfound friendly spreadsheet tool &lt;a href=&quot;https://airtable.com/&quot;&gt;Airtable&lt;/a&gt; to collect my movie notes and watch dates in a machine-readable format. Airtable has an intuitive API that can be used to pull the most recent version of the data easily, without worrying about editing, parsing or exporting text files.&lt;/p&gt;
&lt;p&gt;Next, I wrote a script that merged these “datafied” notes with information from the &lt;a href=&quot;https://www.omdbapi.com/&quot;&gt;Open Movie Database&lt;/a&gt;, a cool API that gives access to all IMDb information. The visualization was starting to come together now. I kept thinking of things to add.&lt;/p&gt;
&lt;p&gt;The coolest by far was an ambient background color effect on movie details. I used &lt;a href=&quot;https://lokeshdhakar.com/projects/color-thief/&quot;&gt;a library&lt;/a&gt; for that and wrapped it with a statistical function that selects the most poppy color from each movie poster. This makes for a real poster palette:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;backgrounds_alpha.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1970&quot; height=&quot;1304&quot; src=&quot;https://thorgalle.me/_astro/backgrounds_alpha.DJQ95JjO_1BqrFN.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Finally, I presented the visualization to a few movie-junkie friends around here to gauge their reactions. That resulted in the addition of a view to see movies by release date, which I prefer now. I also made it usable on smartphone screens.&lt;/p&gt;
&lt;h2 id=&quot;so-what-️&quot;&gt;So what? 🤷‍♂️&lt;/h2&gt;
&lt;p&gt;What’s the use of it? Not much. Sometimes things don’t need to be useful, they can just be fun to make.&lt;/p&gt;
&lt;p&gt;However, I like browsing the visualization and hovering over the titles &lt;em&gt;(NB: in Firefox, there’s more hover effects supported)&lt;/em&gt;. It’s interesting to see that there are some release years from which I didn’t see that many movies, creating holes in the visualization. I’ve lately been catching up with those years by watching their Academy Awards’ &lt;em&gt;Best Picture&lt;/em&gt; nominations.&lt;/p&gt;
&lt;p&gt;And who knows, maybe someone will get inspiration for a next thing to watch while browsing the grid.&lt;/p&gt;
&lt;h3 id=&quot;how-can-i-get-this&quot;&gt;How can I get this?&lt;/h3&gt;
&lt;p&gt;The code is available to use &lt;a href=&quot;https://github.com/th0rgall/movievisualization/&quot;&gt;here&lt;/a&gt; on Github. All you need is basically a list or spreadsheet with movie titles. A properly formatted Airtable document should get you to your own version with minimal effort. Do ask if you need help setting it up, some programming skills are useful.&lt;/p&gt;
&lt;p&gt;PS: I’m still open for movie recommendations. You can fill in &lt;a href=&quot;(https://airtable.com/shr9VA8GxYb77zw4U)&quot;&gt;this form&lt;/a&gt; for that. Find out &lt;a href=&quot;https://airtable.com/shrNdB5PAjYU3ZOcA&quot;&gt;here&lt;/a&gt; with Ctrl+F if I’ve seen it already ;) Thank you, thanks Airtable.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2019/movieviz</link><guid isPermaLink="false">/posts/2019/movieviz</guid></item><item><title>7 Cool things at Slush 2018</title><description>Cool things I saw &amp; experienced on Slush 2018 in Helsinki, Europe&apos;&apos;s largest start-up event.</description><pubDate>Sun, 16 Dec 2018 19:41:00 GMT</pubDate><content:encoded>&lt;p&gt;With about 20,000 attendees, &lt;a href=&quot;http://slush.org/&quot;&gt;Slush&lt;/a&gt; is Europe’s largest start-up event. It’s a three day conference full of talks by technology industry leaders and young start-ups showing off their products. Slush is also the muddy substance you get when snow is partly melted, a common sight in Helsinki in December. For a technology &amp;#x26; business student, this is the event of the year. I became a volunteer in the ‘sustainability team’ (we showed people how to sort waste!). Outside my shifts I got the opportunity to wander along the booths &amp;#x26; podia. Here are some cool things I saw &amp;#x26; experienced.&lt;/p&gt;
&lt;h2 id=&quot;ctrl-labs-neural-interface&quot;&gt;CTRL-Labs Neural Interface&lt;/h2&gt;
&lt;!-- CTRL Labs YT video --&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/mPWg6uqnzR8&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ctrl-labs.com/&quot;&gt;CTRL-labs&lt;/a&gt; is a startup that is making &lt;em&gt;neural interfaces&lt;/em&gt;, say, a device that will enable mind control. Their vision is to make the human output more efficient. While we are very good at processing incoming information with our brain, we can only do so much with our hand and speeds. They want to allow our brain to do more. That’s a fancy way of saying that they want to make Marvel’s mad scientist visions a reality.&lt;/p&gt;
&lt;p&gt;How did they do it? They started by creating an armband that can intercept the neural signals our brain is sending to command our hands. Next, they learned to interprete the meaning of those signals with machine learning. Want to move your middle finger? It’s enough to &lt;em&gt;intend&lt;/em&gt; to do this movement, the signals will already get sent and interpreted. This makes it possible to control a virtual hand without even moving your hand. Or even cooler, to create an imaginary sixth finger and do something with it. It works, as long as you believe it hard enough (check the end of the demo).&lt;/p&gt;
&lt;p&gt;They sure made an impression since they got &lt;a href=&quot;https://venturebeat.com/2019/09/23/facebook-acquires-ctrl-labs-to-advance-its-brain-machine-interface-efforts/&quot;&gt;acquired by Facebook&lt;/a&gt; in September 2019.&lt;/p&gt;
&lt;h2 id=&quot;e-bin-a-waste-sorter&quot;&gt;E-bin: a waste sorter&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;bine.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;828&quot; height=&quot;690&quot; src=&quot;https://thorgalle.me/_astro/bine.BxhIXO3g_1zawOV.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.bine.world/static/Bin-e_custo1-3e76bb3ebe41eaaa94152c42a6b713e2.png&quot;&gt;http://www.bine.world/static/Bin-e_custo1-3e76bb3ebe41eaaa94152c42a6b713e2.png&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It doesn’t need much explanation: a waste bin that automatically sorts waste. Internally it uses a camera and some AI magic to detect what goes where. The machine reaches an accuracy of about 80%, which is arguably more efficient than what uninformed humans can achieve. We saw it demonstrated at the event.&lt;/p&gt;
&lt;p&gt;Check out the Polish startup Bin-E &lt;a href=&quot;http://www.bine.world/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;creating-human-protective-technology---talk-by-aza-raskin&quot;&gt;Creating human-protective technology - talk by Aza Raskin&lt;/h2&gt;
&lt;!-- Aza Raskin in Slush 2018 --&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/VBwtBiH0tRs&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;The &lt;a href=&quot;http://humanetech.com/&quot;&gt;Center for Humane technology&lt;/a&gt; is a non-profit that warns about the adverse effects current technology have on our personal lives and society, and finds way to combat it on different levels. It teaches designers to make products that respect human limits, for example, by preventing addiction or time drains. Aza Raskin is the co-founder, and in this talk he explains the attention economy of social media applications, he demonstrates that humans are “hackable” in the sense that they can be influenced to do things that they do not want to do.&lt;/p&gt;
&lt;p&gt;Why is it that we spend so much time on Instgram, more than we actually want to? Aza explains:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s not that they’re showing us what we want, it’s that they’re showing us things that we can’t help but look at&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I encourage you to check out the full talk above!&lt;/p&gt;
&lt;h2 id=&quot;momo-child-help-application&quot;&gt;Momo child help application&lt;/h2&gt;
&lt;!-- Momo Vimeo Video --&gt;&lt;iframe title=&quot;vimeo-player&quot; src=&quot;https://player.vimeo.com/video/322192496&quot; width=&quot;640&quot; height=&quot;360&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&quot;https://mindofmyown.org.uk/&quot;&gt;Mind of my Own&lt;/a&gt; (MOMO) is a UK based app developer making apps for child care services and children. They offer easy ways for kids to express their thoughts in a digital format, without too much (intimidating) human contact.. Cool is that the child is in control over who they want to share their thoughts with. Only parents? Or a social worker too?&lt;/p&gt;
&lt;p&gt;It reminded me of the start-up &lt;a href=&quot;https://soulcenter.be/&quot;&gt;Soul Center&lt;/a&gt; where I was an intern last year. We helped elderly people to get their life story to carehome personnel and other stakeholders.
Rolls Royce autonomous ships&lt;/p&gt;
&lt;h2 id=&quot;rolls-royce-autonomous-ships&quot;&gt;Rolls Royce autonomous ships&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;20181205_123256.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2639&quot; height=&quot;1948&quot; src=&quot;https://thorgalle.me/_astro/20181205_123256.Sx_Ifd1g_Q8pWK.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Rolls Royce, fancy cars? Or think, fancy ships. Autonomous ships driven by a plethora of sensors and AI technologies.&lt;/p&gt;
&lt;p&gt;With lasers the distance to objects can be accurately measured. And it detects the movement of other boats or objects with cameras and other devices. For objects that don’t emit GPS signals, their course can also be predicted too. Useful for evading the odd blue whale or lumbering icebergs.&lt;/p&gt;
&lt;p&gt;On Slush they demonstrated a test drive that was done at sea around Helsinki. They aim to have a fully autonomous ship in the oceans by 2035.&lt;/p&gt;
&lt;h2 id=&quot;futures-platform-foresight&quot;&gt;Futures Platform foresight&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.futuresplatform.com/&quot;&gt;Futures Platform&lt;/a&gt; is a Finnish software-as-a-service that helps other businesses to predict the future. It’s not as complicated as it seems: they continuously study literature on emerging technologies and societal trends, and they combine their findings in a visualisation that shows how likely things are going to happen and how far away they are. You can see in a glance what’s coming at us: global warming, flying cars and neural interfaces? It will all be in there. It would be perfect tool for a student to find the next topic of a technology report, but unfortunately it is not targeted at students with its steep pricing plans.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2018/7-cool-things-at-slush-2018</link><guid isPermaLink="false">/posts/2018/7-cool-things-at-slush-2018</guid></item><item><title>Selecting text where you can&apos;t</title><pubDate>Wed, 28 Nov 2018 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sometimes you want to copy-paste text from a web page, but it won’t work. Here are a few common reasons and workarounds.&lt;/p&gt;
&lt;h3 id=&quot;1-the-text-is-embedded-in-a-link&quot;&gt;1. The text is embedded in a link&lt;/h3&gt;
&lt;p&gt;The text might be contained by a link. If you click+drag to select text, you will move the link element! Sometimes it is not visible that the text you’re trying to select is, in fact, a link.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution: hold the ALT key while selecting (Option key on Mac)&lt;/strong&gt;. This will allow you to select text in a clickable area like a button&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;&quot; class=&quot;example-select-link&quot;&gt;Try to select me!&lt;/a&gt;&lt;/p&gt;
&lt;script&gt;
function addStyleString(str) {
    var node = document.createElement(&apos;style&apos;);
    node.innerHTML = str;
    document.body.appendChild(node);
}

addStyleString(`.example-select-link:visited, .example-select-link:link, .example-select-link:hover {
	font-size: 1.2em;
	text-align: center;
}`);
&lt;/script&gt;
&lt;h3 id=&quot;2-selecting-is-intentionally-disabled-on-the-site&quot;&gt;2. Selecting is intentionally disabled on the site&lt;/h3&gt;
&lt;p&gt;The site developer probably does not want you to copy the text. This happens regularly on news websites. They include JavaScript code that captures all your clicks and selections and ‘kills’ these events. &lt;strong&gt;Do not try this on a site where you don’t want to lose progress of some sort&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution: block JavaScript on the site&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the μBlock Origin plugin (&lt;a href=&quot;https://addons.mozilla.org/nl/firefox/addon/ublock-origin/&quot;&gt;Firefox&lt;/a&gt;, &lt;a href=&quot;https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm&quot;&gt;Chrome&lt;/a&gt;, &lt;a href=&quot;https://safari-extensions.apple.com/details/?id=com.el1t.uBlock-3NU33NW2M3&quot;&gt;Safari&lt;/a&gt;, &lt;a href=&quot;https://www.microsoft.com/fi-fi/p/ublock-origin/9nblggh444l4?rtc=1&amp;#x26;activetab=pivot:overviewtab&quot;&gt;Microsoft Edge&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Click on the μBlock icon to scripts for the site&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot 2018-11-29 at 18.20.35&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1364&quot; height=&quot;932&quot; src=&quot;https://thorgalle.me/_astro/screenshot-2018-11-29-at-18.20.35.BanXmrb__1eEhAb.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Reload the page&lt;/li&gt;
&lt;li&gt;Copy/pasting is now possible.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You want to re-enable the JavaScript after your copy-paste, a lot of sites depend on it today to function properly.&lt;/p&gt;
&lt;p&gt;PS: μBloc Origin is a versatile, lightweight and open-source ad-blocker. It is probably better than other adblock plugins you might have installed.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2018/selecting-text-where-you-cant</link><guid isPermaLink="false">/posts/2018/selecting-text-where-you-cant</guid></item><item><title>Learn vocabulary from the environment</title><description>Learning advanced English vocabulary with vocabulary.com, supported by a plugin</description><pubDate>Tue, 01 May 2018 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;TLDR: I made a browser plugin for the English language study tool&lt;/strong&gt; &lt;a href=&quot;https://vocabulary.com&quot;&gt;&lt;strong&gt;vocabulary.com&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;. It supports quick word adding from any site and translation when studying.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Huh, why are you learning vocabulary? Yes! Be it in a paper or a book, I regularly encounter words or expressions I do not yet know, mostly in academic texts.&lt;/p&gt;
&lt;p&gt;One option is not to worry and to carry on. &lt;em&gt;I can derive the meaning from the context&lt;/em&gt;. However, you can get a seriously wrong idea of a word with that strategy. For example, for long I thought the word ‘gloomy’ had something to do with ‘glow’, just because it sounded similar.&lt;/p&gt;
&lt;p&gt;Once I finally looked it up, that didn’t seem too right:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;glowgloom.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;633&quot; height=&quot;345&quot; src=&quot;https://thorgalle.me/_astro/glowgloom.JDpgPdho_Yktp0.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;I wanted to tackle this problem by keeping track of the words I did not know, and to study them systematically.&lt;/p&gt;
&lt;h2 id=&quot;101-quick-fix-the-spreadsheet&quot;&gt;101 quick fix: the spreadsheet&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;spreadsheet.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2536&quot; height=&quot;440&quot; src=&quot;https://thorgalle.me/_astro/spreadsheet.DU3EeB_T_Z2jN9f8.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;I made a list. A long list. With the first entry planted in December 2015, it contained &lt;strong&gt;540 words (!)&lt;/strong&gt; that I did not completely understand yet.&lt;/p&gt;
&lt;p&gt;I added on metadata about part-of-speech types, possible synonyms, possible Dutch translations, originating sentence, I-thought-it-meant entries, multiple languages,…&lt;/p&gt;
&lt;p&gt;I kept collecting words while reading papers, books, articles, … but it was annoyingto keep track. Waiting until the Google spreadsheet opened to put in a word interrupted the flow of what I was doing. And even worse, it was fruitless. I never took a look at the list to study it.&lt;/p&gt;
&lt;h2 id=&quot;vocabularycom&quot;&gt;Vocabulary.com&lt;/h2&gt;
&lt;p&gt;Then I found &lt;a href=&quot;https://vocabulary.com&quot;&gt;vocabulary.com&lt;/a&gt;, it is a web app that&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;… combines the world’s smartest dictionary with an adaptive learning game that will have you mastering new words in no time.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In addition, it features funny and not-so-formal definitions of words. It’s really cool. Spending about 2-3 minutes on it almost daily for half a year, &lt;strong&gt;I’ve now ‘mastered’ about 150 words, and added around 400.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A few things could still be improved. That’s why I made a browser plugin with &lt;strong&gt;three main features:&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;1-adds-words-fast-everywhere&quot;&gt;1. Adds words fast, everywhere&lt;/h2&gt;
&lt;p&gt;You can select any word on any web page and add it to one of you vocabulary.com lists. The plugin will pick up the surrounding sentence and source and include it in the Vocabulary.com list:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;adding.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1488&quot; height=&quot;638&quot; src=&quot;https://thorgalle.me/_astro/adding.BX1b7yk1_1tEjDT.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-shows-translations-in-the-learning-game&quot;&gt;2. Shows translations in the learning game&lt;/h2&gt;
&lt;p&gt;Associating a far-fetched English word with their Dutch equivalent helps me to get a grip on the nuances. That’s why it is helpful to show translations next to word definitions, which the addon does. You can select any language by clicking the language abbreviation.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;game.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2318&quot; height=&quot;1455&quot; src=&quot;https://thorgalle.me/_astro/game.DG8gRoHa_ZMqQxi.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;3-links-to-useful-services&quot;&gt;3. Links to useful services&lt;/h2&gt;
&lt;p&gt;For every word, easy clickable shorcuts are shown next to the translations for &lt;a href=&quot;https://images.google.com/&quot;&gt;Google Images&lt;/a&gt; and &lt;a href=&quot;https://duckduckgo.com/&quot;&gt;DuckDuckgo Images&lt;/a&gt; (seeing what a word is can be really useful), &lt;a href=&quot;https://youglish.com&quot;&gt;YouGlish&lt;/a&gt; (for real-life pronounciations) and &lt;a href=&quot;http://giphy.com/&quot;&gt;GIPHY&lt;/a&gt; (for fun).&lt;/p&gt;
&lt;h2 id=&quot;download--install&quot;&gt;Download &amp;#x26; install&lt;/h2&gt;
&lt;p&gt;The add-on is now enjoyed by some ~400 people! (update: March 2020)&lt;/p&gt;
&lt;p&gt;Find it here for your browser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/vocabularycom-enhancer/diddacjdgklfjgnlmknacnakjcgdiegn&quot;&gt;Google Chrome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/vocabulary-com-enhancer/&quot;&gt;Mozilla Firefox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The code is available from my Github page&lt;a href=&quot;https://github.com/th0rgall/voc-adder&quot;&gt;https://github.com/th0rgall/voc-adder&lt;/a&gt;. It will be published in the add-on stores soon.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update Nov ‘18: A cross-desktop platform destkop word adder is in the works. It has some neat features, like a selection of word meaning and integration with OS-wide text on macOS (including .pdf’s in Preview!)&lt;/em&gt;&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2018/learn-vocabulary-from-the-environment</link><guid isPermaLink="false">/posts/2018/learn-vocabulary-from-the-environment</guid></item><item><title>Installing your Firefox add-on permanently</title><pubDate>Mon, 30 Apr 2018 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When you’re developing a cross-browser add-on, you probably want to try it out for a while in your daily browser. Unfortunately, contrary to Chrome, if you &lt;strong&gt;temporarily load your extension in Firefox, it will be gone after a restart.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That’s because Firefox &lt;strong&gt;needs to sign your add-on before you can install it anywhere&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/Add-ons/Distribution&quot;&gt;The documentation&lt;/a&gt; explains so, but in a convoluted way. It’s actually pretty simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Register at FF’s &lt;a href=&quot;https://addons.mozilla.org/en-US/developers/&quot;&gt;Developer Hub&lt;/a&gt; (top right) if you don’t have a FF account yet.&lt;/li&gt;
&lt;li&gt;Go to the &lt;a href=&quot;https://addons.mozilla.org/en-US/developers/addon/submit/distribution&quot;&gt;add-on submission&lt;/a&gt; page.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;‘on your own’&lt;/strong&gt;. This wil &lt;strong&gt;immediately sign&lt;/strong&gt; your add-on, but it won’t be listed in the add-on site for distribution. Ideal for a test version.&lt;/li&gt;
&lt;li&gt;Upload your zipped add-on files.&lt;/li&gt;
&lt;li&gt;Sign, download the &lt;code&gt;.xpi&lt;/code&gt; file &amp;#x26; enjoy. It can be installed from &lt;code&gt;about:addons → gear icon → Install Add-on from file&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded><link>https://thorgalle.me/posts/2018/installing-your-firefox-add-on-permanently</link><guid isPermaLink="false">/posts/2018/installing-your-firefox-add-on-permanently</guid></item><item><title>Dear Professor,</title><pubDate>Fri, 23 Feb 2018 11:49:00 GMT</pubDate><content:encoded>&lt;p&gt;Like most students, I made a resolution this semester to have a fresh start, to attend all classes and make sure I understand the main points in the lectures. I’ve been able to live up to that promise these two weeks, but I’m afraid you just made me break it.&lt;/p&gt;
&lt;p&gt;The reason? It’s not your stuttering, I can live with that. Your verbal skills and physical presence are decent too. The problem is, &lt;strong&gt;there is almost zero added value in coming to your class&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screen Shot 2018-02-23 at 13.45.27&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1928&quot; height=&quot;1078&quot; src=&quot;https://thorgalle.me/_astro/screen-shot-2018-02-23-at-13.45.27.B_HcasIP_Ig7tR.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Almost every single word you say is projected black-white next to you.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then, what do you expect me to do when sitting there? Should I listen to you, or read the PowerPoint content? When I try to listen, the slides distract me. When I try to read, your talking distracts me. The people around me checking their 9GAG feeds on Facebook don’t help either. I’d rather just browse the slides at home.&lt;/p&gt;
&lt;p&gt;This is the prime example of PowerPoint illiteracy. Slides are meant to &lt;strong&gt;support your message&lt;/strong&gt;, they should not overwhelm everyone with an exhaustive summary of the course content. Do you want to distribute your course notes? &lt;em&gt;Awesome&lt;/em&gt;, just publish them online, thank you. They would form a terrific summary for later reference.&lt;/p&gt;
&lt;p&gt;But please, &lt;strong&gt;do not project these slides&lt;/strong&gt;. They’re the reason I won’t be in your class today.&lt;/p&gt;
&lt;p&gt;With kind regards,&lt;/p&gt;
&lt;p&gt;Thor Galle&lt;/p&gt;
&lt;p&gt;PS: check out &lt;a href=&quot;https://www.youtube.com/watch?v=Iwpi1Lm6dFo&quot;&gt;this&lt;/a&gt; TED talk. It might help you.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2018/dear-professor</link><guid isPermaLink="false">/posts/2018/dear-professor</guid></item><item><title>Technology extension opportunities in real life</title><pubDate>Sun, 21 Jan 2018 16:24:00 GMT</pubDate><content:encoded>&lt;p&gt;It’s striking how some insights from school can slip into daily life when you least expect them to. Today my sister showed off a Brother LW-20, an electronic typerwriter. She had rescued it from our grandparents who wanted to discard it. It’s a nice example of how a new technology (the computer) substitutes an old one (the typewriter), something I learned about recently.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;20180120_130806.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2880&quot; height=&quot;2160&quot; src=&quot;https://thorgalle.me/_astro/20180120_130806.CbecqQT1_15xEqX.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;When hearing “typewriter”, I would think about the mechanical type with pounding metal letter sticks. Yet, this particular model was on the market somewhere in the 90’s: a period were computers were growing fast. A computer had more possibilities concerning word processing than typewriters, Microsoft Word was already available in the 80’s.&lt;/p&gt;
&lt;p&gt;And that’s where the insight striked: according to &lt;a href=&quot;https://d1c25a6gwz7q5e.cloudfront.net/reports/2016-02-03-Adner-Kapoor-SMJ-2015_3.pdf&quot;&gt;a paper&lt;/a&gt; of Adner &amp;#x26; Kapoor (2015), old technologies can still survive for some time while better technologies are available, given that there is an &lt;em&gt;extension opportunity&lt;/em&gt; for the old technology. More specifically, some innovations for the new technology can be “spilled back” to the old one.&lt;/p&gt;
&lt;p&gt;This seems to be the case for the Brother: a &lt;a href=&quot;https://de.wikipedia.org/wiki/Brother_LW-Reihe&quot;&gt;German Wikipedia article&lt;/a&gt; tells us it was marketed as an affordable, dedicated word processor. It had some “modern” features like a screen to edit text on and compatibility with floppy storage for documents: features that got spilled over from computers.&lt;/p&gt;
&lt;p&gt;It’s the closest thing to a computer my grandparents have ever owned, and at the same time, it represented the last gasp of the typewriter.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2018/technology-extension-opportunities-in-real-life</link><guid isPermaLink="false">/posts/2018/technology-extension-opportunities-in-real-life</guid></item><item><title>Little adventures on a cycling trip</title><description>Some of my favorite crazy moments on a cycling trip from Belgium to Swiss</description><pubDate>Fri, 29 Dec 2017 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When I tell people about my bicycle travels, I often see them  wondering, “Why would you do such a thing?”.&lt;/p&gt;
&lt;p&gt;For me, an important reason are the countless little adventures you bump into on the way. Here is an account of my favorite crazy moments from a 10-day solo cycling trip through France. If you’d enjoy these, maybe consider going on a bicycle tour as well!&lt;/p&gt;
&lt;h2 id=&quot;day-1---crossing-a-plowed-field&quot;&gt;Day 1 - Crossing a plowed field&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;road.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; src=&quot;https://thorgalle.me/_astro/road.Da-oyHI2_aKcqi.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;It was a cold, rainy day and the sun had just set. My destination, Liège, was still about 10km ahead. I had left late and I was longing for food and dry clothes. The village street I was riding in changed into a bumpy hiking path. Oh well. It went slow, but was feasible.&lt;/p&gt;
&lt;p&gt;Then the road suddenly stopped, right in the middle of a plowed and thus extremely muddy field.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;stop.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; src=&quot;https://thorgalle.me/_astro/stop.WmwQhY0h_ZHg5Ug.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Directions: go right through.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mud.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; src=&quot;https://thorgalle.me/_astro/mud.Zt-6SxiM_Z1aNqyR.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The first day and I was already covered with mud. Yay!&lt;/p&gt;
&lt;h2 id=&quot;day-2---camping-next-to-a-hardcore-festival&quot;&gt;Day 2 - Camping next to a hardcore festival&lt;/h2&gt;
&lt;p&gt;Ahh, beautiful: a quiet camping place.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;plain.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/plain.Via73FDW_ZGJtMq.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Or, not reallly. I arrived at the camping &lt;a href=&quot;https://www.campingoosheem.be/nl/&quot;&gt;Oos Heem&lt;/a&gt; in East Belgium off-season. After having found the proprietor to check in, he told me there would be a festival pre-party that night in one the campings’ buildings. The heavy guitars and electro beats in the background proved his words, until about 3AM. You could say I enjoyed the music for free from my tent!&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;poster.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1944&quot; height=&quot;2592&quot; src=&quot;https://thorgalle.me/_astro/poster.oVcTMMsR_15GUgH.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Oh by the way, when you would have turned around at the first image, you’d have seen a playground with giant chess pieces, two swimming pools and other curiosities.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;behind.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; src=&quot;https://thorgalle.me/_astro/behind.DnXSKJBu_Z29VaT1.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;day-4---climbing-bridge-remnants&quot;&gt;Day 4 - Climbing bridge remnants&lt;/h2&gt;
&lt;p&gt;From afar I could spot a mysteriou pile of stones between the trees on two hills. When I arrived, they appeared to be the overgrown remnants of a demolished bridge.&lt;/p&gt;
&lt;p&gt;High? You could say that.&lt;/p&gt;
&lt;p&gt;Dangerous? &lt;em&gt;[Thor already left]&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;thor-gallery&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;bridge&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3956&quot; height=&quot;5275&quot; src=&quot;https://thorgalle.me/_astro/bridge.D_jvfSQY_ZwXFYU.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;Bike between trees&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/bike_between_tress.D4-F5Px__ZPWhsU.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;people between trees&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4000&quot; height=&quot;6000&quot; src=&quot;https://thorgalle.me/_astro/people_between_trees.DEAQcVxc_138ALn.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h2 id=&quot;day-5---meeting-the-same-guy-twice&quot;&gt;Day 5 - Meeting the same guy twice&lt;/h2&gt;
&lt;p&gt;This was a funny coincidence that requires a little background story.&lt;/p&gt;
&lt;p&gt;After cycling a hefty 120km through Luxembourg’s hills that day, I arrived in Thionville at about 8pm. I didn’t want my hosts in Metz 35km further down to receive me only at 10pm, so I decided to take the train. I could however not find a way to get a train ticket for my bike from the machine. On the platform I spotted an absent-looking guy wearing big headphones and a black hoodie from some kind of metal band. Surely, he could help me. He told me bikes could be taken free of charge on the local train. Awesome!&lt;/p&gt;
&lt;p&gt;In the 20 minute train ride we had a little conversation. We continued our conversation. We had some things in common! He was a computer science student in the same year as I am. We talked about programming languages and atmospheric black metal bands. When we arrived in Metz, he helped me to get my bike out of the station. There we parted ways after exchanging contact information.&lt;/p&gt;
&lt;div class=&quot;thor-gallery&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;oeioei&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; src=&quot;https://thorgalle.me/_astro/oeioei.uQtZ7GUA_N3OG5.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;1-surtur&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1080&quot; height=&quot;1080&quot; src=&quot;https://thorgalle.me/_astro/1-surtur.D8ui01hh_24BOs0.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;trein&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; src=&quot;https://thorgalle.me/_astro/trein.CpBFyN5d_2iGhCt.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;A cozy evening at my hosts’ house passed and the next day I set off to explore Metz. I was enjoying a burger in a recently opened vegan lunch bar when my newfound friend suddenly strolled in. Guess who was a vegan too?&lt;/p&gt;
&lt;h2 id=&quot;day-6---the-cycling-choir-leader&quot;&gt;Day 6 - The cycling choir-leader&lt;/h2&gt;
&lt;p&gt;While cruising through the hilly fields and barely populated towns of rural Grand-Est, I crossed the paths of a man who turned out to be a fellow Belgian citizen! We were following the same route, so we cycled together for the rest of the day.&lt;/p&gt;
&lt;div class=&quot;thor-gallery&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;trippin&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/trippin.CpcrdR-R_2tPMsa.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;snappin&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/snappin.B0pFLPZt_5KhEo.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;bags&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/bags.CyJcxhra_ZcKC0A.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;He was a choir leader at a music academy who had just retired that year. His wife was waiting for him in Venice to attend the Biennale there. While I improved my French, he improved his Dutch. Did you know that “scarecrow” is “épouvantail” in French and “vogelverschikker” in Dutch? He also had some mild daredevil tendencies:&lt;/p&gt;
&lt;p&gt;&lt;video controls src=&quot;https://thorgalle.me/content-media/posts/assets/little-adventures-on-a-cycling-trip/6-mild_daredevil.mp4&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;h2 id=&quot;day-6---a-gloomy-swim-in-a-water-park&quot;&gt;Day 6 - A gloomy swim in a water park&lt;/h2&gt;
&lt;p&gt;We arrived in a village called Mittersheim during a rainy sunset. The village lay next to a lake, where we found a camping. I went to take some pictures of the sunset in the lake, pitched the tent and cooked dinner. I had spotted a funny collection of water attractions, so after dinner I set out to climb these things. Some German camping-goers had the same idea. It was fun.&lt;/p&gt;
&lt;div class=&quot;thor-gallery&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;1-regen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/1-regen.Bc9QNwBF_ZyIbwV.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;2-lake&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/2-lake.Dx9F1nCu_Z21TLbH.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;20-play&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1920&quot; src=&quot;https://thorgalle.me/_astro/20-play.CuDDK6kP_Z1ganlR.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;3-nacht&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; src=&quot;https://thorgalle.me/_astro/3-nacht.icxw3T7j_1GQRVP.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;4-donker&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; src=&quot;https://thorgalle.me/_astro/4-donker.BbK7Rcfb_OE7ud.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h2 id=&quot;day-7---invited-to-tea-by-a-confused-great-granny&quot;&gt;Day 7 - Invited to tea by a confused great-granny&lt;/h2&gt;
&lt;p&gt;The next morning my tablet/GPS got stolen on the camping. My schedule got somewhat mixed-up; I had literally lost my way and, temporarily, also my faith in humanity.&lt;/p&gt;
&lt;p&gt;This was quickly regained around 6pm in a village called Mittelbronn a little further. I was taking a picture of an abandoned restaurant when I heard a window opening behind me. An old woman was curious of the strange appearance of my bike. After a short conversation with heavy use of gestures, she invited me in for tea. I hesitantly accepted, the city I wanted to reach was still 20km ahead.&lt;/p&gt;
&lt;p&gt;I entered the smelly home full of handcrafted woodwork. Even the fridge was behind a wooden door. She showed me around and told me stories of her late husband and great-grandchildren. She gave me a tea bag, but awkwardly, she didn’t remember how to make tea. She didn’t appear to remember much at all really. I wondered how she could live by herself this way. Apparently her daughter assisted her during the day and left her by herself in the evenings.&lt;/p&gt;
&lt;p&gt;&lt;video controls src=&quot;https://thorgalle.me/content-media/posts/assets/little-adventures-on-a-cycling-trip/granny_compilation.mp4&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;I resumed my journey with a piece of bread, a madeleine, an unused teabag, and a smile on my face. Faith in humanity restored.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;grannybike.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1440&quot; src=&quot;https://thorgalle.me/_astro/grannybike.BjYoadW0_ZRAzzQ.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;day-8---camping-in-a-school&quot;&gt;Day 8 - Camping in a school&lt;/h2&gt;
&lt;p&gt;Ad-hoc planning made me choose campings based on their location. The listing in the GPS only included names and no reviews nor ratings. This makes for unexpected places every time! This municipal camping in Barr was just plain weird: its buildings were fused with a primary school. You had to access the sanitary through the school playground.&lt;/p&gt;
&lt;h2 id=&quot;day-9---passing-a-stretch-of-unlit-corn-fields&quot;&gt;Day 9 - Passing a stretch of unlit corn fields&lt;/h2&gt;
&lt;p&gt;This was the only moment that felt genuinely scary. Again, I was still cycling after dusk. The camping I want to reach was only 5 kilometers away, but was separated from me by a huge stretch of unlit corn fields.&lt;/p&gt;
&lt;div class=&quot;thor-gallery&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;1-entry&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/1-entry.BhZp0NDD_1Xwqm7.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;2-cornfields&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/2-cornfields.DeBdWbD5_ZNmQcd.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h2 id=&quot;day-9---getting-smuggled-into-a-full-camping&quot;&gt;Day 9 - Getting smuggled into a full camping&lt;/h2&gt;
&lt;p&gt;When I reached the camping (around 9PM), I found that the office was already full. This is usually not a problem, just enter, pitch the tent and pay the next day. When entering however, two Dutch women who told me there was no space left. A few people were already sent away earlier that day. But they pitied me and invited me cram my tent next to theirs.&lt;/p&gt;
&lt;p&gt;In order not to get them into trouble, I woke up at 4&lt;/p&gt;&lt;div&gt;&lt;/div&gt; AM. I quickly packed and sneaked out. Again cycling in the dark, but now before dawn. It was nice to see the sun rise.&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;thor-gallery&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;1-begin&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;1920&quot; src=&quot;https://thorgalle.me/_astro/1-begin.BGdFix79_Z1sHF1i.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;2-murnin&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;1920&quot; src=&quot;https://thorgalle.me/_astro/2-murnin.Dv8PC-hW_Z2mc0LF.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;3-hellow&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/3-hellow.CvuHcHlP_1OuDwP.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h2 id=&quot;day-10---a-crazy-russian-near-basel&quot;&gt;Day 10 - A Crazy Russian near Basel&lt;/h2&gt;
&lt;p&gt;The evening of the final day a touring cyclist overtook me at high speed, jovially encouraging me to step up the pace. Five minutes later I saw him chilling at the Dreiländereck near Basel, the border between Germany, Swiss and France.&lt;/p&gt;
&lt;p&gt;I joined him in his break. He was recording several personal voice mails for friends &amp;#x26; family in Moscow. In his fast-spoken Russian I could recognize some city names. In between we talked with my broken German - English was not an option. I learned that he had started his trip in the Netherlands and was heading to Rome. He did an astonishing 150km per day. When he pulled a Red Bull out of his bag to share it with me, I got a feel for how he managed to do that.&lt;/p&gt;
&lt;div class=&quot;thor-gallery&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;10-basel&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1280&quot; src=&quot;https://thorgalle.me/_astro/10-basel.B2pKxhl8_1NgkSJ.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;10-russian&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;960&quot; src=&quot;https://thorgalle.me/_astro/10-russian.CIG41C8l_1VbJGR.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;10-russianbike&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1440&quot; height=&quot;1920&quot; src=&quot;https://thorgalle.me/_astro/10-russianbike.CZiISJxM_2hLuUe.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;&lt;/div&gt;</content:encoded><link>https://thorgalle.me/posts/2017/little-adventures-on-a-cycling-trip</link><guid isPermaLink="false">/posts/2017/little-adventures-on-a-cycling-trip</guid></item><item><title>Whatever happened to Google Tasks</title><pubDate>Fri, 27 Oct 2017 21:39:00 GMT</pubDate><content:encoded>&lt;p&gt;As a meek Google user, I’ve been sporting their Calendar for years. Years in which I have used a feature that is being casted into obscurity: Google Tasks.
It &lt;a href=&quot;http://www.makeuseof.com/tag/5-ways-to-access-your-google-tasks/&quot;&gt;once&lt;/a&gt; started as a fancy addition to Calendar. Now it seems to be present only for legacy purposes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You have to activate it by activating a separate Tasks “calendar”.&lt;/li&gt;
&lt;li&gt;The tasks overview still has the calendar styling from 2009.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You can’t display them at the same time as Reminders&lt;/strong&gt;. You have to “switch”. One of the most clumsy UX things I’ve seen from Google.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then why not only use Reminders? There is no overview of Reminders on the web version. Now let this just be the most useful way to keep an eye on long-term deadlines. I will stick with the 2009 tasks, until the reminder overview jumps from the phone to the desktop. Or until the plug gets pulled, of course.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;gtasks&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;463&quot; height=&quot;258&quot; src=&quot;https://thorgalle.me/_astro/gtasks.Boy6Ban4_Z25wOrp.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2017/whatever-happened-to-google-tasks</link><guid isPermaLink="false">/posts/2017/whatever-happened-to-google-tasks</guid></item><item><title>A week at Hackages</title><pubDate>Mon, 09 Oct 2017 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week I got the opportunity to join a TypeScript/Angular/Ionic training at &lt;a href=&quot;http://www.hackages.io/&quot;&gt;Hackages&lt;/a&gt; in Brussels. They’re a consulting and teaching company specialized in modern web technologies.&lt;/p&gt;
&lt;p&gt;The training followed a learning-by-doing methodology. We were submerged in a continuous exercise session, of which a large part revolved around fixing common mistakes planted in example code. Sometimes important concepts were briefly explained &amp;#x26; demoed, but mostly we tried to fulfill the requirements of an incomplete program, with little pointers on how to code these.&lt;/p&gt;
&lt;p&gt;So, we were still scouring the web for documentation, like you would when learning a new language on your own. The difference with self-study is: 1) you can ask when you’re really stuck for a while 2) you’re doing pair programming.&lt;/p&gt;
&lt;p&gt;This is generally a valuable learning approach. But I have my critiques:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The line between learning by fixing mistakes &amp;#x26; being frustrated by annoying bugs is thin.&lt;/li&gt;
&lt;li&gt;Maybe this is not the best way to learn “good practices”: the internet or your intuition does not always point in the right direction.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><link>https://thorgalle.me/posts/2017/hackages-week</link><guid isPermaLink="false">/posts/2017/hackages-week</guid></item><item><title>The use and uselessness of tracking time</title><description>A reflection on of half a year of tracking time with Toggl</description><pubDate>Sat, 15 Jul 2017 10:39:00 GMT</pubDate><content:encoded>&lt;p&gt;When I started tracking my time half a year ago, I just wanted to get some statistics on my study performance procrastination. Now I’m still doing it, because as the data keeps growing I’m finding more and more uses for it. In this post I’ll go over &lt;strong&gt;3 reasons why tracking time is a valuable habit&lt;/strong&gt;. Now nothing is all good, so after that I’ll mention &lt;strong&gt;3 problems with the thing&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-tool-toggl&quot;&gt;The tool: Toggl&lt;/h2&gt;
&lt;p&gt;My time-tracking habit began precisely on the New Years Eve of 2017, when &lt;a href=&quot;https://twitter.com/JochemJanss&quot;&gt;a friend&lt;/a&gt; told me about the app &lt;a href=&quot;https://www.toggl.com/&quot;&gt;Toggl&lt;/a&gt;. He used it to measure the time he spent on his school projects. The core concept is pretty simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Define a &lt;em&gt;project&lt;/em&gt; (eg. Linear Algebra) for a &lt;em&gt;client&lt;/em&gt; (eg. University)&lt;/li&gt;
&lt;li&gt;Start/stop &lt;em&gt;timers&lt;/em&gt; for a project with the press of a button.&lt;/li&gt;
&lt;li&gt;Give the activity you’re doing some meaningful &lt;em&gt;description&lt;/em&gt; (&lt;em&gt;“What are you working on?”&lt;/em&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I’ve been using this tool mainly to track the time spent on university work and volunteering.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;toggl-example-an.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;882&quot; height=&quot;312&quot; src=&quot;https://thorgalle.me/_astro/toggl-example-an.uiOzj3Ri_2vB4ak.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;{.screenshot-img}&lt;/p&gt;
&lt;p&gt;Now that we caught up on that, on to the cool things.&lt;/p&gt;
&lt;h2 id=&quot;cool-thing-1---performance-measurement--planning&quot;&gt;Cool thing #1 - Performance measurement &amp;#x26; planning&lt;/h2&gt;
&lt;p&gt;One of the things Toggl immediately helped with was telling me precisely &lt;strong&gt;how long&lt;/strong&gt; I had studied each day, &lt;strong&gt;how fast&lt;/strong&gt; I could process each course (by comparing time to the amount of work done), and also &lt;strong&gt;when&lt;/strong&gt; I was most productive.&lt;/p&gt;
&lt;p&gt;This is invaluable information for planning work. If you know how long it took you in the past to do something, you can make a reasonable estimate of a similar activity in the future. This enabled me to make a realistic and achievable exam planning. In general, you’ll learn &lt;strong&gt;how long it takes you to do stuff!&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;cool-thing-2---invalidating-time-guidelines&quot;&gt;Cool thing #2 - (In)validating time guidelines&lt;/h2&gt;
&lt;p&gt;For courses or group works, there are often &lt;strong&gt;guidelines&lt;/strong&gt; for how much time you should approximately invest in them. Tracking time allows you to check whether these guidelines make sense for you. It also enables you to give &lt;strong&gt;constructive feedback&lt;/strong&gt; the the guideline creator(s).&lt;/p&gt;
&lt;p&gt;An example: most of my university courses “weigh” 6 study points, which amounts to about 150-180 hours. On one particular course, &lt;a href=&quot;https://onderwijsaanbod.kuleuven.be/syllabi/n/G0Q40CN.htm#activetab=doelstellingen_idp1397184&quot;&gt;software design&lt;/a&gt;, I spent 187 hours. By analyzing the tracking data for this project, I could include in my course feedback that the third project iteration might have been a little too hefty. At the same time, I can see that I passed other courses spending only 2/3 of the expected time.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;deadlinez.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1205&quot; height=&quot;421&quot; src=&quot;https://thorgalle.me/_astro/deadlinez.BJgrKuSm_1N0XSh.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;{.screenshot-img}&lt;/p&gt;
&lt;h2 id=&quot;cool-thing-3---stats&quot;&gt;Cool thing #3 - Stats.&lt;/h2&gt;
&lt;p&gt;Just having stats in general on where you spend your time is interesting to play with.  For example, now I know that I did some 60 hours of volunteer work this year for &lt;a href=&quot;https://www.kuleuven.be/duurzaamheid/archief-1/greenofficeeng&quot;&gt;Green Office KU Leuven&lt;/a&gt;. That’s four times the amount of sport cycling for this year. Maybe I should do a little less volunteering &amp;#x26; more cycling?&lt;/p&gt;
&lt;p&gt;Or I can see that I was far more motivated to work on &lt;a href=&quot;http://2017.summerofcode.be/&quot;&gt;oSoc17&lt;/a&gt; &amp;#x26; programming projects in July than on my exams in June.&lt;/p&gt;
&lt;p&gt;Sometimes it’s just convenient to have a time tracking habit. When doing freelance work, you can track your work hours easily. Referring back to cool thing #1, this allows you to manage your &amp;#x26; your client’s expectations accordingly.&lt;/p&gt;
&lt;h2 id=&quot;problem-1---you-define-it&quot;&gt;Problem #1 - You define it&lt;/h2&gt;
&lt;p&gt;You are the one responsible for defining useful projects and descriptions. Since you mostly have to start/stop timers yourself, you’ll need to think of &lt;em&gt;what&lt;/em&gt; to track beforehand. Two problems here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;It won’t track everything.&lt;/strong&gt; “Everything” is too hard to categorize and to manage.&lt;/li&gt;
&lt;li&gt;Defining the right &lt;strong&gt;granularity&lt;/strong&gt; is not obvious and depends on what you want to do with the data.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For example, if you define a project “School”, it’s hard to get insights on specific courses. On the other hand, if you create a new project for every course task, the amount of projects will become unmanageable.&lt;/p&gt;
&lt;p&gt;Descriptions and tags can be used to refine the granularity if structured in a certain way. For example, I use Toggl’s tags to differentiate between &lt;em&gt;individual&lt;/em&gt; and &lt;em&gt;group&lt;/em&gt; coursework. Additionally, I structure some descriptions in the form “task: subtask” so I can single out tasks by using a keyword search.&lt;/p&gt;
&lt;h2 id=&quot;problem-2---some-things-are-hard-to-measure&quot;&gt;Problem #2 - Some things are hard to measure&lt;/h2&gt;
&lt;p&gt;It’s almost impossible to use Toggl to get insights on &lt;strong&gt;what distracts you&lt;/strong&gt;. You need predetermination to start/stop Toggl timers, which you won’t have when getting really distracted.&lt;/p&gt;
&lt;p&gt;Recently I discovered &lt;a href=&quot;https://www.rescuetime.com&quot;&gt;&lt;strong&gt;RescueTime&lt;/strong&gt;&lt;/a&gt;, a personal spy that automatically &lt;strong&gt;tracks time spent on websites, apps and desktop programs&lt;/strong&gt;.  It’s the other side of time tracking: you don’t have to do anything, but it records how much time you spent reading documentation on a site &lt;em&gt;and&lt;/em&gt; how long you were distracted by Twitter in the meantime. Pretty cool and scary!&lt;/p&gt;
&lt;p&gt;A problem here is that it gathers a lot of &lt;strong&gt;quantitative&lt;/strong&gt; data (&lt;em&gt;you spent X minutes on site A&lt;/em&gt;), but it’s harder to extract insights from that (&lt;em&gt;What were you actually doing on that site? Work-related stuff or not?&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Since RescueTime is pretty much install-and-forget, it can be used alongside Toggl. So you’ll also get a view on what’s mostly distracting you.&lt;/p&gt;
&lt;h2 id=&quot;problem-3---tracking-time-takes-time&quot;&gt;Problem #3 - Tracking time &lt;em&gt;takes time&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;A first interesting RescueTime insight is that the use of Toggl takes me approximately &lt;strong&gt;1 hour per week&lt;/strong&gt;, or 14 minutes per day. That includes the button presses, description typing and report checking. If you sum that up to half a year, you get around 25 hours.&lt;/p&gt;
&lt;p&gt;The question is whether the return on investment is high enough here. Luckily, there exists a nice business quote to guide us to the truth:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can’t improve what you can’t measure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It makes sense to start tracking activities you want to change. Tracking time doesn’t drive actual change, but it does makes you more aware of where your time goes. Being aware of that gives the opportunity to make changes. Whether you’ll actually do it or not, that’s still up to you.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2017/the-use-and-uselessness-of-tracking-time</link><guid isPermaLink="false">/posts/2017/the-use-and-uselessness-of-tracking-time</guid></item><item><title>An overview of sustainability films</title><description>Some of the most inspiring films I&apos;&apos;ve seen about (ecological) sustainability.</description><pubDate>Thu, 09 Mar 2017 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nowadays, films and documentaries are more easily consumed than books. Here I’d like to share a few that helped me to become more aware of (ecological) sustainability and animal rights issues.&lt;/p&gt;
&lt;h2 id=&quot;environment-ecology--economy&quot;&gt;Environment, ecology &amp;#x26; economy&lt;/h2&gt;
&lt;h3 id=&quot;demain--tomorrow-2015&quot;&gt;Demain / Tomorrow (2015)&lt;/h3&gt;
&lt;!-- Demain/Tomorrow YT trailer --&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/NUN0QxRB7e0&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;A French documentary film that explores possible transitions to sustainable food production, economies, communities and education. It is a refreshing watch because for once it does not portray the end of the world, it rather gives a glimpse of a hopeful new age for mankind. Both grassroots and large-scale sustainability initiatives are discussed in a compelling way.&lt;/p&gt;
&lt;h3 id=&quot;home-2009&quot;&gt;HOME (2009)&lt;/h3&gt;
&lt;!-- HOME YT trailer --&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/u_9U4gqwHW8&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;A documentary film with a narrative explaining the evolution of the earth and its inhabitant species to the state in which it is today. It starts with a broad perspective on the origins of life, and progresses towards an overview of the environmental issues caused by humanity. This is a beautiful and educational watch. And the best part: the &lt;strong&gt;whole film is published for free on&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=jqxENMKaeCU&quot;&gt;&lt;strong&gt;YouTube&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;!&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;cowspiracy-2014&quot;&gt;Cowspiracy (2014)&lt;/h3&gt;
&lt;!-- Cowspiracy trailer --&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/nV04zyfLyN4&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;em&gt;The&lt;/em&gt; most influential documentary for me until now! An exploratory documentary with a mind numbing amount of statistics and figures, following the journey and discoveries of the maker. He first discovers some shocking facts about the huge environmental impact of the meat and dairy industries and then looks for related statements by leading environmental organizations. Unsuccessful in this endeavor, he investigates why this is being covered up. A new cut directed by Leonardo DiCaprio is available on Netflix!&lt;/p&gt;
&lt;h3 id=&quot;before-the-flood-2016&quot;&gt;Before The Flood (2016&lt;/h3&gt;
&lt;!-- Before The Flood trailer --&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/6UGsRcxaSAI&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;In my opinion, this looks like Leonardo Dicaprio’s effort to create an unofficial &lt;em&gt;An Inconvenient Truth 2&lt;/em&gt;. The focus of the film is showing that we &lt;em&gt;still&lt;/em&gt; have a very real climate problem and that we’re &lt;em&gt;still&lt;/em&gt; not dealing with it. The problems are presented in a compelling way while following Leo’s story of discovery. Discussion about ways to prevent the projected climate apocalypse however is lacking. It is reserved to some very, very short scenes with high-level concepts and vague or limited recommendations like “make better choices”.&lt;/p&gt;
&lt;p&gt;The storytelling and cinematography on their own are very nice. This, and the fact that it is being starred and produced by Lovely Leo, has its merit. For some previously unconcerned acquaintances, &lt;em&gt;Before The Flood&lt;/em&gt; was an accessible movie that served them as an eye-opener!&lt;/p&gt;
&lt;h2 id=&quot;politics--business&quot;&gt;Politics &amp;#x26; Business&lt;/h2&gt;
&lt;h3 id=&quot;merchants-of-doubt-2014&quot;&gt;Merchants of Doubt (2014)&lt;/h3&gt;
&lt;p&gt;A documentary exposing the existence of corrupt individuals and institutes controlled by corporate interests that try to counter scientific consensus on global warming and other issues. Publicly, they cause mass confusion in order to deliberately slow environmental or health policy changes. Wondering why some groups in the USA still deny climate change? This one can give you some valuable insights!&lt;/p&gt;
&lt;h3 id=&quot;food-inc-2008&quot;&gt;Food, Inc. (2008)&lt;/h3&gt;
&lt;p&gt;A documentary exposing social, environmental and political injustices done by the large American food corporations.&lt;/p&gt;
&lt;h3 id=&quot;the-corporation-2003&quot;&gt;The Corporation (2003)&lt;/h3&gt;
&lt;p&gt;In this documentary film &lt;em&gt;the corporation&lt;/em&gt; is first defined and then analyzed historically using examples. It exposes multiple inherent ethical problems with this business form, while mentioning some positive characteristics. How can a corporation commit ‘psychopathic’ acts without its employees or even managers being necessarily psychopathic?&lt;/p&gt;
&lt;h2 id=&quot;animal-rights--compassion&quot;&gt;Animal Rights &amp;#x26; Compassion&lt;/h2&gt;
&lt;h3 id=&quot;earthlings-2005&quot;&gt;Earthlings (2005)&lt;/h3&gt;
&lt;p&gt;A notorious documentary explaining human exploitation of animals for companionship, food, clothing and entertainment. It is somewhat controversial, because it features graphic hidden camera footage of (extreme) animal mistreatment. It is often accused of not being representative for the meat industry as a whole, but it’s worth to watch it and judge it for yourself. It’s probably more representative than you’d like.&lt;/p&gt;
&lt;h2 id=&quot;worth-a-mention&quot;&gt;Worth a mention&lt;/h2&gt;
&lt;h3 id=&quot;baraka--samsara&quot;&gt;Baraka / Samsara&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;“An image tells more than a thousand words.”&lt;/em&gt; A dilogy without spoken narrative. These films explore the life of various cultures, both of the past and the present, and show how these cultures connect with their environment. The topic sustainability is only implicitly present, but well chosen images make you think twice about the way we’re living now. I personally find these films astonishingly beautiful. If you think slowly moving images of sceneries in nature are boring, they might not be your cup of tea however.&lt;/p&gt;
&lt;h3 id=&quot;the-zeitgeist-trilogy&quot;&gt;The Zeitgeist Trilogy&lt;/h3&gt;
&lt;p&gt;This &lt;a href=&quot;http://www.zeitgeistmovie.com/&quot;&gt;freely accessible&lt;/a&gt; series bombs you with conspiracy theories on religion, society, governments et cetera. I did not take the time to verify any of the statements, but these films certainly provide food for thought!&lt;/p&gt;
&lt;h3 id=&quot;super-size-me&quot;&gt;Super Size Me&lt;/h3&gt;
&lt;p&gt;What happens when you go on a McDonalds-only diet for a month? Quite obviously, that’s a bad idea. It will make you gain weight and bad stuff. Apart from this groundbreaking observation, the movie also tries to explain the causes of America’s fast-food addiction.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Thanks to WWOOF host Viktor Säfve for mentioning a lot of these!&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2017/sustainability-films</link><guid isPermaLink="false">/posts/2017/sustainability-films</guid></item><item><title>Screenshake 2017</title><description>Experiences on the three-day indie game festival Screenshake in Antwerp.</description><pubDate>Sat, 11 Feb 2017 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last week I visited &lt;a href=&quot;https://www.screenshake.be/&quot;&gt;Screenshake 2017&lt;/a&gt; with a friend, an international indie game festival hosted by The House of Indie in Antwerp.&lt;/p&gt;
&lt;p&gt;We had some fun with the games at the expo, but we mainly attended the talks.&lt;/p&gt;
&lt;p&gt;The talk subjects had a common ground, they showed that games are a medium of expression with a potential that is only selectively used today. They can play a meaningful and unique role in conveying emotions, experiences and cultural critique. These are domains mostly dominated by literature and film, but because of its interactive nature, games offer a new set of possibilities. Therefore the speakers argued that we should allow the medium to do new, unexpected things.&lt;/p&gt;
&lt;p&gt;There were no bad talks, but here are some I liked the most, with a synopsis of their content.&lt;/p&gt;
&lt;h2 id=&quot;rami-ismail&quot;&gt;Rami Ismail&lt;/h2&gt;
&lt;p&gt;Rami talked about the evolution of gaming as an entertainment form embedded in western culture. The paradigma of games is now being challenged by other cultures gaining access to contemporary game making tools. With their unusual cultural backgrounds, they can express themselves through games in new ways. This can influence games that are perceived as controversial in western countries, but also broaden the possibilities of the medium.&lt;/p&gt;
&lt;p&gt;An example was given of a war game, &lt;a href=&quot;http://www.liyla.org/&quot;&gt;Liyla&lt;/a&gt;, in which you don’t play an armed soldier fighting off ‘bad guys’ (typical US shooter), but a civilian Palestine girl trying to survive. Rami blogs about the game’s publishing difficulties &lt;a href=&quot;http://ramiismail.com/2016/03/convenience/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;7.2.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;531&quot; height=&quot;348&quot; src=&quot;https://thorgalle.me/_astro/7.2.DQW2E9vu_tdAWr.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The talk was recorded and will be published at some point. If you ever have the chance of watching this, it’s worth its time.&lt;/p&gt;
&lt;h2 id=&quot;press-pause---thryn-henderson&quot;&gt;Press Pause - Thryn Henderson&lt;/h2&gt;
&lt;p&gt;Thryn delivered a surprisingly deep, thought-provoking and eloquently presented lecture about the relation we (can) have with games. It’s a call for slowing down, for “pressing pause” now and then and reflecting on moments in games. A video supporting the whole talk featured “moments” from indie games such as Abzû, BELOW, Firewatch and Minecraft.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;abzu.jpeg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1200&quot; height=&quot;725&quot; src=&quot;https://thorgalle.me/_astro/abzu.D6f50d_h_1aOkTs.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;While the digital nature of games gives it some kind of predictability, it does not prepare you for the experience of being immersed in a game world. Giving oneself some time to contemplate the environment, immersing oneself into the situation or the character can be a valuable, meditative experience in itself.
Also, if you have the chance, check this out!&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2017/screenshake-2017</link><guid isPermaLink="false">/posts/2017/screenshake-2017</guid></item><item><title>Upgrading an aging iMac</title><description>Installing an SSD, a clean OS and adding memory to a Late ‘09 iMac</description><pubDate>Wed, 01 Feb 2017 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Lately, my families 27” iMac from Late 2009 ran slow.&lt;/p&gt;
&lt;p&gt;The 4GB memory space quickly became crowded on a normal workload. A memory-leaking Safari on an old and dirty OS X version didn’t help either. You could hear the stutters of the hard disk after eight years of tiring duty.&lt;/p&gt;
&lt;p&gt;So, it was time for some fresh components and software for this still beautiful machine!&lt;/p&gt;
&lt;h2 id=&quot;memory-&quot;&gt;Memory 🆙&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;ram.jpg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3329&quot; height=&quot;2497&quot; src=&quot;https://thorgalle.me/_astro/ram.DxZ1obJr_2d0bzO.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;We decided to double the memory to 8GB. This gives applications a very comfortable headroom.&lt;/p&gt;
&lt;p&gt;It’s best to match exisiting memory patterns, so with 2x2GB in place, we filled the other two slots the same way. Fitting memory modules could easily be found at a local Apple dealer, but they’re on the internet too.&lt;/p&gt;
&lt;p&gt;Installing was only a matter of unscrewing the bottom panel and inserting the modules.&lt;/p&gt;
&lt;h2 id=&quot;from-hard-to-solid&quot;&gt;From hard to solid&lt;/h2&gt;
&lt;div class=&quot;thor-gallery&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;1 set&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4000&quot; height=&quot;3000&quot; src=&quot;https://thorgalle.me/_astro/1_set.B7u6BFrn_1NAeBU.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;2 new&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4000&quot; height=&quot;3000&quot; src=&quot;https://thorgalle.me/_astro/2_new.B2mJkHYi_Z2rTbo9.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;3 old&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4000&quot; height=&quot;3000&quot; src=&quot;https://thorgalle.me/_astro/3_old.S57GRwQf_1iwYGt.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Replacing a hard disk with a solid state drive reduces noise and increases system responsiveness, essentially what we needed.&lt;/p&gt;
&lt;p&gt;After some research, I found that installing an SSD on a Late 2009 iMac is a little tricky, but feasible. Unfortunately you need a rather expensive &lt;a href=&quot;https://eshop.macsales.com/shop/ssd/owc/imac-27-inch/late-2009&quot;&gt;upgrade kit&lt;/a&gt; including a temperature sensor cable for the new drive.&lt;/p&gt;
&lt;p&gt;As for the SSD itself, we got a Crucial MX300, a low-end option. Getting an SSD with top-notch speed would be a waste anyway, as it’s limited by the older SATA II 3Gb/s interface of the iMac.&lt;/p&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;/h2&gt;
&lt;p&gt;I wanted a clean installation of the latest macOS (Sierra) on the SSD, with user data from the old system.&lt;/p&gt;
&lt;p&gt;I had a peculiar idea of doing this, with some doubts as to whether it would work. I put a &lt;a href=&quot;https://discussions.apple.com/thread/7821640&quot;&gt;forum thread&lt;/a&gt; up at Apple Communities, but in the end I just tried it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Backed up the important stuff (&lt;em&gt;of course&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Connected the SSD to the iMac &lt;em&gt;via an USB adapter&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Installed macOS Sierra directly to the SSD &lt;em&gt;as an&lt;/em&gt; &lt;a href=&quot;https://support.apple.com/en-us/HT202796&quot;&gt;&lt;em&gt;external startup disk&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Booted the iMac  SSD &lt;em&gt;via USB&lt;/em&gt; &amp;#x26; migrated old data and apps manually.&lt;/li&gt;
&lt;li&gt;Made an external backup of important documents &amp;#x26; most of the &lt;code&gt;/Library&lt;/code&gt; folder, using &lt;code&gt;rsync&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Disassembled the iMac &amp;#x26; replaced the internal HDD by the SSD as &lt;a href=&quot;https://vimeo.com/139362797&quot;&gt;shown by OWC&lt;/a&gt;, then reassembled it.&lt;/li&gt;
&lt;li&gt;Done!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The iMac directly booted without problems from the previously external startup disk that became an internal one. This was one of my worries, but luckily there were no weird bootloader complaints.&lt;/p&gt;
&lt;h2 id=&quot;the-mail-crux&quot;&gt;The mail crux&lt;/h2&gt;
&lt;p&gt;Now on to the the most difficult step in the whole process: transferring mails.&lt;/p&gt;
&lt;p&gt;I didn’t want to use the Migration Assistant, as it offers very coarse selection capabilities and would copy over all the rubbish from the old system too.&lt;/p&gt;
&lt;p&gt;According to numerous blog and forum posts, transferring them manually was easy. But the old mac ran OS X Mountain Lion, and starting from El Capitan, Apple seems to have changed the internal structure for mail app storage, effectively obfuscating it. Also the way mail accounts are stored has changed. After many attempts, a copy-paste of data and config files just didn’t work out.&lt;/p&gt;
&lt;p&gt;I ended up recreating accounts, exporting and importing mailboxes as archives as described &lt;a href=&quot;http://apple.stackexchange.com/questions/208766/mail-gone-after-clean-install-of-el-capitan&quot;&gt;here&lt;/a&gt;. Not ideal, but it works.&lt;/p&gt;
&lt;h2 id=&quot;results&quot;&gt;Results?&lt;/h2&gt;
&lt;p&gt;The operation was succesful! Boot time has improved, but not by an amazing margin. Applications definitely react quicker. Not unimportant, we removed a &lt;em&gt;hell of a lot&lt;/em&gt; of dust from the computers’ internals.&lt;/p&gt;
&lt;p&gt;The Mac’s fans however are constantly humming (softly), and I’m not sure whether this was the case before. Maybe there’s something wrong with the temperature sensor cable, though the measurements seem fine. Maybe it’s a new software policy in Sierra. It’s not too annoying.&lt;/p&gt;
&lt;div class=&quot;thor-gallery&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;3 old&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4000&quot; height=&quot;3000&quot; src=&quot;https://thorgalle.me/_astro/3_old.S57GRwQf_1iwYGt.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;IMG 7161&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3000&quot; height=&quot;4000&quot; src=&quot;https://thorgalle.me/_astro/img_7161.C5Yq8IMS_HkQQM.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;IMG 7163&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3000&quot; height=&quot;4000&quot; src=&quot;https://thorgalle.me/_astro/img_7163.bPQNxfj1_9vESM.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;mac stof&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2000&quot; height=&quot;1500&quot; src=&quot;https://thorgalle.me/_astro/mac_stof.1TnAFBrf_6DmlF.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;IMG 7166&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4000&quot; height=&quot;3000&quot; src=&quot;https://thorgalle.me/_astro/img_7166.BcfhpME0_Z2aExqT.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;IMG 7170&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4000&quot; height=&quot;3000&quot; src=&quot;https://thorgalle.me/_astro/img_7170.CQzaONsz_Z1mzSc1.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;mac onderkant&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4000&quot; height=&quot;3000&quot; src=&quot;https://thorgalle.me/_astro/mac_onderkant.C3KxV7K2_Z1yxzNw.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;IMG 7175&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3000&quot; height=&quot;4000&quot; src=&quot;https://thorgalle.me/_astro/img_7175.DmMh51z-_f1zFQ.webp&quot; srcset=&quot;&quot;&gt;
&lt;img alt=&quot;ram&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3329&quot; height=&quot;2497&quot; src=&quot;https://thorgalle.me/_astro/ram.DxZ1obJr_2d0bzO.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;&lt;/div&gt;</content:encoded><link>https://thorgalle.me/posts/2017/upgrading-an-aging-imac</link><guid isPermaLink="false">/posts/2017/upgrading-an-aging-imac</guid></item><item><title>Laying foundations for web projects</title><pubDate>Mon, 30 Jan 2017 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of my goals in the last years has been to get a better understanding of web technologies, so I can use them creatively.&lt;/p&gt;
&lt;p&gt;I’m happy that I have been able to do some fundamental learning already:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic HTML and CSS&lt;/strong&gt;, self-taught via Codecademy, &lt;a href=&quot;http://learn.shayhowe.com/&quot;&gt;Shay Howe&lt;/a&gt;’s nice tutorials, and a trusty web inspector tool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP &amp;#x26; SQL&lt;/strong&gt; basics, by working on a project for a Databases course in university.&lt;/li&gt;
&lt;li&gt;Some &lt;strong&gt;Javascript&lt;/strong&gt; &amp;#x26; jQuery, by poking around on Mozilla MDN &amp;#x26; Codecademy.&lt;/li&gt;
&lt;li&gt;Frameworks like Bootstrap and Pure CSS, the Twig templating engine, while working on sites like this one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now I want to take it a step further: I have a (simple) &lt;strong&gt;web app&lt;/strong&gt; idea that I’d like to realize. To use it myself, but also to gain experience making it.&lt;/p&gt;
&lt;p&gt;This leads to a lot of initial choices. What back-end language or framework to use? What database type? …&lt;/p&gt;
&lt;p&gt;Instead of diving in head-first, I considered the options. On one side, tried and widely used technologies (PHP, SQL, …) are important, because they make up most of the present web stack. On the other hand, it’s interesting to try newer, innovative technologies. After all, they are the building blocks of the future, and I see them in high demand around in local technology startups.&lt;/p&gt;
&lt;p&gt;For this project, I’ve chosen to invest my time in learning the &lt;strong&gt;MEAN stack&lt;/strong&gt; for web apps. This is an alternative to the more traditional *&lt;strong&gt;AMP&lt;/strong&gt; web stacks (Apache, MySQL, PHP), with considerable differences.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;meanstack.jpeg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1024&quot; height=&quot;575&quot; src=&quot;https://thorgalle.me/_astro/meanstack.De-9Q-Sk_ZG8Av3.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MEAN&lt;/strong&gt;: &lt;strong&gt;M&lt;/strong&gt;ongoDB for the database back end, &lt;strong&gt;E&lt;/strong&gt;xpress.js for …, &lt;strong&gt;A&lt;/strong&gt;ngular.js on the client side and &lt;strong&gt;N&lt;/strong&gt;ode.js for the server runtime… all related to Javascript! This is nice, because it offers a uniform language to work on web project, both on the client and the server side.&lt;/p&gt;
&lt;p&gt;One problem though, my Javascript knowledge can improve at the moment.&lt;/p&gt;
&lt;p&gt;My plan to prepare for my web project is roughly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sharpening my Javascript skills by going through the book Eloquent JS.&lt;/li&gt;
&lt;li&gt;Following a relatively specialized edX course on making a MEAN app.&lt;/li&gt;
&lt;li&gt;Familiarize myself further with the components where necessary, using additional web resources and documentation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’ve already read an introduction to MongoDB and followed the first chapter of the edX course. It definitely seems interesting!&lt;/p&gt;
&lt;p&gt;In the next Learning Portfolio post I’ll report how the learning fares, and I’ll introduce my mysterious little project idea briefly.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2017/lp1-laying-foundations-for-web-projects</link><guid isPermaLink="false">/posts/2017/lp1-laying-foundations-for-web-projects</guid></item><item><title>Comments on The Last Wish: Introducing the Witcher</title><description>Some thoughts on the first book from the Witcher series.</description><pubDate>Tue, 17 Jan 2017 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the last week I’ve read &lt;em&gt;The Last Wish: Introducing the Witcher&lt;/em&gt; by Andrzej Sapkowski. This is the first book of the series that inspired The Witcher games.&lt;/p&gt;
&lt;p&gt;I enjoyed the well thought-out world of the second game (&lt;em&gt;Assassings of Kings&lt;/em&gt;), so I reckoned the source books would be a nice read too. However, it has been a while since I read fantasy, and the last one was &lt;em&gt;A Song of Ice and Fire&lt;/em&gt;…&lt;/p&gt;
&lt;h2 id=&quot;what-i-liked&quot;&gt;What I liked&lt;/h2&gt;
&lt;p&gt;The book contains a frame story interleaved with six smaller short stories.
These stories offer an interesting background on Geralt (the witcher) &amp;#x26; some important characters and monsters in the universe. There are &lt;em&gt;a lot&lt;/em&gt; of references to classic fairy tales, I’ve probably only spotted half of them.&lt;/p&gt;
&lt;p&gt;The seperate stories make it relatively varied, interesting and entertaining.&lt;/p&gt;
&lt;h2 id=&quot;whats-weird&quot;&gt;What’s weird&lt;/h2&gt;
&lt;p&gt;Geralt is a monster slayer by profession, righteous and friendly, but hardened by relentless training and physical mutations since birth. Sometimes he is convincingly portrayed as this serious character.&lt;/p&gt;
&lt;p&gt;But regularly, the book takes a weird jump. The characters can flip from being cold blooded killers to teddy bears in a matter of a sentence. For example, in the story &lt;em&gt;A Question of Price&lt;/em&gt;, Geralt is killing guards on one moment, and crying at the happy ending of a love story on the other.&lt;/p&gt;
&lt;p&gt;This makes it all seem a litte “unrealistic”. Not in the sense of a poorly designed fantasy world, but because of the implausibility of the characters and situations. I felt that &lt;em&gt;A Song of Ice and Fire&lt;/em&gt;, Tolkiens’ books or &lt;em&gt;The Inheritance Cycle (Eragon)&lt;/em&gt; and even &lt;em&gt;Ranger’s Apprentice&lt;/em&gt; when I was younger are more sensible in this regard.&lt;/p&gt;
&lt;p&gt;That doesn’t make it &lt;em&gt;bad&lt;/em&gt;. Just an entertaining, light read with an identity crisis every now and then.&lt;/p&gt;
&lt;h3 id=&quot;update-feb-17&quot;&gt;Update Feb ‘17&lt;/h3&gt;
&lt;p&gt;I’m reading the first full book (Blood of Elves) as well, and it’s better. Well, at least it doesn’t have this weird flipping.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The cover image is depicting a scene from the story &lt;em&gt;A Grain of Truth&lt;/em&gt; © by &lt;a href=&quot;http://afternoon63.deviantart.com/art/A-Grain-of-Truth-458127124&quot;&gt;Afternoon63 on DeviantArt&lt;/a&gt;.&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2017/the-last-wish</link><guid isPermaLink="false">/posts/2017/the-last-wish</guid></item><item><title>Mail view styling in Thunderbird</title><pubDate>Sun, 08 Jan 2017 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I find it tiring to read large chunks of text that take up the full width of a browser or mail window. Paragraphs with a book-like line width of around 700px and unobtrusive margins are far more readable.&lt;/p&gt;
&lt;p&gt;So, I had a problem with the display of email in Mozilla Thunderbird:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;before&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1206&quot; height=&quot;684&quot; src=&quot;https://thorgalle.me/_astro/before.rwQTEWQ9_Rp2yq.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Some research led me to &lt;a href=&quot;http://kb.mozillazine.org/UserContent.css&quot;&gt;userContent.css&lt;/a&gt;: a style sheet used by Thunderbird to style the content of &lt;em&gt;all&lt;/em&gt; mails, both written an viewed. It only affects the local machine, so it is not included in sent messages. Perfect!&lt;/p&gt;
&lt;p&gt;This is the quick CSS I threw in to reach my goal:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#6A737D&quot;&gt;/* ~/.thunderbird/[profile folder name]/chrome/userContent.css */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;​&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#6A737D&quot;&gt;/* make mails more readable */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#22863A;--shiki-dark:#85E89D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    max-width&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt;700&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;px&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    margin&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt; auto&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    padding&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;em&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;em&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    line-height&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#79B8FF&quot;&gt;1.8&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F97583&quot;&gt;em&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And this is the result:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Thunderbird After&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1206&quot; height=&quot;684&quot; src=&quot;https://thorgalle.me/_astro/after.D_UhGQ8v_EPtbO.webp&quot; srcset=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;A dissection of the CSS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I didn’t know the CSS selectors I could use to target Thunderbird’s plain mail text, so I just gave &lt;code&gt;html&lt;/code&gt; a shot. Seems to work!&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max-width&lt;/code&gt; instead of &lt;code&gt;width&lt;/code&gt; ensures a readable line width &lt;em&gt;and&lt;/em&gt; avoids a horizontal scrollbar when the window is smaller than 700px.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;margin: 0 auto;&lt;/code&gt; centers the text box horizontally.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;padding&lt;/code&gt; ensures some “margins”, even on a window smaller than 700px (a short hack).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I mainly wanted it to work for plain text mails, but since most rich HTML mails today are designed to work on all kinds of viewports, they scale nicely too. I do think their CSS overrides &lt;code&gt;userContent.css&lt;/code&gt; though.&lt;/p&gt;
&lt;p&gt;Do you know a cleaner way of doing this in CSS? I’d love to hear!&lt;/p&gt;</content:encoded><link>https://thorgalle.me/posts/2017/thunderbird-css-view-styling</link><guid isPermaLink="false">/posts/2017/thunderbird-css-view-styling</guid></item></channel></rss>