Simpele salades voor de lunch

Omdat vorig jaar diabetes is geconstateerd, heb ik mijn dieet moeten aanpassen. En ik moet zeggen dat ik dat makkelijker heb gevonden dan ik verwacht had.

Eén van de wijzigingen die ik gemaakt heb, is dat ik nu elke dag een eenvoudige salade maak voor tussen de middag. De basis voor die salade is vrijwel altijd hetzelfde, maar om me niet te gaan vervelen, varieer ik elke dag een beetje met de smaak.
Bij die salade eet ik dan 2 meergranenboterhammen. Die boterhammen eet ik zonder beleg, maar voor een beetje extra bite doe ik ze wel even in de broodrooster.
En bij dat alles een groot glas mineraalwater, met of zonder bubbels.

En deze super-gezonde en super-lekkere lunch heeft eraan bijgedragen dat mijn bloedsuikerwaarden nu weer perfect zijn (maar uiteraard ligt dat niet alleen aan deze salades).
Maar wie geen diabetes heeft, maar gewoon gezond wil eten, kan hier natuurlijk ook zijn of haar voordeel mee doen.

De basis

Nodig:

  • 1 Sucrine of Little Gem (mini-kropje sla)
  • 1 tomaat
  • ¼ komkommer
  • eventueel een uitje
  • (olijf)olie

Uiteraard kun je ook andere sla gebruiken, als je daaraan de voorkeur geeft. Wat ik prettig vind aan die kleine kropjes bindsla, is dat het heel makkelijk te doseren is (1 kropje per dag), en dat ze lang houdbaar zijn.

Snijd de tomaat en het stuk komkommer aan stukjes of plakjes, en snipper er eventueel een uitje bij.

In plaats van er brood bij te eten, zou je ook wat gekookte volkorenpasta of zilvervliesrijst door de salade kunnen doen.
Of je zou croutons kunnen maken van het brood: neem een vrij compact brood (niet teveel luchtbellen), snijd de korst eraf, snijd het brood in blokjes, en bak die blokjes in een koekenpan met een klein beetje olie en bijvoorbeeld wat knoflook op niet al te hoog vuur tot ze knapperig zijn; laat afkoelen op een stuk keukenpapier, en meng ze door de salade.

Variant 1

Nodig:

  • de basis
  • een pakje hamblokjes (75 gr.)
  • 2 of 3 eetlepels saladekaas

Ik koop altijd blokjes saladekaas in olie, en gebruik die olie dan uiteraard ook voor in de salade.

Deze variant kun je nog wat meer smaak geven door er wat provencaalse kruiden doorheen te scheppen.

Variant 2

Nodig:

  • de basis
  • een blikje tonijn
  • 10-12 zwarte olijven

Als je tonijn in olie gebruikt, kun je die olie ook gebruiken in de salade. Als je tonijn au naturel hebt (in water), laat ‘m dan goed uitlekken voordat je ‘m door de salade schept, en gebruik gewoon olie uit de fles.

Snijd de olijven in plakjes.

Variant 3

Nodig:

  • de basis
  • een pakje kipfiletblokjes (75 gr.)
  • een handje gebakken uitjes
  • een handje pijnboompitten

Gebakken uitjes vind je in de supermarkt bij de oosterse ingrediënten.

Deze variant kun je eventueel een beetje opfrissen met wat tuinkruiden.

Variant 4

Nodig:

  • de basis
  • 1 of 2 gekookte eieren
  • 2 of 3 eetlepels gebakken spekblokjes

Bak de spek zonder toegevoegde olie of boter in een koekenpan met anti-aanbaklaag. Schep ze dan met een schuimspaan uit de pan, en laat ze afkoelen op een stuk keukenpapier. Op deze manier heb je zo min mogelijk vet in je salade.

Bij deze variant is de gesnipperde ui wat mij betreft niet optioneel, omdat dat een lekker fris accent geeft tussen het ei en de spek.

Varianten 5, 6, 7, …

Leef je uit, laat je gaan.

Maïs, gedroogde tomaatjes, sardientjes, augurken, zilveruitjes, knakworstjes…
Of vervang de sla bijvoorbeeld eens door witlof.

Je kunt echt alle kanten op. Het is zo makkelijk, en zo lekker, en zo gezond.

Bereiding

Schep alles door elkaar.

