Log in
Seblog.nl

Seblog.nl

Expanding the search in Vim

I just discovered a new Vim trick I think I am going to use quite often, so I am sharing it here to look it up when I forget.

As you may know, you can issue the / command in Vim to start a search. Every character you type will be in the search, until you hit enter, which will jump you to the first occurance of your searched text.

Another thing you may know, is that you can use this search-motion as a motion to other commands as well. When you do v/here, you will visually select everything between the current cursor position and the first occurance of 'here' in the buffer. I use this to delete stuff that I can't target using the f and t motions.

Then there is the thing I once found out, but never could remember: once you press /, you are in a little submode I can find the name for. In this mode, you can use Ctrl+L and Ctrl+H to increase or decrease your search string by the characters of the first match. You can also use Ctrl+G to move that virtual cursor to the next match, or Ctrl+T to get to the previous. Once you hit enter you are on that last position, removing the need to do n.

But here it comes: when you are deleting with d/, you can also use Ctrl+G to get to that next match. If you searched for a small snippet that accidentally occurs before the place you wanted to go, you can press Gtrl+G to jump over it, and pressing enter will delete the full distance.

Gisteravond luisterde ik een aflevering van de Remote Ruby podcast met Derek Sivers, waarin hij uit de doeken doet hoe hij alle logica van zijn applicaties in de database zelf stopt, en waarin hij ook zijn persoonlijke database noemt, waarin hij zo'n beetje zijn hele leven vastlegt.

Zijn database staat in interessant contrast met de gebruikers van Obsidian, die juist voor 'plain text' gaan als opslagformaat, in de hoop dat tekst over twintig, vijftig, honderd jaar nog steeds gelezen kan worden door computers. Maar tegelijkertijd staat het óók in interessant contrast met de Ruby on Rails en Laravel developers die alle logica uit de database proberen te houden en de database alleen maar gebruiken voor domme opslag van data.

Het is fijn om af en toe even uit je comfortabele doos te worden gestuurd. Dit weblog slaat alle posts ook op in losse tekstbestanden en op mijn werk werk ik met Laravel en een relatief domme database.

Derek wijst in de aflevering ook op de Simplicity Matters talk van Rich Hickey, wiens talks eigenlijk allemaal heel goed zijn. De talk gaat in op de concepten 'makkelijk' (easy) en 'simpel' (simple), en hoe mensen die twee concepten door elkaar halen terwijl ze fundamenteel andere dingen zijn. Ook voor niet-programmeurs wel een aanrader, denk ik, al moet je af en toe even door wat jargon heen.

Ik kwam laatst langs een buitenreclame die iets zei als 'als op je bank wachten je kansen kost'. Ik dacht eerst: ik vind het best lekker om op de bank te zitten als ik wacht. Daarna dacht ik: o ja, L. heeft een bank gekocht en moet daar nu op wachten. Pas daarna drong het tot me door dat het reclamebord waarschijnlijk een ander soort bank bedoelde.

Vandaag geleerd in HTML en CSS

Ik ben dus mijn RSS-reader aan het uitmesten en daarbij leerde ik een paar dingetjes over HTML en CSS die ik kon niet wist of kende.

Bijvoorbeeld dat je dus een uitklapbare boomstructuur kan maken met alleen maar HTML en CSS, dus zonder Javascript, door gebruik te maken van <ul> en <li>, met daarin <details> en <summary>. Vooral die laatste twee elementen kende ik niet, weer wat geleerd.

In CSS-land zijn ze kennelijk ook bezig met een nieuwe manier van kleuren uitdrukken, genaamd LCH of oklch. Wie rgb of cmyk gebruikt, specificeert zelf hoeveel licht of inkt er moet worden gebruikt om de kleur te maken. In feite is dat een hele imperatieve manier van een kleur beschrijven. Een meer declaratieve manier is hsl, waarbij je je kleur beschrijft in termen van tint, verzadiging en helderheid. Deze methode heeft echter nog steeds een directe vertaling naar rgb en is dus een 'leaky abstraction'. De lch is een abstractie die rekening houdt met welke kleuren wij als mensen kunnen waarnemen, en maakt berekeningen met kleuren ('deze kleur maar dan iets donkerder') veel makkelijker.

