go-jamming/mocks/samplerss.xml

17710 lines
1.6 MiB
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Brain Baking</title>
<link>https://brainbaking.com/</link>
<description>Recent content on Brain Baking</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<managingEditor>Wouter Groeneveld</managingEditor>
<webMaster>Wouter Groeneveld</webMaster>
<lastBuildDate>Tue, 16 Mar 2021 17:07:14 +0000</lastBuildDate>
<atom:link href="https://brainbaking.com/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>@celia @kev I have read both you and Kev&#39;s post on...</title>
<link>https://brainbaking.com/notes/2021/03/16h17m07s14/</link>
<comments>https://brainbaking.com/notes/2021/03/16h17m07s14/#commento</comments>
<pubDate>Tue, 16 Mar 2021 17:07:14 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/16h17m07s14/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A5GVjIHI6MH82H6iLQ" href="https://fosstodon.org/@celia" rel="ugc">@<span>celia</span></a></span> <span class="h-card"><a class="u-url mention" data-user="A54b8g0RBaIgjzczMu" href="https://fosstodon.org/@kev" rel="ugc">@<span>kev</span></a></span> I have read both you and Kev&rsquo;s post on this and agree on some points indeed! But I&rsquo;m not yet ready to give up webmentions. As an academic, the idea of citing/mentioning each other is very alluring πŸ€“. Plus, I needed an excuse to fiddle some more with JS&hellip; <br><br>As much as I loved using Wordpress before, I can&rsquo;t imagine going back to writing stuff in there instead of in markdown. Gotta keep the workflow short, though. Hope it helps you focus on what matters - content!</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 16 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>@robert @kev @celia I run an instance-of-one Plero...</title>
<link>https://brainbaking.com/notes/2021/03/16h12m38s27/</link>
<comments>https://brainbaking.com/notes/2021/03/16h12m38s27/#commento</comments>
<pubDate>Tue, 16 Mar 2021 12:38:27 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/16h12m38s27/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A5B4KIqbB6t20egJhQ" href="https://social.winter.ink/@robert" rel="ugc">@<span>robert</span></a></span> <span class="h-card"><a class="u-url mention" data-user="A54b8g0RBaIgjzczMu" href="https://fosstodon.org/@kev" rel="ugc">@<span>kev</span></a></span> <span class="h-card"><a class="u-url mention" data-user="A5GVjIHI6MH82H6iLQ" href="https://fosstodon.org/@celia" rel="ugc">@<span>celia</span></a></span> I run an instance-of-one Pleroma server and ps tells me it&rsquo;s using 8% of the 2GB RAM (postgres takes up even less). Also happy with the clean Soapbox UI. If you&rsquo;re already hiring a VPS, I see no reason to pay for <a href="http://masto.host" rel="ugc">masto.host</a>.</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 16 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>So, we rewrote our CS courses in Markdown. I&#39;m loo...</title>
<link>https://brainbaking.com/notes/2021/03/15h14m43s49/</link>
<comments>https://brainbaking.com/notes/2021/03/15h14m43s49/#commento</comments>
<pubDate>Mon, 15 Mar 2021 14:43:49 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/15h14m43s49/</guid>
<description>
<![CDATA[
<p>So, we rewrote our CS courses in Markdown. I&rsquo;m looking for ways to make things more <strong>interactive</strong> for students, e.g. by embedding <a href="http://replit.com" rel="ugc">replit.com</a> snippets. However, I dont&rsquo;t want to create 34235 repls for every snippet, and a single backed repository is not supported. Any ideas? Jupyter notebooks are out of the question, and sadly, so is <a href="http://codepen.io" rel="ugc">codepen.io</a> or jsfiddle: I need Java and C compile support. It should be something <em>simple</em> - snippets are mostly single-page, small things. E.g. <a href="https://kuleuven-diepenbeek.github.io/osc-course/ch1-c/intro/" rel="ugc"><a href="https://kuleuven-diepenbeek.github.io/osc-course/ch1-c/intro/">https://kuleuven-diepenbeek.github.io/osc-course/ch1-c/intro/</a></a></p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 15 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>Enjoyed an afternoon of oldskool Diablo II on the ...</title>
<link>https://brainbaking.com/notes/2021/03/14h17m41s53/</link>
<comments>https://brainbaking.com/notes/2021/03/14h17m41s53/#commento</comments>
<pubDate>Sun, 14 Mar 2021 17:41:53 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/14h17m41s53/</guid>
<description>
<![CDATA[
<p>Enjoyed an afternoon of oldskool Diablo II on the Europebattle servers. We did a few Mephisto runs, managed to hit Hell, and I re-converetd my druid into a windy one. Good times!</p>
<div class="flex">
<div>
<a class="lbox" href="https://chat.brainbaking.com/media/6f8b72ca-9bfb-460b-9609-c4298a8cab2b/EuropeBattle%202021-03-14%2016-20-36-87.jpg">
<img loading="lazy" src="https://chat.brainbaking.com/media/6f8b72ca-9bfb-460b-9609-c4298a8cab2b/EuropeBattle%202021-03-14%2016-20-36-87.jpg" alt="Enclosed Toot image">
</a>
</div>
<div>
<a class="lbox" href="https://chat.brainbaking.com/media/3dbcb044-2acc-4ace-a4f6-37ce94c3f2b1/EuropeBattle%202021-03-14%2015-35-01-56.jpg">
<img loading="lazy" src="https://chat.brainbaking.com/media/3dbcb044-2acc-4ace-a4f6-37ce94c3f2b1/EuropeBattle%202021-03-14%2015-35-01-56.jpg" alt="Enclosed Toot image">
</a>
</div>
</div>
<p>
By <a href="/about">Wouter Groeneveld</a> on 14 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>@rsolva whoops overlooked the word &#39;native&#39;.Well, ...</title>
<link>https://brainbaking.com/notes/2021/03/13h12m44s29/</link>
<comments>https://brainbaking.com/notes/2021/03/13h12m44s29/#commento</comments>
<pubDate>Sat, 13 Mar 2021 12:44:29 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/13h12m44s29/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A58ShiR61N9xSQZPDk" href="https://mastodon.social/@rsolva" rel="ugc">@<span>rsolva</span></a></span> whoops overlooked the word &lsquo;native&rsquo;.Well, all I can say is: it works!</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 13 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>@rsolva that&#39;s a lie indeed 😁 see https://brainba...</title>
<link>https://brainbaking.com/notes/2021/03/13h09m58s25/</link>
<comments>https://brainbaking.com/notes/2021/03/13h09m58s25/#commento</comments>
<pubDate>Sat, 13 Mar 2021 09:58:25 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/13h09m58s25/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A58ShiR61N9xSQZPDk" href="https://mastodon.social/@rsolva" rel="ugc">@<span>rsolva</span></a></span> that&rsquo;s a lie indeed 😁 see <a href="https://brainbaking.com/post/2021/03/getting-rid-of-tracking-using-lineageos/" rel="ugc"><a href="https://brainbaking.com/post/2021/03/getting-rid-of-tracking-using-lineageos/">https://brainbaking.com/post/2021/03/getting-rid-of-tracking-using-lineageos/</a></a> I use davx5 and it works flawlessly</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 13 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>@rsolva @aral @laura Great incentive Ruben, I chim...</title>
<link>https://brainbaking.com/notes/2021/03/12h19m17s26/</link>
<comments>https://brainbaking.com/notes/2021/03/12h19m17s26/#commento</comments>
<pubDate>Fri, 12 Mar 2021 19:17:26 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/12h19m17s26/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A58ShiR61N9xSQZPDk" href="https://mastodon.social/@rsolva" rel="ugc">@<span>rsolva</span></a></span> <span class="h-card"><a class="u-url mention" data-user="A58ShkZg4RDE5cbHsG" href="https://mastodon.ar.al/@aral" rel="ugc">@<span>aral</span></a></span> <span class="h-card"><a class="u-url mention" data-user="A54UboCD7EY4rO4wgi" href="https://mastodon.laurakalbag.com/@laura" rel="ugc">@<span>laura</span></a></span> Great incentive Ruben, I chimed in and also became a backer! Loving what you guys do. Hopefully the latest video will be online shortly, I missed the live stream.</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 12 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>Great, I can ditch lazysizes.js! Didn&#39;t know about...</title>
<link>https://brainbaking.com/notes/2021/03/12h18m06s14/</link>
<comments>https://brainbaking.com/notes/2021/03/12h18m06s14/#commento</comments>
<pubDate>Fri, 12 Mar 2021 18:06:14 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/12h18m06s14/</guid>
<description>
<![CDATA[
<p>Great, I can ditch lazysizes.js! Didn&rsquo;t know about this before: <a href="https://web.dev/browser-level-image-lazy-loading/" rel="ugc"><a href="https://web.dev/browser-level-image-lazy-loading/">https://web.dev/browser-level-image-lazy-loading/</a></a> and browser support is &ldquo;good enough&rdquo;: <a href="https://caniuse.com/loading-lazy-attr" rel="ugc"><a href="https://caniuse.com/loading-lazy-attr">https://caniuse.com/loading-lazy-attr</a></a></p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 12 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>Always have a Diaster Recovery Plan</title>
<link>https://brainbaking.com/post/2021/03/always-have-a-disaster-recovery-plan/</link>
<comments>https://brainbaking.com/post/2021/03/always-have-a-disaster-recovery-plan/#commento</comments>
<pubDate>Thu, 11 Mar 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/03/always-have-a-disaster-recovery-plan/</guid>
<category domain="https://brainbaking.com/tags/vps">vps</category>
<description>
<![CDATA[
<p>A relatively quiet Wednesday morning. I wrote a few JS files, fiddled a bit more with my attempts to get <a href="/post/2021/03/the-indieweb-mixed-bag/">Webmentions working</a>. Timeouts appeared. Huh? Check <em>brainbaking.com</em>. No response. Huh? Try to login into my VPS administration panel. More timeouts. Huh-wuh?</p>
<p><figure>
<a href="../ovh-fire.jpg" class="lbox">
<img loading="lazy" src="../ovh-fire.jpg" title="Uh-oh. This can&#39;t be good...">
</a>
<figcaption>Uh-oh. This can&#39;t be good...</figcaption>
</figure>
</p>
<p>SBG2, one of <a href="https://www.ovh.com/">OVHcloud&rsquo;s</a> data centers in Strasbourg, <a href="https://twitter.com/olesovhcom/status/1369770805064855552">was completely destroyed</a> by a fire last night. Luckily, everyone got out in time. Well, except for all VPS servers&hellip; Mine is hosted in the adjacent SBG1, and 1/3th of that center is also gone.</p>
<p>The first thing my wife posted on Instagram? <em>&ldquo;Dear sir/madam. <a href="https://www.youtube.com/watch?v=xqQ6Z-HmAqY">Fire - exclamation mark!</a> Fire - exclamation mark!&quot;</em> - who&rsquo;s the nerd now?</p>
<p>We were recommended to <em>&ldquo;activate your disaster recovery plan&rdquo;</em>. Cool. I didn&rsquo;t have any, except for a few shoddy bash scripts I wrote about <a href="/post/2020/04/vps/">last year</a>. That poor man&rsquo;s backup plan clearly was <em>not</em> sufficient&hellip; I hastily reserved another VPS in Gravelines, just below
Dunkirk. DNS IP settings borked, no failover plan, no automatic backups&hellip; Getting static websites back up and running in no-time is not a problem. However, my wife&rsquo;s Wordpress instance was much more painful.</p>
<p>And of course, I forgot to backup the CalDAV and Mastodon databases, and a portion of my wife&rsquo;s Moodle instance&hellip;</p>
<p>So yeah. Wednesday sucked. Time to put Ansible/Docker on the priority queue&hellip;</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 11 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>@eli_oat a serious fire destroyed the data center ...</title>
<link>https://brainbaking.com/notes/2021/03/10h16m24s22/</link>
<comments>https://brainbaking.com/notes/2021/03/10h16m24s22/#commento</comments>
<pubDate>Wed, 10 Mar 2021 16:24:22 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/10h16m24s22/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A54Sl2iQIm74acQBwu" href="https://dog.estate/@eli_oat" rel="ugc">@<span>eli_oat</span></a></span> a serious fire destroyed the data center of my VPS last night: <a href="https://twitter.com/olesovhcom/status/1369478732247932929" rel="ugc"><a href="https://twitter.com/olesovhcom/status/1369478732247932929">https://twitter.com/olesovhcom/status/1369478732247932929</a></a> - guess what I did NOT backup: my Mastodon instance. What a disaster. No idea if things get pushed back to this new instance. Just wanting to see if your instance recognizes this username, cause it's a fresh install?</p>
<p>invalid domain: <a href="https://youtube.com/cool">cool!</a></p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 10 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>I&amp;#39;ve been fiddling with IndieWeb stuff the last week and all in all, I think it&amp;#39;s a mixed...</title>
<link>https://brainbaking.com/notes/2021/03/09h15m17s30/</link>
<comments>https://brainbaking.com/notes/2021/03/09h15m17s30/#commento</comments>
<pubDate>Tue, 09 Mar 2021 15:17:30 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/09h15m17s30/</guid>
<description>
<![CDATA[
<p>I've been fiddling with IndieWeb stuff the last week and all in all, I think it's a mixed bag: <a href="https://brainbaking.com/post/2021/03/the-indieweb-mixed-bag/" rel="ugc"><a href="https://brainbaking.com/post/2021/03/the-indieweb-mixed-bag/">https://brainbaking.com/post/2021/03/the-indieweb-mixed-bag/</a></a><br><span class="h-card"><a class="u-url mention" data-user="A52GhcQ6Ux4hx6tIe0" href="https://fosstodon.org/@kev" rel="ugc">@<span>kev</span></a></span> after I published it, I found out your &quot;removing support for indieweb&quot; post. Seems like we agree that it's overly complicated, sadly enough! Loving the guestbook alternative. What to do, what to do&hellip; πŸ˜…</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 9 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>https://forth-standard.org/ - yet another programming language I need to take a look at? That lis...</title>
<link>https://brainbaking.com/notes/2021/03/09h08m09s04/</link>
<comments>https://brainbaking.com/notes/2021/03/09h08m09s04/#commento</comments>
<pubDate>Tue, 09 Mar 2021 08:09:04 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/09h08m09s04/</guid>
<description>
<![CDATA[
<p><a href="https://forth-standard.org/" rel="ugc"><a href="https://forth-standard.org/">https://forth-standard.org/</a></a> - yet another programming language I need to take a look at? That list is becoming ridiculously long&hellip;</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 9 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>The IndieWeb Mixed Bag</title>
<link>https://brainbaking.com/post/2021/03/the-indieweb-mixed-bag/</link>
<comments>https://brainbaking.com/post/2021/03/the-indieweb-mixed-bag/#commento</comments>
<pubDate>Tue, 09 Mar 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/03/the-indieweb-mixed-bag/</guid>
<category domain="https://brainbaking.com/tags/privacy">privacy</category>
<category domain="https://brainbaking.com/tags/accessibility">accessibility</category>
<description>
<![CDATA[
<p>It&rsquo;s that time again: I started fiddling with my blog code - for the <em>nth</em> time. Kev Quirk calls it <a href="https://kevq.uk/the-wonderful-world-of-wordpress-wizardry-for-working-with-websites/">pissing around with the code</a>. That was meant negatively, and one of the reasons for him to switch back from Jekyll to Wordpress. I, however, like <em>pissing around</em> because I like <em>pissing</em> - or coding, just for the sake of it. After all, <em>Brain Baking</em> is a big side project that helps me learn and discover new things, blogging technology included.</p>
<h2 id="so-what-changed">So, what changed?</h2>
<p>I discovered the <a href="https://indieweb.org/">IndieWeb</a>, perhaps an integral part of what Aral Balkan likes to call the <a href="https://ar.al/2020/08/07/what-is-the-small-web/">Small Web</a>. Many IndieWeb W3C standards have been around for almost twenty years! I have no idea why I only came across it a few weeks ago. Since then, I&rsquo;ve been trying to refactor parts of my site to support the IndieWeb standards, and I&rsquo;m starting to see why.</p>
<p>It&rsquo;s a <em>big hassle</em>.</p>
<p>There&rsquo;s this thing with <code>h-card</code>, <code>e-content</code> and <code>u-url</code> meta-classes that have to be added in order for your HTML content to be machine-parsable. Verification can be done with any <a href="https://aimee-gm.github.io/microformats-parser/">microformats2-parser</a> or the nice website <a href="https://indiewebify.me">indiewebify.me</a>. That meant messing around with the templates - again - as of course many components were not properly placed within each other. Author information should be on the root page of your domain, syndication links should have proper meta classes, etc etc.</p>
<h2 id="but-why">But why?</h2>
<p>Now we&rsquo;re getting somewhere! One compelling component of the IndieWeb movement is <strong>Webmentions</strong>. A webmention is a logical evolution from <code>pingback</code> links from the hopefully long lost XML era that nobody ever implements unless they happen to run a Wordpress website. With Webmentions, you notify others when you&rsquo;ve written an article and linked theirs - or written a comment on theirs.</p>
<p>The concept is a webmention is that instead of commenting on someone else&rsquo;s domain, you <em>own your data</em>. Want to write a comment or remark? Post it on <em>your own</em> site and send a webmention instead. This idea is also called <a href="https://indieweb.org/POSSE">POSSE</a>: <em>Publish On your Site, Syndicate Elsewhere</em>. As opposed to PESOS: <em>Publish Elsewhere, Syndicate to your Own Site</em>. A very intriguing concept that got my full attention.</p>
<p>Until I started thinking about the ramifications of POSSE. It would be cool if the <a href="/notes/2021/03/04h08m47s31/">Switch supported POSSE</a> instead of having me post screenshots to a private Twitter account. It would be great if we had access to the ecosystem of the target <em>silo</em> (a centralized social platform) when simply interacting with our own site. <a href="https://www.jvt.me/mf2/2021/02/hvjtd/">Jamie Tanna</a> uses <a href="https://indigenous.realize.be/">Indigenous</a> to publish content to his site. Oh, you&rsquo;ll need to implement a few microservices (micropub/sub) in order to get that working&hellip; And you&rsquo;ll also lose context. So, again: why?</p>
<p>I like the idea of webmentions, because as an academic, I also like the idea of correctly citing each others work. In theory, writing something like this should automatically post webmention notifications to the people I mentioned in this article. A link to this article should appear on their page. Note that I&rsquo;m using the word <em>should</em> here. A few major problems prevent me from smiling instead of sighing:</p>
<ul>
<li>The responsibility for sending webmentions is the web blog owner. Many blogs do not send them out and only receive them because <a href="https://webmention.io/">webmention.io</a> makes it semi-easy to implement. Yes, many efforts like <a href="https://webmention.app/">webmention.app</a> exist to automate this, but none work effectively, and they all still require you to run the scripts.</li>
<li>Being dependent on something like webmention.io defeats the purpose of a <em>Small Web</em>: now I&rsquo;m still using a big central silo to receive my stuff!</li>
<li>As for POSSE: that&rsquo;s simply ridiculous when thinking about something like Goodreads. I might also be interested in what others are reading, and not every context gets synced to my site with the IndieWeb tools.</li>
</ul>
<h2 id="so-dont-do-it">So don&rsquo;t do it!</h2>
<p>I wrote about my <a href="/post/2020/06/tracking-and-privacy-on-websites/">Facebook PESOS attempt</a> before. I&rsquo;d love to POSSE, but some questions that are posted there simply don&rsquo;t make it back, and as a community maintainer, I simply sometimes need to be there, even if I really, really hate that.</p>
<p><strong>Blog comments</strong>, another big debate. My evolution from Disqus to Commento to nothing to Mastodon to Webmentions says it all<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>: it&rsquo;s a hassle. People like <a href="https://darthmall.net/weblog/webmentions/">Evan Sheehan</a> add a small form to each page where webmentions can be requested - although they should be sent automatically. But what about &ldquo;normal&rdquo;, non-tech savvy people? What if they want to comment? Oh, they can just use <a href="https://commentpara.de/">commentpara.de</a>. Well, that doesn&rsquo;t work, and I&rsquo;ve tried it - and it&rsquo;s another external liability.</p>
<p>All these headaches made people not just leave the IndieWeb standards behind: they are actually leaving static website generators behind and reverting to Wordpress! Read about <a href="https://rusingh.com/2021/03/05/waving-thankful-goodbye-to-static-websites-and-more/">Ru Singh</a> and <a href="https://chriswiegman.com/2020/08/hello-wordpress-my-old-friend/">Chris Wiegman</a>&rsquo;s reasons. It&rsquo;s mostly the convoluted workflow, and the hassle to get all the tools of their Jamstack-site just right.</p>
<p><figure>
<a href="../blogchart.jpg" class="lbox">
<img loading="lazy" src="../blogchart.jpg" title="Courtesy of rakhim.org. I&#39;m somewhere on the lower right...">
</a>
<figcaption>Courtesy of rakhim.org. I&#39;m somewhere on the lower right...</figcaption>
</figure>
</p>
<p><a href="https://jamstack.org/what-is-jamstack/">What&rsquo;s a jamstack</a> πŸ₯ž? I&rsquo;ve been jamstack-ing more than four years and only just found out that there&rsquo;s an acronym/cool word for the counterpart of a LAMP-stack: a <em>Javascript + Microservices-stack</em>. Because if you&rsquo;re interested in receiving webmentions, you still need an end-point&hellip;</p>
<p>Sleeves up, code out:</p>
<ul>
<li>microservice endpoint: check, <a href="https://github.com/wgroeneveld/serve-my-jams">https://github.com/wgroeneveld/serve-my-jams</a></li>
<li>javascript tools: check, <a href="https://github.com/wgroeneveld/jam-my-stack">https://github.com/wgroeneveld/jam-my-stack</a></li>
</ul>
<p>Okay, so now, I can answer the <em>why</em>. Not because it will be heavily used, or the IndieWeb stuff feels like the future. The low adoption rate says it all&hellip; No, simply because I was bored and wanted to learn about modern JS frameworks. I had an excuse to code again. Yay!</p>
<p>Still, once I more or less finished a first revision of my own toolset (sending is up next), I felt a bit empty inside. What&rsquo;s the point? Who will <em>webmention</em> me anyway? Those few other tech-related cooler bloggers? If you pay attention to the webmentions on other sites, you&rsquo;ll notice that <code>95%</code> of them are Twitter feeds, probably converted into webmentions by services like <a href="https://brid.gy/">brid.gy</a>. My point is that as far as <strong>usability</strong> goes, the IndieWeb standard completely falls apart. Sure, decentralization is the future. That&rsquo;s why I try to host and own my own data such as my <a href="https://chat.brainbaking.com/">Mastodon Instance</a> - and that&rsquo;s the philosophy of the IndieWeb.</p>
<p>But I can&rsquo;t ask my wife to stop posting on Instagram because she&rsquo;s giving her data away? I can&rsquo;t ask her to post it on her own Wordpress-site, after installing a bunch of <a href="https://kevq.uk/removing-support-for-the-indieweb/">barely working</a> POSSES-related plug-ins? And I can&rsquo;t ask visitors of my own site to &ldquo;webmention me!&rdquo; if they don&rsquo;t have a site?</p>
<p>Feel free to prove me wrong, though. Why don&rsquo;t you webmention this article?</p>
<h2 id="who-owns-what-data">Who owns what data?</h2>
<p>One of the key properties of POSSE-ing is that you include a url-shortened reference to the original article, like so: <code>(short.co 34yf1)</code>. Having to put up with visible junk metadata on Twitter is also a big concern for me. The theory behind it is good and logical, but without the silos supporting it, the implementation is just awful. Furthermore, without a reference, you won&rsquo;t know if it&rsquo;s POSSE or PESOS. Aren&rsquo;t you still giving your data away either way? On <a href="https://help.micro.blog/2018/twitter-differences/">Micro.blog</a>&rsquo;s help page, they explain the difference between Micro.blog and Twitter like so:</p>
<blockquote>
<p>But when you use Twitter, your content stays at Twitter. At Micro.blog, you can write short posts that appear in the Micro.blog timeline, as well as on your own blog that you control.</p>
</blockquote>
<p>But almost everyone who uses webmention uses it to syndicate replies from others to their site, after POSSE-ing their microblog contents to Twitter. Just for the record: I use PESOS on my <a href="/notes">fleeting notes</a>, because it&rsquo;s coming from my own Mastodon/Pleroma instance anyway.</p>
<p>So, in essence, you&rsquo;re still sending out data to big &ldquo;evil&rdquo; third party silos - possibly including media. That means from thereon, a snapshot of that data does <em>NOT</em> belong to you anymore. You just gave it away! I <a href="/notes/2021/02/27h17m51s39/">can&rsquo;t wrap my head</a> around that. Again, I think the <em>Own Your Data</em> philosophy is great, and I fully support it. Otherwise, I wouldn&rsquo;t have taken the trouble to <a href="/post/2021/03/getting-rid-of-tracking-using-lineageos/">install LineageOS</a>.</p>
<p>Maybe, a part of the blog technology fatigue is because of our own fanaticism&hellip;</p>
<section class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1" role="doc-endnote">
<p>Managing comments is a hassle, as Kev and others agree. I got rid of these systems last year. If you like to chime in on the discussion, just toot or e-mail me. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</section>
<p>
By <a href="/about">Wouter Groeneveld</a> on 9 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>I just learned about https://www.inklestudios.com/ink/ a scripting language used in story-heavy a...</title>
<link>https://brainbaking.com/notes/2021/03/06h12m41s48/</link>
<comments>https://brainbaking.com/notes/2021/03/06h12m41s48/#commento</comments>
<pubDate>Sat, 06 Mar 2021 12:41:48 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/06h12m41s48/</guid>
<description>
<![CDATA[
<p>I just learned about <a href="https://www.inklestudios.com/ink/" rel="ugc"><a href="https://www.inklestudios.com/ink/">https://www.inklestudios.com/ink/</a></a> a scripting language used in story-heavy adventurelite games such as Heaven's Vault. It reminds me of a mention of <a href="http://www.squirrel-lang.org/" rel="ugc"><a href="http://www.squirrel-lang.org/">http://www.squirrel-lang.org/</a></a> by Ron Gilbert while developing Thimbleweed Park: <a href="https://blog.thimbleweedpark.com/scripting_test.html" rel="ugc"><a href="https://blog.thimbleweedpark.com/scripting_test.html">https://blog.thimbleweedpark.com/scripting_test.html</a></a></p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 6 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>I spent some time with Yarn/Jest/ES2019, it felt good to be programming again. I am developing a ...</title>
<link>https://brainbaking.com/notes/2021/03/05h08m51s41/</link>
<comments>https://brainbaking.com/notes/2021/03/05h08m51s41/#commento</comments>
<pubDate>Fri, 05 Mar 2021 08:51:41 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/05h08m51s41/</guid>
<description>
<![CDATA[
<p>I spent some time with Yarn/Jest/ES2019, it felt good to be programming again. I am developing a serious JavaScript FOMO since switching from the software engineering industry to academia, and I'm not quite sure if I like that&hellip;</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 5 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>@rubenerd out of curiosity: are both synced in any way? If not, are you sure the migraine isnt fr...</title>
<link>https://brainbaking.com/notes/2021/03/04h14m52s55/</link>
<comments>https://brainbaking.com/notes/2021/03/04h14m52s55/#commento</comments>
<pubDate>Thu, 04 Mar 2021 14:52:55 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/04h14m52s55/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A4fIbZoZ0HNJPHV4Vs" href="https://bsd.network/@rubenerd" rel="ugc">@<span>rubenerd</span></a></span> out of curiosity: are both synced in any way? If not, are you sure the migraine isnt from checking both walls? πŸ˜‡</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 4 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>Dog-walk thought: how cool would it be if the Nintendo Switch would support publishing screenshot...</title>
<link>https://brainbaking.com/notes/2021/03/04h08m47s31/</link>
<comments>https://brainbaking.com/notes/2021/03/04h08m47s31/#commento</comments>
<pubDate>Thu, 04 Mar 2021 08:47:31 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/04h08m47s31/</guid>
<description>
<![CDATA[
<p>Dog-walk thought: how cool would it be if the Nintendo Switch would support publishing screenshots through <a href="https://indieweb.org/Micropub" rel="ugc"><a href="https://indieweb.org/Micropub">https://indieweb.org/Micropub</a></a> ? Instead, I'm left to fiddling with Birdsite to manually <a href="https://indieweb.org/PESOS" rel="ugc"><a href="https://indieweb.org/PESOS">https://indieweb.org/PESOS</a></a> these things, after which I can finally use them in <a href="http://jefklakscodex.com/" rel="ugc">jefklakscodex.com/</a> &hellip; As long as big companies only support silo infrastructures, we're left with PESOS instead of POSSE.</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 4 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>Heads up RSS feed readers of brainbaking.com! Federated half-baked thoughts (https://brainbaking....</title>
<link>https://brainbaking.com/notes/2021/03/03h16m00s44/</link>
<comments>https://brainbaking.com/notes/2021/03/03h16m00s44/#commento</comments>
<pubDate>Wed, 03 Mar 2021 16:00:44 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/03h16m00s44/</guid>
<description>
<![CDATA[
<p>Heads up RSS feed readers of <a href="http://brainbaking.com" rel="ugc">brainbaking.com</a>! Federated half-baked thoughts (<a href="https://brainbaking.com/notes/" rel="ugc"><a href="https://brainbaking.com/notes/">https://brainbaking.com/notes/</a></a>) are now integrated in /index.xml πŸ€“. Don't like that? Subscribe to /post/index.xml instead! Next up: webmentions, PESOS-ing of Goodreads reviews. I'm not sure if die-hard POSSE is worth it&hellip;</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 3 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>@StampedingLonghorn I tried to chase him away, but you know how that turned out... 😼 There&amp;#39;s ...</title>
<link>https://brainbaking.com/notes/2021/03/02h17m18s46/</link>
<comments>https://brainbaking.com/notes/2021/03/02h17m18s46/#commento</comments>
<pubDate>Tue, 02 Mar 2021 17:18:46 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/02h17m18s46/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A4nwg4LYyh4WgrJOXg" href="https://social.linux.pizza/@StampedingLonghorn" rel="ugc">@<span>StampedingLonghorn</span></a></span> I tried to chase him away, but you know how that turned out&hellip; 😼 There's even cat hair inside the cases&hellip; (to be clear: also unintentional)</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 2 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>@StampedingLonghorn @256 Don&amp;#39;t forget the cleverly hidden Roland MT-32, a majestic piece of p...</title>
<link>https://brainbaking.com/notes/2021/03/02h17m13s27/</link>
<comments>https://brainbaking.com/notes/2021/03/02h17m13s27/#commento</comments>
<pubDate>Tue, 02 Mar 2021 17:13:27 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/02h17m13s27/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A4nwg4LYyh4WgrJOXg" href="https://social.linux.pizza/@StampedingLonghorn" rel="ugc">@<span>StampedingLonghorn</span></a></span> <span class="h-card"><a class="u-url mention" data-user="A4kSMHDHqoHahjCthg" href="https://mastodon.social/@256" rel="ugc">@<span>256</span></a></span> Don't forget the cleverly hidden Roland MT-32, a majestic piece of pre-MIDI standardized era synthesizer. What else would you use to run Sierra Online games, and monkey1? I really need one for my 486&hellip; <a href="https://brainbaking.com/post/2021/02/my-retro-desktop-setup/" rel="ugc"><a href="https://brainbaking.com/post/2021/02/my-retro-desktop-setup/">https://brainbaking.com/post/2021/02/my-retro-desktop-setup/</a></a></p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 2 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>@aussocialadmin Great! I didn&amp;#39;t even know https://joinmobilizon.org/ existed, thanks for shar...</title>
<link>https://brainbaking.com/notes/2021/03/02h13m18s54/</link>
<comments>https://brainbaking.com/notes/2021/03/02h13m18s54/#commento</comments>
<pubDate>Tue, 02 Mar 2021 13:18:54 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/02h13m18s54/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A4nTeVFn4QjKtHVqpU" href="https://aus.social/@aussocialadmin" rel="ugc">@<span>aussocialadmin</span></a></span> Great! I didn't even know <a href="https://joinmobilizon.org/" rel="ugc"><a href="https://joinmobilizon.org/">https://joinmobilizon.org/</a></a> existed, thanks for sharing! So many superb alternatives. If only the userbase would follow&hellip;</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 2 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>I pulled the Google plug and installed LineageOS: https://brainbaking.com/post/2021/03/getting-ri...</title>
<link>https://brainbaking.com/notes/2021/03/01h20m03s35/</link>
<comments>https://brainbaking.com/notes/2021/03/01h20m03s35/#commento</comments>
<pubDate>Mon, 01 Mar 2021 20:03:35 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/03/01h20m03s35/</guid>
<description>
<![CDATA[
<p>I pulled the Google plug and installed LineageOS: <a href="https://brainbaking.com/post/2021/03/getting-rid-of-tracking-using-lineageos/" rel="ugc"><a href="https://brainbaking.com/post/2021/03/getting-rid-of-tracking-using-lineageos/">https://brainbaking.com/post/2021/03/getting-rid-of-tracking-using-lineageos/</a></a> Very impressed so far! Also rely on my own CalDAV server to replace GCalendar. Any others here running <a class="hashtag" data-tag="lineageos" href="https://chat.brainbaking.com/tag/lineageos" rel="tag ugc">#lineageos</a> for privacy reasons?</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 1 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>Getting rid of trackers using LineageOS</title>
<link>https://brainbaking.com/post/2021/03/getting-rid-of-tracking-using-lineageos/</link>
<comments>https://brainbaking.com/post/2021/03/getting-rid-of-tracking-using-lineageos/#commento</comments>
<pubDate>Mon, 01 Mar 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/03/getting-rid-of-tracking-using-lineageos/</guid>
<category domain="https://brainbaking.com/tags/privacy">privacy</category>
<description>
<![CDATA[
<p>Since dipping my toes into the subject of <a href="/tags/privacy">privacy</a>, I kept on exploring more opportunities to take back my own data. This started out quite innocent with a few <a href="/post/2020/06/tracking-and-privacy-on-websites/">changes to this site</a>, that evolved into taking great care <a href="/post/2021/01/digitizing-journals-using-devonthink/">not to spill my data</a> to &ldquo;the cloud&rdquo;. Thank you, <a href="https://laurakalbag.com">Laura</a> and <a href="https://ineed.coffee">Daniel</a>. It seems that a pattern emerges here. Consistently pulling the plug - I love it.</p>
<p>Since January this year, I migrated form GMail to <a href="https://protonmail.com">ProtonMail</a> and took that opportunity to finally settle with a short address on my own domain. The trouble is, simply installing the ProtonMail app on Android does next to nothing if your contacts and address book is are managed by Google. After importing the contacts into Proton, it is still a hassle to create a new one without opening the secure app. So, it was time to go cold turkey on this one. <em>Project Exit Google</em>. To do that, I needed more than a secure e-mail provider. I needed a whole new OS<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. <em>Enter <a href="https://lineageos.org/">LineageOS</a></em>.</p>
<blockquote>
<p>LineageOS is a privacy-focused open source Android OS.</p>
</blockquote>
<h2 id="1-the-installation">1. The Installation</h2>
<p>I&rsquo;ll be honest with you: it was a pain, and it took several days to get it just right. I have an older Sony XZ1 Compact smartphone, one that according to Google can only run up to Android 9. Well, wrong! With LineageOS, you not only get rid of all Google-focused services and unwanted tracking, you also get the latest Android features as a bonus.</p>
<p>That is, if you manage to get it installed. The <a href="https://download.lineageos.org/">downloads builds</a> already gave me trouble: no build for the XZ1. Thankfully, <a href="https://www.getdroidtips.com/lineage-os-17-sony-xperia-xz1-compact/">getdroidtips.com</a> has published a bunch of phone-specific tutorials - only these proved to be very confusing: which tool do I need first? Flash the what now? Reboot how many times? Put that where?</p>
<p>The concept is as follows:</p>
<ol>
<li>Unlock your phone using the <a href="https://developer.android.com/studio/command-line/adb">Android Debug Bridge</a>.</li>
<li>Flash a recovery image of <a href="https://twrp.me/">TWRP</a>.</li>
<li>Use TWRP in recovery mode to prepare the installation by formatting/cleaning/&hellip;</li>
<li>Flash a bootable LineageOS image using TWRP.</li>
<li>Reboot and pray.</li>
<li>If you must: flash an <a href="https://opengapps.org/">Open GApps</a> image - of course I didn&rsquo;t.</li>
</ol>
<p>Unfortunately, I first got stuck in a boot loop due to incompatible TWRP/Lineage versions. The combination <code>lineage-17.1-20201217-UNOFFICIAL-v1.7-lilac</code> and <code>twrp-3.5.0-0-20210117-lilac.img</code> solved that. Next, I had issues with hard disk encryption that went away after repeatedly trying to wipe various things in TWRP. Do not forget to make a backup of your stuff&hellip;</p>
<h2 id="2-it-boots-now-what">2. It boots. Now what?</h2>
<p>Great! Did you configure encryption settings?</p>
<p><figure>
<a href="../lineage-splash.jpg" class="lbox">
<img loading="lazy" src="../lineage-splash.jpg" title="My Lineage Home Screen.">
</a>
<figcaption>My Lineage Home Screen.</figcaption>
</figure>
</p>
<p>Now all we need to do is to find decent replacements for Google&rsquo;s convenient services and apps. Don&rsquo;t get me wrong, I love Google products. I just don&rsquo;t like the free tracking that comes with it. I&rsquo;ve read bloggers complaining about &ldquo;going back to the Dark Ages&rdquo; because of the loss of Google fluff. Fortunately, using LineageOS feels far from being stuck with secondary-choice material.</p>
<p>Lineage is basically a cleaned-up vanilla Android. As you can see from the screenshot above, you can still install any software you&rsquo;d like, although some might not work that perfectly, since the Google Play store is gone. ProtonMail&rsquo;s push notifications don&rsquo;t work, for instance - but that is a good thing, right? Instead, Lineage relies on the <a href="https://auroraoss.com/">Aurora Store</a> and of course <a href="https://f-droid.org/en/packages/">F-Droid</a>. The first is an anonymous shell on top of the Play Store, and the latter&hellip; well, is kind of the junkyard, since sadly not many developers choose to push to the F-Droid repository. Of course, installing a downloaded <code>.apk</code> file works just as well. Yes, both stores will still auto-update your apps. Yes, your favorite banking app still works (at least mine does).</p>
<h3 id="privacy-aware-communication-apps">Privacy-aware communication apps</h3>
<p>Below is a list of apps I&rsquo;ve tried and now rely on:</p>
<ul>
<li><em>Messaging</em>: <a href="https://telegram.org/">Telegram</a>, <a href="https://www.signal.org/">Signal</a>, &hellip; all work. Sadly, so does WhatsApp.</li>
<li><em>Email</em>: the ProtonMail app (although honestly not that great)</li>
<li><em>Social Media</em>: <a href="https://tusky.app/">Tusky</a> is a great Mastodon client!</li>
</ul>
<p>I also use Proton to manage my contacts. After importing from my Google Account before installing Lineage, I now can import/export using a <code>vCard</code> file (although Lineage&rsquo;s default Contact app did not understand <code>v4.0</code>: simply replace all occurrences of <code>4</code> to <code>3</code> in the file itself). The process is not automated, but hey. New contacts by default reside in the smartphone, all I need to do is now and then pressing &ldquo;import&rdquo; again. Bye bye, Google-kept sensitive data of all my friends and family<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<h3 id="privacy-aware-google-maps-alternatives">Privacy-aware Google Maps alternatives</h3>
<ul>
<li><em>City navigation</em>: <a href="https://wego.here.com/">HERE WeGo</a> worked great and has an acceptable privacy policy.</li>
<li><em>Hiking</em>: <a href="https://osmand.net/">OsmAnd</a> uses Open Streetmap data and has the ability to seamlessly download map data. It&rsquo;s not great for in-car use, though.</li>
</ul>
<p>I thought finding a decent alternative was going to be difficult, but I was pleasantly surprised by these two. Give them both a go, even if you&rsquo;re on the vanilla Android OS! If all else fails, you can still surf to maps.google.com.</p>
<h3 id="a-privacy-aware-google-calendar-alternative">A privacy-aware Google Calendar alternative</h3>
<p>Here&rsquo;s where things get a bit more complicated. I heavily relied on Google Calendar&rsquo;s ease of use and sync capabilities to inform my wife of things I&rsquo;ve planned (or the other way around), and she&rsquo;s on iOS. Furthermore, I wanted my MacBook to also use the same calendar: what&rsquo;s the purpose of a digital calendar if it does not synchronize?</p>
<p>After a few hours of fiddling, I had a <a href="https://radicale.org/3.0.html">Radicale CalDAV server</a> up and running on my own domain, that even works with SSL and the usual encryption stuff. Granted, data is not (yet) stored encrypted at rest, but at least it&rsquo;s on my own VPS! On Lineage, install <a href="https://www.davx5.com/">DAVx5</a> - it integrates nicely with the default calendar app. I also rely on <a href="https://icsx5.bitfire.at/">ICSx5</a> to sync my academic calendar using a <code>.ics</code> link. Both work perfectly.</p>
<h3 id="privacy-aware-cloud-syncing">Privacy-aware cloud syncing</h3>
<p>If you must use data syncing using a third party cloud such as iCloud/Google Drive/Dropbox, you still can. Simply use <a href="https://cryptomator.org/">Cryptomator</a> and encrypt everything client-side before sending it to the server. There are mobile clients available, and although it is a bit on the heavy side, it works.</p>
<p>For me though, I decided against using it. My photos are <em>not</em> synced, and I like that now. When I want to transfer something to another machine, I simply share locally through Bluetooth or using the nice <a href="https://openmtp.ganeshrvel.com/">OpenMTP</a> Android File Transfer app for MacOS.</p>
<h3 id="others">Others</h3>
<p><figure>
<a href="../lineage-bandcamp.jpg" class="lbox">
<img loading="lazy" src="../lineage-bandcamp.jpg" title="Looks a lot like stock Android!">
</a>
<figcaption>Looks a lot like stock Android!</figcaption>
</figure>
</p>
<p>A few other apps I regularly use that worked flawlessly on LineageOS:</p>
<ul>
<li>Firefox Mobile with the <a href="https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/">uBlock Origin</a> plugin</li>
<li>Goodreads</li>
<li><a href="https://freeotp.github.io/">FreeOTP</a><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></li>
<li>Bandcamp (<a href="/2021/02/you-shouldnt-use-spotify/">You Shouldn&rsquo;t Use Spotify</a>)</li>
<li>Spotify (Don&rsquo;t believe everything I write)</li>
<li><a href="https://anysoftkeyboard.github.io/">AnySoftKeyboard</a></li>
</ul>
<p>After stress testing LineageOS for two weeks, I can safely say I&rsquo;m impressed. Even the battery life somewhat improved. Granted, I am not a heavy smartphone user. I hate carrying the thing around and sometimes &ldquo;forget&rdquo; it, much to my wife&rsquo;s frustration. But still - I thought getting rid of Google Calendar and others would involve more headaches. I have deleted most e-mails, all my photos, calendar items, and contacts from my Google account, and have not regretted it once. However, <em>do not delete your entire Google account</em>. It now serves as a good spam e-mail address! Give those pesky car salesman your GMail address and they&rsquo;ll think they&rsquo;ve got you. Ha!</p>
<p>If you also experimented with the OS, let me know what you think of Lineage. Which programs did not work that well? Did you experience any trouble with the Google withdrawal plan? <a href="https://chat.brainbaking.com/@wouter">Toot me</a>!</p>
<section class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1" role="doc-endnote">
<p>Others have solved this issue by trading Android <a href="https://kevq.uk/why-im-ditching-android">for iOS</a>. I think that&rsquo;s a bit ridiculous. Sure, Apple is less keen on making money through advertising than Google, but don&rsquo;t tell me iCloud services won&rsquo;t track you. Still, idle Android phones <a href="https://www.bleepingcomputer.com/news/google/idle-android-phones-send-data-to-google-ten-times-more-often-than-ios-devices-to-apple/">send data to Google ten times more often</a> than iOS devices to Apple. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>Note that using WhatsApp also means that <em>all</em> your contacts are sent to their servers. Try this: open up the WhatsApp settings <code>-&gt;</code> Account <code>-&gt;</code> Request account info. This is <a href="https://signal.org/legal/">not the case with Signal</a>! <a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>Backup your settings before reinstalling your phone! I locked myself out of my Paypal account because of that&hellip; <a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</section>
<p>
By <a href="/about">Wouter Groeneveld</a> on 1 March 2021.
</p>
]]>
</description>
</item>
<item>
<title>@darth_mall Interesting, did you use Bridgy to convert Mastodon posts into webmentions? Many site...</title>
<link>https://brainbaking.com/notes/2021/02/28h11m47s37/</link>
<comments>https://brainbaking.com/notes/2021/02/28h11m47s37/#commento</comments>
<pubDate>Sun, 28 Feb 2021 11:47:37 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/02/28h11m47s37/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A4jKa9Q2dIr3nGJlJY" href="https://vis.social/@darth_mall" rel="ugc">@<span>darth_mall</span></a></span> Interesting, did you use Bridgy to convert Mastodon posts into webmentions? Many sites seem to use it, but it of course only scans your own Twitter/Masto feed. IMO, this renders it a bit useless unless you're very popular (😰). Anyone you don't know could talk about a post on your site, but it won't be received since these systems do not push webmentions themselves. Furthermore, I do not see anyone manually posting a link at the end of a post - that kind of defeats the purpose. <br>That said, is it working for you?</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 28 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>Okay, so sending involves Webmention.app and IFTTT to poll my RSS feed (According to https://www....</title>
<link>https://brainbaking.com/notes/2021/02/27h18m00s19/</link>
<comments>https://brainbaking.com/notes/2021/02/27h18m00s19/#commento</comments>
<pubDate>Sat, 27 Feb 2021 18:00:19 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/02/27h18m00s19/</guid>
<description>
<![CDATA[
<p>Okay, so sending involves <a href="http://Webmention.app" rel="ugc">Webmention.app</a> and IFTTT to poll my RSS feed (According to <a href="https://www.jayeless.net/2021/02/integrating-webmentions-into-hugo.html" rel="ugc"><a href="https://www.jayeless.net/2021/02/integrating-webmentions-into-hugo.html">https://www.jayeless.net/2021/02/integrating-webmentions-into-hugo.html</a></a>). Holy shit. Is it even worth it&hellip;</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 27 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>Trying to wrap my mind around WebMentions and how I could implement them without resorting to a t...</title>
<link>https://brainbaking.com/notes/2021/02/27h17m51s39/</link>
<comments>https://brainbaking.com/notes/2021/02/27h17m51s39/#commento</comments>
<pubDate>Sat, 27 Feb 2021 17:51:39 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/02/27h17m51s39/</guid>
<description>
<![CDATA[
<p>Trying to wrap my mind around WebMentions and how I could implement them without resorting to a third-party provider&hellip; <a href="https://sebastiandedeyne.com/adding-webmentions-to-my-blog/" rel="ugc"><a href="https://sebastiandedeyne.com/adding-webmentions-to-my-blog/">https://sebastiandedeyne.com/adding-webmentions-to-my-blog/</a></a> I wonder if a link such as this one would receive a webmention/pingback if I just write about it using Hugo.</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 27 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>Has anyone else noticed posted links on Twitter get re-encoded into t.co URLs in order to gather ...</title>
<link>https://brainbaking.com/notes/2021/02/27h14m25s16/</link>
<comments>https://brainbaking.com/notes/2021/02/27h14m25s16/#commento</comments>
<pubDate>Sat, 27 Feb 2021 14:25:16 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/02/27h14m25s16/</guid>
<description>
<![CDATA[
<p>Has anyone else noticed posted links on Twitter get re-encoded into <a href="http://t.co" rel="ugc">t.co</a> URLs in order to gather even more 'insight' data? That said, I'm having trouble finding anyone on the Fediverse&hellip; Any hints?</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 27 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>@laura It did more than helping! I&amp;#39;m slowly but surely taking back my data. Started with Ever...</title>
<link>https://brainbaking.com/notes/2021/02/26h19m55s59/</link>
<comments>https://brainbaking.com/notes/2021/02/26h19m55s59/#commento</comments>
<pubDate>Fri, 26 Feb 2021 19:55:59 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/02/26h19m55s59/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A4fIvtjUepzOyQooXg" href="https://mastodon.laurakalbag.com/@laura" rel="ugc">@<span>laura</span></a></span> It did more than helping! I'm slowly but surely taking back my data. Started with Evernote -&gt; DEVONThink, got to Gmail -&gt; ProtonMail, and now to Android -&gt; LineageOS. All your fault πŸ˜‚</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 26 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>Just saying hi @kogakure πŸ‘‹ getting my feet wet with decentralized β€œtooting” (although I opted for...</title>
<link>https://brainbaking.com/notes/2021/02/26h13m48s06/</link>
<comments>https://brainbaking.com/notes/2021/02/26h13m48s06/#commento</comments>
<pubDate>Fri, 26 Feb 2021 13:48:06 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/02/26h13m48s06/</guid>
<description>
<![CDATA[
<p>Just saying hi <span class="h-card"><a class="u-url mention" data-user="A4fMTkA13Luczi3SCW" href="https://mastodon.social/@kogakure" rel="ugc">@<span>kogakure</span></a></span> πŸ‘‹ getting my feet wet with decentralized β€œtooting” (although I opted for Pleroma, less drama to install in my own VPS it seemed)</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 26 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>Hi @laura thanks to your https://laurakalbag.com/what-is-mastodon-and-why-should-i-use-it/ I dipp...</title>
<link>https://brainbaking.com/notes/2021/02/26h13m08s52/</link>
<comments>https://brainbaking.com/notes/2021/02/26h13m08s52/#commento</comments>
<pubDate>Fri, 26 Feb 2021 13:08:52 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/02/26h13m08s52/</guid>
<description>
<![CDATA[
<p>Hi <span class="h-card"><a class="u-url mention" data-user="A4fIvtjUepzOyQooXg" href="https://mastodon.laurakalbag.com/@laura" rel="ugc">@<span>laura</span></a></span> thanks to your <a href="https://laurakalbag.com/what-is-mastodon-and-why-should-i-use-it">https://laurakalbag.com/what-is-mastodon-and-why-should-i-use-it</a>/ I dipped my toes into decentralized social networks πŸ˜… FYI The β€œWhat’s wrong with Twitter” link on there is broken. Loving what you do so far, you made me reconsider accessibility and privacy features on my own site!</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 26 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>@rubenerd just installed my own Pleroma server to say hi! Big fan of your micro-blog for ages here.</title>
<link>https://brainbaking.com/notes/2021/02/26h13m04s14/</link>
<comments>https://brainbaking.com/notes/2021/02/26h13m04s14/#commento</comments>
<pubDate>Fri, 26 Feb 2021 13:04:14 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/notes/2021/02/26h13m04s14/</guid>
<description>
<![CDATA[
<p><span class="h-card"><a class="u-url mention" data-user="A4fIbZoZ0HNJPHV4Vs" href="https://bsd.network/@rubenerd" rel="ugc">@<span>rubenerd</span></a></span> just installed my own Pleroma server to say hi! Big fan of your micro-blog for ages here.</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 26 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>The insanity of collecting retro games</title>
<link>https://brainbaking.com/post/2021/02/the-insanity-of-retro-game-collecting/</link>
<comments>https://brainbaking.com/post/2021/02/the-insanity-of-retro-game-collecting/#commento</comments>
<pubDate>Sun, 21 Feb 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/02/the-insanity-of-retro-game-collecting/</guid>
<category domain="https://brainbaking.com/tags/retro">retro</category>
<category domain="https://brainbaking.com/tags/games">games</category>
<description>
<![CDATA[
<p>When I posted my <a href="/post/2021/02/my-retro-desktop-setup/">retro 2021 desktop setup</a> at the beginning of this month, I unintentionally left out a photo of my SNES/Game Boy/whatever physical cartridge collection. You can marvel at my very limited (past) <a href="https://jefklakscodex.com/articles/features/gaming-setup-2007-flashback/">2007 gaming setup</a> and collection over at Jefklak&rsquo;s Codex - I&rsquo;ll go ahead and steal a few photos there to sprinkle them over this article.</p>
<p>As you might have read in the <a href="/2021/02/you-shouldnt-use-spotify/">You Shouldn&rsquo;t Use Spotify</a> article, I recently started thinking things through when spending my hard earned money. It was only a matter of time before arriving at the topic of retro gaming&hellip; And as with all things in this capitalistic world, things that become uncommon also have the tendency to become very, <em>very</em> expensive. Sadly, but perhaps not unexpectedly so, the same is true for retro game collecting. For instance, take a look at the second hand price history of what used to be a fairly common Nintendo DS game; <em>Castlevania Dawn of Sorrow</em>:</p>
<p><figure>
<a href="../valuegamenow.jpg" class="lbox">
<img loading="lazy" src="../valuegamenow.jpg" title="Castlevania Dawn of Sorrow price evolution at Game Value Now">
</a>
<figcaption>Castlevania Dawn of Sorrow price evolution at Game Value Now</figcaption>
</figure>
</p>
<p>The game was released in 2005. Ten years later, one paid on average <code>$20</code> for it - about half of the new price. Since then, prices have gone up. And up. And up. The last sudden big spark is the COVID-effect on game collecting: almost any well-received retro game suddenly costs about a third more than it used to be. Thank you, boredom. The effect isn&rsquo;t that dramatic for Dawn of Sorrow since DS games are &ldquo;relatively new&rdquo;. However, if you take a look at its older brother, <a href="https://gamevaluenow.com/gameboy-advance/Castlevania-Aria-of-Sorrow?gameid=167">Aria of Sorrow</a> for the Game Boy Advance, a complete box sets you back for almost <code>$160</code> - that is four times as much as the original price! Baffling.</p>
<p>As mentioned in <a href="https://www.nintendolife.com/news/2021/02/soapbox_retro_nintendo_games_cost_too_much_but_nostalgia_is_expensive">Nintendo Life&rsquo;s article</a> &ldquo;<em>Retro Nintendo Games Cost Too Much, But Nostalgia Is Expensive</em>, even GameCube games, that until recently were fairly affordable, have suddenly become (too) expensive. Why would you pay more than the original price for Smash Brothers Melee when the latest installment is available on the Nintendo Switch, and the gameplay is the same? Nostalgia indeed does seem to come at a steep price.</p>
<blockquote>
<p>Why would you want to pay more than the original price for Smash Brothers Melee on GameCube?</p>
</blockquote>
<p>Before the global pandemic, a few critics conspired that famous retro gamer <em>Metal Jesus Rocks</em> and his incredibly popular YouTube channel also negatively <a href="https://www.reddit.com/r/gamecollecting/comments/8jmiwi/how_metal_jesus_rocks_affects_retro_video_game/">affects retro game prices</a> with his reviews - and thus ultimately increasing demand. Metal Jesus is also a big fan of the <a href="https://hyperkin.com/retro/retron-5.html">Hyperkin Retron 5</a> all-in-one retro console. Yes, the one that used GNU GPL-licensed open source software without asking. I&rsquo;ve also read about his awesome collection in the UK magazine <em>Retro Gamer</em>. No doubt that must have inspired others - I know it inspired me. Well, until I saw the prices of many games&hellip;</p>
<p><figure>
<a href="../nostalgia_handhelds.jpg" class="lbox">
<img loading="lazy" src="../nostalgia_handhelds.jpg" title="A part of my 2007 handheld collection. I was stupid enough to sell that limited edition Game Boy Micro. It is now goes for over $200...">
</a>
<figcaption>A part of my 2007 handheld collection. I was stupid enough to sell that limited edition Game Boy Micro. It is now goes for over $200...</figcaption>
</figure>
</p>
<h2 id="where-does-that-money-go-to">Where does that money go to?</h2>
<p>Imagine you&rsquo;re buying a recently released game. I presume you want to support the game developers as much as possible. In that case, just like I wrote about <a href="/2021/02/you-shouldnt-use-spotify/">not using Spotify</a>, don&rsquo;t just stream it: buy it - preferably from the devs themselves. Great, you now helped finance a possible sequel!</p>
<p>But what about retro games? I just paid <code>$100</code> to a shady seller at eBay or a local flea market - does that mean a successor to Dawn of Sorrow is guaranteed? No. Konami fucked up the Castlevania series a long time ago, and the creator of the <em>Igavania</em> sub-genre, Koji Igarashi, left in 2014 to start his own studio <a href="https://artplayinc.com/">ArtPlay</a>. Even if the original devs did not leave at some point, money spent on second hand products simply do not end up in the hands of the creator. That does not mean that publishers and developers do not keep an eye out for games that are still in high demand.</p>
<p>The retro game collection hype created a lot of sleezy sharks that love to rip you off: from the common practice of counterfeiting catrdiges - which by now are difficult to discern with the naked eye - to asking absurd amounts of money for &ldquo;mint&rdquo; (boxed) versions of a game. This second hand market seems to bring out the worst in people. I&rsquo;ve witnessed and I&rsquo;ve been a victim of a lot of shady looking deals because of that.</p>
<p><figure>
<a href="/img/fake-gba.jpg" class="lbox">
<img loading="lazy" src="/img/fake-gba.jpg" title="Can you detect which GBA cart is fake?">
</a>
<figcaption>Can you detect which GBA cart is fake?</figcaption>
</figure>
</p>
<p>That brings me to the question: is it really worth it? Do I really want to spend a hundred bucks on a game, of which the dev company is defunct, knowing that my money will ultimately end up supporting this malpractice? There is a lot of proper research on the financial and psychological impact of a second-hand market system, and a lot of improper &ldquo;biz&rdquo; (<a href="https://www.gamesindustry.biz/articles/2012-03-19-used-games-business-is-killing-single-player-experience-says-frontier-developments">used games killed single player gaming</a>, <a href="https://www.gamesindustry.biz/articles/2012-04-12-the-real-cost-of-used-games">used games eliminates independent studios</a>, &hellip;), too much for me to skim through, so feel free to point out where my thinking derailed.</p>
<h2 id="okay-so-lets-pirate-instead">Okay, so let&rsquo;s pirate instead!</h2>
<p>No harm done, right? The game is twenty years old, the companies behind it are long gone, so who cares? I wrote about <a href="/post/2018/12/over-analoog-en-digitaal/">this topic</a> before. We&rsquo;re entering a gray area here, although a lot of people would love to shout <em>&ldquo;No way, it&rsquo;s black or white!&quot;</em> instead.</p>
<p>Although downloading emulators is of course legal, sharing copyrighted ROMs online clearly is not. There is no legal precedent for ripping and downloading ROMs for games you own, though an argument could be made for fair use, as lawyer Derek E. Bambauer <a href="https://www.howtogeek.com/262758/is-downloading-retro-video-game-roms-ever-legal/">points out</a>. Legal matters aside, my main interest is if it harms anyone if you decide to do so for older games. I think it&rsquo;s safe to say yes: many companies still own copyrights to older games - and many companies like Nintendo sill thrive on selling retro games.</p>
<blockquote>
<p>There is no legal precedent for ripping and downloading ROMs for games you own, though an argument could be made for fair use.</p>
</blockquote>
<p>Disney has a special strategy devoted to bringing classic animated videos back to life: they purposely put projects into a vault for many years, only to come back to it later on to reboot/remaster/whatever the original version. I&rsquo;d be less inclined to buy the remaster if I pirated the original a few weeks ago. <a href="https://jefklakscodex.com/articles/features/super-mario-64-aged-badly/">Super Mario 3D All Stars</a> is a compilation of three retro 3D Mario games that was released by Nintendo a few months ago. They even added an unfair amount of pressure to consumers by limiting the amount of physical releases. These games were hardly remastered at all, yet sold like hot cakes. I&rsquo;d be lying if I said I didn&rsquo;t buy it, although I owned all games at some point before.</p>
<p><figure>
<a href="../nostalgia_gamecubecrt.jpg" class="lbox">
<img loading="lazy" src="../nostalgia_gamecubecrt.jpg" title="A part of my 2007 GameCube collection. Even a mediocre game like Wario World, which saw a Player&#39;s Choice re-release, goes for $56 nowadays!">
</a>
<figcaption>A part of my 2007 GameCube collection. Even a mediocre game like Wario World, which saw a Player&#39;s Choice re-release, goes for $56 nowadays!</figcaption>
</figure>
</p>
<h2 id="okay-so-lets-buy-them-digitally">Okay, so let&rsquo;s buy them digitally!</h2>
<p>This remark misses the point. First, retro game collecting is mainly a physical act. For this reason, most serious game collectors wouldn&rsquo;t even consider downloading ROMs - legal or otherwise For this very same reason, I completely detest the trend towards digital gaming. Second, many games are simply not for sale anymore. Of course, many big publishers smell money when they look at their old game collection, and love to periodically re-release old stuff for us suckers to double-dip - no questions asked. But many of the best games have had their prime time, and are unlikely to see the light again, due to legal issues, defunct companies, missing source code, &hellip; As you might have guessed, these games are especially expensive in the second hand market.</p>
<p>Sites such as <a href="https://gog.com">Good Old Games</a> use your nostalgic preference for old junk to cash in. As mentioned before, I love Wizardry 8, and I own the original CDs. The game is also available on GOG. However, Sir-Tech does not exist anymore. I have no idea how this works in detail, but somehow <a href="https://www.nightdivestudios.com/">Nightdive Studios</a> grabs hold of the rights for the title and re-released it on GOG in 2013. That means buying it through the GOG digital platform possibly helps re-vitalizing other classic PC games, since it is Nightdive Studios' primary occupation. However, that does not mean that any of the hard working people of the original game are supported in any way.</p>
<hr>
<p>Buying Wiz8 at GOG does do <em>something</em> useful with your hard earned money. I doubt that buying a Castlevania Aria of Sorrow copy through eBay does the same - except perhaps the ability to put it in a glass cabinet to show off to your fellow retro nerds.</p>
<p>And yet, I really, <em>really</em> want to play Game Boy games on my original Game Boy. Seductive looking pieces of hardware like the <a href="https://www.analogue.co/pocket">Analogue Pocket</a> only makes things worse. Why isn&rsquo;t there a GOG-equivalent for obtaining legal copies of ROMs? I was so thrilled with the Wii&rsquo;s Virtual Console system, and so disappointed at the same time, as Nintendo&rsquo;s Spartan selection left people wanting for more. Furthermore, hacking your Wii to download that legally bought copy (in order to transfer it to a flashcard on your GB) was not only hard - it was also juridically questionable.</p>
<p>That said, I missed a big sale day at my <a href="https://retrogamestore.be/">local retro game store</a>. I was looking forward to mindlessly adding more junk to the shelves&hellip; Don&rsquo;t forget to bring your screwdriver to check the genuineness of the chip!</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 21 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>How to write academic papers in Markdown</title>
<link>https://brainbaking.com/post/2021/02/writing-academic-papers-in-markdown/</link>
<comments>https://brainbaking.com/post/2021/02/writing-academic-papers-in-markdown/#commento</comments>
<pubDate>Sun, 14 Feb 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/02/writing-academic-papers-in-markdown/</guid>
<category domain="https://brainbaking.com/tags/publishing">publishing</category>
<category domain="https://brainbaking.com/tags/pandoc">pandoc</category>
<category domain="https://brainbaking.com/tags/Markdown">Markdown</category>
<category domain="https://brainbaking.com/tags/latex">latex</category>
<description>
<![CDATA[
<p>In 2020, I explained <a href="/post/2020/05/using-pandoc/">how to use pandoc</a> to publish a book. Essentially, I use the same workflow to write papers in academia. A couple of colleagues asked me how this was done, although they suspected it had something to do with <a href="https://pandoc.org/">Pandoc</a>. When I&rsquo;m not writing in collaboration with someone, and thus using <a href="https://overleaf.com/">Overleaf</a>, I like to keep things simple, by resorting to my favorite way of writing things: Markdown.</p>
<p>However geeky and cool LaTeX might be, it violates a lot of <em>Clean Code</em> rules by ignoring separation of concerns. Even <code>html</code> has most of the layout separated - albeit not in a particularly good way - using <code>css</code>. Having to write <code>\textbf{wowza}</code> just to get something in bold gets tiresome fast, and creating your own rules, tags, or scripts ultimately do not resolve the issue, they just work around it. I&rsquo;m not advocating for writing your dissertation in Word. It&rsquo;s simply very confusing to look at a document and try to read sections and streams of thought without the LaTeX syntax getting in the way.</p>
<p>Enter Markdown: instead of</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-tex" data-lang="tex">Hello <span style="color:#728e00">\textbf</span><span style="color:#728e00">{</span>bold<span style="color:#728e00">}</span> stuff! Oh wait, here&#39;s ``an image&#34; - weird quotations
<span style="color:#728e00">\begin</span><span style="color:#728e00">{</span>figure<span style="color:#728e00">}</span>[h!]
<span style="color:#728e00">\centering</span>
<span style="color:#728e00">\includegraphics</span><span style="color:#728e00">{</span>something.png<span style="color:#728e00">}</span>
<span style="color:#728e00">\caption</span><span style="color:#728e00">{</span>My caption. <span style="color:#728e00">\label</span><span style="color:#728e00">{</span>fig:delphi<span style="color:#728e00">}}</span>
<span style="color:#728e00">\end</span><span style="color:#728e00">{</span>figure<span style="color:#728e00">}</span>
Yeah. That sucks.
</code></pre></div><p>You write:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-md" data-lang="md">Hello **bold** stuff! Oh wait, here&#39;s &#34;an image&#34; - regular quotes, whew.
![<span style="color:#434f54">&#34;My caption.&#34;</span>](<span style="color:#434f54">something.png</span>)
Yeah. Much better.
</code></pre></div><p>Sure, there&rsquo;s still &ldquo;syntax&rdquo; to be learned the uninitiated. Still, it&rsquo;s a heck of a lot less, and it makes reading source files (<code>.md</code> instead of <code>.tex</code>) much, <em>much</em> easier. Take a look at an Overleaf window of our latest paper draft:</p>
<p><figure>
<a href="../overleaf.jpg" class="lbox">
<img loading="lazy" src="../overleaf.jpg" >
</a>
</figure>
</p>
<p>The left part - where you do the work - is simply hideous, and usually riddled with layout-specific syntax. Don&rsquo;t get me wrong, I love the collaborative plus-side of Overleaf, but it&rsquo;s still raw LaTeX. As a Java developer, I do not write <code>.class</code> files either: I write the <code>.java</code> ones and compile the latter.</p>
<h3 id="the-toolchain">The toolchain</h3>
<p>As mentioned in the <a href="/post/2020/05/using-pandoc/">pandoc article</a>, this is the setup:</p>
<script defer src="/mermaid/mermaid.min.js">
mermaid.initialize({
startOnLoad: true,
flowchart: {
useMaxWidth: true
}
});
</script>
<div class="mermaid" align="center" >
graph LR;
md[Plaintext, md =]
tex[LaTeX, tex =]
pdf[Postscript, pdf =]
md --> tex
tex --> pdf
</div>
<p>Simple enough, and the <a href="https://pandoc.org/MANUAL.html">Pandoc User Guide</a> helps you in understanding the specifics when converting from Markdown to Tex. The most challenging part of writing academic papers in Markdown is not the conversion process but the annoying details you have to get right when adhering to a layout/template of a conference or journal. I write most things in Sublime, and put simple commands in a <code>Makefile</code> in order for <code>⌘+B</code> (Build) to work. The build file itself is straightforward enough:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-make" data-lang="make"><span style="color:#d35400">all</span><span style="color:#728e00">:</span>
pandoc -f markdown+smart delphi_report.pd.md --include-in-header<span style="color:#728e00">=</span>delphi_report_preamble.tex --template<span style="color:#728e00">=</span><span style="color:#728e00">$(</span>templatedir<span style="color:#728e00">)</span>/acm-pandoc-conf.tex --filter panflute --natbib --variable --biblio-style<span style="color:#728e00">=</span><span style="color:#728e00">$(</span>csldir<span style="color:#728e00">)</span>/ACM-Reference-Format --bibliography<span style="color:#728e00">=</span>delphi.bib -t latex &gt; delphi.tex
xelatex delphi.tex
bibtex delphi
</code></pre></div><h3 id="templates">Templates</h3>
<p>You&rsquo;ll need both a <strong>Pandoc-specific</strong> template and a <strong>LaTeX-specific</strong> template. The latter is usually up for grabs at your favorite conference/journal submission website. For instance, at ACM-sponsored conferences, your <code>.tex</code> file usually starts with:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-tex" data-lang="tex"><span style="color:#728e00">\documentclass</span><span style="color:#434f54">[sigconf]</span><span style="color:#728e00">{</span>acmart<span style="color:#728e00">}</span>
</code></pre></div><p>Meaning you&rsquo;ll need to have the file <code>acmart.cls</code> LaTeX class somewhere nearby. These files are automatically included in Overleaf after selecting the correct starting template. Right, nothing new here.</p>
<p>What is new, is the Pandoc template, called <code>acm-pandoc-conf.tex</code> in the above Makefile. This file adheres to Pandoc-specific syntax and allows you to fill in variables that are defined in the Frontmatter of Markdown files. The file will contain something like this:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-tex" data-lang="tex"><span style="color:#728e00">\documentclass</span><span style="color:#434f54">[sigconf,anonymous=$anonymous$]</span><span style="color:#728e00">{</span>acmart<span style="color:#728e00">}</span>
<span style="color:#95a5a6">% use packages, acm-specific commands, etc
</span><span style="color:#95a5a6"></span>
<span style="color:#7f8c8d">$</span><span style="color:#728e00">if</span><span style="color:#728e00">(</span><span style="color:#728e00">title</span><span style="color:#728e00">)</span><span style="color:#7f8c8d">$</span>
<span style="color:#728e00">\title</span><span style="color:#728e00">{</span><span style="color:#7f8c8d">$</span><span style="color:#728e00">title</span><span style="color:#7f8c8d">$</span><span style="color:#728e00">}</span>
<span style="color:#7f8c8d">$</span><span style="color:#728e00">endif</span><span style="color:#7f8c8d">$</span>
<span style="color:#7f8c8d">$</span><span style="color:#728e00">if</span><span style="color:#728e00">(</span><span style="color:#728e00">subtitle</span><span style="color:#728e00">)</span><span style="color:#7f8c8d">$</span>
<span style="color:#728e00">\subtitle</span><span style="color:#728e00">{</span><span style="color:#7f8c8d">$</span><span style="color:#728e00">subtitle</span><span style="color:#7f8c8d">$</span><span style="color:#728e00">}</span>
<span style="color:#7f8c8d">$</span><span style="color:#728e00">endif</span><span style="color:#7f8c8d">$</span>
<span style="color:#728e00">\maketitle</span>
<span style="color:#728e00">\bibliographystyle</span><span style="color:#728e00">{</span>ACM-Reference-Format<span style="color:#728e00">}</span>
<span style="color:#7f8c8d">$</span><span style="color:#728e00">body</span><span style="color:#7f8c8d">$</span>
<span style="color:#7f8c8d">$</span><span style="color:#728e00">if</span><span style="color:#728e00">(</span><span style="color:#728e00">bibliography</span><span style="color:#728e00">)</span><span style="color:#7f8c8d">$</span>
<span style="color:#728e00">\balance</span>
<span style="color:#728e00">\bibliography</span><span style="color:#728e00">{</span><span style="color:#7f8c8d">$</span><span style="color:#728e00">bibliography</span><span style="color:#7f8c8d">$</span><span style="color:#728e00">}</span>
<span style="color:#7f8c8d">$</span><span style="color:#728e00">endif</span><span style="color:#7f8c8d">$</span>
<span style="color:#728e00">\end</span><span style="color:#728e00">{</span>document<span style="color:#728e00">}</span>
<span style="color:#728e00">\endinput</span>
</code></pre></div><p>I published the full template as a <a href="https://gist.github.com/wgroeneveld/b6e2751c6da2a7bac73f668ddff5c3d0">GitHub gist</a>, in case anyone would like to reuse it.</p>
<p>Now, every <code>$var</code> sign will be auto-replaced with the corresponding key in your <code>.md</code> file. For example:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-md" data-lang="md">---
title: &#39;My Fancy Work&#39;
date: &#39;2019-07-16&#39;
anonymous: &#34;false&#34;
author:
<span style="color:#728e00">-</span> name: Wouter Groeneveld
institution: KU Leuven
orcid: https://orcid.org/0000-0001-5099-7177
city: Leuven
country: Belgium
email: wouter.groeneveld at university
<span style="color:#728e00">-</span> name: Other Guy
output: pdf_document
abstract: &#34;blah blah&#34;
published: true
bibliography: &#34;delphi&#34;
tags: [Publishing]
panflute-filters: [scientific-twocolumn-tables]
panflute-path: &#39;../../pandoc/filters&#39;
---
# INTRODUCTION
Knowledge of software development is becoming more and more important, as shortcomings in the software engineering workforce require companies to come up with creative solutions such as coding boot-camps, to initiate candidates into the wonderful world of programming. However, to be successful as a developer, it no longer suffices to be technically proficient [@garousi2019closing]. There is still no agreement on what separates a great developer from a good one, even if both the academic and industrial world are starting to acknowledge the need for something more besides cognitive knowledge, however good this might be [@capretz2017soft].
Software is first and foremost created by people, for people, hinting on the need for so-called &#39;_soft skills_&#39;, or, more generally, &#39;_non-cognitive abilities_&#39;, defined as the subset of abilities not related to technical skills.
</code></pre></div><p>This excerpt was taken from <a href="https://lirias.kuleuven.be/retrieve/549747/">my 2020 Delphi study</a>. Note the Section Header (<code>#</code>), easy way of citing (<code>[@key]</code>) and emphasizing terms (<code>_</code>). This gets compiled into the usual LaTex junk and you&rsquo;re off. You can make up as many variables as you&rsquo;d like, and also loop through things like multiple authors - see the full gist for more details.</p>
<h3 id="post-processing">Post-processing</h3>
<p>Did you notice the weird <code>panflute-filters</code> stuff? <a href="http://scorreia.com/software/panflute/">Panflute</a>, a Pandoc filter that makes Pandoc filters fun to write (according to the website), can be enabled with the <code>--filter panflute</code> flags after installing it as a Python 3 package. I use it to do the necessary post-processing on the generated Pandoc output - before it is made &ldquo;final&rdquo; as LaTex output. You can create custom hooks that lets you transform blocks, such as paragraphs, images, links, &hellip; This comes in handy when your conference works with a double-column template. Pandoc is not so keen on those, and you sometimes want to convert a figure into a double-column one, or the other way around: <code>\begin{figure}</code> to <code>\begin{figure*}</code> or something similar.</p>
<p>Of course, another way to do simple find and replace post-processing things is to just further transform the <code>.tex</code> output yourself using <code>sed</code> or whatever. This works, but is cumbersome, as sometimes you want to select specific blocks without resorting to artisan regular expressions that take hours to create. For something like <strong>tables</strong>, you&rsquo;d write the following Markdown:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-md" data-lang="md">blaaleft blaright
---------- -----------
something 9
something 10
Table: Demonstration of simple table syntax.
</code></pre></div><p>Pandoc by default generates something like this:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-tex" data-lang="tex"><span style="color:#728e00">\begin</span><span style="color:#728e00">{</span>longtable<span style="color:#728e00">}</span>[]<span style="color:#728e00">{</span>@<span style="color:#728e00">{}</span>lr@<span style="color:#728e00">{}}</span>
<span style="color:#728e00">\caption</span><span style="color:#728e00">{</span>Demonstration of simple table syntax.<span style="color:#728e00">}</span><span style="color:#728e00">\tabularnewline</span>
<span style="color:#728e00">\toprule</span>
blaaleft <span style="color:#728e00">&amp;</span> blaright<span style="color:#728e00">\tabularnewline</span>
<span style="color:#728e00">\midrule</span>
<span style="color:#728e00">\endfirsthead</span>
<span style="color:#728e00">\toprule</span>
blaaleft <span style="color:#728e00">&amp;</span> blaright<span style="color:#728e00">\tabularnewline</span>
<span style="color:#728e00">\midrule</span>
<span style="color:#728e00">\endhead</span>
something <span style="color:#728e00">&amp;</span> 9<span style="color:#728e00">\tabularnewline</span>
something <span style="color:#728e00">&amp;</span> 10<span style="color:#728e00">\tabularnewline</span>
<span style="color:#728e00">\bottomrule</span>
<span style="color:#728e00">\end</span><span style="color:#728e00">{</span>longtable<span style="color:#728e00">}</span>
</code></pre></div><p>With my filter, I managed to modify it to something like this:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-tex" data-lang="tex"><span style="color:#728e00">\begin</span><span style="color:#728e00">{</span>table<span style="color:#728e00">}</span>[h!]
<span style="color:#728e00">\centering</span>
<span style="color:#728e00">\caption</span><span style="color:#728e00">{</span>Demonstration of simple table syntax.<span style="color:#728e00">\label</span><span style="color:#728e00">{</span>table:Demonstration<span style="color:#728e00">_</span>of<span style="color:#728e00">_</span>sim<span style="color:#728e00">}}</span>
<span style="color:#728e00">\begin</span><span style="color:#728e00">{</span>tabular<span style="color:#728e00">}{</span>l r<span style="color:#728e00">}</span>
<span style="color:#728e00">\hline</span>
blaaleft <span style="color:#728e00">&amp;</span> blaright<span style="color:#728e00">\\</span> [0.5ex]
<span style="color:#728e00">\hline</span>
<span style="color:#728e00">\hline</span>
something <span style="color:#728e00">&amp;</span> 9<span style="color:#728e00">\tabularnewline</span>
something <span style="color:#728e00">&amp;</span> 10<span style="color:#728e00">\tabularnewline</span>
<span style="color:#728e00">\hline\end</span><span style="color:#728e00">{</span>tabular<span style="color:#728e00">}</span>
<span style="color:#728e00">\end</span><span style="color:#728e00">{</span>table<span style="color:#728e00">}</span>
</code></pre></div><p>Transforming the <code>longtable</code> into a <code>table</code> is simple enough, but this filter does more than that, as you can see. Passing in extra options as part of the <code>tabular</code> block is also possible. Inspect the full python file <a href="https://gist.github.com/wgroeneveld/9dbeb0d0b60c6cb5d8dfe9b938c5e94e">in this GitHub gist</a> (yes it&rsquo;s a bit messy). A word of warning: Panflute&rsquo;s latest version is a bit experimental and might not be compatible with the latest Pandoc release.</p>
<h3 id="other-nasty-stuff">Other nasty stuff</h3>
<p>In essence, I try to remove as much markup-specific syntax as possible by letting the templates do their thing. Now and then, this is simply not possible, especially for complicated formulas or tables. If all else fails, it is still possible to combine both languages and embed LaTeX inside your Markdown file. Use this as your last resort.</p>
<p>I also usually create a <code>preamble.tex</code> file that contains the necessary metadata for the conference, such as the ACM taxonomy, and a few extra TeX package includes. Furthermore, they&rsquo;re also handy when customizing standardized blocks, such as quotes in Markdown, prepended with <code>&gt;</code>. The package <code>etoolbox</code> allows you to customize these using something like:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-tex" data-lang="tex"><span style="color:#728e00">\AtBeginEnvironment</span><span style="color:#728e00">{</span>quote<span style="color:#728e00">}{</span><span style="color:#728e00">\begin</span><span style="color:#728e00">{</span>tcolorbox<span style="color:#728e00">}</span>[leftrule=2mm,bottomrule=0mm,toprule=0mm,rightrule=0mm,boxsep=0mm,grow to right by=-3mm, grow to left by=-3mm]<span style="color:#728e00">\small</span><span style="color:#728e00">}</span>
<span style="color:#728e00">\AtEndEnvironment</span><span style="color:#728e00">{</span>quote<span style="color:#728e00">}{</span> <span style="color:#728e00">\end</span><span style="color:#728e00">{</span>tcolorbox<span style="color:#728e00">}}</span>
</code></pre></div><p>Remember, the less clutter in your Markdown, the less strain for your eyes! I also know people who write most of their stuff in Markdown, convert it into TeX using Pandoc, and then copy over the compiled garbage into Overleaf to continue and chip away at it together with others. Of course, you can also simply check in your <code>.md</code> source files and use Git to collaborate, although without something like Overleaf, your CI server - and preferably also yourself - will have to install the required build toolchain.</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 14 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>You Shouldn&#39;t Use Spotify</title>
<link>https://brainbaking.com/post/2021/02/you-shouldnt-use-spotify/</link>
<comments>https://brainbaking.com/post/2021/02/you-shouldnt-use-spotify/#commento</comments>
<pubDate>Tue, 09 Feb 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/02/you-shouldnt-use-spotify/</guid>
<category domain="https://brainbaking.com/tags/music">music</category>
<description>
<![CDATA[
<p>Ruben Schade recently posted on his lovely micro-blog <a href="https://rubenerd.com/">Rubenerd</a> that <a href="https://rubenerd.com/going-to-shadu/">you shouldn&rsquo;t use Spotify</a>. That was new to me. I&rsquo;ve been a (paid) Spotify user since 2014, but I honestly never focused my critical thinking on why it is or is not a good service. I was intrigued by that short sentence, that was hastily mentioned without any context. So I started digging.</p>
<h2 id="part-i-streaming-or-downloading">Part I: Streaming or Downloading</h2>
<p>I&rsquo;ve never been an audiophile, and I probably never will be, but I like the idea of spending money wisely. Back in the day, in late nineties and early 2000s, I loved browsing CD stores to buy the latest Wu-Tang <em>shizzle</em> (yeah, I was that kind of guy) and maybe spot other interesting hip-hop stuff I never heard of before. But let&rsquo;s be completely honest here: who didn&rsquo;t primarily Napster/Limewire/Newsgroup/whatever music? Guilty as charged - my ridiculously small amount of pocket money was reserved for Game Boy games. Fast forward ten years, five iterations of iPods and Creative Zen <code>mp3</code> players, and we arrive at the wonderful world of <em>streaming music</em> instead of <em>downloading</em> it. Your disk will be grateful.</p>
<p>But your favorite music band won&rsquo;t be. According to <a href="https://www.theguardian.com/technology/2015/apr/03/how-much-musicians-make-spotify-itunes-youtube">The Guardian</a> and the <em>Information is Beautiful</em> infographic, a musician receives on average <code>$0.001128</code> every time you listen to a track. In practice, things aren&rsquo;t that simple, as Spotify (as almost every other streaming music provider) employs a <strong>pro rata</strong> payout model. The more sites and papers I read about this<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, the more confused I become. As far as I understand it, it goes something like this: when all I listen to is 2Pac, and I pay <code>€10</code>/month, a portion of my own money still goes to 2Pac&rsquo;s archenemy the Notorios B.I.G. - even though I did not actively &ldquo;support&rdquo; him.</p>
<p><a href="https://informationisbeautiful.net/visualizations/spotify-apple-music-tidal-music-streaming-services-royalty-rates-compared/">Information is Beautiful</a> goes even further by adding metadata, such as the number of plays needed to earn minimum wage, amount of free users for each streaming service, and so on. A musician needs to hit <code>336k</code> plays before earning <code>$1.472</code> (without taking any costs into account). When I try to compare this to a bought CD (I&rsquo;m treading on thin ice here), say <code>€15</code> for a CD with 15 tracks or <code>€1</code> per track, of which the artist would get for instance <code>23%</code> (See <a href="https://www.theguardian.com/technology/2015/apr/03/how-much-musicians-make-spotify-itunes-youtube">The Guardian</a> figure). That means <code>6400</code> per track. But since you can&rsquo;t buy a single one (usually, for a physical album), all that is needed to hit the minimum wage is <code>427</code> CD sales.</p>
<p>The difference is ridiculous. Simply staggering. I implore you to take a look at the aforementioned infographics. Yet, <code>23%</code> for a physical CD sale is still disappointing. Luckily, <a href="https://bandcamp.com/fair_trade_music_policy">Bandcamp</a> only takes <code>15%</code> and enables artists to publish their work without having to rely on a physical medium, or even a label company. That same CD, maybe now sold for only <code>€10</code> because it&rsquo;s digital, only needs <code>116</code> sales before reaching the threshold.</p>
<p>There are <a href="https://radarradio.net/blog/why-i-dont-use-spotify">many blog posts</a> entitled <em>&ldquo;why I don&rsquo;t use Spotify&rdquo;</em>, and there are just as many statements from streaming companies claiming that comparing streaming with buying is like comparing apples with oranges. And they are probably both right. Still, it breaks my heart that I used to think that streaming <a href="https://switchstancerecordings.bandcamp.com/album/into-bass-and-time">Into Bass and Time</a> from Ancient Astronauts would support the guys. It does, but barely. And my hard-earned money also ends up in the pockets of other artists.</p>
<p>Spotify used to stream pirated copies of music based on peer-to-peer networks. Only after a few years, they started &ldquo;sobering up&rdquo;, but still proudly claim that streaming music (on a free account) is the best alternative to illegally downloading music - and it seems to really <a href="https://www.engadget.com/2015-10-28-spotify-piracy-study.html">slightly reduce piracy</a> - but at a (steep) cost.</p>
<h2 id="part-ii-consumers-critical-thinking">Part II: Consumers' Critical Thinking</h2>
<p>Sometimes, I think that <em>critical thinking</em> every single second in your live on every single thing you do (or do not do) can be very, very tiresome. I have to think critically when at work, when buying groceries at the store, when buying a new laptop, when looking in the fridge and cooking, and apparently, also when putting on some music.</p>
<p>That got me thinking (urgh). Why does our society provide options that are decidedly <strong>unfair</strong>?<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> If there was only Fair Trade chocolate in the supermarket, I couldn&rsquo;t buy stuff that exploits African farmers. If there was only the option to buy from a fair streaming service, I wouldn&rsquo;t need to fry my brains trying to trace my subscription money. Granted, it is very frustrating to see so many big companies who are <em>not</em> as transparent as for instance Bandcamp&rsquo;s open policy.</p>
<p>The same is true for games. Do I buy them on Steam or Good Old Games? Should I wait for a <a href="https://www.humblebundle.com/about?hmb_source=navbar">Humble Bundle</a> that also donates to charities? Do the developers offer a way to directly buy from them?</p>
<p>The same is true for books. Did you know that on average, the profit margin of a physical book is less than <code>10%</code>? I earn about <code>€3</code> for each sale, and my book costs <code>€28.50</code>. Of course, <a href="https://www.bookdepository.com/">The Book Depository</a> and Amazon put even more pressure on that retail price and even dare to undercut the market (which is <a href="https://www.boekenprijs.be/over-site">illegal in Belgium</a>). Fabian Sanglard&rsquo;s <a href="https://fabiensanglard.net/gebbdoom/">Doom Game Engine Book</a> fares off much worse: <code>$1.59</code> of the <code>$54</code> goes to him. Luckily, he told me that many people make great use of the Paypal donate button. The only <em>fair</em> publisher I know of is <a href="https://pragprog.com/become-an-author/">The Pragmatic Bookshelf</a>, which state they pay out a royalty of <code>50%</code>. <em>&ldquo;Far more than the industry standards&rdquo;</em>. Indeed.</p>
<p><figure>
<a href="../profit.jpg" class="lbox">
<img loading="lazy" src="../profit.jpg" title="A simplified breakdown of my book profit margin. ">
</a>
<figcaption>A simplified breakdown of my book profit margin. </figcaption>
</figure>
</p>
<p>That got me thinking again (it&rsquo;s starting to hurt). Why are many <strong>artists</strong> - that create original, creative material, in some way or another - mistreated in our society? David Graeber&rsquo;s <a href="/post/2020/12/thoughts-on-bullshit-jobs/">Bullshit Jobs</a> also talks about this. Service jobs (Hello consultants and lawyers) earn millions, while many artists struggle to survive. Granted, even though Taylor Swift <a href="https://www.rollingstone.com/music/music-news/taylor-swift-abruptly-pulls-entire-catalog-from-spotify-55523/">pulled her songs</a> from Spotify in 2014 (and re-uploaded them later&hellip;), I highly doubt she&rsquo;s struggling - but many small artists are. I&rsquo;d love to be a full-time writer, but it is hardly feasible when writing about obscure subjects in a language other than English.</p>
<h2 id="why-i-sometimes-do-use-spotify">Why I sometimes do use Spotify</h2>
<p><em>Serendipity</em>. <em>Deliberate Discovery</em>. Browsing, having stuff suggested, listening to a few songs, and jumping to Bandcamp to buy the album. That last part is crucial, and I hope by now you know why. Sometimes, it does pay off to be a critical thinker.</p>
<p>Thanks, Ruben.</p>
<section class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1" role="doc-endnote">
<p><a href="https://repositories.lib.utexas.edu/bitstream/handle/2152/75450/gierharthunter_Thesis_How%20the%20Spotify%20Streaming%20Model%20Affects%20the%20Modern%20American%20Musician_2019.pdf?sequence=1&amp;isAllowed=y">Hunter Gierhar&rsquo;ts thesis</a> on <em>How the Spotify StreamingModel Affects the Modern American Musician</em> was especially interesting. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>The answer is capitalism. Everyone wants <em>free stuff</em>, and when they can&rsquo;t, they want the cheapest option, thereby forgetting to pay the creator. <a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</section>
<p>
By <a href="/about">Wouter Groeneveld</a> on 9 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>My Retro Desk/Gaming Setup in 2021</title>
<link>https://brainbaking.com/post/2021/02/my-retro-desktop-setup/</link>
<comments>https://brainbaking.com/post/2021/02/my-retro-desktop-setup/#commento</comments>
<pubDate>Tue, 02 Feb 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/02/my-retro-desktop-setup/</guid>
<category domain="https://brainbaking.com/tags/retro">retro</category>
<description>
<![CDATA[
<p>Thanks to my resurgent interest in retro computing, I discovered others' setups and blogs that inspired me to completely rework my home office. Of course, COVID-19 also made sure I invested in better office equipment at home. Well, <em>better</em> is subjective. It will never be as cool as <a href="https://www.bytecellar.com/photo_pano.html">The Byte Cellar</a>: I simply don&rsquo;t have the space (nor permission from my wife; nor the nostalgic connection with many older machines). &ldquo;<a href="https://www.resetera.com/threads/post-your-gaming-setup-2021-edition.354757/">Post your gaming setup</a>&rdquo; is a yearly tradition at the <a href="https://www.resetera.com/">ResetEra</a> forums, but the Reset community is mainly a next-generation console-centered one that showcases mostly shiny TVs in living rooms.</p>
<p>Still, I always feel a bit inspired flicking through photos of others' setups - so why not post my own that hopefully does the same. Inevitably, IKEA made some money in the progress. I&rsquo;ve looked at alternatives, but none are as ecological (the desk is made of recycled paper honeycomb) or as cheap as what IKEA offers. Searching on the net for &ldquo;<a href="https://duckduckgo.com/?q=ikea+linnmon+gaming&amp;t=ffab&amp;iar=images&amp;iax=images&amp;ia=images">ikea linnmon gaming</a>&rdquo; results in more inspiration material I dutifully stole some ideas from. Right, so here goes.</p>
<h2 id="an-overview">An overview</h2>
<p><figure>
<a href="../desk_overview.jpg" class="lbox">
<img loading="lazy" src="../desk_overview.jpg" title="The desk setup: an overview.">
</a>
<figcaption>The desk setup: an overview.</figcaption>
</figure>
</p>
<p>The room is small, so fitting in as much stuff as possible while still feeling spacious and calming was one of the main goals. The LINNMON desk is <code>60cm</code> deep, so installing an old CRT screen was sadly out of the question, unless I positioned it in a corner - which was already being occupied by my WinXP horizontal case (that allows for convenient cable hiding). I really wanted a nice curving corner desk especially for that. In the end, the setup consists of three pieces of LINNMON: one <code>1m</code> straight piece (to the left), one corner piece, and one <code>1.2m</code> straight piece (to the right).</p>
<p>Another priority was <em>cable management</em>. I hate the sight of cable clutter - or any sort of clutter, come to think of it. It prevents my mind from entering a clear and peaceful state where I can think straight. Beneath every piece of desk, I installed cable raceways, and I paid special attention to which cable should go to where. The switch was also taped upside-down to the center piece, to keep Ethernet cables out of sight as much as possible. All three parts have one single power strip that feed all electrical devices, and keep things separated. Let&rsquo;s take a closer look at what&rsquo;s installed.</p>
<h2 id="zoomed-in">Zoomed In</h2>
<h3 id="1-left-the-486-machine">1. Left: The 486 machine</h3>
<p><figure>
<a href="../desk_486.jpg" class="lbox">
<img loading="lazy" src="../desk_486.jpg" title="Zoomed in on the 80486.">
</a>
<figcaption>Zoomed in on the 80486.</figcaption>
</figure>
</p>
<p>Next to the doorway, we have the least amount of space. I would love to get a decent CRT screen coupled with <a href="/post/2020/09/reviving-a-80486/">my 486 machine</a>, but space constraints make this impossible. The <code>17&quot;</code> DELL screen does an okay job at displaying old VESA CGA/VGA resolutions, but it&rsquo;s far from great. At least now everything fits nicely. As a big fan of the original <a href="https://en.wikipedia.org/wiki/The_Secret_of_Monkey_Island">Monkey Island</a> games, I framed the cover art (printed as high quality posters), that blends perfectly with the 1990s retro theme.</p>
<p>In the above photo, it&rsquo;s a bit hard to see, but this setup already mixes old (the obvious 486) with new (the newer LCD screen, the <a href="/post/2020/09/486-upgrade-sd-hdd/">SD card based HDD</a> mod, and the <a href="http://localhost:1313/post/2020/09/486-upgrade-sound-blaster/">S2 wavetable board</a>). I especially love the mechanical old keyboard, which was taken apart and thoroughly cleaned a couple of months ago. Things still on the wish list: a set of original Roland speakers, and of course a Roland <a href="https://en.wikipedia.org/wiki/Roland_MT-32">MT-32 MIDI syntheziser</a> or one of the more recent <a href="https://en.wikipedia.org/wiki/Roland_Sound_Canvas">Sound Canvas</a> devices.</p>
<h3 id="2-middle-the-win98xp-machines">2. Middle: The Win98/XP machines</h3>
<p><figure>
<a href="../desk_win98.jpg" class="lbox">
<img loading="lazy" src="../desk_win98.jpg" title="Zoomed in on the Win98/WinXP setup.">
</a>
<figcaption>Zoomed in on the Win98/WinXP setup.</figcaption>
</figure>
</p>
<p>Here, again the space saving strategy is clearly visible: there&rsquo;s only one screen, the DELL UltraSharp 2007WFP I bought in 2007. The screen can handle VGA, DVI, S-Video and composite, and you can change input channels through the menu system. <a href="/post/2020/10/building-a-core2duo-winxp-retro-pc/">My WinXP machine</a> is setup for DVI, while <a href="/post/2020/10/building-an-athlon-win98-retro-pc/">my Win98SE machine</a> still relies on the good ol' analog VGA cable. I loved that Antec horizontal case back in the day because I could shove it under my drawer set, mounted and hanging on the desk backside.</p>
<p>Only having one physical location for both PCs does have some downsides: I had to buy an USB2 hub that allows me to quickly switch using keyboard and mouse from one PC to the next. Since the Win98 USB drivers aren&rsquo;t great, this was a bit of a pain to get working. Luckily, it&rsquo;s quite effortless now! The only thing that is still left to do is to make a simple analog audio mixer that allows me to use one set of speakers for both machines. Replugging cables is not much fun.</p>
<p>What <em>is</em> much fun, though, is classic 1999-style case modding: I tore apart the old AOpen classic beige PC midi tower with a whipsaw, bought a couple of 5/12V led strips, and put in a piece of plexiglass. The intention is to do the same for the 486. The reason why the towers are positioned like that is, again, space constraints, but now I can also show off the actual retro hardware! Bonus points for those who can guess which game is running (on Win98).</p>
<h3 id="3-right-the-macbook-air">3. Right: The MacBook Air</h3>
<p><figure>
<a href="../desk_mac.jpg" class="lbox">
<img loading="lazy" src="../desk_mac.jpg" title="The &#39;work&#39; corner: a MacBook and recent screen.">
</a>
<figcaption>The &#39;work&#39; corner: a MacBook and recent screen.</figcaption>
</figure>
Β 
On to the <em>work corner</em>, where I employed a minimalistic strategy that relies on a cool <a href="https://www.dell.com/en-us/work/shop/dell-ultrasharp-usb-c-hub-monitor-u2421e/apd/210-axmg/monitors-monitor-accessories">DELL UltraSharp U2421E</a> USB-C Hub Monitor and the <a href="https://www.twelvesouth.com/products/magicbridge">TwelveSouth MagicBridge</a> that marries the Apple Keyboard with the Trackpad. I bought the monitor last month and I&rsquo;m extremely pleased with it: it eliminates the need of an external hub <em>and</em> it eliminates the need to have an untidy power cable lying around, as it also charges through USB-C. Furthermore, you can even plug in an Ethernet cable - which I did - that allows for a more stable Internet connection. Working on <a href="/post/2020/12/developing-on-apple-m1-silicon/">my M1 MacBook Air</a> was never that satisfying. Unfortunately, the <code>24&quot;</code> DELL screen isn&rsquo;t the best in terms of pixel intensity, especially compared to the native screen of the Mac. Those specialized screens were much, much more expensive.</p>
<p>On top of the Win98 tower, you can spot an AirPlay-enabled Pioneer XW-SMA4-K from 2009 that&rsquo;s also connected to the switch. I&rsquo;ve had problems with streaming music to it because of the unstable WiFi signal and the slow WiFi receiver from my previous MacBook. A Stereo Jack plug works, but introduces another cable, and removes the biggest advantage of this setup: when I want to physically move my laptop to my lap in the comfy chair (see below), the music stops. The box is mainly used to stream music while working from home - to great frustration of my wife.</p>
<p>I also plan to connect the last piece of retro hardware, the Nintendo GameCube, to the screen using a <a href="https://www.eongaming.tech/product-page/gchd-mk-ii-rgblack">GCHD MK-II</a> HDMI adapter - the video signal of the laptop goes through USB-C. The only stupid mistake I made a couple of years ago was to sell of a large portion of my GameCube collection, including the amazing wireless WaveBird controller&hellip;</p>
<h2 id="the-book-wall">The Book Wall</h2>
<p><figure>
<a href="../desk_reverse.jpg" class="lbox">
<img loading="lazy" src="../desk_reverse.jpg" title="The other side of the wall: my mini-library.">
</a>
<figcaption>The other side of the wall: my mini-library.</figcaption>
</figure>
</p>
<p>When you turn your back to the retro crazyness, you will see a few bookcases and a cozy chair (Note the 486 keyboard in the lower right). The intention was to comfortably play on the GameCube from the chair, but <code>24&quot;</code> is a tad too small for that. I decided against buying a <code>27&quot;</code> screen, as that would be too big for the limited depth of the LINNMON setup. Thanks to COVID, the chair (yup, also IKEA) sees a lot of use when my back hurts because of that cheap IKEA office chair I still need to replace.</p>
<p>On the shelves, I keep a happy mix-mash of our non-fiction books, which is only a portion of what we have. I love being around books, so naturally, they had to be present. Those who look well enough will discover a few Magic: The Gathering boxes I couldn&rsquo;t fit in our boardgame closet - someday, we should sell some stuff&hellip;</p>
<h2 id="wait-i-sense-something-is-missing">Wait, I sense something is missing!</h2>
<p>Your senses would not be misleading you! My relished Game Boy (Color/Advance) and Nintendo (3)DS collection currently resides in multiple other rooms, scattered around the house. There wasn&rsquo;t enough room to show off dozens of plastic cases. Future work might include mounting simple shelves against the wall below the skylight. They do not need to be very sturdy so it shouldn&rsquo;t take up that much extra space.</p>
<p>The retro big box PC games and the Nintendo GameCube miniDVDs I still own are tucked away in the cabinet behind the reading chair. I sadly don&rsquo;t own that many anymore: moving three times didn&rsquo;t help in preserving these. Most of my retro PC collection nowadays consists of <a href="https://gog.com">gog.com</a> downloads, which is a bit of a pain to get up and running on older operating systems because of the Windows 10 installer. As for the Nintendo SNES cartridges and more recent Nintendo Switch games, they are of course kept in a drawer close to the TV, as both machines are connected to a screen in our living room.</p>
<p>I also have a mini SNES and mini PS1 lying around somewhere, but due to lack of HDMI ports on the TV, they don&rsquo;t see much use. That was another reason why I wanted that GameCube in my retro room. There are only so many consoles (and games) you can devote your time to, and I&rsquo;ve always been more of a PC and handheld gamer myself.</p>
<p>If there is anything you&rsquo;d like more specifications of, just let me know!</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 2 February 2021.
</p>
]]>
</description>
</item>
<item>
<title>Win98 Upgrade: GeForce 3 Ti200 vs Riva TNT2</title>
<link>https://brainbaking.com/post/2021/01/win98-upgrade-geforce3/</link>
<comments>https://brainbaking.com/post/2021/01/win98-upgrade-geforce3/#commento</comments>
<pubDate>Thu, 28 Jan 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/01/win98-upgrade-geforce3/</guid>
<category domain="https://brainbaking.com/tags/geforce">geforce</category>
<category domain="https://brainbaking.com/tags/win98">win98</category>
<category domain="https://brainbaking.com/tags/retro">retro</category>
<description>
<![CDATA[
<p>
<img align="left" hspace="5" src="https://brainbaking.com/bigimg/geforce3.jpg"/>
</p>
<p>After building a <a href="/post/2020/10/building-an-athlon-win98-retro-pc">Windows 98SE retro PC</a> in October 2020, I&rsquo;ve upgraded the sound card to a proper <a href="/tags/soundblaster">SoundBlaster</a>. Yet, little games made use of that capability because my graphics card lagged behind. The PC slotted a OEM version of a Riva TNT2 M64 card with <code>32MB</code> SD RAM. The chip has a sticker called <em>&ldquo;Sparkle&rdquo;</em> on it, but it sure wasn&rsquo;t sparkling that much as soon as I booted Unreal Tournament. So, the only logical conclusion to make was to do another upgrade.</p>
<p>What are the options? During the end of the nineties and the beginning of the 2000s, the video card market exploded. From dual-linked Voodoo cards on PCI ports to competitive ATI Radeon ones that also were quite new at that time. I had two options: either I stay true to the historical correctness of the retro computer, or I go all out and get the best my motherboard could possibly handle. I of course chose option number 3: something in-between.</p>
<h2 id="the-geforce-3-ti-200">The GeForce 3 Ti 200</h2>
<p><figure>
<a href="../geforce3.jpg" class="lbox">
<img loading="lazy" src="../geforce3.jpg" title="The MSI/Medion GeForce 3 Ti200 card.">
</a>
<figcaption>The MSI/Medion GeForce 3 Ti200 card.</figcaption>
</figure>
</p>
<p>The third generation of Nvidia&rsquo;s GeForce graphics processing units, the GeForce 3, was released in the beginning of 2001. I&rsquo;m pretty sure most people by then had moved on from Windows 98 to (hopefully) Windows 2000 - thereby safely sidestepping the disaster that Windows Me (or Millennium) was. Compared to the Riva TNT2, a chip also by Nvidia from early 1999, the GeForce 3 cards were beasts - yet only two years passed since the TNT2 release!</p>
<p>The TNT2 was never intended to be a big performer: the 1998 3Dfx Voodoo 2 and Voodoo 3 outperformed it in certain games. That is because the graphics APIs were not yet fully matured: you had your <strong>Glide</strong> drivers, that worked well with 3Dfx cards, your <strong>OpenGL</strong> ones, and Microsoft <strong>Direct3D</strong>. Some games could be patched to work better with a particular API, but most were pretty hard-wired. As a gamer with a Voodoo card, you&rsquo;d be forced to also periodically upgrade your AGP slot if you wanted access to all games. The Voodoo cards slotted in PCI ports, meaning you could mix and match, or even run them in SLI, a popular configuration in the Retro PC scene at <a href="https://vogons.org">VOGONS</a>. That is, if you&rsquo;re prepared to drop more than <code>€140</code> a piece - <a href="https://www.benl.ebay.be/sch/i.html?_from=R40&amp;_trksid=m570.l1313&amp;_nkw=voodoo+2&amp;_sacat=0">even nowadays</a>.</p>
<p>I have fond memories of the floating 3Dfx logo. I remember my dad flashing our Voodoo card in order to overclock it, an attempt that ended with smoke coming out of a capacitor. We brought it back to the store, and when the guy behind the counter asked whether or not we flashed the thing, my dad said &ldquo;of course not!&rdquo;. We promptly got a new one. However, until I can get hold of a Voodoo card at a fair price, I decided to resort to Nvidia&rsquo;s budget version of the GeForce 3 instead, that I found for only <code>€30</code>. The Ti 200 was basically a pumped-up GeForce 2 with <code>64MB</code> and a clock rate of <code>200MHz</code>. To me, it felt a bit more historically accurate compared to a high-end Ti 500 - although you can <a href="https://www.philscomputerlab.com/geforce3-ti-200.html">overclock the card</a> by adding active cooling. As a fan of <em>silent</em> PCs, I was keen on keeping the cooling as passive as possible. The result is a massive (well, for that time) black block on top of the GPU:</p>
<p><figure>
<a href="../geforcevsriva.jpg" class="lbox">
<img loading="lazy" src="../geforcevsriva.jpg" title="The GeForce 3 (left) compared to the TNT2 (right).">
</a>
<figcaption>The GeForce 3 (left) compared to the TNT2 (right).</figcaption>
</figure>
</p>
<p>Note that the GeForce3 has multiple video-out ports: a VGA one and an S-Video one - of course both still analog. Fitting the card inside your case can be a bit challenging if you didn&rsquo;t do proper cable management (whoops), as it&rsquo;s both longer and higher than its predecessor. My card was branded <em>MEDION</em> (by the German supermarket <em>ALDI</em>), but it&rsquo;s essential an <em>MSI</em>, so I don&rsquo;t care. It probably came from one of those cheap (but pretty good) MEDION computer builds. I got it from a friendly German IT parts recycler at eBay.</p>
<h2 id="performance">Performance</h2>
<p>Okay, let&rsquo;s see what happens after pulling out a screwdriver and replacing the TNT2. Windows 98SE still booted - that&rsquo;s a start. Of course, it does not recognize the card and reverts to 16-color mode. After digging up the right Nvidia driver set (and installing DirectX 9), rebooting a couple of times, it was time to play some games. I failed to find any &ldquo;GeForce3 VS TNT2&rdquo; articles on the internet that compare FPS stats, so I recorded a few of my own.</p>
<h3 id="dungeon-siege">Dungeon Siege</h3>
<p><a href="https://jefklakscodex.com/articles/reviews/dungeon-siege/">Dungeon Siege</a>, released by Gas Powered Games in 2002, is one of the first <a href="https://jefklakscodex.com/articles/features/the-best-and-worst-retro-hack-and-slash-games/">hack &amp; slash</a> games that was rendered in full 3D. This of course put quite a strain on PCs back then. Since I was replaying old H&amp;S games, and this one was released a year after the Ti200, it was a good candidate for a first stress test.</p>
<p><figure>
<a href="/post/2020/11/furyseye.jpg" class="lbox">
<img loading="lazy" src="/post/2020/11/furyseye.jpg" title="Dungeon Siege">
</a>
<figcaption>Dungeon Siege</figcaption>
</figure>
</p>
<p>To be honest, the game was unplayable with the Riva TNT2: it barely managed to pull off rendering <code>7</code> to <code>8</code> frames each second. I had to resort to my <a href="/post/2020/10/building-a-core2duo-winxp-retro-pc/">Windows XP build</a> to play it, before upgrading the graphics card, where it of course comfortably peaked at <code>60</code> FPS at a resolution of <code>1024x768</code> and every setting configured to high. The GeForce 3 fared much better than the TNT2: from <code>8</code> FPS to a whopping <code>23</code> in the midst of a heavy battle with spells flying all over the place. Remember, Generation Z kids: back then, if we got more than <code>15</code> FPS, we played it and did not complain. I wandered around in the swamps for a bit, and traveled to the Goblin-infested fortress, without major hickups, although the occasional dip in frames is still there.</p>
<h3 id="unreal-tournament">Unreal Tournament</h3>
<p>UT1, released in November 1999, was more interesting to test, because it supports multiple graphics APIs due to its launch in the midst of the &ldquo;AGP war&rdquo;. The Glide drivers are supposed to be good, but I cannot verify that. I can, however, try out a bunch of different options with both TNT2 and GeForce3 cards. Below is a summary of my findings (all details are set to <em>high</em> with skin to <em>medium</em>; resolution is always <code>1024x768</code>):</p>
<p><strong>Riva TNT2 M64</strong>:</p>
<ul>
<li><code>16bpp</code> (bits per pixel); Direct3D (default): <code>28</code> FPS</li>
<li><code>32bpp</code>; Direct3D: <code>14</code> FPS</li>
<li><code>32bpp</code>; OpenGL: <em>crash!</em> (whoops)</li>
</ul>
<p><strong>GeForce 3 Ti 200</strong>:</p>
<ul>
<li><code>16bpp</code>; Direct3D: <code>30</code> FPS</li>
<li><code>32bpp</code>; Direct3D: <code>15</code> FPS</li>
<li><code>32bpp</code>; OpenGL: <code>74</code> FPS</li>
</ul>
<p>These statistics were gathered using Fraps in the same multiplayer map, with the same weapon and the same movements/location. Strangely enough, Direct3D was no friend of the GeForce 3: the amount of FPS is virtually identical? I did install the latest UT1 patches, but it could very well be that I overlooked something. It was only after switching to OpenGL that I noticed a major performance boost. Messing with color depth is dangerous on the TNT2, it seems.</p>
<h3 id="wizardry-8">Wizardry 8</h3>
<p>As I mentioned in the original <a href="/post/2020/10/building-an-athlon-win98-retro-pc">Win98SE article</a>: the first thing I did after the video/audio drivers was of course installing <a href="https://jefklakscodex.com/tags/wizardry8/">Wizardry 8</a>, my all-time favorite PC RPG, released in 2001.</p>
<p><figure>
<a href="../wiz8.jpg" class="lbox">
<img loading="lazy" src="../wiz8.jpg" title="Wizardry 8: stranded on a beach, dangerous crabs nearby!">
</a>
<figcaption>Wizardry 8: stranded on a beach, dangerous crabs nearby!</figcaption>
</figure>
</p>
<p>Wiz8 was never the prettiest game of them all, and its development was riddled with more than a few hickups and tumbles. Sadly, Sir-Tech Canada eventually closed doors, so an official sequel is out of the question. There aren&rsquo;t a lot of graphics options to play with, and after choosing the OpenGL API drivers, all I can say is that both cards pull of rendering scenes in Wizardry 8 quite well. In and around the monastery, the begin location of the party, The TNT2 pushes frames to <code>19</code> FPS, while the GeForce 3 almost quadruples this to <code>75</code> FPS. Since this is not an action-packed frenetic shooting gallery, like Quake 3 or Unreal Tournament are, having semi-low frames is something you don&rsquo;t even notice. It played fine on the TNT2, and it plays fine on the GeForce 3.</p>
<h2 id="so-was-it-worth-it">So, was it worth it?</h2>
<p>That depends. If you&rsquo;re like me, and prefer RPG and turn-based games to shooters, then probably not so much. Yet, I liked being able to play Dungeon Siege on Windows 98 rather than Windows XP. It felt more authentic. The hack &amp; slash game Sacred deserves the WinXP machine since that game is from 2004: the mid-2000s, not the early ones.</p>
<p>The card is cheap, silent, the installation is painless, and I can finally attempt to reinstall my favorite Grand Theft Auto version: GTA Vice City, released in 2002. We&rsquo;ll see how the game fares with the card - or how the card fares with the game&hellip;</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 28 January 2021.
</p>
]]>
</description>
</item>
<item>
<title>What is Creativity in Software Engineering?</title>
<link>https://brainbaking.com/post/2021/01/what-is-creativity-in-software-engineering/</link>
<comments>https://brainbaking.com/post/2021/01/what-is-creativity-in-software-engineering/#commento</comments>
<pubDate>Wed, 20 Jan 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/01/what-is-creativity-in-software-engineering/</guid>
<category domain="https://brainbaking.com/tags/creativity">creativity</category>
<category domain="https://brainbaking.com/tags/phd">phd</category>
<description>
<![CDATA[
<p>Last month, our paper entitled <em>&ldquo;Exploring the Role of Creativity in Software Engineering&rdquo;</em> got accepted for publication in the proceedings of the 43nd International Conference on Software Engineering: <a href="https://conf.researchr.org/track/icse-2021/icse-2021-Software-Engineering-in-Society">Software Engineering in Society</a> (ICSE-SEIS). Read the <a href="https://arxiv.org/abs/2101.00837">pre-print paper here</a>. In this article, I&rsquo;d like to summarize and rephrase our findings, since academic prose can be a bit&hellip; well&hellip; you know.</p>
<h2 id="why-the-sudden-interest-in-creativity">Why the sudden interest in creativity?</h2>
<p>Good question. In my PhD work, I try to identify - and later on, hopefully amplify - so-called <em>non-technical</em> skills that are needed to succeed as a software engineer. First of all, software engineering is my field of expertise: read the <a href="/about">about me</a> page if you didn&rsquo;t know that yet. Secondly, I wondered what else besides the technical mumbo-jumbo one really has to master in order to be a <em>proper</em> developer. This goes beyond programming languages, frameworks, typing and productivity knowledge.</p>
<p>In the previous years, I&rsquo;ve worked on:</p>
<ol>
<li>Trying to come up with a list of skills that are important, according to experts in the field;</li>
<li>Trying to come up with a list of skills currently taught in higher education;</li>
<li>Trying to match these and narrow down the results to reveal the biggest skill gap.</li>
</ol>
<p>Guess what. Creativity was in the top 3. But the more papers I read about the topic (of which surprisingly little specifically for software development!), and the more people I talked to, the less easily &ldquo;creativity&rdquo; could be defined. Hence the effort to facilitate a focus group, where 33 experts in 4 groups talked about their personal experience on the subject at hand.</p>
<p>I wrote about programming as a <a href="/post/2019/10/creative-cognitive-processes/">creative cognitive process</a> before, and tried to link the different existing frameworks out there. Most were too theoretical or contained too little context to be able to relate to practical software development. This time, we wanted to validate our thoughts by involving others.</p>
<h2 id="dimensions-of-creative-problem-solving">Dimensions of Creative Problem Solving</h2>
<p>After plowing through <code>399</code> lovely minutes of discussion, applying the needed qualitative tactics and methods, we came up with 7 main themes that, according to our interviewees, define creativity in the world of (agile/enterprise) software development. The paper contains much more details surrounding these, I merely try to summarize in this blog post.</p>
<p><figure>
<a href="../creativity-mindmap.jpg" class="lbox">
<img loading="lazy" src="../creativity-mindmap.jpg" title="A mind map of the 7 identified themes of creativity in software engineering.">
</a>
<figcaption>A mind map of the 7 identified themes of creativity in software engineering.</figcaption>
</figure>
</p>
<p>We did our best to be as specific as possible, using the wording of the participants as much as possible, but generalizations of course are bound to be made at some point in time. Also, instead of going for a vague term like &ldquo;creativity&rdquo;, we always talked <strong>in context of a programming problem</strong>. That is why the center states &ldquo;creative problem solving&rdquo; rather than &ldquo;creativity&rdquo;. Someone said:</p>
<blockquote>
<p>Creativity simply arises when you are solving a problem.</p>
</blockquote>
<p>Existing literature has proven before that creativity is context-dependent. Whether or not it&rsquo;s also domain-dependent is still an on-going debate.</p>
<h3 id="1-creative-techniques">1. Creative Techniques</h3>
<p>Let&rsquo;s start with obvious ones: when talking about creativity, someone is bound to mention &ldquo;brainstorming&rdquo; or &ldquo;combining ideas&rdquo;. Yet, if you don&rsquo;t know about these (practical) techniques, you&rsquo;ll have a harder time solving the problem at hand. For instance, until recently, I never heard about non-linear note-taking, <a href="https://zettelkasten.de/introduction/">until now</a>. It has completely changed the way I work!</p>
<p>The most interesting remark came from someone who said:</p>
<blockquote>
<p>Creativity is the brew of different inputs.</p>
</blockquote>
<p>Because of this, he actively sought out new information - anything that could help him in making the connection with the current problem. Thus, the more you know (and can remember!), the more you can link. And the more you can link, the more you can <em>cook up</em> a solution! That is why this term is colored both blue and purple.</p>
<p>More interesting common practices that were mentioned:</p>
<ul>
<li><em>Peeling the onion</em> by keeping on asking <em>&ldquo;why?&quot;</em>;</li>
<li><em>Rubber ducking</em>;</li>
<li>Switching gears: zooming out or zooming in;</li>
<li>Seeking out edge cases (hopefully in combination with unit tests);</li>
<li>&hellip;</li>
</ul>
<p>Things like <em>shower thoughts</em> reminded me and participants of Andy Hunt&rsquo;s <a href="https://www.goodreads.com/book/show/3063393">Pragmatic Thinking &amp; Learning</a>, one of the best books any developer can read.</p>
<h3 id="2-technical-knowledge">2. Technical Knowledge</h3>
<p>If creativity is the brew of different inputs, then you better be inputting a lot! Without any base knowledge of the problem at hand (syntax, alternative previous solutions, &hellip;), your creative mind will probably never even bootstrap. The obvious link to another popular non-technical skill, <em>continuous learning</em> (or <em>lifelong learning</em>) can be made here.</p>
<h3 id="3-communication">3. Communication</h3>
<p>Many people falsely assume that creativity is a very personal matter: the lone genius creating away of having awesome thought after thought. Yet it is usual within <a href="https://jessitron.com/2020/12/26/purple-developer/">the Camerata</a> where the magic happens: the group of like-minded people that share ideas, in a liquid network, as in Steven Johnson&rsquo;s <a href="https://www.goodreads.com/book/show/8034188">Where Good Ideas Come From</a>.</p>
<p>Rubber ducking is all good, but it&rsquo;s better to do it with a colleague: the sensible or insensible response might trigger a thought in your brain and end up helping your creative process. Rubber ducks don&rsquo;t talk back, as far as I know.</p>
<p>Communicating might also help with motivation - which in turn helps you being more creative (extrinsic motivation only goes that far). One participant said:</p>
<blockquote>
<p>Doing something without feedback is just too non-committal.</p>
</blockquote>
<h3 id="4-constraints">4. Constraints</h3>
<p>Besides of the exchange of ideas in the communication dimension, working with a fast feedback loop and doing stuff client-oriented introduces <strong>constraints</strong>. Constraints are the things of the Devil - the things we as developers usually curse at: time too short, nagging client, stupid bug report, and so forth. Yet, in reality, the <em>sweet spot of creativity</em> is having enough constraints to keep it challenging. Biskjaer talks about <a href="https://link.springer.com/article/10.1007/s10798-019-09496-7">How task constraints affect inspiration search strategies</a> - and that is exactly what happens with creative software developers.</p>
<p>Next time your team members complain about yet another constraint, tell them they&rsquo;re being more creative that way.</p>
<h3 id="5-critical-thinking">5. Critical Thinking</h3>
<p>Criticizing others' ideas (<em>&ldquo;That ain&rsquo;t gonna work!&quot;</em>) is easy. Coming up with good alternatives yourself is not. Separating the wheat from the chaff, in terms of conceptual ideas you and your team has on this one programming problem, is very important. My ex-colleagues neatly summarized this as: <em>&ldquo;don&rsquo;t ASS-ume, you make an ass out of u and me&rdquo;</em>. This was said quite often, for example when we assumed the <code>NullPointerException</code> was because of <code>x</code>, without digging deeper first.</p>
<p>Of course, the cause turned out to be a combination of <code>y</code> and <code>z</code>.</p>
<h3 id="6-curiosity">6. Curiosity</h3>
<p>Closely related to <strong>motivation</strong>. One participant said he had a lot of respect for creative solutions, also beyond the context of software engineering. Admiring something creative because of the creative aspects drives your own curiosity, pushing you to look for alternatives and niche paths you might never have looked at before. In short: get out of your comfort zone! Work cross-team, pick up that other programming language, read others' blogs (thanks!) - even if it makes you feel uncomfortable. That feeling is the feeling that you&rsquo;re <em>learning</em>.</p>
<p>Does this mean we always have to be curious? Unlikely. Use your critical thinking skills to decide! Participants emphasize the right combination between creativity and critical thinking, taking into account the context and constraints of the problem:</p>
<blockquote>
<p>Creativity is the means, not the goal.</p>
</blockquote>
<h3 id="7-creative-state-of-mind">7. Creative State of Mind</h3>
<p>Before being creative, you first have to be <em>allowed</em> to be creative: companies should also and actively support this! Setting the right scene to allow the flow of thought is a requirement of good creative problem solving. This means your environment should allow for freedom and flexibility.</p>
<h4 id="this-is-where-the-magic-happens">This is where &ldquo;the magic&rdquo; happens</h4>
<p>Funnily enough, creative thinking does not seem to happen exclusively on the workplace, behind your desk. Someone said ideas come to mind when standing in front of a traffic light, while others jot stuff down after a shower. I loved this statement:</p>
<blockquote>
<p>When I&rsquo;m at work, all I have to do is type out the solution in my head.</p>
</blockquote>
<p>Of course, <code>80%</code> of the work has been done <em>before</em> getting to work (or on the previous days/weeks at work).
I remember our boss being very angry because we were letting off steam by playing cards at 14h30 - just finishing up a game we had to interrupt. What he didn&rsquo;t see was our invisible collectible creative problem solving effort (and probably also sweat) we put in earlier. Like the guy who said I just type out stuff when I&rsquo;m at work. Managers like busy-work, but most if it is distinctively <em>not</em> creative: that part has already been done!</p>
<h2 id="future-work">Future Work</h2>
<p>There are many more variables involving creativity and sparking that creative <em>flow</em> (how to assess it, what are some limitations, what are motivations to be creative, &hellip;). We&rsquo;re planning on using the above dimensions to create a small survey in order to test how creatively students approach a programming project. I think we can safely presume that there is still a lot of unexplored ground to cover, and I love that - it means we can contribute something useful!</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 20 January 2021.
</p>
]]>
</description>
</item>
<item>
<title>The Productive Programmer on Mac</title>
<link>https://brainbaking.com/post/2021/01/the-productive-programmer-on-mac/</link>
<comments>https://brainbaking.com/post/2021/01/the-productive-programmer-on-mac/#commento</comments>
<pubDate>Wed, 13 Jan 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/01/the-productive-programmer-on-mac/</guid>
<category>productivity</category>
<category>the productive programmer</category>
<category>neal ford</category>
<category>productivity tools macos</category>
<category>programming productively</category>
<category>productivity mac</category>
<category>iterm</category>
<category>alfred</category>
<category>sublime text</category>
<description>
<![CDATA[
<p>In 2010, I attended a <a href="https://devoxx.be/">Devoxx Conference</a> talk by Neal Ford called <em>&ldquo;Productive Programming&rdquo;</em>. Of course, I also bought the <a href="https://www.goodreads.com/book/show/3411606-the-productive-programmer?from_search=true&amp;from_srp=true&amp;qid=JyUZOnUvOl&amp;rank=1">accompanying book</a>, published in 2008. Eleven years ago, I also gained interest in <a href="/tags/self-improvement/">self-improvement</a>. Therefore, any sort of productivity tip was welcomed with open arms. I think/hope Neal converted many non-believers that day. It even gave me ideas to do a talk myself - which I did in the following year. It is a lot of fun to rummage through old notebooks as <a href="/post/2021/01/digitizing-journals-using-devonthink/">I&rsquo;m digitizing these</a>, to see which ideas from others got my own ideas flowing. Here is the proof:</p>
<p><figure>
<a href="../devoxx-note.jpg" class="lbox">
<img loading="lazy" src="../devoxx-note.jpg" title="Page 19 of my first &#39;real&#39; journal ever.">
</a>
<figcaption>Page 19 of my first &#39;real&#39; journal ever.</figcaption>
</figure>
</p>
<p>Back to <em>The Productive Programmer</em>. Neal Ford&rsquo;s premise was simple: you&rsquo;re a programmer, so use your PC as productive as you can. You&rsquo;re stuck behind the desk for eight hours a day anyway! While that idea wasn&rsquo;t exactly mind-blowing, the fact that so many people - colleagues - I knew still could not touch type, let alone consistently use shortkeys to refactor pieces of code, was baffling to me. So I decided to go all in and hopefully impress a few others on the way. Not to boast my ego, but to inspire others.</p>
<p>A Productive Programmer knows the <em>mechanics</em> of productivity, and he has gained enough experience through <em>practice</em> to seize opportunities to further improve things. In the light of my <a href="/post/2020/12/developing-on-apple-m1-silicon/">new M1 MacBook Air</a>, let us take a look at what that entails for a Mac user. The book might propose many tools that aren&rsquo;t relevant anymore, but the underlying concepts remain significant. I hope this will inspire students and smart people that recently joined the Mac club to pay attention to what they&rsquo;re doing. Always ask yourself: am I doing this a lot? Can this be done quicker?</p>
<h2 id="a-mechanics">A. Mechanics</h2>
<p>A quote from the book that resonated with me:</p>
<blockquote>
<p>Spend a little time each day to make every day more productive. <span>Neal Ford</span></p>
</blockquote>
<h3 id="1-acceleration">1. Acceleration</h3>
<p><figure>
<a href="../icon-iterm.png#right" class="lbox">
<img loading="lazy" src="../icon-iterm.png#right" >
</a>
</figure>
</p>
<p><em>Don&rsquo;t type the same commands again and again</em>. Find something to do the work for you. Neal suggests to use things that <em>remember history</em>: clipboard extenders, history keepers that can be automatically recalled, command prompt plug-ins, and so forth. These things seem so mundane and obvious nowadays. Yet, who knows every <a href="https://iterm2.com/features.html">obscure feature</a> of their <a href="https://www.zsh.org/">Zsh</a>-powered <a href="https://iterm2.com/">iTerm2</a>? A few I just learned yesterday:</p>
<ul>
<li><code>⌘+;</code> to auto-complete anything from history. I usually resort to Zsh&rsquo;s smart history.</li>
<li><code>βŒ₯+SPACE</code> is my iTerm hotkey, an overlay window that appears out of nowhere. Always access to the command line!</li>
<li>In combination with Alfred: <code>⌘+SPACE</code>, <code>&gt;</code> to quickly output anything to cmd.</li>
</ul>
<p>Things like a built-in password manager, badges, image integration and clipboard managing are less useful for me, since I use other tools that work outside of a shell. I&rsquo;m still discovering new features and it&rsquo;s impossible to list them all here.</p>
<p><figure>
<a href="../icon-alfred.png#right" class="lbox">
<img loading="lazy" src="../icon-alfred.png#right" >
</a>
</figure>
</p>
<p>Another saying: <em>search trumps navigation</em>. Don&rsquo;t use Finder to click through all directories if you know what you&rsquo;re looking for: let the tools do the work for you. Remember Google&rsquo;s clean and simple search UI? There&rsquo;s one single input box: type and thou shall find. I cannot recount the number of times I&rsquo;ve pressed <code>CTRL+SHIFT+T</code> in Eclipse in my life, or <code>⌘+O</code> in IntelliJ. Why limiting yourself to only use these search tools inside a specific code editor, when you can have it across your Mac?</p>
<p>That&rsquo;s right, I&rsquo;m not talking about Spotlight but about <a href="https://www.alfredapp.com/">Alfred</a> that hijacked Spotlight&rsquo;s <code>⌘+SPACE</code> shortcut on my laptop. I&rsquo;ve never given it much thought until yesterday, but that small application might just as well be the best productivity boosting tool I&rsquo;ve used in years. The possibilities with Alfred are endless. Things I use:</p>
<ul>
<li>The clipboard history. Bye bye, Clipy - we&rsquo;ve had a good run!</li>
<li>Custom web searches: <code>gr</code> for a quick Goodreads lookup, <code>sc</code> for Google Scholar, <code>yt</code> for YouTube, &hellip; Remember the coolness of these quick searches in your shiny Google Chrome browser back in 2013? Well&hellip;</li>
<li>Snippets. Typing <code>bbblog</code> (Brain Baking Blog) <em>anywhere</em> pastes a Markdown snippet to start writing a new blog article, including my pre-set front matter and filled in date.</li>
<li>Workflows. Oh boy, where to begin?
<ul>
<li><code>tr</code> to quickly translate from Dutch to English when I&rsquo;m writing a paper (<a href="https://github.com/xfslove/alfred-google-translate">alfred-google-translate</a>).</li>
<li><code>pows</code> to quickly find a synonym using the Power Thesaurus when I&rsquo;m writing a paper (<a href="https://github.com/clarencecastillo/alfred-powerthesaurus">alfred-powerthesaurus</a>).</li>
<li><code>mdn</code> or <code>vue</code> to quickly find developer documentation of a JavaScript method in MDN or the VueJS docs. There are countless workflows like these!</li>
<li><code>dnt</code> to quickly look up something in DEVONthink.</li>
</ul>
</li>
</ul>
<p>You might have noticed the increased usage of the word <em>quickly</em>. I have the feeling that I only barely scratched the surface of Alfred. Oh, and it&rsquo;s <em>faster</em> than Spotlight, even for bootstrapping basic applications.</p>
<p><figure>
<a href="../alfred-demo.gif" class="lbox">
<img loading="lazy" src="../alfred-demo.gif" title="Accelerate your Workflow. From the alfred-powerthesaurus repo.">
</a>
<figcaption>Accelerate your Workflow. From the alfred-powerthesaurus repo.</figcaption>
</figure>
</p>
<h3 id="2-focus">2. Focus</h3>
<blockquote>
<p>The higher level of concentration, the denser the ideas. <span>Neal Ford</span></p>
</blockquote>
<p>This section of the book is a toned-down version of Cal Newport&rsquo;s <a href="https://www.goodreads.com/book/show/25744928-deep-work?from_search=true&amp;from_srp=true&amp;qid=sGwpE3mzlh&amp;rank=1">Deep Work</a>. He shows that tools like TweakUI for Windows XP (Hah! Remember that?) can de-clutter your Windows setup, creating more room in your head for actual ideas. Use virtual desktops, use <em>Distraction Free Modes</em>, such as Sublime Text&rsquo;s <code>⇧+⌘+βŒ₯+F</code>.</p>
<p>Speaking of de-cluttering: I try to reduce the amount of visible icons in the top right menu bar as much as possible. I&rsquo;ve seen Mac owners that install a bunch of tools that eat up so many clean menu space that the program menu and the icons almost touch each other. Horrible. Having more stuff on screen makes me anxious and reduces my productivity, instead of increasing it. The Spotlight search icon and Alfred hat can be hidden (check). Things I regularly use are kept visible, such as a dedicated Bluetooth icon. In Big Sur, I also re-enabled the visible percentage of battery life.</p>
<p>An ex-colleague of mine used the Pomodoro technique and installed a small application that reminds him when to take a break and when to push on. Of course, you could track all these things and have it draw fancy graphs for you to marvel at (how bad you did that day). There is a plethora of apps for this at your disposal, but I personally never used any.</p>
<h3 id="3-automation">3. Automation</h3>
<blockquote>
<p>Don&rsquo;t Repeat Yourself (DRY)!<span>Neal Ford</span></p>
</blockquote>
<p><em>&ldquo;Can I script that?&quot;</em> should be the first thing that springs into your mind when you&rsquo;re doing something for the second time. Use <a href="https://ifttt.com/">IFTTT</a>, automate RSS filtering (or let Feedly do this for you). However, don&rsquo;t make the mistake of reinventing the wheel!</p>
<p>Another thing Neal was advocating for: use a <em>real</em> programming language when scripting. You never know when that <em>jig</em> will turn out to be a permanent part of your development cycle. If that is the case, it will get expanded. If that is the case, it better damn well be easily unit-testable!</p>
<p><figure>
<a href="../icon-firefox.png#right" class="lbox">
<img loading="lazy" src="../icon-firefox.png#right" >
</a>
</figure>
</p>
<p>In 2010, Selenium and WebDriver was thΓ© tool to automate your browser, and to write acceptance tests with. Nowadays, we have <a href="https://www.cypress.io/">Cypress</a> and others that are gaining popularity. One thing that struck me in that Devoxx presentation was, why limit the usage of these tools to your workday? They can also be useful to automate mundane things such as form completions - outside of the enterprise application you&rsquo;re working on. <a href="https://www.tampermonkey.net/scripts.php">Tampermonkey</a> and <a href="https://monkeyscripts.org/">MonkeyScripts</a> also fall into this category.</p>
<p>Think about it - how many hours a day do you spend on a computer? I bet 80% of that time, you have at least one tab open in a browser, looking for something (shady?). Do not overlook your browser habits when thinking about automation. A recent one I discovered myself lately: in Firefox, there&rsquo;s a &ldquo;<a href="https://support.mozilla.org/en-US/kb/accessibility-features-firefox-make-firefox-and-we?redirectslug=Accessibility&amp;redirectlocale=en-US">search for text</a> as you start typing&rdquo; option that allows me to completely omit pressing <code>⌘+F</code>.</p>
<h3 id="4-canonicality">4. Canonicality</h3>
<p>Don&rsquo;t throw away binaries: (automatically) archive artifacts instead. Leverage continuous integration and deployment techniques, and device principles when thinking about your own workflow. Use virtualization, also back up your <em>configuration</em>: config is code!</p>
<p>To me, not only configuration, but also <em>documentation</em> is code:</p>
<blockquote>
<p>Out-of-date documentation is worse than none because it is actively misleading.<span>Neal Ford</span></p>
</blockquote>
<p>This is the single best reason to completely ditch (manually adding) Javadoc. Use tools like <a href="https://swagger.io/">Swagger</a> to create and automatically maintain your API documentation. Am I boring you by repeating words like <em>auto</em>?</p>
<h2 id="b-practice-your-editor">B. Practice: your Editor</h2>
<p><em>Learn to get to know your tools.</em> Do not just &ldquo;use&rdquo; them - understand them, click through all menus, write down the shortcuts, and try to learn one (of an action you of course actually use) very day. This isn&rsquo;t limited to just your (code) editor!</p>
<p><figure>
<a href="../icon-sublime.png#right" class="lbox">
<img loading="lazy" src="../icon-sublime.png#right" >
</a>
</figure>
</p>
<p>Talking about editors: pick one and dive deep - it&rsquo;s as simple as that. Editors come and go, but Vi and Emacs will probably stay forever, so both are a solid choice - if you can muster chewing through thick guides and a <em>very</em> steep learning curve. In 2012, I gave up on Vi (sorry, I&rsquo;m a softie) and bought <a href="https://www.sublimetext.com/">Sublime Text</a> together with my first MacBook - probably the best decisions I&rsquo;ve made that year. Sublime is available on any platform. Funnily enough, eight years later, I&rsquo;m still learning new Sublime tricks. Admittedly, it takes a lot of effort to deliberately learn new things when actually you want to concentrate at the task at hand. A few recent things I&rsquo;ve learned:</p>
<ul>
<li><code>⌘+B</code> to build a Markdown file using Pandoc and a custom Makefile.</li>
<li><code>^+⌘+T</code> as a custom shortcut that opens a new tab in the current path using the Terminus plugin. Thanks, <a href="https://www.youtube.com/watch?v=mV0ghkMwTQc">OdatNurd</a>!</li>
<li><code>⌘+R</code> (Go To Resource) also works with <a href="https://github.com/SublimeText-Markdown/MarkdownEditing">MarkdownEditing</a> and allows you to quickly jump to certain sections in your paper text.</li>
<li><code>βŒ₯+⌘+V</code> in MarkdownEditing auto-creates a <code>[](link-from-clipboard)</code> nippet.</li>
<li>There are also snippets in here, although I use Alfred for that.</li>
</ul>
<p>And of course, the well-known <code>⇧+⌘+P</code> Command Palette that seems to be commonplace now - great! I also try to remap keys in other tools to resemble the ones I know by heart. This means less confusing and learning, and more time to focus on content.</p>
<p>Although I really, really, should take more time to thoroughly learn Sublime!</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 13 January 2021.
</p>
]]>
</description>
</item>
<item>
<title>RSS Feeds, Hugo, and Lazy Image Loading</title>
<link>https://brainbaking.com/post/2021/01/hugo-rss-feeds-and-lazy-image-loading/</link>
<comments>https://brainbaking.com/post/2021/01/hugo-rss-feeds-and-lazy-image-loading/#commento</comments>
<pubDate>Tue, 05 Jan 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/01/hugo-rss-feeds-and-lazy-image-loading/</guid>
<category>hugo</category>
<category>rss</category>
<category>lazy image loading</category>
<category>lazy loading</category>
<category>rss images</category>
<category>hugo rss images</category>
<category>hugo noscript</category>
<description>
<![CDATA[
<h2 id="full-rss-content-in-hugo">Full RSS Content in Hugo</h2>
<p>Just a quick one I wanted to get out there in case you are, like me, using <a href="/post/2020/05/hugo-extended/">Hugo</a> to power a blog. Apparently, in 2017, the default <a href="https://discourse.gohugo.io/t/full-text-rss-feed/8368/3">behavior changed</a> from using the <code>.Content</code> to the <code>.Summary</code> variable in the default <a href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/rss.xml">rss.xml</a>.</p>
<hr>
<p><strong>Update, 12 March 2021</strong>: This article officially became obsolete! Just use <code>loading=&quot;lazy&quot;</code> - a lot less complicated and already <a href="/notes/2021/03/12h18m06s14/">decent browser support</a>. Yay for upgrades!</p>
<hr>
<p>What&rsquo;s the big deal? I had no idea, until I started using a proper RSS reader today - the open source <a href="https://ranchero.com/netnewswire/">NetNewsWire</a> for Mac. This is what your RSS feed will look like:</p>
<p><figure>
<a href="../netnewswire.jpg" class="lbox">
<img loading="lazy" src="../netnewswire.jpg" title="My Apple M1 article in an RSS reader. Where&#39;s all the text?">
</a>
<figcaption>My Apple M1 article in an RSS reader. Where&#39;s all the text?</figcaption>
</figure>
</p>
<p>The above screenshot might mislead you into thinking I simply captured only a part - I did not. That&rsquo;s the <code>.Summary</code>, right there. Since reading all &ldquo;the news&rdquo; in one place sounds intriguing, and I&rsquo;d like other visitors to enjoy my <em>full</em> blog posts in these tools too, I&rsquo;d have to change the default behavior. That can be easily done by copy-pasting the default into <code>layouts/_default/rss.xml</code> and altering it to your liking - such as swapping <code>.Summary</code> for <code>.Content</code>.</p>
<p>However, that brings us to to problem number two.</p>
<h2 id="lazy-loading-and-rss-feeds">Lazy loading and RSS Feeds</h2>
<p>Recently, after trying to maximize my <a href="https://developers.google.com/web/tools/lighthouse/">Lighthouse</a> score, especially on performance levels, I implemented <a href="https://github.com/aFarkas/lazysizes">lazysizes</a>, a simple solution to lazy load <code>&lt;img/&gt;</code> tags, thereby reducing the critical path for a single page to load. That requires a custom <code>render-image.html</code> (only available when using the Goldmark Markdown renderer) in <code>_default/_markup/</code> that looks like this:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">&lt;<span style="color:#434f54">figure</span>&gt;
&lt;<span style="color:#434f54">a</span> <span style="color:#434f54">href</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;{{ .Destination | safeURL }}&#34;</span> <span style="color:#434f54">class</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;lbox&#34;</span>&gt;
&lt;<span style="color:#434f54">noscript</span>&gt;
&lt;<span style="color:#434f54">img</span> <span style="color:#434f54">src</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;{{ .Destination | safeURL }}&#34;</span> <span style="color:#a61717">{{</span> <span style="color:#434f54">with</span> <span style="color:#a61717">.</span><span style="color:#434f54">Text</span> <span style="color:#a61717">}}</span> <span style="color:#434f54">alt</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;{{ . }}&#34;</span><span style="color:#a61717">{{</span> <span style="color:#434f54">end</span> <span style="color:#a61717">}}</span> <span style="color:#a61717">{{</span> <span style="color:#434f54">with</span> <span style="color:#a61717">.</span><span style="color:#434f54">Title</span><span style="color:#a61717">}}</span> <span style="color:#434f54">title</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;{{ . }}&#34;</span><span style="color:#a61717">{{</span> <span style="color:#434f54">end</span> <span style="color:#a61717">}}</span>&gt;
&lt;/<span style="color:#434f54">noscript</span>&gt;
&lt;<span style="color:#434f54">img</span> <span style="color:#434f54">class</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;lazyload&#34;</span> <span style="color:#434f54">data-src</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;{{ .Destination | safeURL }}&#34;</span> <span style="color:#a61717">{{</span> <span style="color:#434f54">with</span> <span style="color:#a61717">.</span><span style="color:#434f54">Text</span> <span style="color:#a61717">}}</span> <span style="color:#434f54">alt</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;{{ . }}&#34;</span><span style="color:#a61717">{{</span> <span style="color:#434f54">end</span> <span style="color:#a61717">}}</span> <span style="color:#a61717">{{</span> <span style="color:#434f54">with</span> <span style="color:#a61717">.</span><span style="color:#434f54">Title</span><span style="color:#a61717">}}</span> <span style="color:#434f54">title</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;{{ . }}&#34;</span><span style="color:#a61717">{{</span> <span style="color:#434f54">end</span> <span style="color:#a61717">}}</span>&gt;
&lt;/<span style="color:#434f54">a</span>&gt;
{{ with .Title }}
&lt;<span style="color:#434f54">figcaption</span>&gt;{{ . }}&lt;/<span style="color:#434f54">figcaption</span>&gt;
{{ end }}
&lt;/<span style="color:#434f54">figure</span>&gt;
</code></pre></div><p>Do not forget the <code>&lt;noscript/&gt;</code> tag in case JavaScript is disabled or the visitor will not see any images!<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Same goes for the RSS feed: your <code>index.xml</code> that NetNewsWire loads will see an image tag, but not a <code>src</code> attribute. To fix that, I replaced the content, like so:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">{{ $lazyLoadImg := &#34;&lt;<span style="color:#434f54">img</span> <span style="color:#434f54">class</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">\&#34;lazyload\&#34;</span> <span style="color:#434f54">data-src</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34; }}
</span><span style="color:#7f8c8d">{{ $eagerLoadImg := &#34;</span><span style="color:#a61717">&lt;</span><span style="color:#434f54">img</span> <span style="color:#434f54">src</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;</span> <span style="color:#a61717">}}</span>
<span style="color:#a61717">{{</span> <span style="color:#a61717">$</span><span style="color:#434f54">content</span> <span style="color:#434f54">:</span><span style="color:#728e00">=</span> <span style="color:#7f8c8d">.Content</span> <span style="color:#a61717">|</span> <span style="color:#434f54">replaceRE</span> <span style="color:#a61717">$</span><span style="color:#434f54">lazyLoadImg</span> <span style="color:#a61717">$</span><span style="color:#434f54">eagerLoadImg</span> <span style="color:#a61717">|</span> <span style="color:#434f54">safeHTML</span> <span style="color:#a61717">}}</span>
<span style="color:#a61717">&lt;</span><span style="color:#434f54">description</span>&gt;
{{ $content }}
]]&gt;
&lt;/<span style="color:#434f54">description</span>&gt;
</code></pre></div><p>I know the documentation mentions <code>render-image.rss.xml</code> as a separate RSS renderer, but it <a href="https://discourse.gohugo.io/t/how-does-render-image-rss-xml-work/29935">as reported</a> before, it currently does not work (v0.79.1).</p>
<p><strong>Update, 9 Jan. 2021</strong>: It seems that the RSS reader <a href="https://feedly.com/">Feedly</a> processes <code>&lt;noscript/&gt;</code> tags, resulting in two displayed images instead of one. Another <code>replaceRE</code> to replace the tag fixes that, although it&rsquo;s starting to get messy&hellip;</p>
<h2 id="featured-images-in-rss-feeds">Featured images in RSS feeds</h2>
<p>I still wasn&rsquo;t satisfied. Some blog posts use a &ldquo;big image&rdquo; (or &ldquo;featured image&rdquo; masthead), that is part of the article header, and is currently not shown in the RSS reader. After inspecting the RSS specifications, it seems that a <code>&lt;img/&gt;</code> tag in the description is the only way to do it (provided a <code>CDATA</code> wrapper is present), as opposed to twitter cards that have a dedicated tag for this. So, the above description tag was extended, and now looks like this:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">&lt;<span style="color:#434f54">description</span>&gt;
{{ `<span style="color:#728e00">&lt;![CDATA[ ` | safeHTML }}
</span><span style="color:#728e00"> {{ if .Params.bigimg }}
</span><span style="color:#728e00"> &lt;p&gt;
</span><span style="color:#728e00"> &lt;img hspace=&#34;5&#34; src=&#34;{{ $baseurl }}bigimg/{{ .Params.bigimg }}&#34;/&gt;
</span><span style="color:#728e00"> &lt;/p&gt;
</span><span style="color:#728e00"> {{ end }}
</span><span style="color:#728e00">
</span><span style="color:#728e00"> {{ $content | safeHTML }}
</span><span style="color:#728e00"> ]]&gt;</span>
&lt;/<span style="color:#434f54">description</span>&gt;
</code></pre></div><p>Let&rsquo;s inspect the changes with our RSS reader:</p>
<p><figure>
<a href="../netnewswire2.jpg" class="lbox">
<img loading="lazy" src="../netnewswire2.jpg" title="Yes, a featured image and the rest of the text!">
</a>
<figcaption>Yes, a featured image and the rest of the text!</figcaption>
</figure>
</p>
<p>Scrolling down also reveals properly loaded images, hooray! Do not forget to add feed metadata to the <code>&lt;header/&gt;</code> tag so that NetNewsWire can automatically detect the location of your RSS feed:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">&lt;<span style="color:#434f54">link</span> <span style="color:#434f54">href</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;{{ .RelPermalink }}&#34;</span> <span style="color:#434f54">rel</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;alternate&#34;</span> <span style="color:#434f54">type</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;application/rss+xml&#34;</span> <span style="color:#434f54">title</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;Brain Baking&#34;</span> /&gt;
&lt;<span style="color:#434f54">link</span> <span style="color:#434f54">href</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;{{ .RelPermalink }}&#34;</span> <span style="color:#434f54">rel</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;feed&#34;</span> <span style="color:#434f54">type</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;application/rss+xml&#34;</span> <span style="color:#434f54">title</span><span style="color:#728e00">=</span><span style="color:#7f8c8d">&#34;Brain Baking&#34;</span> /&gt;
</code></pre></div><p><a href="/subscribe">Enjoy my RSS feeds</a>!</p>
<section class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1" role="doc-endnote">
<p>Try it your for yourself by disabling JS in your browser. Your blog should be accessible to anyone - no CSS, no JS, <a href="/post/2020/06/designing-with-accessibility-in-mind/">accessibility options</a> - try to include everyone. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</section>
<p>
By <a href="/about">Wouter Groeneveld</a> on 5 January 2021.
</p>
]]>
</description>
</item>
<item>
<title>Digitizing journals using DEVONthink</title>
<link>https://brainbaking.com/post/2021/01/digitizing-journals-using-devonthink/</link>
<comments>https://brainbaking.com/post/2021/01/digitizing-journals-using-devonthink/#commento</comments>
<pubDate>Fri, 01 Jan 2021 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2021/01/digitizing-journals-using-devonthink/</guid>
<category>devonthink</category>
<category>digitizing journals</category>
<category>digitalizing journals</category>
<category>from evernote to devonthink</category>
<category>scanning journals</category>
<category>tagging journals</category>
<category>scanning hand-written journals</category>
<description>
<![CDATA[
<p>
<img align="left" hspace="5" src="https://brainbaking.com/bigimg/devonexport.jpg"/>
</p>
<p>In 2017, I wrote a practical <a href="post/2017/07/journaling-in-practice/">guide to keeping a journal</a>, which also contained a digitalizing part involving Evernote. Since then, a few things happened that ultimately made me close my Evernote account for good, and resort to other methods I&rsquo;d like to explain here.</p>
<h2 id="why-i-quit-evernote">Why I Quit Evernote</h2>
<h3 id="1-privacy-and-security">1. Privacy and Security</h3>
<p>The primary reason to quit Evernote was taking back control of my own data. I don&rsquo;t want to throw my whole life on &ldquo;the cloud&rdquo; anymore - even if it&rsquo;s encrypted at rest on Google Cloud servers - to which I do not have any key, by the way. Oh, and
<a href="https://lifehacker.com/evernote-employees-can-read-your-notes-and-theres-no-w-1790099958">Evernote employees can read your notes</a>? I&rsquo;ve also heard stories of disappearing notes. Although that never happened here, it&rsquo;s kind of scary.</p>
<p>So, I purposely looked for a <strong>decentralized</strong> solution that does <em>not</em> force me to store my very personal data somewhere else besides on my own hardware. With DEVONthink, you can still sync between multiple devices using Dropbox, with client-side encryption. Making backups is a simple matter of zipping a single directory, and doing whatever the hell I want with it. The note database can also be encrypted, although I simply rely on <a href="https://support.apple.com/en-us/HT204837">FileVault</a>&rsquo;s disk encryption instead.</p>
<h3 id="2-functionality">2. Functionality</h3>
<p>DEVONthink has so many bells and whistles that it is impossible for me to list them here. Take a look at <a href="https://www.devontechnologies.com/apps/devonthink">the official website</a>. Of course, if you&rsquo;re a minimalist, that can also be a bad thing. Luckily, most features are discrete and the main UI is clean and can be customized to your liking. A few things I particularly liked, compared to the Evernote OSX application:</p>
<ul>
<li>Proper Markdown support, custom CSS, WikiLinks, &hellip;</li>
<li>Smart AI that suggests related notes.</li>
<li>A scriptable interface using AppleScript (not great, but it works)</li>
<li>Smart Rules that lets you auto-tag, move, rename, &hellip;</li>
</ul>
<h3 id="3-speed">3. Speed</h3>
<p>DEVONthik is <em>blazingly fast</em> on my <a href="/post/2020/12/developing-on-apple-m1-silicon/">M1 MacBook Air</a>. It literally takes a single second to boot, while the Electron-based Evernote app takes its sweet time. By then, I&rsquo;m over the <em>&ldquo;quickly, jot that down or I&rsquo;ll lose it!&quot;</em> pattern. Okay, that&rsquo;s a lie, I only take notes in my analog journal, but still.</p>
<h3 id="disatvantages-of-devon-tech">Disatvantages of DEVON Tech.</h3>
<ul>
<li><strong>It&rsquo;s expensive</strong>. True, but it&rsquo;s a <em>one-time</em> cost, not a yearly one! With Evernote increasing its prices to <code>$7</code> a month, after two years you&rsquo;ve almost covered the Pro edition. However, what I actually like about the price is that it forces me to <em>actually make use of it</em>. After all, I paid quite a bit of money (at once) on a single product. Better make the most of it, then!</li>
<li><strong>You&rsquo;re limited to Mac tech</strong>. Also true. Although I don&rsquo;t mind, I do wish I had an iPhone right now, because DEVONthink To Go is not available for Android, and that does sting. Avoiding vendor lock-in is important, especially as you want your note-taking system to last preferably your entire life. Export options are plenty, and notes are simply files in folders.</li>
</ul>
<h2 id="migrating-from-evernote-to-devonthink">Migrating from Evernote to DEVONthink</h2>
<p>My Evernote journal stack was easily exported into a weird <code>.enex</code> format that turned out to contain a simple XML structure. A few <a href="https://gist.github.com/evernotegists/6134552">parsing gists</a> helped me cook up a script to automatically import this data into DEVONthink. Yes, there&rsquo;s a Import menu, but it requires Evernote to be installed, and by then, my account as already closed.</p>
<p>The <a href="https://discourse.devontechnologies.com/t/easy-capture-of-pdf-from-web/4137/3">DEVON community</a> helped with tips on <a href="http://myproductivemac.com/blog/devon-think-part-3-importing-and-indexing14102015">importing</a> and <a href="https://wp.honekamp.net/2019/01/04/automate-storing-of-images-with-pythonista-and-devonthink/">image importing</a>, and I ended up with a Python script that combines AppleScript (using <a href="https://pypi.org/project/appscript/">appscript</a>, which is deprecated and &ldquo;unsupported&rdquo;, but still works on Big Sur) to command DEVONthink and raw python to parse the XML structure:</p>
<div class="highlight"><pre style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python"> <span style="color:#434f54">journaldb</span> <span style="color:#728e00">=</span> <span style="color:#434f54">self</span><span style="color:#728e00">.</span><span style="color:#434f54">devon</span><span style="color:#728e00">.</span><span style="color:#434f54">create_record_with</span>({<span style="color:#434f54">k</span><span style="color:#728e00">.</span><span style="color:#434f54">type</span>:<span style="color:#434f54">k</span><span style="color:#728e00">.</span><span style="color:#434f54">group</span>,<span style="color:#434f54">k</span><span style="color:#728e00">.</span><span style="color:#434f54">name</span>: <span style="color:#434f54">filename</span><span style="color:#728e00">.</span><span style="color:#434f54">replace</span>(<span style="color:#7f8c8d">&#34;.enex&#34;</span>, <span style="color:#7f8c8d">&#34;&#34;</span>)},<span style="color:#434f54">in_</span><span style="color:#728e00">=</span><span style="color:#434f54">db</span>)
<span style="color:#434f54">self</span><span style="color:#728e00">.</span><span style="color:#434f54">devon</span><span style="color:#728e00">.</span><span style="color:#434f54">create_record_with</span>({<span style="color:#434f54">k</span><span style="color:#728e00">.</span><span style="color:#434f54">type</span>:<span style="color:#434f54">k</span><span style="color:#728e00">.</span><span style="color:#434f54">picture</span>, <span style="color:#434f54">k</span><span style="color:#728e00">.</span><span style="color:#434f54">tags</span>: <span style="color:#434f54">tags</span>, <span style="color:#434f54">k</span><span style="color:#728e00">.</span><span style="color:#434f54">name</span>: <span style="color:#434f54">title</span>, <span style="color:#434f54">k</span><span style="color:#728e00">.</span><span style="color:#434f54">data</span>: <span style="color:#434f54">url</span>},<span style="color:#434f54">in_</span><span style="color:#728e00">=</span><span style="color:#434f54">journaldb</span>)
</code></pre></div><p>In order to pass the URL, the Base64-encoded image data from the <code>.enex</code> export is first copied to a local file. The full gist code is <a href="https://gist.github.com/wgroeneveld/25139d401840bbfd65e0152a5791ba3f">available here</a>.</p>
<h2 id="how-to-digitize-hand-written-journals">How to Digitize Hand-written Journals</h2>
<h3 id="1-scanning">1. Scanning</h3>
<p>Since the Android Evernote scanner app - which worked quite well, to be honest - isn&rsquo;t an option for me anymore, I needed to find another way to efficiently digitize my stuff. After reading <a href="http://www.markwk.com/digitalize-paper-journals.html">Mark Koester&rsquo;s guide</a> on digitalizing journals with a scanner app, I decided to give <a href="https://www.thegrizzlylabs.com/genius-scan">Genius Scan</a> a try. Others I&rsquo;ve tried are Adobe Scan (requires login, nope!) and Smart Doc Scanner (too clumsy to quickly scan multiple pages).</p>
<p>Scanning an entire journal (240 pages) took <code>20</code>min. However, the app only managed to identify and properly cut the pages about <code>30%</code> of the time, and regularly rotates scans even though I don&rsquo;t want that. I do like writing with a lot of colors, pasting pieces of cut-out papers and images in-between. That might have confused it. Furthermore, the quality of the scans themselves isn&rsquo;t great (even after selecting the <em>&ldquo;Highest&rdquo;</em> image quality), compared to the scans made by the Evernote app. I&rsquo;m not sure whether I can recommend it, but it&rsquo;s the best of the worst. I tried both scanning single pages and two pages at once (by opening up the journal) and the latter worked much better.</p>
<p>Although Genius Scan quickly lets you create a single PDF document for each journal, I don&rsquo;t want a <em>single</em> file: I want separate files for each page to tag in DEVONthink. No problem: after transferring the PDF to your workstation, use ImageMagick: <code>convert -density 150 journal.pdf -quality 90 journal.jpg</code> creates <code>journal-i.jpg</code> for each page (<code>48</code>s for 248 pages on the <a href="/post/2020/12/developing-on-apple-m1-silicon/">Apple M1</a> - <code>300</code>dpi creates blown-up <code>4</code>MB files that I don&rsquo;t need). Then, simply drag these into DEVONthink after creating a new group for the journal and the painful tagging process can begin&hellip;</p>
<p>As for note names, I used the pattern <code>#XPYYY</code> where <code>X</code> was the journal index and <code>YYY</code> was the page number. A very handy feature of DEVONthink is the <em>Automatic WikiLinks</em> one that creates linkks to journal pages if you mention them in a note. This does not work if a note starts with a hashtag. I converted these using the Script - Rename - Rename using RegEx menu. Do <em>not</em> rename them on disk: this will corrupt your note DB. I simply replaced <code>#</code> with <code>b</code> (for &ldquo;book&rdquo;). I&rsquo;ve seen others use a timestamp in their filename, but that makes linking even more difficult.</p>
<p><figure>
<a href="../devon-wikilink.jpg" class="lbox">
<img loading="lazy" src="../devon-wikilink.jpg" title="Autocompleting links to journal pages in Markdown.">
</a>
<figcaption>Autocompleting links to journal pages in Markdown.</figcaption>
</figure>
</p>
<h3 id="2-tagging">2. Tagging</h3>
<p><em>Fast</em> tagging is an art. With DEVONtink and a bit of shortcut trickery, you&rsquo;ll do just fine. Select a scanned picture. Click on &ldquo;Tags&rdquo; on the right and add some. Press Enter. Use <code>CTRL+TAB</code> and <code>DOWN</code> to quickly go to the next. If you didn&rsquo;t touch your trackpad, just click again to re-enter the next set of tags. I usually browse through the same physical journal in case I feel like re-reading or the scanned image is a bit blurry. This process takes about <code>1.5</code>hrs per journal. A few more tips:</p>
<ul>
<li>If you&rsquo;re obsessed about structure: DEVONthink supports hierarchical tags.</li>
<li>Don&rsquo;t overdo it. I used to tag way too much, or use too fine-grained things. If you, like me, use tags primarily to quickly <em>find</em> stuff, be mindful of the name and amount.</li>
</ul>
<h3 id="3-other-metadata">3. Other metadata</h3>
<p>With Evernote, I <a href="(post/2017/07/journaling-in-practice/)">used to annotate</a> each individual note with the correct date as appearing on the physical paper. I stopped doing that because it takes too much time, and it is irrelevant: either the date stamp, positioned in a corner, is also scanned, or I can deduce the period by simply looking at the <em>Location</em>: each group is labeled as follows:</p>
<pre><code>Book XX MMYYYY - MMYYYY
</code></pre><p>Where <code>XX</code> is a simple serial number and both dates denote the beginning and ending period of that particular notebook. If, for some reason, that still isn&rsquo;t enough, I simply locate the physical copy and look at that one instead. For me, the digital versions are never meant to replace the originals: they are merely there as a backup and a quick way to find notes.</p>
<p><figure>
<a href="../devon-notes.jpg" class="lbox">
<img loading="lazy" src="../devon-notes.jpg" title="Tags (left), Journals (Middle), selected Page and tags (right).">
</a>
<figcaption>Tags (left), Journals (Middle), selected Page and tags (right).</figcaption>
</figure>
</p>
<p>If that is not enough for you, DEVONthink offers the ability to add custom metadata fields.</p>
<h2 id="so-im-a-devonthinker-now-whats-next">So I&rsquo;m a DEVONthinker now. What&rsquo;s next?</h2>
<p>Customize your setup. Browse through online DEVONthink <a href="http://myproductivemac.com/blog/making-devonthink-and-hazel-play-nicely1522017">productivity tips</a>. Read Stefan Imhoff&rsquo;s <a href="https://www.stefanimhoff.de/zettelkasten-note-taking-devonthink/">Zettelkasten Note-taking Method</a> with DEVONthink. I&rsquo;m far from a note-taking ninja myself, and it&rsquo;s very inspiring to read how others tackle this. As he put it:</p>
<blockquote>
<p>Putting notes into folders is the beginners’ approach.</p>
</blockquote>
<p>The Zettelkasten method basically equals to the practice of <em>non-linear note-taking</em>:</p>
<ol>
<li>You take notes. Good, but not great.</li>
<li>You also tag notes. Better, as it groups them into clusters, but still not great.</li>
<li>You create links between tags/notes. Congrats, you&rsquo;re <em>zettlekast</em>-ing!</li>
</ol>
<p>Remember, digitizing your journal is <em>only the beginning</em>. So we&rsquo;re officially a note-taking newbie now. On to level 2!</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 1 January 2021.
</p>
]]>
</description>
</item>
<item>
<title>Programming on the Apple M1 Silicon</title>
<link>https://brainbaking.com/post/2020/12/developing-on-apple-m1-silicon/</link>
<comments>https://brainbaking.com/post/2020/12/developing-on-apple-m1-silicon/#commento</comments>
<pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2020/12/developing-on-apple-m1-silicon/</guid>
<category>m1 programming</category>
<category>apple m1 development</category>
<category>m1 apple java</category>
<category>m1 jdk</category>
<category>apple m1 gradle</category>
<category>big sur productivity tools</category>
<category>java arm64</category>
<category>netbeans m1 apple</category>
<category>intellij m1 apple</category>
<category>gba m1 apple</category>
<category>arduino m1 apple</category>
<category>go m1 apple</category>
<category>python m1</category>
<category>hugo m1 apple</category>
<category>pandoc m1 apple</category>
<category>mactex m1 apple</category>
<category>javascript m1 apple</category>
<category>javascript arm64</category>
<description>
<![CDATA[
<p>
<img align="left" hspace="5" src="https://brainbaking.com/bigimg/macbookairs.jpg"/>
</p>
<p>Ever since I read Kay Singh&rsquo;s Apple Silicon M1: <a href="https://singhkays.com/blog/apple-silicon-m1-black-magic/">Black. Magic. Fuckery</a> article, I couldn&rsquo;t stop wanting one. My 2012 MacBook Air was in need of a replacement, and although still <em>very</em> serviceable for a 8+year old laptop, not upgrading OSX and a shortened battery lifespan were getting irritating. So, Santa (well, you know) bought me a M1 2020 MacBook Air. At first, I wanted to hold off for a while, after many of the developer tools I use were officially supporting ARM64. But hey, what the heck.</p>
<p>As there&rsquo;s not a lot of information out there on the M1 from a developers perspective, except <a href="https://steipete.com/posts/apple-silicon-m1-a-developer-perspective/">a few</a> <a href="https://medium.com/before-semicolon/is-m1-mac-worthy-or-good-for-developers-developer-review-3ed832f4105e">other blogs</a> here <a href="https://codetober.com/software-development-on-the-new-m1-macbook-pro-13/">and there</a>, I wanted to chime in and share my initial findings. Bear in mind that this will very likely change in the near future, as many developers are starting to support the new architecture. An interesting site to check whether your software works is <a href="https://isapplesiliconready.com/">isapplesiliconready.com</a> and <a href="https://doesitarm.com/kind/developer-tools/">doesitarm.com</a> - although these are not always up to date and sometimes provides false information! Be sure to go after the source yourself.</p>
<p>Whatever you do, be sure to upgrade Big Sur to <code>11.1</code> first - that will take a while (and eat up more HDD space). I went with the <code>512GB</code> Air version with eight cores. I don&rsquo;t care about CPU throttling - even with the 25% performance hit, it still outperforms heavyweight Intel MacBook Pros!</p>
<h2 id="productivity-tools">Productivity tools</h2>
<p>Before getting to the programming part, let&rsquo;s take a look at the basic tools I couldn&rsquo;t live without. First, install <strong><a href="https://iterm2.com/">iTerm 2</a></strong>. It&rsquo;s already M1-ready, and Big Sur moved from Bash to Zsh, another good shell I still know from my Gentoo days. Check out technofob.com&rsquo;s <a href="https://technofob.com/2020/12/24/the-ultimate-mac-m1-terminal-iterm2-oh-my-zsh-zsh-syntax-highlighting/">oh-my-zsh config</a> for colors and such, and maybe add <a href="https://gist.github.com/knadh/123bca5cfdae8645db750bfb49cb44b0">extras</a> in your <code>~.zsh</code>.</p>
<p>Now that you have a shell, we need cmdline stuff. The master branch of Homebrew is ARM64-complaint and you can <a href="https://soffes.blog/homebrew-on-apple-silicon">install two homebrews</a> for the bottles that are still lagging behind - or compile them from source using <code>brew install --build-from-source</code>. I&rsquo;ve successfully built these from source: sqlite, openssh, python3.9, imagemagick. I set up the M1 homebrew version in <code>/opt/homebrew</code> - and so far, every installation didn&rsquo;t need a Rosetta alternative - yet. (Heads up: <a href="https://github.com/Homebrew/discussions/discussions/285">unrar is gone</a>! See link for alternate formula.)</p>
<p>A few other critical pieces of software:</p>
<p>Already running native:</p>
<ul>
<li>The <a href="https://brave.com/">Brave</a> nightly build. Most Chromium-based browsers work.</li>
<li><a href="https://rectangleapp.com/">Rectangle</a>, the upgraded Spectacle one.</li>
<li><a href="https://www.alfredapp.com/">Alfred</a> - of course! I became a convert after fiddling with it, replacing Spotlight and Clipy (see below).</li>
</ul>
<p>Still on Rosetta - but development on the way:</p>
<ul>
<li><a href="https://github.com/Clipy/Clipy">Clipy</a> clipboard utility, the upgraded ClipMenu one.</li>
<li>Hopefully Opera someday soon.</li>
<li><a href="https://www.sublimetext.com/3">Sublime Text 3</a>. Preview builds of Visual Studio code are already released.</li>
<li><a href="https://discussion.evernote.com/forums/topic/131507-apple-silicon-m1-version-of-evernote-10/">Evernote</a>. It runs on Electron, a known-to-be CPU hungry JS shell. The Rosetta one works, but is a bit sluggish and uses a significant amount of battery.</li>
<li>Update jan. 2021: The latest <a href="https://www.gimp.org/downloads/">GIMP</a> 2.10 is finally released for OSX, but there are known Big Sur issues. I didn&rsquo;t run into a single one.</li>
</ul>
<p>Update 12 jan. 2021: Sublime <a href="https://www.sublimetext.com/docs/3/build_systems.html">Build Systems</a> still use <code>/bin/bash</code> to execute the <code>exec_cmd</code> or <code>cmd</code> commands. This means that your <code>$PATH</code> will be screwed up. There are a couple of options to mitigate this. Fiddling with the internal <code>exec.py</code> file did not work for me. In the end, I simply re-created a <code>.bash_profile</code> file in my home dir to set the path for Sublime Text 3 builds. Using <a href="https://github.com/randy3k/Terminus">Terminus</a> does not help.</p>
<p><a href="https://www.reddit.com/r/spotify/comments/jyrsxw/when_will_spotify_support_the_new_m1_macbooks/">Spotify is a mess</a>, according to some, while others claim that Rosetta is &ldquo;good enough&rdquo;. I&rsquo;d like to run as much stuff as possible native, I guess we&rsquo;ll have to wait. For now, &ldquo;it just works&rdquo;, but as Evernote, is far from optimized.</p>
<p><figure>
<a href="../mbairsvs.jpg" class="lbox">
<img loading="lazy" src="../mbairsvs.jpg" title="Left: M1 MacBook Air 2020. Right: x86_64 MacBook Air 2012. Note the differences in screen size. The Gold is a bit more Pink than I&#39;d like, but it&#39;s growing on me!">
</a>
<figcaption>Left: M1 MacBook Air 2020. Right: x86_64 MacBook Air 2012. Note the differences in screen size. The Gold is a bit more Pink than I&#39;d like, but it&#39;s growing on me!</figcaption>
</figure>
</p>
<h2 id="java-development">Java development</h2>
<p>The Azul community released <a href="https://www.azul.com/downloads/zulu-community/?os=macos&amp;architecture=arm-64-bit&amp;package=jdk">ARM64 Java builds</a> that are blazingly fast. There are <a href="https://izziswift.com/java-jdk-for-apple-m1-chip/">other solutions</a>, but the Zulu builds I tested so far are great. They even ported the JDK13/JDK11/JDK8 older ones. I settled for v15, since Gradle does not like Java 16 yet, according to the <a href="https://docs.gradle.org/current/userguide/compatibility.html">compatibility matrix</a>. Gradle <code>6.7</code> builds fine with the ARM64 development kit.</p>
<p>The biggest hurdle for me was <strong>JavaFX</strong>, the UI libraries we use to teach students the Model-View-Controller principle. It <a href="https://nequalsonelifestyle.com/2020/11/23/apple-silicon-benchmarks-pt2-javafx/">reportedly</a> works under Rosetta, but I wanted to try it native anyway, and got a nice <code>no toolkit found</code> exception, not unlike <a href="https://github.com/javafxports/openjdk-jfx/issues/237">this one</a>. Funnily enough, it <em>builds</em> fine, but it does not <em>execute</em>: JavaFX looks for a native UI renderer and cannot find one.</p>
<p>Installing JDKs with different architectures turned out not to be problematic, and I can quickly switch between both using an alias:</p>
<pre><code>alias jdkarm=&quot;export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-15.jdk/Contents/Home&quot;
jdkarm
alias jdkx86=&quot;export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home&quot;
export PATH_TO_FX=/Users/wgroeneveld/development/java/javafx-sdk-15.0.1/lib
</code></pre><p>Paths shouldn&rsquo;t be hardcoded, but <code>/usr/libexec/java_home -a</code> didn&rsquo;t work for me. Building this <a href="https://github.com/KULeuven-Diepenbeek/db-course/tree/main/examples/jdbc-fxml-start">sample FXML project</a> using <code>./gradlew clean build</code> took about a second natively:</p>
<ul>
<li>ARM64: <code>1378</code>ms</li>
<li>x86_64 Rosetta2: <code>9646</code>ms! (second time: <code>2459</code>ms, still almost double)</li>
<li>x86_64 MacBook Air 2012: <code>14590</code>ms (second time: <code>3200</code>ms)</li>
</ul>
<p><figure>
<a href="../javaperformance.jpg" class="lbox">
<img loading="lazy" src="../javaperformance.jpg" title="Lower is better. Compile performance in ms.">
</a>
<figcaption>Lower is better. Compile performance in ms.</figcaption>
</figure>
</p>
<p>As you can see, combining Rosetta with another &ldquo;Virtual&rdquo; Machine is not a particularly great idea. Remember that the 2012 MacBook Air only has <code>4GB</code> of memory, with eight year old tech.</p>
<h3 id="netbeans-ide">NetBeans IDE</h3>
<p>NetBeans: 12.2 includes Big Sur/Rosetta2 support, but is not running natively. It auto-detects the JDK ARM64 build, which is even more annoying, as setting the default Java Platform is a pain. The &ldquo;best&rdquo; way is to manually override <code>netbeans_jdkhome</code> in <a href="https://developer.apple.com/forums/thread/664759">netbeans.conf</a>. Compared to IntelliJ, NetBeans truly is a piece of shit. Of course, the x86_64 setting also slows down NetBeans itself, not only the project you wish to compile/run.</p>
<h3 id="intellij-ide">IntelliJ IDE</h3>
<p>IntelliJ: 2020.3 ARM64 <a href="https://youtrack.jetbrains.com/issue/JBR-2526">test builds</a> are available. It seems that the Rust debugger is not hitting the breakpoints. There&rsquo;s also a preview <a href="https://blog.jetbrains.com/phpstorm/2020/12/phpstorm-2020-3-1-rc/">PHPStorm build</a>, although I haven&rsquo;t tried it yet. After opening a Gradle <code>6.3</code> project, IntelliJ complains about an invalid Gradle configuration, claiming that JDK15 isn&rsquo;t compatible with this version of Gradle, although it builds fine on cmdline. Fixing the distribution URL in gradle-wrapper.properties to <code>6.7.1</code> does the trick:</p>
<pre><code>distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
</code></pre><p>After that, the Azul JDK combined with the IntelliJ preview build is a snappy experience and pleasant to work with. Debugging works fine, just as a few third-party libraries I tried - as long as you stay away from JavaFX.</p>
<h2 id="net-development">.NET Development</h2>
<p>I still need to try this with Rider and Mono. Khalid Abuhakmeh wrote about his experience in a <a href="https://blog.jetbrains.com/dotnet/2020/12/11/net-development-on-apple-silicon/">jetbrains blogpost</a>, concluding that it was pleasant to work with .NET on the M1. Bear in mind that he&rsquo;s talking about Rosetta.</p>
<h2 id="cccross-compiling">C/C++/Cross-compiling</h2>
<p>First, get Xcode from the App Store. Yoink, <code>12GB</code>!</p>
<p>Next, the <strong>CLion</strong> IDE: the debugger cannot be launched, official ARM support is currently not there yet, but they&rsquo;re <a href="https://youtrack.jetbrains.com/issue/CPP-23494#focus=Comments-27-4615098.0-0">working on it</a> (last update: 25th of December). One of the perks of being an early adopter, I guess&hellip; I don&rsquo;t want to try this in Rosetta as I only need CLion every odd semester for my teaching activities, and hopefully, by then it&rsquo;ll be okay.</p>
<p>Until then, I&rsquo;ll compile and debug cmdline. <strong>CMake</strong> works flawlessly, using the master version of brew: <code>==&gt; Pouring cmake-3.19.2.arm64_big_sur.bottle.tar.gz</code>. Using it to compile the <code>1.10</code> release of Google Test gives C++11 errors so you&rsquo;ll have to add a <code>-DCMAKE_CXX_STANDARD=17</code> flag to CMake as per <a href="https://github.com/google/googletest/issues/1519">this ticket</a>. Compiling itself was extremely quick, compared to what I&rsquo;m used to on my 2012 MacBook Air.</p>
<h3 id="game-boy-advance">Game Boy Advance</h3>
<p>Cross-compiling <strong>GBA stuff</strong> using <a href="https://github.com/devkitPro/pacman/releases/latest">pacman</a> worked flawlessly, obviously in Rosetta mode. I doubt it will ever be released natively. Cross-compiling the whole <a href="https://github.com/wgroeneveld/gba-sprite-engine">gba-sprite-library</a>, including four demo projects, took <code>15343</code>ms. I was surprised that this worked without any problems, and a Rosetta-enabled mGBA happily plays my binaries! On the 2012 laptop, it takes more than twice that long: <code>32950</code>ms.</p>
<h3 id="arduino">Arduino</h3>
<p>After finding not so promising <a href="https://www.reddit.com/r/arduino/comments/jwpuuu/arduino_on_new_apple_macbooks_with_m1_chip/">Reddit posts</a>, I had to try it out myself. A <a href="https://github.com/arduino/Arduino/issues/10836">Github issue</a> tells us Rosetta is supported and &ldquo;somewhere in the future&rdquo; native support should be coming - Linux ARM64 builds are already available.</p>
<p>After installing the Arduino IDE (which runs on a JRE, by the way), right-clicking and pressing &ldquo;Get Info&rdquo; reveals <em>Kind: Application (Intel)</em>. It boots up fairly slowly, but compiling and uploading work without problems. Performance is a non-issue here, you won&rsquo;t be compiling megabytes of C code anyway.</p>
<h2 id="javascript">JavaScript</h2>
<p>Node <code>15.5.0</code> and its package manager have native bottles uploaded in the master Homebrew repository. Everything works flawlessly after a <code>brew install npm</code>. Do yourself a favor and install a Chromium-based browser to check out <a href="https://developers.google.com/web/tools/lighthouse/">Lighthouse</a>.</p>
<h2 id="go">Go</h2>
<p>It&rsquo;s been a while since I programmed in Go, but Dids created <a href="https://gist.github.com/Dids/dbe6356377e2a0b0dc8eacb0101dc3a7">a gist</a> entitled <em>&ldquo;Compile Go for Apple Silicon (M1)&quot;</em>, where he explains how to compile Go natively. I have yet to try it out.</p>
<h2 id="python">Python</h2>
<p>Although python <code>3.8</code> comes included with Big Sur, python <code>3.9</code> compiled without any issues from source using Homebrew. However, since OSX always seems to come with an annoyingly old <code>2.7</code> version, you have to create a symlink in <code>/usr/local/bin</code> to set the default version to 3.9. You may also need to re-link Python:</p>
<pre><code>brew unlink python &amp;&amp; brew link python
sudo ln -s -f /opt/homebrew/bin/python3.9 /usr/local/bin/python
sudo ln -s -f /opt/homebrew/bin/pip3.9 /usr/local/bin/pip
</code></pre><h2 id="writing">Writing</h2>
<p><strong>Hugo</strong> extended works like a charm on ARM64. Pfew!</p>
<p>As for my needed <strong>LaTeX</strong> tools: the <a href="https://www.tug.org/mactex/aboutarm.html">MacTeX about ARM page</a> tells me that full native support will arrive in spring 2021. Until then, Rosetta to the rescue (it also requires <code>6.7GB</code>&hellip;). I do hope that switching will not be problematic, as I can&rsquo;t wait until then.</p>
<p>As for <strong>pandoc</strong> that converts my Markdown to LaTeX, compiling from source downloads the x86_64 version of the <a href="https://www.haskell.org/ghc/">GHC</a> Haskell compiler. As expected, compilation crashed:</p>
<pre><code>ghc@8.8: The x86_64 architecture is required for this software.
Error: An unsatisfied requirement failed this build.
</code></pre><p>So, I reverted to the <a href="https://pandoc.org/installing.html">x86 installer pkg</a>, which seems to work fine. After the necessary installations, I re-compiled a recently accepted ICSE paper (involving make, pandoc, panflute, pdflatex, bibtex, yaddayadda), and it took <code>7700</code>ms on the 2012 Air, while the Rosetta x86_64 version took <code>4447</code>ms. Consider me happy! It will be <em>very</em> interesting to see this number further reduced in spring 2021.</p>
<h2 id="virtualization">Virtualization</h2>
<p>The universal memory structure of the M1 architecture has its advantages, but these obviously fade when dual booting. Furthermore, using something like VirtualBox gets you into <a href="https://codetober.com/software-development-on-the-new-m1-macbook-pro-13/">further trouble</a> by evenly splitting RAM. It <a href="https://forums.virtualbox.org/viewtopic.php?f=8&amp;t=98742">looks like</a> VirtualBox support will never be coming as it requires a x86 CPU.</p>
<p>Alternative options are <a href="https://www.parallels.com/blogs/parallels-desktop-apple-silicon-mac/">Parallels</a>, which has a technical preview already published, and VMWare Fusion, which announced <a href="https://twitter.com/VMwareFusion/status/1326229094648832000">on Twitter</a> that they&rsquo;re working on it.</p>
<p>As of now, there is no possibility for me to run my virtual image of Linux for the Operating Systems course I&rsquo;m teaching. I guess I&rsquo;ll be using a Dell laptop for this purpose&hellip; I don&rsquo;t mind, my 2012 MacBook Air didn&rsquo;t have the required memory to comfortably work with it anyway, so I already resorted to another machine.</p>
<p><strong>Edit 25 jan. 20121</strong>: Eleanor pointed me towards a gist to get <a href="https://gist.github.com/niw/e4313b9c14e968764a52375da41b4278">qemu running on M1</a>. This means it is possible to run Windows 10 and Ubuntu Server on your ARM Mac! On performance: A simple factorial program in ghci is noticeably faster on Ubuntu (ARM64) via qemu than on MacOS via Rosetta. Follow Sevarg&rsquo;s <a href="https://www.sevarg.net/2021/01/09/arm-mac-mini-and-boinc/">recent guide</a> to get Ubuntu running under QEmu!</p>
<h2 id="so-is-it-worth-it">So&hellip; Is it worth it?</h2>
<p>It depends. If you&rsquo;re like me, and you have been waiting for a long time to upgrade, now is the best possible time to take the plunge. However, if you already own a more recent MacBook (I hope it&rsquo;s with a decent keyboard: this one types lovely, compared to my wife&rsquo;s 2017 <em>butterfly</em> keyboard on the MacBook Pro - what a train-wreck), it might be a better idea to wait half a year.</p>
<p>Currently, with the software I daily use, about <code>50%</code> of them are running under Rosetta. It is impressive nonetheless: it is seamless and still very fast - except if you&rsquo;re a Java developer and somehow have to support JavaFX. Don&rsquo;t forget that the M1 chip comes with other awesome perks:</p>
<ul>
<li><code>18h</code> battery life (more like 10+ with regular compile jobs, but still great)</li>
<li>Greatly improved screen compared to my 2012 laptop</li>
<li>I finally bought a <code>QUERTY</code> one.</li>
<li><code>8GB</code> is more than <code>4GB</code>.</li>
<li>We used the 2020 Air to video-call (using browser-based <a href="https://meet.jit.si/">Jitsi</a>) over Christmas, while we used the 2012 Air during Christmas Eve - the fan went on and it crashed once.</li>
<li>The instant-on effect is <em>amazing</em>, compared to waiting up to ten seconds.</li>
<li>I can finally play <a href="https://www.reddit.com/r/macgaming/comments/k5sf57/baldurs_gate_3_on_apple_m1_performance_review/">Baldur&rsquo;s Gate III</a>!</li>
</ul>
<p>Like Kay said: Black. Magic. Fuckery!</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 27 December 2020.
</p>
]]>
</description>
</item>
<item>
<title>Thoughts on Bullshit Jobs</title>
<link>https://brainbaking.com/post/2020/12/thoughts-on-bullshit-jobs/</link>
<comments>https://brainbaking.com/post/2020/12/thoughts-on-bullshit-jobs/#commento</comments>
<pubDate>Sun, 20 Dec 2020 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2020/12/thoughts-on-bullshit-jobs/</guid>
<category domain="https://brainbaking.com/tags/jobs">jobs</category>
<category domain="https://brainbaking.com/tags/academia">academia</category>
<description>
<![CDATA[
<p>In 2013, David Graeber, a professor of Anthropology, published an essay on the phenomenon of Bullshit Jobs in <a href="https://www.strike.coop/bullshit-jobs/">Strike! Magazine</a>. This work was further expanded in his 2018 book <a href="https://www.goodreads.com/book/show/34466958-bullshit-jobs">Bullshit Jobs: A Theory</a>. I&rsquo;ve read the latter, but highly recommend everyone to read the former instead, as it much more concisely summarizes the essence.</p>
<h3 id="defining-a-bullshit-job">Defining a bullshit job</h3>
<p>What&rsquo;s a bullshit job, you ask? I&rsquo;m pretty sure everybody instinctively knows what a bullshit job entails, but just to be clear, David provides a working definition: <em>a bullshit job is a form of paid employment that is so completely pointless, unnecessary, or pernicious that even the employee cannot justify its existence even though, as part of the conditions of employment, the employee feels obliged to pretend that is not the case</em>. Since then, it has been expanded by others to also include, among others, a <a href="https://austingmackell.medium.com/explaining-bullshit-jobs-with-monetary-theory-11be9bb99d35">monetary theory</a>.</p>
<blockquote>
<p>A bullshit job is paid employment that is so completely pointless that even the employee cannot justify its existence.</p>
</blockquote>
<p>You know, the sort of very useful governmental paper pushing that is required when registering a travel passport, making a complaint, or trying to convince your bank employee that no, you&rsquo;re not going to take that extra insurance. There are obvious examples, but as I read the book, and as David also admitted, very large portions of virtually <em>any job</em> contain bullshit parts. And bullshit percentages are increasing at an alarming rate.</p>
<p>There is, however, one small but important detail present in the definition: it is <strong>the employee</strong> him/herself who cannot justify the existence. I&rsquo;m not entirely convinced that this is the only kind of bullshit job. Imagine a HR advisor that admits his/her job is useless: bullshit job. Imagine another HR advisor who thinks he/she&rsquo;s doing incredible valuable work, while in fact, it&rsquo;s the same bullshit. Does the latter mean the job is not a bullshit job? We all know a lot of people in denial working bullshit jobs&hellip;</p>
<p>The theory on why society does not object to bullshit jobs is also worth looking at. According to Graeber, social value and pay are inversely correlated: hospital cleaners and garbage collectors contribute to our social structure, but barely get paid anything, while corporate lawyers effectively hurt our social culture, and get a paid royal amount for doing so. There seem to be papers on the discussion of jobs and their (perceived?) social value, of which a few are referenced in the book.</p>
<p>This is a summary of the social value breakdown, found in a 2017 study, categorized by jobs (<a href="https://www.journals.uchicago.edu/doi/abs/10.1086/693393?casa_token=46Fn4qTkh1cAAAAA:aR3HQynt1SCG2WjPx1eh2GSkxaciKEmGYgIrmB9te230mEyN2MCBGzpjzBLseSGfmRKPMQUl4ow">Taxation and the Allocation of Talent</a> by Lockwoot et al.):</p>
<p><figure>
<a href="../taxationchart.jpg" class="lbox">
<img loading="lazy" src="../taxationchart.jpg" alt="Taxation and the Allocation of Talent" >
</a>
</figure>
</p>
<p>Isn&rsquo;t that something - research that claims researchers produce the most valuable output (economically speaking) for society?</p>
<h3 id="bullshit-in-the-software-engineering-industry">Bullshit in the software engineering industry</h3>
<p>In my <a href="/post/2018/10/a-decade-in-the-industry/">a decade in the industry</a> post, I reflect on ten years as an agile software developer working for various privately held companies. After reading bullshit jobs, a lot of <em>&lsquo;shit&rsquo;</em> I&rsquo;ve done there can be easily categorized as bullshit:</p>
<ul>
<li>Meetings: standups, sprint plannings, retrospectives, &hellip;</li>
<li>A favorite of mine: filling in timesheets</li>
<li>&hellip;</li>
</ul>
<p>Let&rsquo;s be honest. A lot of &lsquo;Scrum Best Practices&rsquo; are totally bullshit. We never adhered to the indicated planning. We never did anything else in retros except complain. Every standup goes like this: &ldquo;I did x yesterday. Today same&rdquo;. Although admittedly, it is not the practice but the person and the company who is to blame. Still, we&rsquo;re not finished, the worst is yet to come:</p>
<ul>
<li>Implement features that are never used;</li>
<li>Fix bugs that someone else breaks the same day;</li>
<li>Work on something for months that you know will be canceled. Receive an e-mail that confirms it&rsquo;s trashed;</li>
<li>Writing business reports that are never read;</li>
<li>&hellip;</li>
</ul>
<p>To anyone who isn&rsquo;t familiar with <a href="https://en.wikipedia.org/wiki/Dilbert_principle">The Dilbert Principle</a>: promoting incompetent people to management to get them out of the workflow fits perfectly with this theme.</p>
<blockquote>
<p>Leadership is nature&rsquo;s way of removing morons from the productive flow <span>Dogbert (Dilbert)</p>
</blockquote>
<p>A social value of <code>0</code>, according to the above graph, is in my opinion dependent on what kind of software you&rsquo;re creating. In general, being a software developer for a large company does not necessarily entail virtuous behavior, nor does it mean finding meaning. So I quit and joined the academic world to teach undergraduates how to do a bullshit job.</p>
<h3 id="bullshit-in-computing-academia">Bullshit in computing academia</h3>
<p>Now that I&rsquo;m an academic, I&rsquo;m not particularly better off. In fact, if I look around and see what professors are doing and what David talks about, it&rsquo;s a lot worse. Like I <a href="/post/2020/02/agile-academia">previously wrote</a>, e-mail is the main communication channel now, and a lot of <em>bullshit mail</em> prevents me from actually doing what I&rsquo;m supposed to be doing. Luckily, as a PhD researcher, most of the bullshit is off-loaded to the professors:</p>
<ul>
<li>Meetings, meetings more meetings: at faculty, department, campus, &hellip; level;</li>
<li>Writing 20-page long documents to hopefully get a grant, knowing you won&rsquo;t;</li>
<li>Various hideous administrative tasks;</li>
<li>&hellip;</li>
</ul>
<blockquote>
<p>These <em>&lsquo;strategic vision documents&rsquo;</em> aren&rsquo;t going to write themselves, you know!</p>
</blockquote>
<p>The supply and demand of administrative services has risen up to <code>+240%</code> between 1985 and 2005 (p. 161), meaning both industry and academia are heavily burdened by paper pushing. These <em>&lsquo;strategic vision documents&rsquo;</em> aren&rsquo;t going to write themselves, you know! David admits that his tenure as a professor in reality entails that about <code>50%</code> of his job is total and utter bullshit (p. 263). That is not something to look forward to.</p>
<p>The question is, is a professor a schoolteacher (social value <code>+1</code>), a researcher (social value <code>+9</code>), or a manager (<code>-0.8</code>)? Furthermore, I&rsquo;ve read a lot of published research that can safely be called bullshit. Simply reducing a job or even entire sector to a financial number to see if it adds or subtracts from the economy overall seems to be bullshit too.</p>
<h3 id="coping-with-bullshit-jobs">Coping with bullshit jobs</h3>
<p>The book contains hilarious statements from various people who invented ways to do whatever they want, without raising suspicion. In a bullshit job, it is important to act like you&rsquo;re busy, when in fact, you&rsquo;re not. Or you might be busy, but doing meaningless stuff instead of what <em>should</em> be be keeping you busy.</p>
<ul>
<li>There&rsquo;s a guy who installed <a href="http://lynx.browser.org">Lynx</a>, the command-line browser. This makes him look like an expert scripting away at a terminal, when in fact he&rsquo;s editing Wikipedia articles all day;</li>
<li>Someone managed to squeeze his work into one day a week. The rest of the week, he&rsquo;s &lsquo;working from home&rsquo; - meaning learning quantum physics;</li>
<li>Spending an unusual amount of time in the bathroom;</li>
<li>&hellip;</li>
</ul>
<p>It is both funny and painful to read. The question on why we put up with &lsquo;managerial feudalism&rsquo;, as David calls it, still remains. For instance, why would David himself (or myself?) not quit his academic position and focus on writing books and essays instead? There, a lot of bullshit dropped in an instant. I guess status still plays a big role that is all too briefly mentioned in the book. I do not believe that researchers in general provide more to society than IT consultants. I could write software that helps elderly people accessing multimedia. Or I could write a meaningless paper about the non-existence of vampires (yes, it has been done). Which one would you call bullshit?</p>
<p>I&rsquo;m unsure on what to do with this information. Although not exactly new to me, it is still saddening to see the breadth and depth of bullshit jobs in our society. Maybe we should start asking ourselves if we are willing to put up with this? Life&rsquo;s too short, cut the crap! Find a way to disconnect &lsquo;work&rsquo; from &lsquo;revenue&rsquo; and try to free yourself to pursue more worthwhile things.</p>
<p>Such as baking bread, for instance.</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 20 December 2020.
</p>
]]>
</description>
</item>
<item>
<title>Win98 Upgrade: Sound Blaster Audigy</title>
<link>https://brainbaking.com/post/2020/11/win98-upgrade-sound-blaster-audigy/</link>
<comments>https://brainbaking.com/post/2020/11/win98-upgrade-sound-blaster-audigy/#commento</comments>
<pubDate>Tue, 24 Nov 2020 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2020/11/win98-upgrade-sound-blaster-audigy/</guid>
<category domain="https://brainbaking.com/tags/soundblaster">soundblaster</category>
<category domain="https://brainbaking.com/tags/win98">win98</category>
<category domain="https://brainbaking.com/tags/retro">retro</category>
<description>
<![CDATA[
<p>
<img align="left" hspace="5" src="https://brainbaking.com/bigimg/audigy.jpg"/>
</p>
<p>My initial <a href="/post/2020/10/building-an-athlon-win98-retro-pc">Windows 98SE retro PC build</a> came with a free <a href="https://en.wikipedia.org/wiki/Sound_Blaster#Ensoniq_AudioPCI-based_cards">Ensoniq AudioPCI</a> based card, a cheap 1998 OEM alternative to the <em>AWE64</em> or the <em>Sound Blaster Live!</em>_ line. The Sound Blaster PCI128 or _Vibra128_ is basically the same card, as it contains a Creative AudioPCI chip. The card is good enough if you&rsquo;re not picky, but it comes with a few major downsides:</p>
<ol>
<li>No external header pins for those cool looking <code>5.2&quot;</code> audio drive bays;</li>
<li>No EAX support for games;</li>
<li>Horrible, <em>horrible</em> Sound Blaster 16 (SB16) DOS emulation (see below);</li>
<li>No digital audio out;</li>
<li>Analog audio out is not that great.</li>
</ol>
<p>And since I bought a <a href="/post/2020/11/winxp-upgrade-sound-blaster-xfi">Creative X-Fi</a> for my WinXP machine, I was in the mood for another Sound Blaster upgrade. The X-Fi is the last entry in the fifth generation of Creative SB PCI cards, of which the Audigy, PCI 512, Sound Blaster Live! and PCI 128 are also a part. In 1998, I actually used to own a variant of a SB Live! card, but the analog audio output port is of questionable quality (although I never noticed that as a kid). The main problem with going for subjective history-accuracy here is the sheer variability of quality on Live! cards, so hunting down the right <code>CT4830</code> or whatever version is challenging.</p>
<p><figure>
<a href="../audigy-vibra128.jpg" class="lbox">
<img loading="lazy" src="../audigy-vibra128.jpg" title="The Audigy next to its predecessor, the Sound Blaster Vibra128.">
</a>
<figcaption>The Audigy next to its predecessor, the Sound Blaster Vibra128.</figcaption>
</figure>
</p>
<p>The eBay price range also dictated my decision to simply buy an Audigy (first edition) <code>SB0090</code> card instead - these cards are from 2001, which is still not too recent. At <a href="https://vogons.org">VOGONS</a>, the consensus for a Windows 98 build is an Audigy 2 ZS, which has updated DAC and op-amps to produce more than <code>108</code> dB and support surround 7.1. The ZS is not made to work with Win9x and I didn&rsquo;t want to overdo it, so I settled with a <code>SB0090</code> instead, costing a whopping <code>10 EUR</code>&hellip;</p>
<p>So, what does Wikipedia have to say about this card?</p>
<blockquote>
<p>It has an <code>EMU10K2</code> chip, an updated version of the Live! <code>EMU10K1</code>, that supports EAX 3.0 Advanced HD and up to 5.1 channel output.</p>
</blockquote>
<p>The hardware can handle the mixing of 64 DirectSound3D channels, compared to only half (32) on the Live! cards. But I want to compare it to the Audio PCI or PCI128 card I threw out - well it&rsquo;s better than that successor. We&rsquo;re not going to learn much by looking at the numbers. Let&rsquo;s do some test recordings instead and let the results speak for themselves.</p>
<p><figure>
<a href="../audigy.jpg" class="lbox">
<img loading="lazy" src="../audigy.jpg" title="The Sound Blaster Audigy SB0090 card with shiny IO ports.">
</a>
<figcaption>The Sound Blaster Audigy SB0090 card with shiny IO ports.</figcaption>
</figure>
</p>
<h3 id="the-eax-experience-in-games">The EAX experience in games</h3>
<p>Installing the card was painless, except for removing the old Sound Blaster drivers, as the uninstaller crashed. Windows 98 is <em>very</em> picky when it comes to swapping in and out pieces of hardware, so I was a bit worried there, and tried to manually cleanup the mess, with varying degrees of success. The Audigy installation CD ISO is available at <a href="http://vogonsdrivers.com">vogonsdrivers.com</a>, and after installing the DOSDRV and 1.12 patch, rebooting a few times because of the obligatory blue screen, I moved on to testing games.</p>
<p>First up: <em>Dungeon Siege</em>. It has excellent EAX support that enhances the feeling of actually being in the Kingdom of Ehb - or at least in its many dungeons and caves filled with stuff to whack at. Listen to a short clip with EAX enabled on the new card:</p>
<div class="video-mask">
<video width="100%" controls preload="metadata">
<source src="/vid/ds-eax.mp4#t=0.5" type="video/mp4">
Your browser does not support HTML video. Here's a link to the MP4-encoded video instead: <a href="/vid/ds-eax.mp4">/vid/ds-eax.mp4</a>.
</video>
</div>
<p>Now listen to the very same scene recorded with the Vibra128 card, which cannot do EAX:</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/ds1_noeax_pcm128.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/ds1_noeax_pcm128.mp3">/audio/ds1_noeax_pcm128.mp3</a>.
</video>
</div>
<p>What should be immediately noticeable is the reflective, muffled sound coming from the EAX-enabled card because the party enters a cave. The bouncy sound of the squeaks of the valve , followed by the goblin fight that sound very, <em>very</em> flat on the PCI128 card. Admittedly, Dungeon Siege likes to overdo this effect and it does get old every time you enter a huge cave (which is about half the game). It is clear that the difference is very audible and does affect my mood when playing a game: &ldquo;immersiveness&rdquo; of course is relevant.</p>
<p>The Audigy install CD-ROM comes with a nice &ldquo;mine demo&rdquo; that showcases all different EAX effects (sound reflection etc). Phils Computer Lab has <a href="https://www.youtube.com/watch?v=C4SWsC86jZw">more audio samples</a> available at YouTube.</p>
<p>Now, If you&rsquo;d ask me what the difference is between playing Dungeon Siege with a Sound Blaster Audigy on Windows 98 or with an X-Fi on Windows XP, the answer I would give is <em>I don&rsquo;t know</em>. To be honest, that difference would be marginal - at least to my ears.</p>
<h3 id="sb16-and-mpu-401-dos-emulation">SB16 and MPU-401 DOS emulation</h3>
<p>I&rsquo;ll be brief and resort to my <em>Rise of the Triad</em> comparison again:</p>
<h4 id="sound-blaster-16">Sound Blaster 16</h4>
<p><strong>The Reference</strong>; an authentic SB16 on my <a href="/post/2020/09/486-upgrade-sound-blaster">486 PC</a>:</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/ROTT_sb16.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/ROTT_sb16.mp3">/audio/ROTT_sb16.mp3</a>.
</video>
</div>
<p><strong>The PCI128 card</strong>;</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/ROTT_sb16_pcm128.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/ROTT_sb16_pcm128.mp3">/audio/ROTT_sb16_pcm128.mp3</a>.
</video>
</div>
<p><strong>The Audigy card</strong>;</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/ROTT_sb16_audigy.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/ROTT_sb16_audigy.mp3">/audio/ROTT_sb16_audigy.mp3</a>.
</video>
</div>
<p>What on earth is that PCI128 card doing? I have never heard anything that bad in a long time&hellip; So yeah, if being able to play older DOS games is of any importance to you, then I implore you to upgrade. SB16 emulation is clearly not one of its strong points. Just to be sure, let&rsquo;s listen to the classic <em>grabbag</em> Duke Nukem 3D tune with the music configured to Sound Blaster:</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/dn3d_sb16_pcm128.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/dn3d_sb16_pcm128.mp3">/audio/dn3d_sb16_pcm128.mp3</a>.
</video>
</div>
<p>That&rsquo;s just <em>sad</em>. Fortunately, the Audigy clearly knows how to handle the emulation, although it does not sound as clear as it should compared to the reference audio. The tones sound a bit harsh on the edges, but it&rsquo;s as good as it&rsquo;s going to get for OPL3 emulation. Unless one uses a ISA motherboard and slots in a proper Sound Blaster AWE64&hellip;</p>
<p>The Audigy to the rescue:</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/dn3d_sb16_audigy.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/dn3d_sb16_audigy.mp3">/audio/dn3d_sb16_audigy.mp3</a>.
</video>
</div>
<h4 id="mpu-401">MPU-401</h4>
<p>In the end, the <em>proper</em> way to play Duke Nukem 3D is with General MIDI support (recorded with Audigy):</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/dn3d_mpu_audigy.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/dn3d_mpu_audigy.mp3">/audio/dn3d_mpu_audigy.mp3</a>.
</video>
</div>
<p><figure>
<a href="../dn3d.jpg" class="lbox">
<img loading="lazy" src="../dn3d.jpg" title="Let&#39;s Rock!">
</a>
<figcaption>Let&#39;s Rock!</figcaption>
</figure>
</p>
<p>A monumental difference compared to both SB16 variants! Now, let&rsquo;s compare the same <em>Rise of the Triad</em> level 1 music again, this time by configuring <code>SNDSETUP.EXE</code> with &ldquo;Wave Blaster&rdquo; or &ldquo;General MIDI&rdquo; options (both are the same on emulated hardware).</p>
<p><strong>The Reference</strong>; an authentic SB16 on my <a href="/post/2020/09/486-upgrade-sound-blaster">486 PC</a> with S2 Wavetable daughter board:</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/ROTT_waveblaster.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/ROTT_waveblaster.mp3">/audio/ROTT_waveblaster.mp3</a>.
</video>
</div>
<p><strong>The PCI128 card</strong>;</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/ROTT_mpu_pcm128.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/ROTT_mpu_pcm128.mp3">/audio/ROTT_mpu_pcm128.mp3</a>.
</video>
</div>
<p><strong>The Audigy card</strong>;</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/ROTT_mpu_audigy.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/ROTT_mpu_audigy.mp3">/audio/ROTT_mpu_audigy.mp3</a>.
</video>
</div>
<p>Both cards are clearly different than the S2, but the S2 isn&rsquo;t exactly a genuine piece of general MIDI hardware, and I sadly do not own proper Roland audio hardware. However, when comparing PCI128 with Audigy, differences are suddenly much more subtle. To be honest, I can&rsquo;t really make out any when I listen on my laptop speakers. The difference is present when using high quality headphones, but either version is more than good enough for me.</p>
<h3 id="more-toys-to-play-with">More toys to play with</h3>
<p>The Audigy supports proper Sound Font switching, you can mess around with the EAX effects on the desktop using a very annoying TaskBar, and there are a bunch of other goodies present - provided you wish to install those. A audio CD daemon, the PlayCenter, the AudioHQ configuration center, MIDI finetuning properties, Wave Studio to record stuff, and so forth. Software support of the Vibra128 card pales compared to this.</p>
<p><figure>
<a href="../audigytools.jpg" class="lbox">
<img loading="lazy" src="../audigytools.jpg" title="Look at all these &#39;creative&#39; Creative tools, especially the taskbar!">
</a>
<figcaption>Look at all these &#39;creative&#39; Creative tools, especially the taskbar!</figcaption>
</figure>
</p>
<p>Of course, in the end, it&rsquo;s the audio playback that matters, not the software tools that I barely touch anyway, although it is nice to be able to have the power to configure it all. In any case, I can conclude that this hardware upgrade again was worth the effort and I enjoyed a day of fiddling with it. Just be sure to never play SB16-enabled games on your PCI128!</p>
<p>
By <a href="/about">Wouter Groeneveld</a> on 24 November 2020.
</p>
]]>
</description>
</item>
<item>
<title>The Internet Killed Secrets in Games</title>
<link>https://brainbaking.com/post/2020/11/the-internet-killed-secrets-in-games/</link>
<comments>https://brainbaking.com/post/2020/11/the-internet-killed-secrets-in-games/#commento</comments>
<pubDate>Thu, 19 Nov 2020 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2020/11/the-internet-killed-secrets-in-games/</guid>
<description>
<![CDATA[
<p>
<img align="left" hspace="5" src="https://brainbaking.com/bigimg/gob2joker.jpg"/>
</p>
<p>After <a href="https://jefklakscodex.com/articles/reviews/sacred/">finishing <em>Sacred</em></a> and planning to replay other nostalgic hack &amp; slash games, I am currently working my way through 2002&rsquo;s <em>Dungeon Siege</em> for the second time. Somewhere deep in the crystal caves, there&rsquo;s a semi-hidden treasure chest that contains <strong>Fury&rsquo;s Eye</strong> - and I have no idea what to do with it.</p>
<p>Or rather, I <em>had</em> no idea. Until I clicked on <a href="https://steamcommunity.com/sharedfiles/filedetails/?id=1264921426">this link</a> that meticulously explains every single nook and cranny in the Dungeon Siege Kingdom. It turns out that Fury&rsquo;s Eye is part of a three-item requirement to transfer your party to a hidden location in the game, a homage to Diablo II&rsquo;s classic and <em>very secret</em> cow (I&rsquo;m sorry, <a href="https://diablo.fandom.com/wiki/Hell_Bovine"><em>Hell Bovines</em></a>) level, that requires players to combine a Tome of Town Portal and a bloody leg using a device called the Horadric Cube. Still with me?</p>
<h3 id="a-case-against-the-availability-of-information">A case against the availability of information</h3>
<p>The gist is this: I came across an item that uncovers a secret, and instead of trying to do uncover it myself (and probably miserably failing), I simply &ldquo;googled&rdquo; it. This subconscious instant gratification move completely bypasses both frustration and fun I could have extracted out of the experimentation with Fury&rsquo;s Eye. Why is it so easy to go to <a href="https://gamefaqs.gamespot.com">GameFAQs.com</a>? I love digesting details on character builds, strategies and tips before and during a play through - in fact, I have my own website <a href="https://jefklakscodex.com">Jefklak&rsquo;s Retro Gaming Codex</a> dedicated to things like that.</p>
<p><figure>
<a href="../furyseye.jpg" class="lbox">
<img loading="lazy" src="../furyseye.jpg" title="Fury&#39;s Eye - what was I supposed to do with this again?">
</a>
<figcaption>Fury&#39;s Eye - what was I supposed to do with this again?</figcaption>
</figure>
</p>
<p>And yet, I&rsquo;m angry at myself for so easily falling back to the knowledge of the masses, before giving it a go myself. Dungeon Siege is definitely <em>not</em> the kind of game that deserves that kind of devoted attention, mind you. However, Diablo II does. But who tries to jam together a leg found in Tristram with a Town Portal Tome? Who does that? There are about a million other possible (wrong) item combinations to be made. Because you think that&rsquo;s the most efficient way to portal the leg out of here?</p>
<p>Without external help, chances are very slim of discovering angry axe-wielding cows (sorry, <em>Hell Bonvi</em>-what was it again?) in Diablo II yourself. Before the Internet, there were game magazines. I fondly remember reading up on Nintendo Power how to discover hidden stuff in Kirby&rsquo;s Dreamland. As a kid, I did not have the needed perseverance nor knowledge to find out about these things by myself. But the fact that one has to rely on others - by means of interrogating Game Boy owning friends - is/was a very good thing.</p>
<p>In <a href="https://jefklakscodex.com/articles/reviews/gobliins2/">Gobliins 2</a>, a point &amp; click adventure game from 1992, you can consult the hint system if you&rsquo;re stuck - only a couple of times <strong>per game</strong>. They call these &ldquo;jokers&rdquo;: once you&rsquo;ve used them all up, it&rsquo;s up to you to figure out the puzzle yourself. That meant frenetically writing down the English text, asking someone to translate it for me (I was 7), and still scratching your head because the hints were mostly cryptic. I loved the limitedness of these jokers. Every adventure players knows this dilemma if they&rsquo;re stuck: to look up a walkthrough or not? The fact that it&rsquo;s become easier means having to exercise more cognitive demanding willpower not do to it. After all, it&rsquo;s only two clicks away.</p>
<p><figure>
<a href="../d2cows.jpg" class="lbox">
<img loading="lazy" src="../d2cows.jpg" title="Moo-mo-momo-mooh! Src: Diablo Wikia">
</a>
<figcaption>Moo-mo-momo-mooh! Src: Diablo Wikia</figcaption>
</figure>
</p>
<p>When she was little, my wife played the game Lucky Luke on the Super Nintendo, a tough run-and-gun 2D game that employs a common strategy to prolong the play time of older games: it&rsquo;s hard and you get limited continues. When she was stuck on a certain part, only with one continue left, she paused the game and had her father call a support line. In the early nineties, it was actually possible to telephone an anonymous expert and yell &ldquo;<em>Help, only one continue left, should I go left or right in that mine tunnel?</em>&rdquo; Of course, you&rsquo;d only do that if (1) you were <em>really, really</em> stuck, and (2) you had the money to pay the expensive telephone bill.</p>
<p>Information has always been available: whether in game magazines, through support lines, or on the internet. The fact that it has become as easy as grabbing your smartphone and typing a few keywords inevitably means guides and walkthroughs will be consulted much more often<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. And that will make or break that gaming experience&hellip;</p>
<h3 id="a-case-in-favor-of-availability-of-information">A case in favor of availability of information</h3>
<p>Without guides, I probably would not have enjoyed games as much as I do. As a kid, I printed out maps and class guides of <em>Might and Magic VIII</em>, a first person RPG released in 2000 by New World Computing. Without this information, the game would become a slog quite quickly, as you need to travel to masters of certain skills to hone your own, and these are scattered throughout the world and sometimes very hard to track down. Furthermore, if you created a character that specializes in certain skills, only to discover halfway through that these skills you invested in totally sucked, you&rsquo;d probably never make it to the finish line. Thank you, <a href="http://www.zimlab.com/wizardry/recovered/flamestryke/mm8/flamestrykes_mm8.html">Flamestryke&rsquo;s MM8 Wiki</a>.</p>
<p>Of course the internet - and the instant availability of information - made our lives as a gamer easier. Yet, there&rsquo;s a thin line between <em>easier</em> and <em>too easy</em>, and lately, I have the feeling that I&rsquo;m unconsciously leaning towards the latter.</p>
<p>In the end, there&rsquo;s always the <a href="https://www.retromags.com">retromags.com</a> and <a href="https://archive.org/details/gamemagazines">Internet Archive Game Magazine</a> databases to dig through, but that&rsquo;s beside the point. The point is that instant gratification has become the norm, not the exception, and I&rsquo;m typing this to point a finger to someone in particular: me.</p>
<section class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1" role="doc-endnote">
<p>This also frequently happens when having a conversation or watching television, and encountering something you don&rsquo;t know yet, or want to brag about (especially that). Whip out that smartphone and prove them wrong! One of the consequences of this is an <em>&ldquo;I&rsquo;m sorry, what was it that you said?&quot;</em> conversation. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</section>
<p>
By <a href="/about">Wouter Groeneveld</a> on 19 November 2020.
</p>
]]>
</description>
</item>
<item>
<title>WinXP Upgrade: Sound Blaster X-Fi</title>
<link>https://brainbaking.com/post/2020/11/winxp-upgrade-sound-blaster-xfi/</link>
<comments>https://brainbaking.com/post/2020/11/winxp-upgrade-sound-blaster-xfi/#commento</comments>
<pubDate>Sun, 08 Nov 2020 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2020/11/winxp-upgrade-sound-blaster-xfi/</guid>
<category domain="https://brainbaking.com/tags/soundblaster">soundblaster</category>
<category domain="https://brainbaking.com/tags/winxp">winxp</category>
<category domain="https://brainbaking.com/tags/retro">retro</category>
<description>
<![CDATA[
<p>
<img align="left" hspace="5" src="https://brainbaking.com/bigimg/xfi.jpg"/>
</p>
<p>Ever since the &ldquo;<em>Sound Blaster</em>&rdquo; brand became iconic in those <a href="/post/2020/09/486-upgrade-sound-blaster/">486 PCs</a>, I became a big fan of most products Creative brought to the market. Their iconic big boxes that accompanied new sound cards were always a joy to open up, and the last PCI card in their Sound Blaster range from 2005, the X-Fi, is no different.</p>
<p>I&rsquo;ve been doing some research on the Sound Blaster family, and Wikipedia <a href="https://en.wikipedia.org/wiki/Sound_Blaster">summarizes the cards</a> quite nicely. In short, there are 5 generations of older cards I&rsquo;m interested in:</p>
<ol>
<li>8-BIT ISA cards, the original <em>Sound Blaster 1.0/2.0</em> (1989);</li>
<li>16-BIT ISA cards, the <em>SB Pro 1.0/2.0</em> (1991);</li>
<li>The <em>Sound Blaster 16</em>, which I <a href="/post/2020/09/486-upgrade-sound-blaster/">wrote about</a> earlier, and <em>Vibra 16</em> (1992);</li>
<li>The <em>AWE32</em> (1994) and <em>AWE64</em> (1996) digital sample-based synthesis cards;</li>
<li>The PCI cards; roughly divided in <em>PCI128</em>/<em>AudioPCI</em> and <em>Live!</em> (1998), the <em>Audigy</em> (2001), and the <em>X-Fi</em> (2005).</li>
</ol>
<p>My <a href="/post/2020/10/building-a-core2duo-winxp-retro-pc/">WinXP retro machine</a> never housed a soundcard: instead, it was the first PC I built that relied on embedded, onboard audio, coming from the motherboard. The <a href="https://www.manualslib.com/manual/709493/Msi-Ms-7357-V1-X.html?page=75#manual">MSI MS-7357</a> mobo has a Realtek <code>ALC888</code> audio chip soldered on that is capable enough in its own right. However, it pales in comparison with the Sound Blaster X-Fi or <em>eXtreme Fidelity</em>.</p>
<p><figure>
<a href="../xfi.jpg" class="lbox">
<img loading="lazy" src="../xfi.jpg" title="The Sound Blaster X-Fi PCI Xtreme Music Edition.">
</a>
<figcaption>The Sound Blaster X-Fi PCI Xtreme Music Edition.</figcaption>
</figure>
</p>
<p>Multiple versions of the card exist, but luckily, in comparison to the confusing <em>Live!</em> or <em>SB16</em> revisions (of which there are good and less than stellar cards to pick from), the differences are negligible. Well, that&rsquo;s not entirely true, as there exist different <a href="https://en.wikipedia.org/wiki/E-mu_20K">chip versions</a> of the <code>EMU20K1</code> audio chips with a bit of increased RAM. I went ahead and ordered the cheapest I could find for <code>18EUR</code>, apparently the <em>Extreme Music</em> variant. It sadly came without awesome looking drive bay as the <em>Fatal1ty</em> pro ones, but the <code>AD_EXT</code> pins are all there, so that&rsquo;s for on the wish list.</p>
<p>Now, what does this card do, compared to its elder brother the Audigy, or even the well-loved Audigy 2 ZS, the &ldquo;best&rdquo; Win9x card? According to Wikipedia, it was:</p>
<blockquote>
<p>The most powerful, offering an extremely robust sample rate conversion engine in addition to enhanced internal sound channel routing options and greater 3D audio enhancement capabilities.</p>
</blockquote>
<p>What does that mean? Well, the 51 million transistors operating at <code>400 MHz</code> compute about <strong>24 times</strong> faster than the Audigy processor. Okay, so it&rsquo;s <em>very</em> speedy. What else? Well, it has EAX 5.0 support, a 24-bit crystallizer that can emphasize low or high pitched portions of sound, a completely overhauled sampling engine and better mixing support, &hellip; The list goes on.</p>
<p>I love the neat placement of the micro resistors and the overall look and feel of this black card:</p>
<p><figure>
<a href="../xfi-zoom.jpg" class="lbox">
<img loading="lazy" src="../xfi-zoom.jpg" title="Don&#39;t you just love the intricate details (and powerful opamps) on here?">
</a>
<figcaption>Don&#39;t you just love the intricate details (and powerful opamps) on here?</figcaption>
</figure>
</p>
<h3 id="in-game-performance">In-Game Performance</h3>
<p>We&rsquo;re off to a good start here. After slotting it in and installing the drivers and tools, it&rsquo;s time for some games (and for more fiddling with settings). I disabled the Realtek chip in the BIOS to avoid conflicts or loading of unused drivers.</p>
<p>Most games sound just a little bit more clear, but I am no audiophile. Admittedly, the initial excitement wore off pretty quickly. The main problem is that it is very hard to directly compare onboard audio with something like this without changing the default audio settings in the Creative tools and the games themselves. Furthermore, recording samples for this article sound like crap on my MacBook Air because of the <em>Intel HD Audio</em> system. It seems that writing about subtle audio differences is much easier than adding an audio excerpt: it will depend on the audio hardware you have installed yourself when listening to it!</p>
<p>For example, this is a short Unreal Tournament 2004 clip, where audio hardware acceleration and EAX is turned on and off, <em>before</em> fiddling with the Creative Console to increase the bass:</p>
<div class="video-mask">
<video width="100%" controls preload="metadata">
<source src="/vid/ut2004_withoutbass.mp4#t=0.5" type="video/mp4">
Your browser does not support HTML video. Here's a link to the MP4-encoded video instead: <a href="/vid/ut2004_withoutbass.mp4">/vid/ut2004_withoutbass.mp4</a>.
</video>
</div>
<p>However feeble my attempt to capture the deltas, nobody will deny the superiority of EAX-enhanced sound. Next, I switched on <em>Bass Boost</em> and the X-Fi <em>Crystallizer</em>. Notice the bassy &ldquo;thuds&rdquo; when clicking on the buttons in the upper menu. It sounds very hollow on my MacBook, but the difference is there:</p>
<div class="video-mask">
<video width="100%" controls preload="metadata">
<source src="/vid/ut2004_withbass.mp4#t=0.5" type="video/mp4">
Your browser does not support HTML video. Here's a link to the MP4-encoded video instead: <a href="/vid/ut2004_withbass.mp4">/vid/ut2004_withbass.mp4</a>.
</video>
</div>
<p>When actually playing, the game sounds absolutely <em>fantastic</em>! The difference is even more pronounced when plugging in high quality headphones, thanks to the CMSS-3D feature of the sound card: the X-Fi 3D virtualization does a great job in giving the illusion of being fully immersed in the sound and music. Admittedly, the difference between the Realtek and the X-Fi, without relying on the added features, is far from mind-blowing. As <a href="https://www.tomshardware.com/reviews/high-end-pc-audio,3733-19.html">Tom&rsquo;s Hardware</a> already pointed out (in 2014), <em>anything above $2 buys more features, not better quality</em>. CMSS 3D and EAX do add to the total quality, though.</p>
<h4 id="fps-performance">FPS Performance</h4>
<p>According to hardware reviews such as <a href="https://www.guru3d.com/articles_pages/x_fi_xtreme_music_sound_blaster_review,1.html">Guru 3D</a>, the fast <code>EMU20K1</code> chip should even give a graphics performance boost: less work for your CPU to be done. However, I measured FPS on multiple games, and I could not see a substantial fluctuation between normal (embedded) audio or hardware-enabled (X-Fi) audio. That might be because my system is already quite powerful for a 2005 computer, or because the Realtek chip does the job good enough, or because the games are programmed the way they are.</p>
<p>To be fair, there was a <em>slight</em> performance gain:</p>
<p><figure>
<a href="../xfiperformance.jpg" class="lbox">
<img loading="lazy" src="../xfiperformance.jpg" alt="xfi performance chart" >
</a>
</figure>
</p>
<p>The real gain is proper EAX support, superior IN/OUT ports, bass boost, virtual 3D audio stuff, etc &hellip; The card software even lets you choose something called &ldquo;<em>Sound Banks</em>&rdquo; for MIDI synthesizing if that&rsquo;s your thing or if you plan to emulate an ISA Sound Blaster card in Win9x compatibility mode:</p>
<p><figure>
<a href="../xfitools.jpg" class="lbox">
<img loading="lazy" src="../xfitools.jpg" title="A bunch of Creative Tools to fiddle with various settings.">
</a>
<figcaption>A bunch of Creative Tools to fiddle with various settings.</figcaption>
</figure>
</p>
<p>To convince the reader that the X-Fi is very capable of pulling off DOS music tricks, by configuring games to use <em>&ldquo;GENERAL MIDI&rdquo;</em>, here are some Rise of the Triad music samples originating from my <a href="/post/2020/09/486-upgrade-sound-blaster">SB16 article</a>. Recorded with the X-Fi, on my 486 with the SB16 Sound Blaster music option:</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/ROTT_sb16.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/ROTT_sb16.mp3">/audio/ROTT_sb16.mp3</a>.
</video>
</div>
<p>The same SB16, with the S2 WaveBlaster daughterboard enabled:</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/ROTT_waveblaster.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/ROTT_waveblaster.mp3">/audio/ROTT_waveblaster.mp3</a>.
</video>
</div>
<p>On WinXP with the X-Fi and General MIDI, using sound font &ldquo;<a href="https://www.philscomputerlab.com/general-midi-and-soundfonts.html">ChromiumRevA</a>&quot;:</p>
<div class="video-mask">
<audio width="100%" controls preload="metadata">
<source src="/audio/ROTT_XFi_Chorium.mp3#t=0.5" type="audio/mpeg">
Your browser does not support HTML audio. Here's a link to the MP3-encoded audio instead: <a href="/audio/ROTT_XFi_Chorium.mp3">/audio/ROTT_XFi_Chorium.mp3</a>.
</video>
</div>
<p><em>Oh my, oh my</em>. I&rsquo;m not sure whether I prefer this over the S2, but it might convince me to occasionally play older games in DOSBox again! There are more cool sound fonts available, there is no definitive version, it all depends on the game.</p>
<p>I can happily conclude that the PCI slot will remain to be occupied by the X-Fi card, and the embedded audio will remain to be disabled. If it was all worth it for casual games such as playing <em>Plants VS Zombies</em> without headphones, I don&rsquo;t know&hellip; But for a few (European) bucks, why wouldn&rsquo;t you? Grab them now before they become as scarce as the upper tier Sound Blaster 16 cards!</p>
<p>More information:</p>
<ul>
<li>LGR <a href="https://www.youtube.com/watch?v=-TpGtrhpDuI&amp;t=326s">X-Fi Platinum XP Upgrade</a></li>
<li>Phils Computer Lab <a href="https://www.youtube.com/watch?v=gSBMrHfsXjE">Sound Blaster X-Fi MB3</a> review</li>
<li><code>AD_EXT</code> <a href="https://pinouts.ru/Audio-Video-Hardware/sb_audigy2_ad_ext_pinout.shtml">pinout scheme</a> - the same as Audigy&rsquo;s <code>AUD_EXT</code>. It is possible to tap into SPDIF, MIDI, and GP signals separately. Note that your front panel headphone jack will likely pick up static noise except if it&rsquo;s wired directly onto the Sound Blaster using these pins. Another reason to buy the drive bay!</li>
</ul>
<p>
By <a href="/about">Wouter Groeneveld</a> on 8 November 2020.
</p>
]]>
</description>
</item>
<item>
<title>Personal Desktop Screenshots of Olde</title>
<link>https://brainbaking.com/post/2020/11/desktop-screenshots-of-olde/</link>
<comments>https://brainbaking.com/post/2020/11/desktop-screenshots-of-olde/#commento</comments>
<pubDate>Sun, 01 Nov 2020 00:00:00 +0000</pubDate>
<author>Wouter Groeneveld</author>
<guid isPermaLink="true">https://brainbaking.com/post/2020/11/desktop-screenshots-of-olde/</guid>
<category domain="https://brainbaking.com/tags/linux">linux</category>
<description>
<![CDATA[
<p>Rummaging through old data is fun. It&rsquo;s like rediscovering a part of yourself you have long forgotten. Since the last few months I&rsquo;m in a nostalgic hardware mood, let&rsquo;s revisit some old desktops of which I meticulously kept screenshots from 2004 to 2008 from various systems. Sadly, the SuSE Linux <code>6.3</code> screenshots are forever gone&hellip; And before 2003, it was not yet cool enough to share desktop screens on-line (that is: I didn&rsquo;t know how!).</p>
<h3 id="the-gentoo-linux-20040-machine">The Gentoo Linux 2004.0 Machine</h3>
<p>Once I got hooked on Linux during my first university years, I decided in order to become a real pro, one has to install everything form source. <em>Every-thing</em> (Gentoo). Oh, and kernel-patch your own vanilla Linux kernel - that too. Many weeks later; I discovered FVWM, and after even more weeks of fiddling with config files, my desktop looked like this:</p>
<p><figure>
<a href="/img/desktopshots/feb2004.jpg" class="lbox">
<img loading="lazy" src="/img/desktopshots/feb2004.jpg" title="FVWM, 02/2004">
</a>
<figcaption>FVWM, 02/2004</figcaption>
</figure>
</p>
<p>Remember the floating duck, that indicates CPU/Memory usage? The more water, the more RAM, and the more waves, the more CPU usage. Funny, and completely useless.
A few months later, the status bar started to look like a cheap OSX knock-off:</p>