Is programmeren echt zo moeilijk dan?

Scratch editor met bewegende katSinds begin dit jaar probeer ik als newbie coach te helpen bij CoderDojo Genk. Ik moet eerlijk zijn, ik ken nog niet écht veel van Scratch en nog veel minder van micro:bit, maar ik ga ervan uit dat dat wel zal komen. Soit, afgelopen weekend vertelde de moeder van 2 deelnemers me dat programmeren haar zo moeilijk lijkt. In de chaos van het moment heb ik daar amper op geantwoord, maar die opmerking heeft de schoolmeester in mij toch een beetje wakker gehouden. Want is programmeren echt zo moeilijk? Als een “leek” het werk van een échte developer op het scherm ziet, lijkt dat ongetwijfeld ondoorgrondelijke tekst met hier en daar enkele herkenbare Engelse woorden waar verder kop noch staart aan te krijgen is. Het succes van Scratch is dat het die letterspaghetti verbergt achter mooi gekleurde blokjes die logisch in elkaar kunnen worden geklikt om zo de basisconcepten van het programmeren spelenderwijze aan te leren. Maar zitten er achter die Scratch-blokjes eigenlijk geen eenvoudige ideeën die iedereen zou kunnen begrijpen?

Ik probeer even met een denkbeeldig spelletje waar je een vliegtuigje moet besturen;

  • in elk computerprogramma (software) zitten er acties; toon een vliegtuigje en een achtergrond, … (dus dikwijls “uitvoer” naar de gebruiker van de software)
  • er is logica om de gebruiker toe te laten om die actie te beïnvloeden (de invoer of input), bijvoorbeeld het pijltje naar boven of beneden om het vliegtuigje te besturen
  • die invoer wordt getoetst aan “als … dan” voorwaarden (testen): dalen of stijgen is afhankelijk van welk pijltje wordt ingedrukt, maar een voorwaarde kan even goed controleren of de positie van het vliegtuigje te laag vliegt waarop het crasht of landt (een nieuw actie dus)
  • software zal dikwijls informatie bijhouden (en soms tonen) in “variabelen“, bv. de huidige positie van het vliegtuigje of een score of het aantal levens dat je nog resten in een spel
  • als scores worden bijgehouden kan om de high scores te tonen een lus gebruikt worden. zo een “loop” kan een vast aantal keer doorlopen worden (zoals een top 5 om de eerste vijf resultaten uit een al geordende lijst), maar een lus kan ook doorlopen worden tot er aan een voorwaarde voldaan is (bijvoorbeeld als je een oneindig aantal pogingen krijgt om woord te raden, in dat geval blijf je in die lus tot je het woord geraden hebt).

Is dat echt alles? Nee, er komt natuurlijk meer bij software development kijken; het opvangen van fouten, de code veilig maken voor hackers, de code leesbaar en onderhoudbaar houden voor collega’s zorgen voor technische documentatie, zorgen voor automatische testen en het communiceren met databases of andere software om maar een paar zaken te noemen. Vanzelfsprekend bevat zowat elk stukje software honderden of duizenden acties, voorwaarden, loops, variabelen en databank velden, maar bovenstaande concepten geven wel een beeld met welke betrekkelijk eenvoudige basisblokken software wordt geschreven.

Programmeren is in de eerste plaats dan ook volgens een bepaalde logica nadenken. De juiste vragen stellen en proberen, falen, je afvragen waarom het niet werkt en met dat nieuwe inzicht opnieuw proberen tot het werkt. Dat heb ik dikwijls ook geantwoord op de Coderdojo aan de Scratchende kinderen/ tieners; “Wat denk je zelf dat er moet gebeuren?” en “OK, probeer het eens en kijk of het werkt”. En zo leer ik ook beetje bij beetje Scratchen 🙂

How to go block-less with the WordPress ActivityPub plugin

Being the web performance zealot I am, I strive to having as little JavaScript on my sites as possible. JavaScript after all has to be downloaded and has to be executed, so extra JS will always have a performance impact even when in the best of circumstances it exceptionally does not impact Core Web Vitals (which are a snapshot of the bigger performance and sustainability picture). Hence when adding blocks in WordPress, I check if the block is entirely rendered server-side and if not I look for alternatives to avoid multiple files from wp-includes/js/dist (and in the case of some 3rd party blocks the entire React JS and more) being loaded.

For that reason I tested the WordPress ActivityPub plugin with the reactions block loaded as per these guidelines and indeed it triggers the loading of hooks.min.jsi18n.min.jsurl.min.js, api-fetch.min.js (all in wp-includes/js/dist) and 2 files from the plugin itself (/wp-content/plugins/activitypub/build/reactions/view.js and /wp-content/plugins/activitypub/build/remote-reply/view.js).

To be able to reduce the dependency on those JavaScript files, 2 questions needed to be answered; how to have reactions (which I like a lot) without the JavaScript-driven rendering and what is that remote-reply thing.

Starting with the latter; “remote-reply” handles the federation of local comments on reactions (comments) from the Fediverse, showing a modal window where the commenter is asked what ActivityPub account they want to post the reaction from. I decided this was not that important for me and –with some help from Matthias @pfefferle who always gives great support- came up with a couple of lines of code to not “do” remote-reply on this blog.