Verder kwam Hidde met een leuke manier om flexbox te gebruiken voor data-visualisatie.

Naming things

Er zijn een paar gevleugelde uitspraken die ik vaak gebruik op werk (zoals '500 is nooit het goede antwoord') en dit software-cliché is waarschijnlijk de aanvoerder op die lijst:

There are only two hard problems in computer science: naming things, cache invalidation and off-by-one errors.

Vooral omdat het waar is: dingen een naam geven is moeilijk, en zonder namen zijn het eigenlijk alleen maar berekeningen zonder betekenis. Er valt pas geld te verdienen als er betekenis – en dus waarde – aan die getallen zitten.

Maar nu las ik een stukje van ntietz, waarin i signaleert dat beschrijvende namen voor stukken code problematisch zijn. De OrderCreateService maakt waarschijnlijk een order aan, maar zodra hij ook mails gaat sturen naar de klant, moet het dan niet de OrderCreateAndEmailSendService zijn? Succes met overal in je codebase de naam van de service aanpassen.

In plaats daarvan, zegt ntietz, moeten namen vooral leuk zijn (mijn vertaling). Diens belangrijkste punt: namen zijn een manier om identiteit uit te drukken, niet om te beschrijven. Het artikel noemt verder geen voorbeelden, maar in mijn hoofd heb ik nu een service genaamd Truus die de orders aanmaakt. De e-mail? 'O ja, die stuurt Truus.'

Ik denk niet dat ik mijn collega's overtuigd krijg, maar ik vind het een geweldig idee.

Deze week kwam ik tot de conclusie dat ik dit hele jaar mijn RSS-reader nog niet had geopend, en die periode bevat natuurlijk ook de kerstweek (Eerste tot en met Zevende Kerstdag), dus er was nogal een voorraadje ontstaan. Zoals altijd denk ik nu 'ik moet ook meer bloggen' en daarom vandaag dus een paar posts achter elkaar, over dingen die ik tegenkwam in mijn RSS-reader, zodat die ook in jullie RSS-reader staan.

Spelletjesweek

Tussen kerst en oud-en-nieuw ben ik naar Wintergo geweest, een winterkamp voor go-spelers waar stiekem ook andere spellen worden gespeeld. In combinatie met feestdagen bij familie levert me dat 15 verschillende spellen in één week op. Hier een overzichtje, in chronologische volgorde.

Pandemic

De klassieker uit 2020, die stiekem al uit 2013 komt. De twist van het spel is dat je met z'n allen tegen het spel speelt: iedereen werkt samen om de virussen te bestrijden en dus win je allemaal, of helemaal niemand. Ik heb deze al veel vaker gespeeld, inclusief een maand-lang potje waarbij ik elke ochtend de stand van het bord in een whatsapp-groep deelde. Met Eerste Kerstdag heb ik het met mijn stiefmoeder en broertje gespeeld, twee potjes, gelijkspel tussen ons en het virus.

Regenwormen

Dit is ook een klassieker en mijn (andere) broertje bleek dit te hebben en leuk te vinden (hij is niet van de spellen). Dus hebben we op Tweede Kerstdag met z'n tweeën een potje gedaan, dat best wel spannend was. Ik ken het spel vooral als een fijn spel voor in een café met een groep mensen, omdat je in principe gewoon een gesprek kan voeren in de tijd dat je niet aan de beurt bent: voor je de dobbelstenen in handen gedrukt krijgt kan toch alles anders liggen.

Go

Naamgever van Wintergo en het spel der spellen. Het spel valt in dezelfde categorie als schaken en dammen: twee spelers, zwart en wit, alle informatie is beschikbaar, heel veel mogelijke zetten, erg diep spel. Het nare is dat ik er inmiddels zo goed in ben dat ik dit niet meer met zomaar iemand kan spelen, maar daar hebben ze dus Wintergo voor bedacht: een midweek elke ochtend om 10 uur een partij spelen met mensen die vaak nog véél beter zijn.

Paleo

