dammIThttps://dammit.nl/2024-02-10T19:37:00+01:00A rantboxGitHub Spam is out of control2024-02-10T19:37:00+01:002024-02-10T19:37:00+01:00Michiel Scholtentag:dammit.nl,2024-02-10:/link-github-spam.html<p><img alt="The GitHub logo surrounded by spam with his mouth open (original, copied from the source article)" src="https://dammit.nl/images/content/DALL-E-2024-01-28-17.12.15-A-digital-composition-for-a-blog-post-header-titled-GitHub-Spam-is-out-of-control.-The-image-features-a-stylized-representation-of-the-GitHub-logo--1536x878.png"></p>
<p>Dan Janes writes:</p>
<blockquote>
<p>Spam is nothing new, spam on GitHub is also not particularly new. Any site that accepts user-generated content will need to figure out how to prevent people from submitting spam, whether that is for scams, malicious software, or X-rated material. I have been getting tagged in Crypto …</p></blockquote><p><img alt="The GitHub logo surrounded by spam with his mouth open (original, copied from the source article)" src="https://dammit.nl/images/content/DALL-E-2024-01-28-17.12.15-A-digital-composition-for-a-blog-post-header-titled-GitHub-Spam-is-out-of-control.-The-image-features-a-stylized-representation-of-the-GitHub-logo--1536x878.png"></p>
<p>Dan Janes writes:</p>
<blockquote>
<p>Spam is nothing new, spam on GitHub is also not particularly new. Any site that accepts user-generated content will need to figure out how to prevent people from submitting spam, whether that is for scams, malicious software, or X-rated material. I have been getting tagged in Crypto related for the past 6 months or so. In the past 24 hours I have been tagged in two of them.</p>
</blockquote>
<p>You would think some work and thought has been put into this for a while, but:</p>
<blockquote>
<p>How the actual fuck does GitHub NOT have a report button on a piece of user generated content. Do you know the process of reporting this? Copy Link -> Go to user’s profile page -> Click Block & Report -> Click Report Abuse button -> <em>New page</em> Click “I want to report harmful… cryptocurrency abuse” -> Click “I want to report suspicious cryptocurrency or mining content.” button -> FINALLY paste the link you copied 10 years ago into the form box and give your justification on why this user did a bad thing and hope that the link still works/content is still up by the time they get around to looking at it…</p>
</blockquote>
<p>It's a good read, and makes you think what Microsoft (which is not a small company) has been doing all this time.</p>
<p><a href="https://www.youtube.com/watch?v=CEZ3WEdNS-c">Theo made a cool video about this article</a> with some of his personal thoughts and experiences as well (with his experience from working at Twitch, including the UX about making reporting spam as frictionless as possible).</p>Have an uneventful 20242024-01-01T21:18:26+01:002024-01-01T21:18:26+01:00Michiel Scholtentag:dammit.nl,2024-01-01:/have-an-uneventful-2024.html<p>Today was the first day of a new year. 2023 is behind us, but we are not done with the things we started during it. It was a year of both struggles and good times. Sometimes simultaneously.</p>
<p>2024 should be a year of improvements. Improving the situation at home, improving …</p><p>Today was the first day of a new year. 2023 is behind us, but we are not done with the things we started during it. It was a year of both struggles and good times. Sometimes simultaneously.</p>
<p>2024 should be a year of improvements. Improving the situation at home, improving ourselves at work, and the most fun part: getting better at those hobbies we cherish. Looking forward to that, and to laying the foundations of the upcoming years.</p>
<p>Stay healthy, stay sane!</p>
<p>(The fireworks still are strong here BTW)</p>
<p><img alt="Fireworks over houses" src="https://shuttereye.org/images/b3/b3f350e0f1b2f271_2000-2000.jpeg"></p>Twenty years of blogging2023-12-21T20:23:40+01:002023-12-21T22:10:40+01:00Michiel Scholtentag:dammit.nl,2023-12-21:/twenty-years-of-blogging.html<p>Twenty years ago - not long after the turn of the century - I was tinkering with <a href="https://github.com/aquatix/dammit/commits/master?after=7a084bfa7c0e36f63d52c6cc2154fb68a20a6cd7+384&branch=master&qualified_name=refs%2Fheads%2Fmaster">some PHP code</a> to replace <a href="https://web.archive.org/web/20030829140416/http://aquariusoft.org/~mbscholt/">a static HTML page I had been experimenting with</a>. It was becoming my private website, in the classic sense of the word: where I put stuff I am interested in …</p><p>Twenty years ago - not long after the turn of the century - I was tinkering with <a href="https://github.com/aquatix/dammit/commits/master?after=7a084bfa7c0e36f63d52c6cc2154fb68a20a6cd7+384&branch=master&qualified_name=refs%2Fheads%2Fmaster">some PHP code</a> to replace <a href="https://web.archive.org/web/20030829140416/http://aquariusoft.org/~mbscholt/">a static HTML page I had been experimenting with</a>. It was becoming my private website, in the classic sense of the word: where I put stuff I am interested in, about who I am, and in this case also to introduce my homeserver called 'xcalibur', after the well-known sword of the King with his round table.</p>
<p>'Static HTML' is not entirely correct here; it was already a bunch of PHP pages, some of which even provided almost-realtime information about the system it was running on (see below).</p>
<p>At the time I was a Computer Science student at the Vrije Universiteit in Amsterdam, had just acquired the hardware of the 'xcalibur' server from an uncle that was into tech and photography (and smoking, I still remember the smell of the first few days of the tower running in our attic, venting his chain-smoking odours). It was intended to host a few websites and to tinker around with other networking stuff.</p>
<p>I wanted to exercise my English writing skills, and thought it fun to have an echo room out on the wild wild web. When Christmas holiday 2003 came around, I had some free time on my hands, <a href="https://dammit.nl/20031221-my-very-own-rantbox.html">implemented a MySQL-backed rant box</a>, and have been blogging ever since.</p>
<p>In <a href="https://dammit.nl/moved-to-pelican.html">the 2017 post where I described moving the weblog to Pelican</a>, I already wrote a small timeline and reasons not to use things like Wordpress (did barely exist when I started). It has always been my toy, my venting place, and my online documentation system, especially later on, when I started writing howto articles; mainly to condense what I had to research and fix recently, for future reference by myself and hopefully a few others.</p>
<p>I love having my own place here; it has always been independent from whatever platform-du-jour, has never been involved in ads, and has been a welcoming refuge for my thoughts. I certainly plan to keep it around for many years, and maybe have a few visitors enjoying my work :)</p>
<p>Twenty years I have been tending my own garden. I am really curious to how it will look in twenty years time.</p>
<p>For fun, here are some early posts in 2004, not much changed personally :D (<a href="https://web.archive.org/web/20040205135520/http://aquariusoft.org:80/~mbscholt/">Screenshot from the Internet Archive</a> with bigger font and slightly other list-styling than the original, so that's why the navigation looks cramped)</p>
<p><img alt="Weblog homepage in early 2004" src="https://dammit.nl/images/content/20231221_dammit_xcalibur_20040205_rantbox.png"></p>
<p>The homepage in november 2003, where I noted that I wanted to create my own weblog, but thought it too involved for what I had to say (not much, I thought):</p>
<p><img alt="XCalibur homepage in 2003" src="https://dammit.nl/images/content/20231221_dammit_xcalibur_20031124.png"></p>
<p>Real-time server information in november 2003 (fancy!):</p>
<p><img alt="XCalibur server info in 2003" src="https://dammit.nl/images/content/20231221_dammit_xcalibur_20031124_serverinfo.png"></p>NerdFonts on ChromeOS2023-12-06T16:40:02+01:002023-12-06T16:40:02+01:00Michiel Scholtentag:dammit.nl,2023-12-06:/chromeos-nerdfonts.html<p><img alt="ChromeOS hterm with NerdFonts-enabled vim" src="https://shuttereye.org/images/49/4941616121616125_2000-2000.png"></p>
<p>I get way too much 'kick' out of a <a href="https://dammit.nl/monaspaced.html">good font</a>, and the <a href="https://www.nerdfonts.com/">Nerd Fonts</a> project has been doing an awesome job at combining about every monospace font with glyphs/icons from FontAwesome, Devicons etc, for use in vim, terminal prompts and more. Of course I combine my frequent use …</p><p><img alt="ChromeOS hterm with NerdFonts-enabled vim" src="https://shuttereye.org/images/49/4941616121616125_2000-2000.png"></p>
<p>I get way too much 'kick' out of a <a href="https://dammit.nl/monaspaced.html">good font</a>, and the <a href="https://www.nerdfonts.com/">Nerd Fonts</a> project has been doing an awesome job at combining about every monospace font with glyphs/icons from FontAwesome, Devicons etc, for use in vim, terminal prompts and more. Of course I combine my frequent use of terminals with the lovely fonts above and my wielding of a variety of gadgets, among which two ChromeOS-based 2-in-1 tablets, which means the default configuration of the terminal on these devices falls short of expectations.</p>
<p>The built-in monospace fonts in the so-called <code>hterm</code> terminal on Chromebooks has some extra glyphs, but by far not the complete set of icons that we have grown to expect from the likes of NerdFonts.</p>
<p>How to fix?</p>
<p>Start with opening the extended terminal/SSH preferences by pasting (or typing) this URL in Chrome: <code>chrome-untrusted://terminal/html/nassh_preferences_editor.html</code> and point the 'Custom CSS (URI)' field to a URL hosting a CSS file with content this one:</p>
<pre><code class="language-css">@font-face {
font-family: "Hack Sans Mono Nerd";
src: url("https://cdn.example.com/chromeos/HackNerdFontMono-Regular.ttf");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "JetBrains Sans Mono Nerd";
src: url("https://cdn.example.com/chromeos/JetBrainsMonoNerdFontMono-Regular.ttf");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "DejaVu Sans Mono Nerd";
src: url("https://raw.githubusercontent.com/ryanoasis/nerd-fonts/master/patched-fonts/DejaVuSansMono/Regular/complete/DejaVu%20Sans%20Mono%20Nerd%20Font%20Complete%20Mono.ttf");
font-weight: normal;
font-style: normal;
}
</code></pre>
<p>This of course assumes you have access to a webserver to host such a file on, preferably with some of the fonts too. We'll skip over that part here for scope's sake.</p>
<p>In the 'Text font family' input field, type the name of the font you'd like to use, for example <code>'Hack Sans Mono Nerd', monospace</code> (this falls back to the default <code>monospace</code>).</p>
<p>Now comes the fun part, as serving this file is pretty easy, but the <code>hterm</code> ChromeOS terminal does not load the styling or the font files if the relevant cross-origin headers are not set correctly on the webserver; this would mean that the server would tell the client (generally the browser, in our case the terminal-that's-really-just-a-browser-window) that it is not allowed to load the content when it is not from the same domain name/server/location. As the ChromeOS terminal loads from a local resource on the Chromebook, of course it will never match your webserver's location, so we will have to take that into account.</p>
<p>Thankfully, the mentioned headers are there to tell the webserver what to - er, well - tell the client. <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin">Access-Control-Allow-Origin</a> is needed to accept loading the files from any location, and the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Embedder-Policy">Cross-Origin-Embedder-Policy</a> ('COEP') related headers are there to tell the client that it is allowed to use the files as resources in whatever it is trying to show. This latter one would normally prevent the loading of the stylesheet file with a line about 'COEP'; you can check that by typing <kbd>ctrl</kbd>+<kbd>shift</kbd>+<kbd>j</kbd> to open the dev tools while having a terminal window opened. The messages show up in the Console.</p>
<p>Now, to configure the webserver.</p>
<p>nginx config, for example:</p>
<pre><code> location / {
root /srv/www/cdn.example.com/;
location ~* \.(css|eot|ttf|woff|woff2)$ {
# Allow remote loading of fonts, e.g., when developing
add_header Access-Control-Allow-Origin *;
add_header Cross-Origin-Resource-Policy cross-origin;
add_header Cross-Origin-Embedder-Policy require-corp;
add_header Cross-Origin-Opener-Policy same-origin;
}
}
</code></pre>
<p>Apache config, for example:</p>
<pre><code> DocumentRoot /srv/www/cdn.example.com
<Directory />
# Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Origin *
Header set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type,Authorization,X-Requested-With"
Header set Access-Control-Allow-Credentials "true"
Header add Cross-Origin-Resource-Policy "cross-origin"
Header add Cross-Origin-Embedder-Policy "require-corp"
Header add Cross-Origin-Opener-Policy "same-origin"
</Directory>
</code></pre>
<p>Restart the webserver software, close all terminal windows on your Chromebook, and try the font by opening a fresh ChromeOS terminal.</p>
<p><img alt="starship.rs prompt" src="https://dammit.nl/images/content/20231206_chromeos_terminal_starship_prompt.png"></p>
<h2>Other ways, not always working</h2>
<p><kbd>ctrl</kbd>+<kbd>shift</kbd>+<kbd>j</kbd> to open the dev tools while having a terminal window opened. Go to the Javascript Console. Paste these commands, first adjusting to your wishes:</p>
<pre><code class="language-javascript">term_.prefs_.set('font-family', 'JetBrains Mono Nerd Font, monospace');
term_.prefs_.set('user-css-text', '@font-face {font-family: "JetBrains Mono Nerd Font"; src: url("https://cdn.example.com/chromeos/JetBrainsMonoNerdFontMono-Regular.ttf)"); font-weight: normal; font-style: normal;} x-row {text-rendering: optimizeLegibility;font-variant-ligatures: normal;}')
// or:
term_.prefs_.set('user-css-text', '@font-face {font-family: "JetBrains Mono Nerd Font"; src: url("https://raw.githubusercontent.com/ryanoasis/nerd-fonts/master/patched-fonts/JetBrainsMono/Ligatures/Regular/JetBrainsMonoNerdFont-Regular.ttf)"); font-weight: normal; font-style: normal;} x-row {text-rendering: optimizeLegibility;font-variant-ligatures: normal;}')
term_.prefs_.set('font-family', 'DejaVu Sans Mono Nerd');
term_.prefs_.set('user-css-text', '@font-face {font-family: "DejaVu Sans Mono Nerd"; src: url("https://raw.githubusercontent.com/ryanoasis/nerd-fonts/master/patched-fonts/DejaVuSansMono/Regular/complete/DejaVu%20Sans%20Mono%20Nerd%20Font%20Complete%20Mono.ttf"); font-weight: normal; font-style: normal;}')
</code></pre>
<p>This method should work too, but might need re-applying after a reboot. It has as pre that you do not need to host a stylesheet somewhere.</p>Playing audio/music on Steam Deck from other device2023-12-05T21:42:04+01:002023-12-05T21:42:04+01:00Michiel Scholtentag:dammit.nl,2023-12-05:/steamdeck-bluetooth-audio.html<p><img alt="Steam Deck playing Ori and the Blind Forest" src="https://shuttereye.org/images/e4/e4e4e86969f04fc6_2000-2000.jpg"></p>
<p>Recently I acquired the Linux gaming handheld better known as the Valve Steam Deck, pictured above sitting on top of a cozy plaid as winter is here. Getting one was kind of a gamble for me, as I was not entirely sure I would be into handheld gaming, but I …</p><p><img alt="Steam Deck playing Ori and the Blind Forest" src="https://shuttereye.org/images/e4/e4e4e86969f04fc6_2000-2000.jpg"></p>
<p>Recently I acquired the Linux gaming handheld better known as the Valve Steam Deck, pictured above sitting on top of a cozy plaid as winter is here. Getting one was kind of a gamble for me, as I was not entirely sure I would be into handheld gaming, but I really like it so far. One of the objectives for me was to finally play some of the games that have been gathering dust in my Steam library, and force myself to play some platformers - a genre I've been pretty bad at since forever. It makes it easy for me to play for a bit on the couch instead of having to go upstairs to my home office where The Workstation resides.</p>
<p>A great thing is that it plays pretty much everything I throw at it, often better than expected. The OLED screen (of course I got the newly revised edition) looks amazing too, even though it's "only" 1280x800 pixels. This is perfectly fine for its 7.4" size, and the great colours and inky blacks make for a mighty fine visual experience.</p>
<p>It courageously has a jackplug for headphones (the USB-C cable pictured at the right above is used for charging, and data if you like), so I happily use my headphones with it to enjoy the musical soundscapes of the games. While playing around, I discovered that when I paired my phone with the Deck, the Deck showed up as a target for playing audio too, and lo and behold, it mixes whatever I play on my phone right through whatever I'm doing on the Deck! This means that I can play music from my phone (or other device), or listen to the audio of some YouTube clip or similar, while seamlessly using the headphone plugged into the gaming device in my lap.</p>
<p>But Mike, you say, how in the Light did you do accomplish that magical feat?!</p>
<p>Press the <kbd>Steam</kbd> button to the left of the screen, choose <kbd>Power</kbd> and '<kbd>Switch to Desktop</kbd>'. Find the Bluetooth settings next to the clock or in the settings, and check the 'Show all devices' option to ensure it also shows phones and similar devices. Pair, then try playing something from your other device. Neat ey? Now tap the shortcut on the desktop to go back to gaming mode and enjoy your enhanced audio experience.</p>
<p>I use Arch btw.</p>nginx atom feed configuration2023-11-19T15:45:08+01:002023-11-19T15:45:08+01:00Michiel Scholtentag:dammit.nl,2023-11-19:/nginx-atom-feed.html<p><a href="https://shuttereye.org/nature/morning_stroll/IMG_3249.jpg/view/"><img alt="Spider web with dew drops" src="https://shuttereye.org/images/74/74d23339c971695a_2000-2000.jpg"></a></p>
<p>Today I got an email from the Google Search Console about a page, or pages on dammIT that are "Duplicate without user-selected canonical". That generally means that a website has two (very) similar pages that contain the same content, without having a <code><link rel="canonical"></code> element in the duplicating pages …</p><p><a href="https://shuttereye.org/nature/morning_stroll/IMG_3249.jpg/view/"><img alt="Spider web with dew drops" src="https://shuttereye.org/images/74/74d23339c971695a_2000-2000.jpg"></a></p>
<p>Today I got an email from the Google Search Console about a page, or pages on dammIT that are "Duplicate without user-selected canonical". That generally means that a website has two (very) similar pages that contain the same content, without having a <code><link rel="canonical"></code> element in the duplicating pages linking back (with the <code>href</code> property) to the 'original' <a href="https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls">or something similar</a>, to make clear which is the 'source', and which are 'variants'. It's fine to have duplicates as long as one makes it clear that they are not just padding, and where a visitor can find the spring.</p>
<p>I was curious as to what I would have duplicated, as I tend to not repeat myself much. Following the link from the email and looking in the dashboard that opened, it turned out to be the <code>https://dammit.nl/feeds/all.atom.xml</code> file, which is the general <a href="https://en.wikipedia.org/wiki/Atom_(web_standard)">Atom feed</a> that interested people can use to follow posts in all categories here on dammIT, in their favorite <a href="https://en.wikipedia.org/wiki/News_aggregator">feed reader/aggregator</a> (myself, I use <a href="https://www.inoreader.com/">Inoreader</a> as it has a great mobile app and decent web app and it saves all my read state and has handy features, but <a href="https://en.wikipedia.org/wiki/Comparison_of_feed_aggregators">there are plenty of others</a>). I can recommend using a feed reader instead of some social media website to read your daily fix with.</p>
<p>Anyway, that was amusing, as <em>of course</em> it duplicates stuff, it's the feed with all recent-ish content on my weblog after all. Apparently Google's crawler isn't all too aware about what this 'page' is about though, and a quick look at the headers in the 'Network' tab of my browser showed me that of course it was served as an item with mimetype <code>application/xml</code>, which could mean anything. As Atom has its own mimetype - <code>application/atom+xml</code> - I decided that it would a good idea to have the various Atom feeds be served with that mimetype, whether it would solve this particular 'issue' or not.</p>
<div class="admonition hint">
<p class="admonition-title">Hint</p>
<p>For example all the <a href="https://dammit.nl/categories.html">categories</a> have their own feed (e.g., <a href="https://dammit.nl/feeds/howto.atom.xml">howto</a>), as do <a href="https://dammit.nl/tags.html">the tags</a>.</p>
</div>
<p>As all the Atom feeds on dammIT are of the format <code>NAME.atom.xml</code> it is easy enough to match the files and have nginx use a different mimetype than for regular <code>.xml</code> files, like so:</p>
<pre><code>location ~* \.atom\.xml$ {
types { } default_type "application/atom+xml; charset=utf-8";
}
</code></pre>
<p>So I did, and after a quick restart of nginx I refreshed my browser tab with the <code>https://dammit.nl/feeds/all.atom.xml</code> feed and was greeted with a 404 Not Found page, which was slightly surprising. It turned out that was because of the way I configured the various root directories/items in the dammIT nginx configuration:</p>
<pre><code>server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name dammit.nl;
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
access_log /var/log/nginx/access_dammit.nl.log;
error_log /var/log/nginx/error_dammit.nl.log warn;
location ~* \.atom\.xml$ {
types { } default_type "application/atom+xml; charset=utf-8";
}
location / {
root /path/to/dammit.nl/;
}
location /images/dammit.svg {
alias /path/to/dammit.nl/images/dammit.svg;
}
location /images/ {
root /other/path/to/www_data/dammit.nl/;
}
# ...
}
</code></pre>
<p>As you can see, there is some specific root and alias configurations going on here, and the <code>location</code> item for <code>*.atom.xml</code> does not contain a root. It also doesn't help to put this specific <code>location</code> item at the end (it doesn't magically inherit the correct root), but providing an explicit root that corresponds with the rest of the generated files <em>does</em> work:</p>
<pre><code>location ~* \.atom\.xml$ {
types { } default_type "application/atom+xml; charset=utf-8";
root /srv/www/dammit.nl/;
}
</code></pre>
<p>So that's how it ended up looking.</p>
<p>As of writing, validating the page indexing issue is still pending, so I'm curious if it even fixes the original problem to begin with :)</p>Monaspaced2023-11-13T22:27:26+01:002023-11-13T22:27:26+01:00Michiel Scholtentag:dammit.nl,2023-11-13:/monaspaced.html<p><img alt="Monaspaced" src="https://dammit.nl/images/content/monaspaced.png"></p>
<p>As some of you might know, GitHub with their GitHubNext team recently released <a href="https://github.com/githubnext/monaspace">their own monospace font, Monaspace</a> in five variants. I was intrigued, because they actually made for an interesting take on the concept, and it was not just one font, but a whole family with each their <a href="https://monaspace.githubnext.com/">own …</a></p><p><img alt="Monaspaced" src="https://dammit.nl/images/content/monaspaced.png"></p>
<p>As some of you might know, GitHub with their GitHubNext team recently released <a href="https://github.com/githubnext/monaspace">their own monospace font, Monaspace</a> in five variants. I was intrigued, because they actually made for an interesting take on the concept, and it was not just one font, but a whole family with each their <a href="https://monaspace.githubnext.com/">own characteristics</a>.</p>
<p>As I was a tad tired of the font family used on dammIT an idea grew, and when <a href="https://xeiaso.net/">Xe</a> challenged me to do it, I implemented it.</p>
<p>Behold, using all five Monaspace families, from Argon as main body typeface, Krypton for headings, Neon for <a href="https://dammit.nl/vim-reloaded.html">codeblocks</a>, Radon for <a href="https://dammit.nl/admonitions.html">admonitions</a> and Xeon for, errr, ah yes, commenting fields!</p>
<p>Another example where it all comes together is <a href="https://dammit.nl/firefox-deb-ubuntu-2204.html">this post on Firefox</a>.</p>
<p>Enjoy the mon~~o~~aspaced dammIT HQ.</p>On YouTube, adblocking, the state of our ad-driven internet2023-11-06T20:58:33+01:002023-11-06T20:58:33+01:00Michiel Scholtentag:dammit.nl,2023-11-06:/link-youtube-adblocking.html<p>Internet 'fundamentalist' Louis Rossmann on YouTube, adblocking and the state of the ad-supported internet that's currently our reality.</p>
<p>There are some good points made about how the internet turned to shit, basically because the race to the bottom we made with for example jumping on Gmail in 2004 with its …</p><p>Internet 'fundamentalist' Louis Rossmann on YouTube, adblocking and the state of the ad-supported internet that's currently our reality.</p>
<p>There are some good points made about how the internet turned to shit, basically because the race to the bottom we made with for example jumping on Gmail in 2004 with its free 1GB of storage for Free (except that Google reads all your mail for targeting/profiling purposes). People expect things on the net to be free and advertisements are the answer to journalists, videomakers and the like to still make some money. Except that nobody likes them, and that they enable the worst of content to bubble up, because clicks pay and haha look at this funny dog, awww cute cat, hey look, <a href="https://9to5google.com/2023/11/06/youtube-random-video-button-app/">a black button in the YouTube app</a> that starts an endless random stream of shorts; oh what a <em>bleeping</em> human being to act that way... What was I saying?</p>
<p>Ah yes, content we shouldn't maybe even be consuming in the first place (really, there's so much great material to read, watch and enjoy - grab a book for example).</p>
<p>The funny thing with Google and its penny-in-couch quest is that it so interestingly backfiring. Normal people weren't using adblockers; most didn't even know they are a thing. Now a lot of press coverage is generated, in true Streisand effect style, adblockers are in the spotlight and lot of people that were previously unaware of their existence are discovering they are a Thing, and they actually improve the experience in general. For free!</p>
<p>Adblocker-blockers aren't the answer. Nobody wants to see the mostly irrelevant, bad and badly-timed ads in videos and written articles alike, and having them shoved into our faces is not going to help. On the other hand, journalism costs money. Hosting is not free (not for written media and especially true for streaming video platforms), as is the time of people who try to make a living out of putting interesting and good material online for us to enjoy and learn from.</p>
<p>Going back to subscriptions can be an answer. Please make sure not to screw these up by still annoying people with things like advertisements while there already has been paid good money for the subscription. Also, we really do not need those computer-generated listicles, comparison sites with the most minimal effort that purely exist to generate revenue by affiliate links.</p>
<p>I think there's a place for quite a few paid services, as long as they actually facilitate good material (ugh, 'content') and adhere to the above. On the other hand, we need to solve the 1001-subscriptions problem. We have some hard problems to solve, but it's not the first time in human history we had to do just that, and I think working on a more enjoyable net for the Greater Good is feasible.</p>
<p>Or I am just still the naively optimistically utopian-thinking person that I tend to become when that side of me wins some brain time from my regular, more cynically-inclined character.</p>
<p>Oh, the anti-sponsor spot for Intuit Quickbooks is hilarious; what a bad piece of Intuit software. And people trust their money with them... Worth a watch just to oggle and grin at the weird bugs.</p>Free Public WiFi2023-07-30T16:01:27+02:002023-07-30T16:01:27+02:00Michiel Scholtentag:dammit.nl,2023-07-30:/link-free-public-wifi.html<blockquote>
<p>Remember Free Public WiFi?</p>
<p>Once, many years ago, I stayed on the 62nd floor of the Westin Peachtree Plaza in Atlanta, Georgia. This was in the age when the price of a hotel room was directly correlated with the price of the WiFi service, and as a high school student …</p></blockquote><blockquote>
<p>Remember Free Public WiFi?</p>
<p>Once, many years ago, I stayed on the 62nd floor of the Westin Peachtree Plaza in Atlanta, Georgia. This was in the age when the price of a hotel room was directly correlated with the price of the WiFi service, and as a high school student I was not prepared to pay in excess of $15 a day for the internet. As I remember, a Motel 6 that was not blocks away but within line of sight ended up filling the role. But even up there, 62 floors from the ground, there was false promise: Free Public WiFi.</p>
</blockquote>
<p>Remember those networks? They used to be everywhere. Fun little trip down memory lane about the how, why, and where they went. (Spoiler: they weren't real networks).</p>Meta’s vision for Threads is more mega-mall than public square2023-07-08T23:47:51+02:002023-07-08T23:47:51+02:00Michiel Scholtentag:dammit.nl,2023-07-08:/link-meta-vision-threads.html<p>Why I have zero interest in trying Threads, even read-only.</p>
<blockquote>
<p>Mosseri’s take here is strange and fairly alarming for a few reasons. For one, it echoes some of the anodyne ways that Facebook has described itself over the years: just a big, friendly, neutral place where people could “connect …</p></blockquote><p>Why I have zero interest in trying Threads, even read-only.</p>
<blockquote>
<p>Mosseri’s take here is strange and fairly alarming for a few reasons. For one, it echoes some of the anodyne ways that Facebook has described itself over the years: just a big, friendly, neutral place where people could “connect” — Mark Zuckerberg’s favored pitch and one that conjures images of a male and female USB cable making love. Contrary to its stated neutrality, his company ritualistically incentivized particular forms of content and behavior, driving Facebook users deeper into ideological echo chambers while fanning the flames of the polarization and extremism that plagues global politics today</p>
</blockquote>Get Hooked2023-06-22T21:00:24+02:002023-06-22T21:00:24+02:00Michiel Scholtentag:dammit.nl,2023-06-22:/get-hooked.html<p><img alt="Actual code of the amazing webhook project" src="https://shuttereye.org/images/40/4030b0b8999b9f9b_2000-2000.jpeg"></p>
<p>Are you tired of doing everything by hand, having to remote into a build server to switch to that certain user account, then type in a bunch of commands, looking them up in your shell's history?</p>
<p>Or has your CI failed you again? Is the company behind it forcing some …</p><p><img alt="Actual code of the amazing webhook project" src="https://shuttereye.org/images/40/4030b0b8999b9f9b_2000-2000.jpeg"></p>
<p>Are you tired of doing everything by hand, having to remote into a build server to switch to that certain user account, then type in a bunch of commands, looking them up in your shell's history?</p>
<p>Or has your CI failed you again? Is the company behind it forcing some big update on you, or has that update just brought down half of your infra? Did you fall asleep halfway through reading how to set up the building of artifacts? Or do you just want to update some Git repository checkouts on a handful of servers instead of investing so many of your precious lunch time investigating how to do the easy stuff with that piece of garbage? Especially since the documentation is from before you where born and has the same coherence as your thoughts before coffee?</p>
<p>"Mike," you say "I recognise some of what you are talking about above, but what on earth are you gearing up to?"</p>
<p>Glad you asked!</p>
<p>Let me introduce to you: <a href="https://github.com/aquatix/webhaak/">webhaak</a>! Yes, that's a fancy spelling of 'webhook', the technology glue behind a lot of online automation. Fancy because it is actually the Dutch spelling of the word, and we all know that the Dutch are fancy with their windmills, Turkish tulips, wooden shoes, weed, waterworks, electric cars and such. (Well, actually, they do not spell it like that in The Netherlands, as they just use 'webhook' too, like they long ago stopped saying 'rekenmachine' to a computer and 'gegevensbank' to databases. But I digress).</p>
<p>"Fancy words, Mike!"</p>
<p>Thanks.</p>
<p><code>webhaak</code> is something that should not be missing from your toolkit. It slices, it dices, it takes an incoming URL call and executes the commands you configured it to do on that trigger; it updates Git checkouts, performs checks, builds whatever you want it to build <sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>, all done asynchronously because that is fashionable and also because it is not good design to perform bigger tasks in the view of a web application, so it uses <a href="https://python-rq.org/">a queueing backend</a> that is actually easy to install and maintain, with a worker that does all that hard work for you. Whenever it is done, it notifies you if you want. Support for PushOver and Telegram, all those developer friendly notification channels! Or just have it fire a webhook instead, it is what it is good at, those webhooks.</p>
<p>Did you know the very weblog you are watching this message on is automatically built via <code>webhook</code>? Now you do!</p>
<p>This product is 100% Python <sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup> because why not? Of course, it is also <a href="https://pypi.org/project/webhaak/">pushed to PyPI</a>, so you can install it with a simple <code>pip install webhaak</code>!</p>
<p>"Mike, it errors on download!"</p>
<p>That is because it is so bleeding edge! It makes your edge bleed because it is such a sharp tool! Now look at <a href="https://github.com/aquatix/webhaak/blob/master/example_config/examples.yaml">this user friendly yaml configuration file</a>.</p>
<p>"Mike, this is amazing!"</p>
<p>But wait, there is more! There even is functionality coming that creates informational notifications about new pull requests and updates of those, so you can finally make sure your team mates are taking part in the process.</p>
<p>Apart from that, <a href="https://webhaak.readthedocs.io/en/latest/">documentation can be found on Read the Docs</a>, not even connected through webhaak itself, but updates <em>are</em> kicked off through the magic of webhooks originating from GitHub, as that is all we are here for.</p>
<p>There even is <a href="https://github.com/aquatix/webhaak-ui">a web frontend</a> for the REST goodness that is <code>webhaak</code>. Just host this HTML file wherever you want and the actions really become a single click action.</p>
<p>Now, get hooked too, and start using <a href="https://github.com/aquatix/webhaak/">webhaak</a> in production! Or even on your dev tryout machine! Maybe hook it up to your documentation repository and have it build your Sphinx documentation on push, or go out on a limb, glue it to <a href="https://www.fabfile.org/">Fabric</a> and go wild!</p>
<p>We love to hear your success stories <a href="https://github.com/aquatix/webhaak/issues">in the issue tracker</a>.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:1">
<p>As long as you tell it how to do so <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>With a healthy dose of shell scripts <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Why You Should Stop Reading News2023-03-18T16:04:28+01:002023-03-18T16:04:28+01:00Michiel Scholtentag:dammit.nl,2023-03-18:/link-stop-reading-news.html<blockquote>
<p>News is, by definition, something that doesn’t last. It exists for only a moment before it changes. As news has become easier to distribute and cheaper to produce, the quality has decreased, and the quantity has increased, making it nearly impossible to find the signal in the noise.</p>
</blockquote>
<p>So …</p><blockquote>
<p>News is, by definition, something that doesn’t last. It exists for only a moment before it changes. As news has become easier to distribute and cheaper to produce, the quality has decreased, and the quantity has increased, making it nearly impossible to find the signal in the noise.</p>
</blockquote>
<p>So why keep yourself submerged in it? The rate in which information/tidbits are fired into our brains has increased a lot over the years, and we barely have time to form thoughts about them ourselves; probably the person writing the article we just read isn't that well-informed on the subject themselves either.</p>
<p>Myself, I quit cold-turkey years ago when I realised I could just keep reading news factlets continuously. I prefer reading a good book instead, or watching a TV series, spending time actually paying attention to my dear ones or being submerged in a game instead. There's barely enough time for that as it is, so not spending time on news helps tremendously. Important stuff will percolate through anyway. It surely was healthy for my (state of) mind.</p>
<p>Anyway, good read, food for thought.</p>
<p><a href="https://shuttereye.org/photolog/1000026627-01.jpeg/view/"><img alt="Frozen rose-like forms on a rock" src="https://shuttereye.org/images/64/6476062c8c5145e6_2000-2000.jpeg"></a></p>Frozen fog2023-03-02T11:44:31+01:002023-03-02T11:44:31+01:00Michiel Scholtentag:dammit.nl,2023-03-02:/frozen-fog.html<p>Views that make me happy.</p>
<p><a href="https://shuttereye.org/photolog/PXL_20230301_073911460-01.jpeg/view/"><img alt="Cluster of trees in the fog with rays of sunlight, in front of a frosty canal" src="https://shuttereye.org/images/f0/f089999118069098_2000-2000.jpeg"></a></p>Tiktok's enshittification2023-01-28T20:49:33+01:002023-01-28T20:49:33+01:00Michiel Scholtentag:dammit.nl,2023-01-28:/link-tiktoks-enshittification.html<p><img alt="Potato" src="https://shuttereye.org/images/09/091189898998dd6c_2000-2000.jpeg"></p>
<blockquote>
<p>Here is how platforms die: first, they are good to their users; then they abuse their users to make things better for their business customers; finally, they abuse those business customers to claw back all the value for themselves. Then, they die.</p>
<p>I call this enshittification, and it is a …</p></blockquote><p><img alt="Potato" src="https://shuttereye.org/images/09/091189898998dd6c_2000-2000.jpeg"></p>
<blockquote>
<p>Here is how platforms die: first, they are good to their users; then they abuse their users to make things better for their business customers; finally, they abuse those business customers to claw back all the value for themselves. Then, they die.</p>
<p>I call this enshittification, and it is a seemingly inevitable consequence arising from the combination of the ease of changing how a platform allocates value, combined with the nature of a "two sided market," where a platform sits between buyers and sellers, hold each hostage to the other, raking off an ever-larger share of the value that passes between them.</p>
</blockquote>
<p>After a platform takes off because it actually is useful for its users it starts growing, it takes money from investors and/or business users, it starts dancing to their tune, and it's downhill from there for their users and then for their business users too, clawing back all the value for themselves.</p>
<p>Then they die.</p>
<p>Amazon is a good example, like the article continues to point out. For example, it used to have a block on an article's page that showed what else people buying this product, also bought. This was a great way of finding out interesting related products, or even better versions of the stuff that you just found.</p>
<p>Of course that's not a thing any more. You just get emails and ads trying to sell you the same product you just bought. Their search has never worked for me, and I've had an account there for decades. It's just ads.</p>
<p>They have stagnated, act really shitty to their employees and I have been done with them for years, and I hope more people will turn away from buying from/through them.</p>
<p>Anyway.</p>
<p>Apart from me needing to stop posting rambling posts late at night, just go read the article :)</p>Transplanting files and directories to other repository keeping Git history2023-01-12T10:26:47+01:002023-01-12T10:26:47+01:00Michiel Scholtentag:dammit.nl,2023-01-12:/transplanting-files-keeping-git-history.html<p>Recently, I wanted to split off a few files from a Git repository in which I keep notes to a repository of their own. Reason was that they served an entirely different purpose than the rest, so it made more sense to separate the two sets.</p>
<p>However, they had quite …</p><p>Recently, I wanted to split off a few files from a Git repository in which I keep notes to a repository of their own. Reason was that they served an entirely different purpose than the rest, so it made more sense to separate the two sets.</p>
<p>However, they had quite some commit history in the original repository, and I didn't want to lose that. Thankfully, I found a neat way of doing just that.</p>
<p>If your history is sane, you can take the commits out as patch and apply them in the new repository:</p>
<pre><code class="language-bash">cd repository
git log --pretty=email --patch-with-stat --reverse --full-index --binary -m --first-parent -- path/to/file_or_folder > patch
cd ../another_repository
git am --committer-date-is-author-date < ../repository/patch
</code></pre>
<p>In the <code>patch</code> file (which you can of course name however you like), you can edit the paths if you like before importing again in the other repository; it is just a text file with all the commits in email format. Editing paths is for example useful when you have files in some subdirectory, and now want them in the root of the new repository, or in another subdirectory, or rename the files altogether.</p>
<p>Alternatively, you can do it in one line (of course skipping any renaming this way):</p>
<pre><code class="language-bash">git log --pretty=email --patch-with-stat --reverse --full-index --binary -m --first-parent -- path/to/file_or_folder | (cd /path/to/new_repository && git am --committer-date-is-author-date)
</code></pre>
<p><a href="https://stackoverflow.com/a/11426261">source</a></p>Have a very nominal 20232023-01-01T17:02:29+01:002023-01-01T17:02:29+01:00Michiel Scholtentag:dammit.nl,2023-01-01:/have-a-very-nominal-2023.html<p>The year 2022 has been an interesting one for me personally. At work, we had a lot of interesting developments, most of which I'm pretty happy with. On a personal level, we had some breakthroughs with matters we have been struggling with for quite some years now. I think I'll …</p><p>The year 2022 has been an interesting one for me personally. At work, we had a lot of interesting developments, most of which I'm pretty happy with. On a personal level, we had some breakthroughs with matters we have been struggling with for quite some years now. I think I'll keep the details for a 'hindsight is 20-22' post and stick with wishing all of you a very good 2023!</p>
<p>Stay healthy, stay sane!</p>vim, a true coding knight2022-12-10T13:05:40+01:002022-12-10T13:05:40+01:00Michiel Scholtentag:dammit.nl,2022-12-10:/song-about-vim.html<blockquote>
<p>Verse 1:<br>
In the land of the hackers,<br>
Where the code never sleeps,<br>
There's an editor that rules them all,<br>
The one they call Vim. </p>
<p>Chorus:<br>
Vim, Vim, the editor of choice,<br>
For those who crave speed and power,<br>
With its shortcuts and commands,<br>
It will make you a coding …</p></blockquote><blockquote>
<p>Verse 1:<br>
In the land of the hackers,<br>
Where the code never sleeps,<br>
There's an editor that rules them all,<br>
The one they call Vim. </p>
<p>Chorus:<br>
Vim, Vim, the editor of choice,<br>
For those who crave speed and power,<br>
With its shortcuts and commands,<br>
It will make you a coding tower. </p>
<p>Verse 2:<br>
Some may prefer GUI,<br>
But for us command-line kings,<br>
Vim is the way to go,<br>
Our editing lord and savior. </p>
<p>Chorus:<br>
Vim, Vim, the editor of choice,<br>
For those who crave speed and power,<br>
With its shortcuts and commands,<br>
It will make you a coding tower. </p>
<p>Bridge:<br>
From its humble beginnings,<br>
To its current might,<br>
Vim has proven its worth,<br>
A true coding knight. </p>
<p>Chorus:<br>
Vim, Vim, the editor of choice,<br>
For those who crave speed and power,<br>
With its shortcuts and commands,<br>
It will make you a coding tower. </p>
</blockquote>
<ul>
<li>(<a href="https://chat.openai.com/chat">GPT</a>)</li>
</ul>Admonitions, or how to box heads-ups2022-11-03T21:23:23+01:002022-11-03T21:23:23+01:00Michiel Scholtentag:dammit.nl,2022-11-03:/admonitions.html<p>As of about <a href="https://github.com/aquatix/dammit.nl/commit/d1ed7f3021b6985185e9e21e477c7acaec1300c1">15 minutes ago</a>, I finally have styled admonitions here at dammIT HQ. If you are unsure about what those are, you might have seen them in the wild but just didn't know their name. Behold:</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Note that this code is 100% organically grown at home and …</p></div><p>As of about <a href="https://github.com/aquatix/dammit.nl/commit/d1ed7f3021b6985185e9e21e477c7acaec1300c1">15 minutes ago</a>, I finally have styled admonitions here at dammIT HQ. If you are unsure about what those are, you might have seen them in the wild but just didn't know their name. Behold:</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Note that this code is 100% organically grown at home and is not guaranteed to work or even look pretty.</p>
<p>Feel free to use it in your own projects, it might even work and do what you want.</p>
</div>
<div class="admonition danger">
<p class="admonition-title">Danger</p>
<p>It will eat your cat.</p>
</div>
<div class="admonition hint">
<p class="admonition-title">Hint</p>
<p>It might cook you dinner though.</p>
</div>
<p>These are pretty handy, as important notes can be highlighted in a visually distinctive way without breaking the flow of the post (too much).</p>
<p>If the icons look familiar, I blatantly <a href="https://github.com/Pelican-Elegant/elegant/blob/master/static/css/admonition.css">stole them from Elegant</a> (where they <a href="https://dvesti.github.io/Pelican/2018/12/18/warnings-admonition/">look like this</a>).</p>
<p>Anyway, always fun to tinker with my weblog; this was instigated by <a href="https://maya.land/updates/2022/11/02/update-fonts-vampires.html">Maya's updated font</a> the looks of which I greatly appreciate. I was thinking about changing the font(s) here too, but somehow I keep coming back to the current one.</p>
<p>I've been doing UI clean-ups and tweaks at work too lately and greatly enjoying myself. I'm by no means a good designer, but making UI's work and look better is just so satisfying.</p>OpenSSL gave everyone alarm fatigue2022-11-02T09:28:26+01:002022-11-02T09:28:26+01:00Michiel Scholtentag:dammit.nl,2022-11-02:/link-alarm-fatigue.html<blockquote>
<p>I'm worried that this is going to be seen as a reason to not take "CRITICAL" disclosures seriously at first glance like we should. A "CRITICAL" bug MUST be treated as if it was critically bad. From a community health perspective, people have been told that something really bad is …</p></blockquote><blockquote>
<p>I'm worried that this is going to be seen as a reason to not take "CRITICAL" disclosures seriously at first glance like we should. A "CRITICAL" bug MUST be treated as if it was critically bad. From a community health perspective, people have been told that something really bad is about to come out for a week and then had the rug pulled out from under them and now it's "nah we were wrong you're probably fine".</p>
</blockquote>
<p>I totally agree. For a week, I was slightly anxious about the impact this vulnerability would have on our systems at work and my own private services. I relaxed a bit when I realised Debian 11 ships with OpenSSL 1.1.1 which is not impacted, but still was keeping my eye out for everything else.</p>
<p>Then, yesterday it turned out that - yes - it is bad, but in really specific, not even that often occurring circumstances. Combined with the re-framed impact level of 'high', that takes away believability of the initial 'this is really impactful!' news and the accompanying hype.</p>
<p><a href="https://www.openssl.org/blog/blog/2022/11/01/email-address-overflows/">The information provided by the devs themselves on the OpenSSL blog</a></p>Hilary Hahn is such a gem2022-10-06T10:49:07+02:002022-10-06T10:49:07+02:00Michiel Scholtentag:dammit.nl,2022-10-06:/hilary-hahn.html<p>Last Friday my better half and me went to <a href="https://www.rotterdamsphilharmonisch.nl/agenda/hilary-hahn-speelt-dvorak">a concert</a>. The Rotterdam Philharmonic Orchestra was playing a contemporary piece (Con Brio, surprisingly nice with musicians using their instruments as percussion and such), the Violin Concerto by Dvořák and the First Symphony of Brahms.</p>
<p>The very reason we went there …</p><p>Last Friday my better half and me went to <a href="https://www.rotterdamsphilharmonisch.nl/agenda/hilary-hahn-speelt-dvorak">a concert</a>. The Rotterdam Philharmonic Orchestra was playing a contemporary piece (Con Brio, surprisingly nice with musicians using their instruments as percussion and such), the Violin Concerto by Dvořák and the First Symphony of Brahms.</p>
<p>The very reason we went there was to witness and experience our violin crush Hilary Hahn. Apart from being a beautiful lady, she just has just such a playfully skilled style; the joy of making music is clearly visible and the difficult pieces look and sound effortless and bright. She has a nice interaction with the orchestra and even made some dance steps at certain parts :)</p>
<p>All in all, it was exciting and fulfilling to witness and have it gulf over us.</p>
<p>The First Symphony of Brahms that was played afterwards by the orchestra - while played beautifully - in contrast seemed a bit dull. Or maybe we just are growing old and get tired after ten in the evening.</p>
<p>Anyway, I just hope Hilary Hahn can continue to brighten up the lives of people for a long while!</p>
<p><a href="https://shuttereye.org/various/dammit/PXL_20220930_190855070.jpg/view/"><img alt="Hilary Hahn in De Doelen, Rotterdam" src="https://shuttereye.org/images/b4/b4f8646cbcf3b1ec_2000-2000.jpg"></a></p>
<p>I liked the interior and colour setting of the venue too; <a href="https://en.wikipedia.org/wiki/De_Doelen">De Doelen</a> is pretty nice:</p>
<p><a href="https://shuttereye.org/various/dammit/PXL_20220930_175430086.jpg/view/"><img alt="De Doelen concert hall in Rotterdam" src="https://shuttereye.org/images/62/6270c64892e667f2_2000-2000.jpg"></a></p>