Als je deze salades mee naar je werk of naar school wilt nemen, dan kun je ze prima thuis voorbereiden, maar verpak de gesneden ingrediënten in aparte bakjes, en meng ze pas als je gaat eten. Zo voorkom je dat het een kleffe drab wordt.

Smakelijk!

Custom kernel on a remote host

This is a FreeBSD tutorial; it’s useless for Linux.

The FreeBSD handbook describes how to build a custom kernel. However, this documentation assumes that you have access to the boot menu in case the new kernel won’t boot. And on a remote server this is not always an option.
So I will describe the process for building a custom kernel on a remote server here. For clarity and sysadmin friendliness I will start at the beginning, instead of only explaining how to boot the old, working kernel if something is wrong with your new kernel.

Read More

Lou Sagna

A little macaroni in my life
A little fettuccine by my side
A little rigatoni is all I need
A little tortellini is all I see
A little pappardelle in the sun
A little cannelloni all night long
A little vermicelli here I am
A little bit of pasta makes me your man

Kip met tomaten-wijnsaus

Een experimentje dat publicatie-waardig bleek.

Nodig voor 1 persoon:

  • olie
  • kipfilet
  • 1/4 chorizo
  • zilveruitjes
  • knoflookpoeder (versgeperst mag natuurlijk ook)
  • champignons
  • blikje tomatenpuree
  • 1 glas rode wijn
  • ketjap
  • provençaalse kruiden

Verwarm de oven voor op een graad of 180.

Snijd de chorizo en de champignons in blokjes.

Verwarm wat olie in een pannetje, en fruit hierin de uitjes een paar minuten. Laat de uitjes wel eerst uitlekken, maar het is niet nodig om ze af te spoelen.
Voeg de chorizo en naar smaak knoflook toe, en roer het geheel door elkaar. Laat weer een paar minuten pruttelen.
Schep dan de champignons erbij, en naar smaak provençaalse kruiden, en laat dit een paar minuten samen pruttelen; roer af en toe.
Voeg tot slot de tomatenpuree, de wijn, en 2 of 3 eetlepels ketjap toe.
Laat het geheel warm worden onder voortdurend roeren.

Leg de kipfilet in een ovenvaste schaal, en giet de saus erover. Dek de schaal af met aluminiumfolie, en zet zo’n 45 minuten in de oven.
Als de saus de kip niet helemaal bedekt, draai de kip dan af en toe om (en dan de folie er weer overheen).

Serveer met gebakken aardappels, en wellicht een salade.

Smakelijk!

(on)bereikbare telefonische helpdesk

Ik heb een trucje ontdekt dat de wachttijd voor de telefonische helpdesk van mijn bank, die altijd overbelast en onbereikbaar is, terugbrengt tot minder dan een minuut.

Nieuwsgierig?
Let op.

Iedereen weet dat banken schoften zijn, die alleen maar op ons geld uit zijn, en die geen enkele boodschap hebben aan service. Dat geldt overigens niet alleen voor banken, maar ook voor telefoon- en internetproviders, energiebedrijven, verzekeraars, enzovoort; dat weet ook iedereen.
Deze bedrijven verstoppen zich achter onbereikbaarheid: de telefonische hulplijnen zijn altijd overbelast en onbereikbaar, en de email-hulplijnen reageren alleen met geautomatiseerde nutteloze berichten.

Mijn trucje, als je het zo kunt noemen, gaat uit van de inhaligheid van deze bedrijven. Ik ging er namelijk vanuit dat deze bedrijven richting nieuwe klanten veel minder onbeschoft zouden zijn; deze moeten immers eerst binnengeharkt worden voordat ze geld gaan opleveren.

In plaats van de helpdesk voor klanten belde ik dus de algemene hulplijn:

robot   : Goedemiddag. Welkom bij <bank>.
          Kies 1 als u al klant bent en toegang wilt tot uw rekeninggegevens.
          Kies 2 als u al klant bent en informatie wilt over aanvullende produkten.
          Kies 3 als u nog geen klant bent.
ik      : 3
robot   : Kies 1 als u informatie wilt over betalen en sparen.
          Kies 2 als u informatie wilt over verzekeringen.
          ... enzovoort ...
ik      : ... (doe niets, maar wacht alleen)
robot   : Ik heb uw keuze niet begrepen.
          Kies 1 als u informatie wilt over ... (zelfde menuutje als hiervoor) ...