Dankzij Pandemic zijn coöperatieve spellen populair, en Paleo is er ook zo een. Zoals de rest van de spellen op deze lijst kende ik deze nog niet. Het speelt zich af in de prehistorie en je bent een groep mensen die probeert te overleven door voedsel en spullen te verzamelen. Het is een wat uitgebreider spel, met veel verschillende opties, maar nog steeds goed speelbaar met familie, denk ik. Ik heb er drie potjes van gedaan en de laatste hebben we verloren – het kan wel knap lastig zijn. Maar dat hoort er ook bij.

Samurai Swords (voorheen 'Shogun' en nu 'Ikusa')

Dit spel kwam volgens Bart uit de kringloopwinkel voor een paar euro, maar is dus een pareltje waar je ook 100 dollar voor kan betalen. Het spel is door juridische en marketing-technische redenen een paar keer van naam veranderd, maar wij speelden dus 'Samurai Swords', mét zwaardjes om de spelvolgorde te bepalen. Het is een soort Risk, maar dan met samurai-saus en een apart bordje waarop je drie grote legers kan bijhouden, wat het spelen aanzienlijk veel duidelijker maakt. We hebben de partij helaas niet af kunnen maken, maar mijn vermoeden is dat het even lang duurt als Risk (uren).

Ocean: Great Barrier Reef

Dit vond ik van alle spellen de minste. Het is een kaartspel waarbij je kaarten met vissen in allerlei kleuren kan verzamelen (een beetje zoals treinkaartjes bij Ticket to Ride, inclusief joker) die je vervolgens kan inwisselen voor kaartjes die punten en bonussen geven. We hadden helaas twee best essentiële regels verkeerd begrepen, dus het was een rommelig potje. Ik moet het eigenlijk nog eens een kans geven, maar vooralsnog ben ik er niet kapot van.

Perseverance: Castaway Chronicles - Episode 1

Dit spel won de competitie voor 'grootste en intimiderendste doos'. Het is eigenlijk twee spellen in één – episode 1 en 2 – en wij hebben alleen episode 1 gespeeld. Met anderhalf uur speeltijd viel dat enorm mee ten opzichte van wat je van de doos zou verwachten. Je bent een cyberpunk-leger dat een eiland vol dino's probeert te koloniseren, waarbij dino's continu je kampementen aanvallen. Best interessant spel, ik ben ook benieuwd naar episode 2, die je dus met dezelfde dino-poppetjes kan spelen.

The Crew: Mission Deep Sea

De grote ontdekking van de week. Ook dit is een coöperatief spel, maar dan vele malen simpeler. Het bestaat uit een soort-van gewoon kaartspel waarmee je slagen moet spelen. De twist is dat je samenwerkt om opdrachten uit te voeren zoals een bepaald teamlid de blauwe 4 te laten winnen, of evenveel van twee kleuren. Juist omdat het eigenlijk 'gewoon kaarten' is, denk ik dat dit het toegankelijkste coöperatieve spel is dat ik ken. Er is ook een space-editie maar men zei dat daar nog wat 'fouten' in zaten, dus neem vooral de duikboot.

Terraforming Mars: Ares Expedition

Een kaartspel met heel veel icoontjes en acties en combinaties. Ik speelde het met z'n tweeën, maar Yvonne speelde het daarna ook nog eens met vier en zei achteraf dat het daar een beetje een ander spel door wordt. Zij is er erg over te spreken als tweespeler-spel. Ik vond het heel interessant, maar vrees wel dat het hierbij weer wat lastiger is om een medespeler te vinden, omdat er dus zo veel verschillende dingetjes in zitten. Maar het zit goed in elkaar!

Wonder Woods

Bij dit spel moet je paddenstoelen verzamelen op basis van informatie uit kaartjes die alleen jij kan zien ('deze paddenstoel is niet 5 waard'). Speelt lekker makkelijk weg, maar ik deed iets te veel paddenstoelen in één mandje en ging daarmee een beetje het schip in. Wel geinig.

Keyflower

Een woordspeling op de Mayflower: schepen met kolonisten arriveren en jij bouwt in vier seizoenen een dorp door te bieden op gebouwen. Het heeft een interessant systeem met hexagonale tegels, waarbij elke speler z'n poppetjes aan één kant van de tegel zet om er zo op te bieden, óf op de tegel om de actie van dat gebouw uit te voeren. Ondanks de tip ging ik toch voor schepen en dus raakte ik aan lager wal, maar wel een leuk spel.