Now that Fediverse reactions block is very nice and I did want reactions showing on my blog, so I started looking at the database and the ActivityPub plugin code and saw that all Fediverse reactions were stored in the wp-comment en wp-comment-meta db-tables and were in fact accessible with the WP_Comment_Query class. With quite a bit of trial and error I ultimately ended up with a totally server-side generated solution that looks pretty nice (and similar to the JavaScript-rendered one).

If you’re interested, you can find the code in this gist, but don’t expect it to be good. Some negatives include no language handling, unminified CSS inline and the placement of the reactions might not work on every theme as I hook into the comments_template action to try to show them just before the comments. But who knows it might just work for you as well?

As seen on YouTube; Angine de Poitrine live on KEXP

Angine de Poitrine live on KEXP. French-Canadian Dada-ist instrumental rock-techno-jazz maybe? A bit of Can, Primus, King Crimson and Sun Ra and a whole lot of virtuoso drums and guitar loop-pedal juggling. If I could I’d go straight for the moshpit but it’s just me in my homeoffice so …

Some of the YouTube comments (not a cesspool, for once) are spot on;

Aside from their insane technical skills, the fact that the guitarist can keep the looper in time whilst playing a microtonal guitar on top of odd timesignatures blows my mind. All hail!

No artificial intelligence without original thought could come up with something this bizarre and enthralling.

my wife isn’t going to appreciate a single second of this

Anyway, just look & listen;

Angine de Poitrine - Full Performance (Live on KEXP)

Zijn er Meshcore-users in de Limburgse Maasvallei?

Ik steek het op de Fediverse, waar ik sinds een paar weken (maanden?) regelmatig posts langs zag komen over Meshcore als technologie/ software voor gedecentraliseerde ad-hoc netwerken voor tekst-gebaseerde berichten op basis van LoRa radio. Ik heb me zo een Sensecap T1000-e gekocht, meshcore geflasht (vanuit Chrome, poef) en verbonden met m’n Fairphone met de Meshcore app en … niks. Adverts gestuurd, eerst braaf 1 hop, daarna floods. Maar nee, niemand te zien. Alleen op de wereld!

Anderzijds mag me dat niet verwonderen; zelfs met de GSM is de ontvangst hier in de bossen aan de rand van het Kempisch plateau abominabel. En die Sensecap met interne antenne, dat is ook niet van dien aard om kilometers ver te zien/ zichtbaar te zijn. Ik veronderstel dat ik eerstdaags eens naar het panoramapunt op de Mechelse Heide moet wandelen, daar heb ik misschien iets meer kans?

Maar bij deze; als U in de Limburgse Maasvallei woont en af en toe een Meshcore-toestel aan hebt staan, geef dan gerust een seintje! En vertel er direct bij welke frequentie U frequenteert misschien? 😉

w.social invite code

Screenshot of the w.social landing page where an invitation code has to be entered.So regarding that new EU social network (which is said to be decentralized but unclear if that implies ActivityPub which would make it more relevant in my book); entering a string in the “invitation code” and clicking “continue” does not result in an XHR request to the server and there’s a lot of JS on the page to handle the invitation code.

This implies the code is checked in the browser so the correct code(s) is somewhere in the JavaScript. So it should be possible to reverse-engineer it, no? 😉

Any takers for this challenge?

blog.futtta.be on the fediverse

Pretty sure no-one is waiting for this, but after having spent a couple of years on the Fediverse (Mastodon in my case) I decided to add ActivityPub support to my WordPress installation via the ActivityPub plugin.

I have the WP Rest Cache plugin active, so I’m expecting things to gently hum along, without (most likely) or with these posts gaining traction.

Kudo’s to Stian and Servebolt for assisting me to get the webfinger endpoint to work, which is … not self-explanatory on hosts that have unoverrideable configuration on the .well-known folder 🙂

Joni’s “Both Sides Now”

I watched a movie this evening which featured the main actress singing “Both sides now” and is was moving until it became too musical-like for my taste. But now I’m in a Joni rabbit hole again, listening to all great versions of Joni performing that song. One of the earliest live video’s I found was from 1969 and on the other end of the timescale there’s the Grammy one from 2024 with Brandi Carlile, but for me the most touching rendition by far is this orchestral one from 2000;

Joni Mitchell - Both Sides Now (Live Tribute concert, 2000)

AOPro soon to have a wizard tab

Currently the last lines of code are being added/ reviewed to integrate a “wizard” tab in Autoptimize Pro, which should help new users to switch between different presets all while keeping backups of original settings so one can easily try out different optimization levels. Have a look at below screenshot to see where we’re taking this 🙂

screenshot of the soon to be available "wizard" tab in AOPro

And while we’re at it; have a great 2026, whether you’re using Autoptimize, AOPro or if you’re just reading this out of curiosity!

Lopen er Limbugse mijngangen onder uw bed?

Lopen er gangen van de (Belgisch) Limburgse mijnen onder uw huis? Dat kunt U misschien aan de hand van onderstaande “ongeveer juiste” kaart zien, die ik uit nieuwsgierigheid op basis van de kaart van de Facebook-pagina van de “Kempense Steenkoolmijnen – vriendenkring” maakte. De positionering is op basis van de loop de Maas gedaan en zou dus min of meer correct kunnen zijn.

kaart van mijngangen in Limburg bovenop de kaart op straatniveau.

Op het eerste zicht geen gangen onder mijn huis, maar als we rekening houden met een serieuze foutenmarge (die Maas paste niet 100%), kunnen we daar toch niet zeker van zijn 🙂