ik      : ... (doe niets, maar wacht alleen)
robot   : Ik heb uw keuze niet begrepen.
          (een paar seconden muziek)
persoon : Goedemiddag. Waarmee kan ik u van dienst zijn?

Zoals gezegd: dit soort bedrijven zijn inhalige schoften; ze zullen dus potentiële nieuwe klanten nooit de kans geven om af te haken.
En daar kun je gebruik van maken. En dat moet je ook vooral zonder schaamte doen, want ze maken nog veel harder gebruik van jou.

Uiteraard kan ik niet garanderen dat dit altijd werkt, of dat het altijd op dezelfde manier werkt. Maar het is altijd de moeite van het proberen waard.
Zoek in het menu naar de meest commerciële optie, en gedraag je dan als een bejaarde die niets snapt van wat-ie voorgeschoteld krijgt; de kans is groot dat je dan wordt behandeld met de voorrang die je als betalende klant verdient.

The 1 thing that’s missing in 2FA

Wikipedia, Twitter, GitHub, Trello, …
Hundreds, if not thousands of websites require multi-factor authentication, or at least offer it as a complementary security measure.

WordPress, Roundcube, Kanboard, Nextcloud, …
Hundreds, if not thousands of web applications offer multi-factor authentication by default or as a module/plugin.

And yet, there is one thing that none of all these 2FA developers/implementors have thought of. And since I don’t have the time, nor the desire, to submit a bug report for each of these thousands of applications and websites, I’m just going to say it here. Kudos to all developers who read this, realize that I’m right, and implement this.

IF AND WHEN SOMEONE REACHES MY 2FA FORM AND CANNOT COMPLETE IT, I WANT TO BE NOTIFIED!

If someone reaches the 2FA form, this means that they have correctly entered my password.
If someone cannot complete the 2FA form, this means that they probably do not have my phone or 2FA device.
So it is very probable that someone who cannot complete the 2FA challenge IS NOT ME.
This means that someone who is not me has managed to correctly enter my password.

This means that very probably my password has been compromised, and I must change it. NOW!

So, if the above is too much text for you, let me summarize below:

IF SOMEONE CANNOT COMPLETE MY 2FA CHALLENGE,
THEY HAVE PROBABLY ALREADY COMPROMISED MY PASSWORD,
AND I NEED TO KNOW ASAP!

And actually, I’d even prefer to know if they reach the 2FA form and don’t try to complete the challenge. Because if I want to log in, I go all the way, and I don’t abandon between password and 2FA.

Check the ACL!

I just shot myself in the foot using Access Control Lists.

# ls -l ./somefile.txt
-rw-r-----+  1 root  www  893  Apr 4 00:44 ./somefile.txt
# getfacl ./somefile.txt
user::rw-
user:www:--x  # effective: ---
group::r-x    # effective: r--
mask::r--
other::---

In the above example, the file inherited the default ACL from the parent directory.

I’m not even going to tell you how long it took me to figure out why the web server couldn’t access the file…

If you can’t find it: check those ACL!

And if you want to drive your colleague crazy:

# setfacl -m u:george:--- /some/random/commonly/used/file

Reprocess mbox file

Say you’ve found an mbox file somewhere, and you’d like Postfix to reprocess the messages it contains, to have them imported into your regular mailbox.

Then you may want to copy this script:

#!/usr/bin/env python3

# Script to reprocess an mbox file.

################################################################################
#
# Copyright (c) 2021 Rob LA LAU <https://www.ohreally.nl/>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
################################################################################

import mailbox, os, subprocess, sys

if len(sys.argv) < 3:
	print('Usage:')
	print('  %s recipient@example.com /path/to/mbox/file' % sys.argv[0])
	sys.exit(1)

recipient = sys.argv[1]
mbox = sys.argv[2]
if not os.access(mbox, os.R_OK):
	print('mbox file is not accessible')
	sys.exit(1)

for message in mailbox.mbox(mbox):
	proc = subprocess.Popen(
		['sendmail', '-i', recipient],
		stdin = subprocess.PIPE,
		text = True
	)
	proc.communicate(message.as_string())

Save that script as ~/bin/resend_mbox.py, make it executable, and execute it as follows:

# ~/bin/resend_mbox.py george@example.com /var/mail/root

Obviously, you replace george@example.com with your own email address (don’t spam poor George, please), and /var/mail/root with the path to your mbox file.