Night of the Ninja

Betere versie van Weerwolven van Wakkerdam, met één nadeel: ik hou echt niet van die psychologie ervan (daarom ben ik bij Weerwolven altijd de verteller, maar die is hier niet bij). Voordeel van Night of the Ninja is dat je wel echt meer informatie hebt (je kan een kaart spelen om te kijken wie wie is) en dat je dus niet blind dorpsbewoners op de brandstapel aan het gooien bent. We speelden het met 5 en dat was goed te doen, maar vanaf 8 spelers is het waarschijnlijk leuker.

Mindbug: First Contact

Op de laatste avond nog even een nieuw spel leren omdat je een halfuurtje moet wachten tot het volgende begint – ook dat is Wintergo. Gelukkig is Mindbug dus inderdaad in 10 minuten uit te leggen en in 10 minuten te spelen, al helpt het wel heel erg als je ooit Magic the Gathering uitgelegd hebt gekregen, want veel mechaniekjes zijn hetzelfde. De twist is dat je tweemaal een kaart van de tegenstander mag jatten door een Mindbug te spelen, waarna vaak heel veel effecten nog een keer triggeren. Ging helaas veel te snel, maar ik wil zeker nog een potje.

Verder heb ik nog talloze andere spellen gespeeld zien worden, maar goed, je kan ook niet alles spelen in zo'n week.

Vegan kaas

De afgelopen weken ben ik bezig met vegan kaas uitproberen. Aanvankelijk zag ik het als project om een lange blogpost over te schrijven, waarin ik alle opties die op de markt zijn op een rijtje zet, maar gaandeweg is die afgezwakt tot deze blogpost, waarin ik zeg: het is wennen, maar daarna goed te doen.

Ik eet al een paar jaar (vijf? zes?) geen vlees meer: een lang verhaal waarin een McDonalds op 50 meter naast mijn huis oppopt, en een weggegeven fiets werd omgezet in een avond in een restaurant waar ik het beste – en dus laatste – vlees ooit heb gegeten. Maar de belangrijkste reden is denk ik dat ik mezelf hypocriet vond dat ik wel vlees at als ik het niet herkende, maar niet als er nog bot aan zat.

Al een tijdje ben ik ook wat aan het zuivel-minderen, en de 'zuivel is niet zo zuiver als we denken' reclames maken dat ik daar nog net weer iets bewuster op let. Ik koop nu zelf geen kaas meer voor op brood, maar dat was ergens wel een gemis, want wat doe je er ander op? Ik ben fan van hagelslag maar alles heeft grenzen.

De vegan kaas biedt uitkomst. Vaak zijn deze kazen op kokos-basis, lijkt het, en hoewel dat je dat in het begin ook erg goed proeft, merk ik dat het me nu nauwelijks nog opvalt en dat ik het gewoon zie als een plak kaas.

Mijn trainingsplan om aan vegan kaas te wennen, wat stiekem ongeveer mijn eigen pad is: eet eerst een maand geen kaas. Koop daarna de vegan komijnenkaas van de Albert Heijn. Omdat de komijn extra smaak geeft en daarmee de specifieke vegan-smaak verhult, is dit misschien wel een goede start.

Probeer vervolgens eens de pittige smeltkaas van WildWestland. Ik heb hem zelf niet gesmolten, maar ik heb inmiddels een tosti-ijzer, dus als hij weer eens voorradig is ga ik dat zeker proberen.

Probeer daarna de Violife kazen. Er is een 'normale' en een Goudse variant, die ik in die volgorde heb geprobeerd. Volgens mij zijn dit hele prima kazen. Op dit punt in het proces kon ik al bijna niet meer beoordelen of dit nu écht zo goed naar kaas smaakte, of dat ik gewoon aan vegan kaas gewend was.

Ik heb net ook nog de Albert Heijn huismerk Goudse kaas geprobeerd en die was ook oké. Mijn stelling hierin is: ja, het is een ander smaakje, zoals ook soya-yoghurt en havermelk net een ander smaakje hebben, maar daar kan je aan wennen en als je er eenmaal aan gewend bent zijn ze heel lekker. Dat is het bespaarde dierenleed wel waard.

Ik speel sinds 2013 Go, 'het oudste bordspel ter wereld', en was er altijd trots op dat ik al speelde vóór de computer zo sterk werd dat geen mens er meer van kan winnen. Niet dat ik ooit van 'de computer' heb kunnen winnen: in 2013 was dat al alleen voorbehouden aan de sterkste spelers.

Een ander feitje over Go dat ik graag herhaal, is dat het meer bordposities heeft dan schaken. Bla bla, de computer won al van de mens met schaken in 1977, en dan noem ik het aantal atomen in het zichtbare universum, alsof ik weet waar ik het over heb.

Maar met grote verbazing las ik dus net in NRC dat er een ander spel is dat nóg meer bordposities heeft en waar de computer het nóg moeilijker mee had. Door de bordposities, door het aantal mogelijke begin-opstellingen, én door het feit dat de tegenstander niet weet waar de stukken staan. We hebben het over Stratego, wie had dat gedacht.

Het is een leuk concept, zo'n zuignapafwasborstel, maar telkens als ik thuis kom ligt hij gewoon in de wasbak; dat kon die oude ook wel.

It seems like a lot of people (W, J and H) are cleaning up their <head>. I always tried to be minimalist in my HTML (and I did meditate back when I build the current version of my site), so my head was actually already rather empty. I did however removed 'add Twitter metadata' from my personal backlog. Feels freeing.

Van de week boostte ik op Mastodon twee toots, over Twitter en over Github, maar zojuist had ik precies diezelfde ervaring op Youtube. Een popupje vertelde me dat ik nu ook posts en videos kan 'delen met mijn publiek' en mijn eerste reactie was: mijn publiek op Youtube, hoezo op Youtube?

Ik hoop dat meer en meer mensen dit blijven hebben. Het is zo'n verademing als die muren weg zijn.

Zevenheuvelenstress

Zometeen is de start van de Zevenheuvelenloop en hoewel ik weet dat ik er gewoon van moet genieten ben ik behoorlijk zenuwachtig en onzeker. Mijn huidige record is 1:15:10, die liep ik in 2017. Daarna heb ik hem in 2019 nog eens gelopen in 1:22:04. Het idee is dat ik hem deze keer weer rond de 1 uur en 15 minuten zou kunnen lopen.

Maar de zenuwen zitten er dan nu in dat het, als ik dat wil, vandaag wel moet gebeuren. Het is behoorlijk kouder dan de afgelopen tijd, en het gaat waarschijnlijk vanmiddag nog regenen ook. Ik ben nu een beetje aan het samenstellen wat ik aan moet tijdens de wedstrijd, maar waarschijnlijk ga ik net te veel aan hebben omdat ik niet te weinig aan wil hebben.

En dan de training. Het ging echt heel erg goed, met meerdere keren per week een rondje, maar de afgelopen twee weken heb ik het helemaal laten versloffen. Zo voelt het, maar aan de andere kant kan je dit 'taperen' noemen en dan is het precies het juiste. Maar heb ik wel genoeg gegeten in de afgelopen week? Drink ik vandaag genoeg of net te veel? Allemaal onzekerheden.

Een paar weken geleden droomde ik dat ik naar een hardloopwedstrijd had moeten gaan, maar dat ik niet ging, omdat het niet meer ging, omdat ik niets meer gedaan had in de weken ervoor. Ik droomde de zelfsabotage die ik nu een beetje voel dat ik weer aan het doen ben. Je kan ook zeggen dat het druk was op werk.

Enfin, het plan ligt klaar, het horloge aan de oplader, de kleren hier naast me op de bank. Als het echt niet gaat gelden er twee regels: hou je vorm goed, geniet van de tocht.

In mijn post van vorig weekend wilde ik niet toegeven dat de requests die Mastdon naar mijn inbox stuurde helemaal niet door mijn eigen verificatie-code heen kwamen.

Het stappenplan is als volgt: Mastodon stuurt een bericht naar mijn inbox, stuurt daarbij een HTTP-header met daarin een keyId, een signature en een lijstje aan namen van headers. Ik moet dan de waardes van de HTTP-headers bij de namen zoeken, de keyId ophalen (dit is een URL) en dan verifiëren of de signature van de headers inderdaad ondertekend is met de public key uit de keyId. Omdat het cryptografie is gaf de functie alleen maar false terug, zonder enige verder info.

Na heel veel zoeken bleek dat in elk geval de deletes een simpele verklaring hadden: zodra de Actor is verwijderd is ook de public key weg, en dus valt er niets te verifyen. Dat is geen bug, zeggen ze. Ik negeer nu lekker alle Actor-deletes want ik haal toch geen profielen op. Follows en Follow-Undo's die ik als test bleef doen bleven wel falen.

Na letterlijk uren te hebben doorgebracht met specs zoeken en code lezen uit Pixelfed (PHP Laravel) en Pleroma (Elixir), bleef ik er toch echt van overtuigd dat ik alles goed berekende, aan elkaar knoopte, ophaalde, alles. Heel frustrerend.

Maar, wat bleek: de (request-target) vulde ik aan als (request-target) /inbox, terwijl ik mijn inbox op /activitypub/inbox had neergezet. De andere implementaties plakten die path dynamisch op uit de Request/conn. Daar ging 6 uur waarin ik al heel veel verder kon zijn geweest met Activitypub. Maar goed, volgend weekend weer een weekend.

Muis

In de traditie van bloggen over beesten in mijn kamer, door de jaren heen, hier een nieuwe aflevering: ik had een muis.

Ik hoorde mijn buren al eens smoezen dat er muizen waren. O jee, dacht ik, daar heb ik dus hélemaal geen zin in. Ik negeerde het een beetje omdat ik zelf nergens last van had. Mijn bovenbuurman ging flink aan het schrobben, kon ik horen.

Op een dag kwam ik thuis en zag ik het snoer van mijn staafmixer half uit het keukenkastje hangen. Dat is gek, dacht ik nog, dat zou ik toch nooit zo laten hangen, ik werk vast veel te hard. (Ja.)

Een avond later die week was ik dus weer veel te hard aan het werk tot veel te laat, toen ik opeens iets bij de deur van mijn kantoor zag bewegen. Ik schrok daar een beetje van, maar het schrok ook van mij, en ging er in een dolle vaart vandoor.

Dit was het moment dat ik de connectie naar het keukenkastje maakte: in dat kastje zit achterin een gat naar een stopcontact, voor mijn elektrische fornuis. Toen ik het beter inspecteerde zag ik er inderdaad wat zaagsel liggen, alsof er iemand door dat gat naar binnen was gekomen.

Het punt van het keukenkastje is echter: zodra die dicht is gevallen, kan je als muis in elk geval niet zo makkelijk meer naar buiten via diezelfde weg. En verder zijn hier niet zo veel gaten in de muur, wat waarschijnlijk bijdroeg aan het feit dat ik het muizenprobleem tot nu toe kon negeren.

In die week verdween er inderdaad een hagelslagje dat ik zorgvuldig op een vlek in de vloer had gelegd: de muis was er nog steeds. Toch negeerde ik het nog wat verder, tot ik op een zekere nacht wakker werd van gekraak en geknaag.

Na wat gordijnen op zij te hebben getrokken zag ik hem: de muis zat ín mijn slaapkamer. Dit was vorige week zondag. Wat volgde was een halve nacht op de bank (ben ik veel te lang voor), diverse opruimacties om de muis te vinden, slapen op een luchtbed in een andere kamer, en vooral: de deur dicht houden.

Woensdag kwam de DAR langs, en die hebben ons alles uitgelegd over muizen. 'Als er een potlood in kan kan er een muis door.' Ik met grote ogen. 'Als een potlood past, past een muis,' bleef de muizenman stellig. Zo liepen we een rondje rond het huis en vonden we inderdaad veel gaten.

Ik had dingen te doen in de randstad, dus ik heb mijn spullen gepakt en ben een paar dagen bij mijn ouders gaan logeren. Op de kamer stond een val. Nu ik net thuis ben vond ik daar de muis in. Ik moet toegeven dat ik daar dan weer even bijna van moest huilen: het arme beest, moest hij nou echt dood voor mij?

De muis is opgeruimd, de gaten zijn dicht, er ligt gif in de kruipruimte, het lijkt de goede kant op te gaan. Maar zielig is het wel.

Meer laden