Overig / Notes

Leerplein

Doel Leerplein

Regels Leerplein

--

ROCvA

Rooster koppelen aan Agenda

Hoe koppel ik mijn Rooster aan mijn ROCvA agenda?

  1. Ga naar EduArte Classic
  2. Onder Home, ga naar instellingen - Agenda
  3. Kopieer link (eventueel eerst key/sleutel genereren)
  4. Ga naar de online versie van Outlook
  5. Ga naar kalander
  6. Kies import kalender - Kies from Web
  7. Vul de gekopieerde link in en Geef de nieuwe kalender een naam.

Sync Issues

Als de koppeling niet werkt kan dat komen door een corrupte OST file.

Repareer dit door de mail en/of calendar folder in Outlook (lokaal) te repareren.

  1. Right-click the folder, and then click Properties.
  2. Click Clear Offline Items > OK.
  3. On the Outlook ribbon, click the Send/Receive tab.
  4. Click Update Folder.

--

Bookstack

Bookstack

roc.och dev omgeving: http://vps232189.ovh.net/bookstack/public

Bookstack commands
# Create a new admin user
php artisan bookstack:create-admin

# Delete all activity history from the system
php artisan bookstack:clear-activity

# Delete all page revisions from the system
php artisan bookstack:clear-revisions

# Delete all page revisions from the system including update drafts
php artisan bookstack:clear-revisions -a

# Delete all page views from the system
php artisan bookstack:clear-views

# Search and remove images that are not used in page content
php artisan bookstack:cleanup-images

# Generate SQL commands that will upgrade the database to UTF8mb4
# See https://www.bookstackapp.com/docs/admin/ut8mb4-support/
php artisan bookstack:db-utf8mb4

# Rebuild the search index
# Useful if manually inserting pages into the system
php artisan bookstack:regenerate-search

# Regenerate access permissions - Used mostly in development
php artisan bookstack:regenerate-permissions

# Delete all users from the system that are not "admin" or system users
php artisan bookstack:delete-users

# Copy the permission settings of a specified, or all, shelf to their child books
php artisan bookstack:copy-shelf-permissions --all
php artisan bookstack:copy-shelf-permissions --slug=my_shelf_slug
Set rechten op directories (Centos)
chown -R apache:max ./public/uploads/images/
chown -R apache:max ./storage/uploads/files/

chmod -R 775 ./public/uploads/images/
chmod -R 775 ./storage/uploads/files/
Set rechten op directories (Ubuntu)
chown -R www-data:max ./public/uploads/images/
chown -R www-data:max ./storage/uploads/files/

chmod -R 775 ./public/uploads/images/
chmod -R 775 ./storage/uploads/files/

x

Youtube Videos

Alle video's ter ondersteuning van onderwijs ROC

Alles

https://www.youtube.com/playlist?list=PLBU_XXNTKkBoD2pUPw8GR8VF51mc0z67U

Alleen Linux

https://www.youtube.com/playlist?list=PLBU_XXNTKkBrehj5Tcax4itW85cY5xMSr

Alleen SQL

https://www.youtube.com/playlist?list=PLBU_XXNTKkBordjKWRgH5XqF7I9Z26Cn8

Alleen PHP

https://www.youtube.com/playlist?list=PLBU_XXNTKkBrJ2kDna9tAAEJPbJBFQlZ-

 

Lesplanning - Max

Laatste week Periode 3

ma 20-4

8A - PHP Examens uitleggen - voorschot nemen naar nieuw rooster
Cijfers
Opdr 1: Code aanpassen -> Corona opdracht
Opdr 2: Na de vakantie -> OOP, PDO CRUD
9a - PHP cijfers - Eindcijfer (overgang): huiswerk - mondeling - portfolio
nieuw rooster uitleggen
Opdracht Portfolio (uitleg site/Les) en Bankrekening (deadline)
9B - PHP  
9C - PHP  

di 21-4

9A IB - SQL Socrative (extra) test
Les Joins afmaken
9B IB - SQL  

wo 22-4

8A - PHP Huiswerk maken
9a - PHP Huiswerk maken
9B - PHP  
9C - PHP  

-- online lessen --

ma 12-3

9A - PHP Bespreken huiswerk functies en inleiden nieuwe praktijkopdracht simulatie.
Bespreken HW LInux 3.2 - opdracht 2f en opdracht 3
9B - PHP Toets PHP 1.1
9A - PHP Toets PHP 1.1
IB9A - SQL 3 nieuwe leerlingen HW verplicht!: Ali, Ayoub en Kamel
Toets

- week 7 -

vr 12-3

8A - Linux

Uitleg HW PHP En Linux, komende week concentreren op PHP: 2 opdrachten Hoofdstedenspel en dobbelstenen (of indien gewenst bankrekeningnummer)
9C Linux uitval ivm Corona - Werken aan les install Apache en Virtual Server
8A - Linux uitval ivm Corona - zelfstandig werken en individuele hulp
8A - PHP uitval ivm Corona - zelfstandig werken en individuele hulp
9C - PHP uitval ivm Corona - Toets PHP 1.1

-- Nieuwe richtlijnen Covid-19 --

do 12-3

8A - PHP

Functions 2a/b - unset array - "samen programmeren" via pseude code

 

9B - PHP

6.4 Functions en Linux 4.1/4.2

9C - PHP

Huiswerk nabespreken - demo - discipline

Voorbespreken PHP Toets volgende week maandag
array -> filmpje (array en assiociative array)
for-loop -> filmpje

 

(PHP) 6.4 Functions

(Linux) 4.1 en 4.2 - uitleg

9ABC

Leerplein

wo 11-03

9B Linux

Voorbespreken PHP Toets volgende week maandag
array -> filmpje (array en assiociative array)
for-loop -> filmpje

 

Huiswerk 3.1 opgave 3 bespreken

Huiswerk 3.2 Opgave 2f en 3 en maar 7! Ingeleverd? Waarom?

 

4.1 Deze week

4.2 Volgende week - wordt afgetekend veel werk

8B Mentorles  
IB9B SQL

Toets bespreken
Voorbespreken SQL 2de toets: les 2, 3 en 4 (4 filmpjes kijken!)

Nieuwe leerlingen? -> HW?

 

HW PHP 9C nakijken en voorbereiden voor morgen

 

 


(searchtag planningmax roostermax rmax)

CamStudio

Voor het afnemen van toetsen is het nodig om een schermopname van de toets te laten zien.

Dit kan op verschillende manieren, hier wordt uitgelegd hoe dat kan met CamStudio.

CamStudio

Download and Install

Download de portabel versie: https://portableapps.com/downloading/?a=CamStudioPortable&n=CamStudio%20Portable&s=s&p=&d=pa&f=CamStudioPortable_2.7.2_English.paf.exe

"Installeer" de software, feitelijk wordt de software nu alleen uitgepakt.

Start de software op en configureer een paar zaken. Omdat de software niet is geïnstalleerd moet je via de verkenner/explorer zelf naar de juiste folder CamStudioPortable toe gaan en de CamStudioPortable.exe opstarten.

Configuratie

1. Zet de region op Full Screen.

2. Kies onder menu options - video options en select Microsoft Video 1

3. Kies onder menu Options - Record audio from microphone

4. Kies Options - Program Options - Name of Avi File - Automatic file naming

Opname maken

Druk op de rode record button om de opname te starten.

Druk op de blauwe stop button (rechts naast de record button) om de opname te stoppen.

--

Langs de Kromme Mijdrecht

Via Ouderkerk aan de Amstel of via de Ouderkerkerplas ga je naar Abcoude, bij Abcoude langs het spoor en uiteindelijk de weg langs het Amsterdam Rijnkanaal op richting het zuiden, Breukelen en Utrech).

Breukelen onder he spoor en A2

 
Bij Breukelen naar rechtsen dan de A2 onderdoor

Via Abcoude, langs het spoor, de weg volgen (niet tunneltje onderdoor, maar vlak daarvoor naar links) naar het (Amsterdam-Rijn) kanaal.
Kanaal aan linkerhand houden, brug bij Loenersloot onderdoor en door rijden tot aan Breukelen.
Bij Breukelen zie je de brug over het kanaal; bij de tweede rotonde naar rechts (eerst mag je als fietser niet naar rechts).
Er staat hier een fiets bordje "Station en Kockengen 4". Dit is nog een paar honderd meter voor de brug.
Je gaat het spoor onderdoor, weg volgen, A2 onderdoor, weg volgen. Je komt op een brede ventweg (rechts is de provinciale weg N401).


Ventweg langs N401

Weg volgen tot aan rotonde

Eerste rotonde ga je naar rechts, je komt door het dorpje Portengensebrug.


Vlak na de rotonde her dorpje Portengensebrug

Eerste links

Dan eerste weg naar links. Dat is na nog geen 2 km. Je komt op een verlaten brede weg, en je kunt links en rechts ver kijken.


Verlaten weg

Deze weg volgens en je komt dan langs een gemaal/sluisje (?) en dan op een weg langs een 'riviertje, de Geer. De Geer is links van je. Deze weg volgen. Ergens moet je nog een keer de N212 oversteken, rechtdoor en je volgt het water gewoon. Tot aan een de T-splitsing bij de witte brug aan de linkerkant, deze brug gaat over de Geer.

Witte brug de Geer over

Linksaf de witte brug het water de Geer over en direct weer naar rechts. Je ziet een bord dat je de provincie Utrecht verlaat. Dit is een wat drukkere weg (Lange Meentweg) en je komt in het dorpje Woerdense Verlaat.

Woerdense Verlaat, Amstelkade rechts


Nadat je rechts bent gegaan, de Amstelkade in Woerdense Verlaat

In Woerdense Verlaat opletten er komt een soort industrieterreintje aan de rechter kant. Daar moet je naar rechts (Amstelkade). (Als je in Woerdense Verlaat bij een brug komt dan ben je iets te ver).  Over een paar honderd meter zie je dan aan je linker hand de Kromme Mijdrecht. Deze volgen tot aan Uithoorn.
Via Uithoorn langs de Amstel verder weer richting Ouderkerk a/d Amstel

Scrum

Scrum Begrippenlijst

Het Scrumteam kent 3 rollen die elkaar complementeren in verantwoordelijkheden zodat er een optimale samenwerking kan worden bewerkstelligd. 

Ontwikkelteam   

Een zelf organiserend, multidisciplinair team, bestaande uit vijf tot negen leden, dat alle items op de product backlog ontwikkelt tot werkende (deel)producten.  

Product Owner   

Vertaalt alle klantwensen naar wat er geleverd moet worden. Hiervoor gebruikt de product owner de product backlog waarin zij bepaalt wat de hoogste prioriteit heeft. 

Scrum Master   

Faciliteert de product owner en het ontwikkelteam gedurende het proces. Zij zorgt ervoor dat iedereen begrijpt hoe scrum werkt en dat alle impediments (hobbels op de weg) die het proces vertragen en/of hinderen worden weggenomen.  

Sprint meetings

Al het werk dat gedaan moet worden is georganiseerd in 4 herhalende sprints van ieder 2 weken per sprint.   

Tijdens elke sprint vinden er 4 sprint meetings (ceremonies) plaats, die de mogelijkheid bieden om het proces voortdurend aan te passen aan de omstandigheden.  

Sprintplanning   

Elke sprint begint met een sprintplanning waarin de product owner de opdracht voor de sprint geeft en het ontwikkelteam het werk voor de sprint plant. 

Daily Scrum  

Een korte dagelijkse bijeenkomst van hooguit 15 minuten waarin het ontwikkelteam de voortgang en de obstakels bespreken. 

Sprint Review  

Aan het eind van de sprint presenteert het ontwikkelteam de resultaten en krijgt het feedback van betrokkenen, zoals klanten, managers en collega’s. 

Sprint Retrospective   

Ter afronding van de sprint wordt het proces geëvalueerd met als doel het proces te verbeteren met het oog op de volgende sprint.  

Termen  en Overzichten

Product backlog  

een lijst van al het werk dat gedaan moet worden om een product te creëren en onderhouden. De product owner beheert en prioriteert de product backlog.  

Sprint backlog  

een overzicht van het geselecteerde werk uit de product backlog dat het ontwikkelteam wilt realiseren gedurende de aankomende sprint.  

Definition of done  

een lijst met vereisten waaraan een item van de sprint backlog moet voldoen om als voltooid te worden aangemerkt.  

Scrumbord  

een bord met 3 kolommen (soms 4): (‘Backlog’),‘to do’, ‘doing’ en ‘done’. Hierop worden de taken die op de sprint backlog staan (vaak in de vorm van post-its) weergegeven die door teamleden zijn opgepakt.  

Sprint Burndown Chart

image-1593547243948.png

een grafiek met de voorraad werk per dag. Als het goed is, zie je een dalende lijn die aan het eidn van de sprint op 0 moet uitkomen.

User Story  

Een user story is een korte beschrijving van een onderdeel van een product, beschreven vanuit het oogpunt van de eindgebruiker. Het heeft de structuur: Als (wie?), wil ik (wat?), zodat ik (waarom?).  

GIT - cheat sheet

Install (Windows)

https://git-scm.com/

https://desktop.github.com/

set up new repo

(create git repo in web gui first)

git init
git add .gitignore
touch README.md
git add README.md
git remote add myOrigin git@github.com:maxbis/examengesprekken
git push -u origin master

ssh key

add ~/.ssh/id_rsa.pub in git hub web gui

add file

git add <file name>

update repo

git commit -a -m "comment"
git push

Get updated files

git pull

Overwrite local changes

git reset --hard
git pull

New clone - install new

git clone https://github.com/maxbis/examengesprekken

// for Ubuntu server
sudo chgrp -R www-data examengesprekken

Go to older version

git reset --hard 0ad5a7a6.....

Git clear cache (if ignore file is changed)

git rm --cached config

List all tracked files

git ls-tree -r HEAD --name-only

Git issues with .ignore

git rm -r --cached .
git add .
git commit -m "Stop tracking files that are now ignored"

Init new repo

cd path/to/class-cloud
git init
git add .
git commit -m "Initial commit"

<create new repo on githib>

git remote add origin https://github.com/maxbis/class-cloud.git
git push -u origin master

<on Linux>
git clone https://github.com/maxbis/class-cloud.git

Set Remote Git && Check git remote

SSH key

ssh-keygen -t ed25519 -C "your_email@example.com"

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

cat ~/.ssh/id_ed25519.pub

git remote set-url origin git@github.com:USERNAME/REPO.git
git remote -v

Test Connection

ssh -T git@github.com

CheckList

Yii

1. XAMPP is recent - jun 2019 of nieuwer

image-1600856926495.png

2. PHP is maar één keer geïnstalleerd.

- check path variabele (cmd box 'path')

Er mag maar een verwijzing zijn naar een php directory.

image-1600857056993.png

Meer details zijn te vinden op: https://www.roc.ovh/books/yii/page/trouble-shooting-yii-installatie

3. Yii2 Model generator werkt

De model generator werk, http://localhost:8080/gii/model

image-1594285274135.png

Vereisten: (1) Yii is geïnstalleerd, (2) XAMPP is up-to-date, (3) PHP van XAMPP wordt gebruikt (zie trouble shoot page), (4) database draait en (5) database is in Yii geconfigureerd en geïmporteerd (zie les 1)

ERD

1. Iedereen heeft een login op Lucichart

Student mag andere tool gebruiken, dan graag noteren welke.

image-1600857375231.png

Functioneel Ontwerp

1. Wireframe

https://balsamiq.cloud

( Licence key voor desktop versie op verzoek via Teams verkrijgbaar )

image-1600860424980.png

2. Tool overzicht

Alles studenten dienen dit helder te hebben en wij moeten de voorbeelden afvinken.

Wat Hoe -  Tool Voorbeeld gezien
ERD voor TO    
Wireframe voor FO (dat is grove schets v/d lay-out)    
Uivoerontwerp; proto-type output scherm    
Formulierontwerp; proto-type form (invoerscherm)    
Navigatie structuur - flow diagram    

Zie instructie in les welke tool je kan gebruiken.

De keuze van tools is verder vrij, mits er wordt aangetoond dat de student in staat is de gevraagde diagrammen te maken.

--

 

 

Ontkalken

  1. filter verwijderen
  2. 100 ml (level A) onkalkingsmiddel + 1 liter water (level B)
  3. Stoompijpje en koffieruitloop onder grote bak
  4. Toets "druppels" onder stoomknop 5 sec indrukken
  5. Stoomlampje knippert -> stoomkraan open zetten
  6. ong. 25 m. wachten
  7. Lampjes (stoom en kannetje) knipperen - stoomkraantje uit - vers water  - stoomkraantje weer aan
  8. Zelfde als stap 7 maar nu met filter

KT3 Upload website

Maak lijst met kandidaten in Excel, met alle studenten nummers en verzin/generate wachtwoorden.

Maak een  text input file met userid's en passwords (gescheiden door spatie).

Scipts ran on Ubuntu Server VPS

SFTP restriction

in /etc/ssh/sshd_config (aan eind toevoegen).

Match Group sftp
ForceCommand internal-sftp
ChrootDirectory %h
AllowTCPForwarding no
PermitTunnel no
X11Forwarding no

Werkt niet goed - uiteindelijk opgelost met standaard rechten:

drwxr-xr-x  14 root root      4096 Jul 26  2020 var/

drwxrwxr-x  9 root  www-data  4096 Nov 30 10:28 www/

drwxr-x--x 78 max   root      4096 Feb  4 21:12 softwaredeveloper/
  
drwxr-x--x  4 u515  sftp      4096 Feb  5 16:15 u515/
(group root werkt ook)

-rw-rw-r--  1 u515 sftp         38 Feb  3 19:42 index.php
(group root werkt ook)

Note group sftp only needed if ssh restriction are aplied
Readme
input file consists out of line with
<userid> <password>

add users
run addUser.sh <file>
run creatDBUsers.sql file; sudo mysql < createDB Users.sql

remove
run removeUser.sf <file>
go to php myadmin and delete dabases and users (no script but easy with gui)

Script add users

#!/bin/bash
# Script to add a user to Linux system
# Params <user> <passw> or <file>

DB_FILE=createDBUsers.sql

addThisUser() {
  if [ $(id -u) -eq 0 ]; then

    echo "" >> $DB_FILE

    if [ "$1" == "" ]; then
      read -p "Enter username : " username
    else
      username=$1
    fi
    if [ "$2" == "" ]; then
      read -s -p "Enter password : " password
    else
      password=$2
    fi

    egrep "^$username" /etc/passwd >/dev/null
    if [ $? -eq 0 ]; then
      echo "$username exists!"
      exit 1
    else
      U_HOME=/var/www/softwaredeveloper/$username
      U_GROUP=sftp
      U_SHELL=/bin/bash

      pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)

      useradd -d $U_HOME -g $U_GROUP -m -s $U_SHELL -p $pass $username
      [ $? -eq 0 ] && echo "User $username has been added to system!" || echo "Failed to add a user!"

      chown $username $U_HOME
      echo "<?php echo \"welkom $username\"; ?>" > $U_HOME/index.php
      chown $username $U_HOME/index.php

      echo "" >> $DB_FILE
      echo  "CREATE USER \`$username\`@\`%\` IDENTIFIED BY '$password';" >> $DB_FILE
      echo  "ALTER USER  \`$username\`@\`%\` REQUIRE NONE;" >> $DB_FILE
      echo  "CREATE DATABASE IF NOT EXISTS \`$username\`;" >> $DB_FILE
      echo  "GRANT ALL PRIVILEGES ON \`$username\`.* TO \`$username\`@\`%\`;" >> $DB_FILE

    fi
  else
    echo "Only root may add a user to the system"
    exit 2
  fi
}

# is parameter is file then read input from file <user> Mpassword>
# else read two command line params
if test -f "$1"; then
  while IFS= read -r line
  do
    addThisUser $line
  done < $1
else
  addThisUser $1 $2
fi

script del users

#!/bin/bash
# remove user, params <user> or <file>

removeThisUser() {
  if [ $(id -u) -ne 0 ]; then
    echo "Only root may add a user to the system"
    exit 2
  fi

  if [ "$1" == "" ]; then
    read -p "Enter username : " username
  else
    username=$1
  fi

  if [ $? -eq 0 ]; then
    userdel -r $username
    getent group $username || groupadd $username

    U_HOME=/var/www/softwaredeveloper/$username

    echo "Remove $U_HOME"

  fi
}

# is parameter is file then read input from file <user>
# else read command line params
if test -f "$1"; then
    while IFS= read -r line
  do
    removeThisUser $line
  done < $1
else
  removeThisUser $1 $2
fi

 

 

examen.ovh

Verwijderen resultaten uit examanresultaat

Dit doe je als er een kandidaat is beoordeeld die niet heeft meegedaan. Kandidaat moet volledig uit de uitslagenlijst.

DELETE FROM `results`
WHERE studentid in (48, 59, 52, 51, 55, 39, 34, 68,1) 
AND formid=18
AND examenid=4

In dit voorbeeld worden alle resultaten van de studenten met id's 48, 59,.... en het formulier id 18 verwijderd. Als je regel 3 weglaat dan worden alle uitslagen van alle formulieren van de student van het examen (in dit voorbeeld id-4) weggehaald.

Beoordelaar1/2 in batch wijzigen

De beoordeling wordt pas naar de beoordeling tabel gekopieerd als die is ge-saved. Op dat moment wordt het commentaar vanuit de forms ook in de beoordeling gekopieerd. Als je de beoordelaars van de gesaved-de beoordelingen wil wijzigen.

update uitslag u
inner join student  s on s.id = u.studentid
set beoordeelaar2id = 16
where examenid= 4
and s.klas='8C'
and werkproces = 'B1-K3-W1'

 

 

Backup DB

Backup

  1. 5x per dag wordt een dump van de database op de server gemaakt. -> cron job
  2. Oude back-up worden verwijderd, de 23:10 back up wordt 400 dagen bewaard,
    de andere worden eerder verwijderd.
  3. Elk dag wordt via rsync en ssh (via public/privat keys) de hele document root plus alle database dumps gekopieerd. Script wordt geïnitieerd door NAS.
  4. Een controle script - nog niet geïmplementeerd.

NAS

Cron job draait om 11:10, 14:10, 17:10, 20:10 en 23:10. Er worden dus 5 DB dumps per dag gemaakt.

# create backup of Bookstack Database
10 23,20,17,14,11 * * * /home/max/mysql/backupDB.sh > /home/max/mysql/backupDB.log 2>&1

Backup Script plus clean up

Script backupDB.sh voor backup

#!/bin/bash

export PATH=/bin:/usr/bin:/usr/local/bin
TODAY=`date +"%d%b%Y"`
TODAY=`date +"%m%d-%H00"`

################################################################
################## Update below values  ########################

DB_BACKUP_PATH='/home/max/mysql/Backup-DB'
MYSQL_HOST='localhost'
MYSQL_PORT='3306'
MYSQL_USER='user'
MYSQL_PASSWORD='secret'
DATABASE_NAME='sb_name'
BACKUP_RETAIN_DAYS=180   ## Number of days to keep local backup copy

#################################################################

echo "Backup started for database - ${DATABASE_NAME}"

mkdir -p ${DB_BACKUP_PATH}

mysqldump -h ${MYSQL_HOST} \
   -P ${MYSQL_PORT} \
   -u ${MYSQL_USER} \
   -p${MYSQL_PASSWORD} \
   ${DATABASE_NAME} | gzip > ${DB_BACKUP_PATH}/${DATABASE_NAME}-${TODAY}.sql.gz

if [ $? -eq 0 ]; then
  # remove all files older than 400 days
  find ${DB_BACKUP_PATH} -type f -not -name '*.sql.gz' -mtime +400 -exec rm {} \;
  # remove all files older than 90 days excpet those made on the 1ste of the month
  find ${DB_BACKUP_PATH} -type f -not -name '*01-????.sql.gz' -mtime +90 -exec rm {} \;
  # remove all files not created ar 23:00 and older than 10 days
  find ${DB_BACKUP_PATH} -type f -not -name '*300.sql.gz' -mtime +10 -exec rm {} \;
  echo "Database backup successfully completed"
else
  echo "Error found during backup"
  exit 1
fi


##### Remove backups older than {BACKUP_RETAIN_DAYS} days  #####
find ${DB_BACKUP_PATH}/* -mtime +${BACKUP_RETAIN_DAYS} -exec rm {} \;

NAS Script

(let op dat niet-standaard poorten worden gebruikt ivm security)

TARGET=/volume1/archives/1/

mkdir -p $TARGET/server/var/www
mkdir -p $TARGET/server/home/abc

nohup rsync -av -e 'ssh -p 9999' servername.domain.net:/var/www/* $TARGET/server/var/www &
nohup rsync -av -e 'ssh -p 9999' servername.domain.net:/home/abc/ $TARGET/server/home/abc &

 

Garmin

Hard reset:

https://www.youtube.com/watch?v=-8vWGDOrn_Q

Ostrogorski Paradox

Ik laat aan de hand van een voorbeeld zien dat als er in een democratie wordt gekozen op een partij en daarmee op een compleet partij-programma, er een verkeerd beeld kan ontstaan van de "wil van de kiezer". Deze verstoring zou niet bestaan als de kiezer per onderwerp zou stemmen.

Deze verstoring heeft niets te maken met coalitievorming. Ik werk een voorbeeld uit waarin twee partijen met de verkiezingen meedoen.

Stel je hebt twee partijen de PP = Progressieve Partij en de CP = Conservatieven Partij.

Stel er zijn drie belangrijke onderwerpen, economie (ec), milieu (env) en Europese samenwerking (eur). Stel voor het gemak dat alle onderwerpen even zwaar wegen.

Dit is wat de partijen willen:

Onderwerp PP, Progressieve partij CP, Conservatieve partij
Economie hervormen (1) zo houden als het is (0)
milieu hervormen (1) huidig beleid voortzetten (0)
Europese Samenwerking meer politieke integratie (1) houden zoals het is (0)

De keuzes hervormen of niet worden in het kort weergegeven door 1 of 0.

Er zijn 5 kiezers en die hebben de volgende voorkeuren:


Economie Milieu Europese Samenwerking Stemt (dus)op
Kiezer 1 0 1 0 CP
Kiezer 2 0 1 0 CP
Kiezer 3 1 0 0 CP
Kiezer 4 1 1 1 PP
Kiezer 5 1 1 0 PP
Uitslag


CP wint

Alleen kiezer 4 en 5 stemmen op de PP omdat zij beiden voor de meerderheid van de onderwerpen het beste passen bij de PP. Bijvoorbeeld kiezer 5 vind voor twee van zijn idealen aansluiting bij de PP en voor maar één bij de CP. Let wel alle onderwerpen tellen even zwaar.

Voor kiezer 1,2 en 3 geldt andersom dat zij de meeste aansluiting vinden bij de CP.

Kiezer 1 CP overeenstemming 2/3 punten
Kiezer 2 CP overeenstemming 2/3 punten
Kiezer 3 CP overeenstemming 2/3 punten
Kiezer 4 PP overeenstemming 3/3 punten
Kiezer 5 PP overeenstemming 2/3 punten

Dus de meeste keizers zullen als zij volledig rationeel kiezen, kiezen voor de CP. De CP wint met 3 tegen 2 stemmen.

"Case closed" of niet?

Laten we per onderwerp eens gaan bekijken hoe de stand is:


Economie Milieu Europese Samenwerking
Kiezer 1 0 1 0
Kiezer 2 0 1 0
Kiezer 3 1 0 0
Kiezer 4 1 1 1
Kiezer 5 1 1 0
Uitslag - voorkeur
PP PP CP PP wint

Voor 2 van 3 punten wil de meerderheid dus het beleid van de PP. Het zou dus in het belang van iedereen zijn als de PP zou winnen in de verkiezingen omdat dan de meeste wensen van de kiezers dan worden uitgevoerd. De meerderheid is het immers op 2 van de 3 onderwerpen eens met de PP. Als iedereen rationeel stemt dan wint echter de CP.

Dus in deze denkbeeldige vereenvoudigde situatie waarin iedereen rationeel zou handelen, zou de partij winnen die opgeteld per onderwerp niet de meerderheid zou vertegenwoordigwoordigen.

Dit is slechts een vereenvoudigd voorbeeld met 3 issues en 2 partijen, maar ook in een complexere situatie geldt hetzelfde. Als de kiezers stemmen op de partij die het meest bij hun past, dan kan er als je alle issues zou optellen en eventueel zou wegen een verkiezingsuitslag komen die niet optimaal is voor de gemiddelde kiezer.

Dus deze paradox laat zien dat er een vervorming van de "wil van de kiezer" kan ontstaan als er gekozen wordt op een compleet partij-programma in plaats van dat er op aparte onderwerpen zou worden gekozen.

of in het Engels (quote van second.wiki):

The paradox shows that there can be strong distortions of the “will of the electorate” in elections and votes when votes are taken on entire party programs and not (separately) on individual issues.

Bronnen

www.pigozzi.org/Episteme_Pigozzi.pdf

https://second.wiki/wiki/ostrogorski-paradox

--

Running Numbers

Gewicht

Op de 10KM scheelt elke kilo meer gewich iets meer dan 30 seconden.

Weight Estimated Time Time Difference
67kg 42:23 - 02:37
68kg 42:55 - 02:05
69kg 43:26 - 01:34
70kg 43:58 - 01:02
71kg 44:29 - 00:31
72kg 45:00 -
73kg 45:31 + 00:31
74kg 46:02 + 01:02
75kg 46:33 + 01:33
76kg 47:04 + 02:04
77kg 47:35 + 02:35

Gewicht schoenen

Elke 100 gram scheelt iets minder dan 1% snelheid.

Caloriegebruik

Aantal kilometer X gewicht ~ calorie gebruik.


Calculators: https://runbundle.com/tools/


Mail alias in Google

Het werkt als volgt.

Ga naar ‘tandwieltje’/settings

Account and Import

Add another email address (waar we ook zaten)

Vul in:

smtp.google.com

jouw email, dus laura.bisschop@gmail.com

wachtwoord (alleen als je geen 2FA aan hebt staan, anders lees verder hieronder)

dan wachtwoord als je GEEN 2FA aan hebt staan (2FA is twee factor authenticatie).

Heb je wel 2FA aan staan dan wordt het lastiger:

In een ander window click op google-account (op je fotootje).

Manage your google account

(links) Security (4de optie?)

Dan onder signing in to Google, App password
(opnieuw aanloggen)
select een app en een device (beiden zijn puur een label, dus verzin wat).

Dan druk je op generate en je krijgt een wachtwoord:

Dat ziet er zo uit:

image-1655317503639.png

Dat wachtwoord in dat gele vlak kun je dan copy/past en dat is jouw wachtwoord voor  in dat andere window.

Bewaar dit wachtwoord even, want het gaat soms mis (de smtp server is vaak druk).
Probeer het dus opnieuw als het niet lukt.

Uiteindelijk lukte het, dan krijg je een window voor een verificatie-code. Die krijg je in 1 a 2 minuten via mail.

Success!

Niet vergeten.....

O ja en als alles werkt dan kun je dat (tijdelijke) wachtwoord weer beter weghalen. Het is niet meer nodig. Het was alleen nodig voor de verificatie email.

Wachtwoord kun je weghalen op dezelfde plaats als waar jehet hebt aangemaakt. Spreekt voor zich: gewoon op het prullenmandje clicken.

Nutriscore

De berekening van de Nutriscore

Er zijn op landniveau verschillen voor bepaalde productgroepen zoals kazen, olijfolie, ....


Stap 1, negatieve- en positieve punten

image-1660471929782.png

Bron: https://blog.has.nl/voedselkeuzelogo-2-het-nutri-score-algoritme/


Stap 2, punten omzetten in score

image-1660471946737.png

Bron: https://www.colruytgroup.com/en/conscious-consuming/nutri-score


Slide Show Pictures (HTML/CSS en JS)

Hoe maak je een slide show?
Opacity

Je hebt 4 images en via de CSS heeft elke img een opacity van 0 en is daarmee doorzichtig.

Class Active

Het enige plaatje dat je ziet, is het plaatsje dat via de class active een opacity van 1 heeft gekregen.

Javascript

Het JavaScript zorgt ervoor dat het plaatje de class active wordt weggehaald (remove) en dat het volgende plaatje de class active krijgt.

Via de transition in de CSS wordt de overgang van het ene naar het andere plaatje op 0.5 seconden gezet. Het JS loopt oneindig door en ververst elke 3000 ms (=3 seconden) het plaatje.

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Rotating Images</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="slideshow">
        <img src="image1.jpg" alt="Image 1" class="active">
        <img src="image2.jpg" alt="Image 2">
        <img src="image3.jpg" alt="Image 3">
        <img src="image4.jpg" alt="Image 4">
    </div>

    <script src="script.js"></script>
</body>
</html>

CSS

.slideshow {
    position: relative;
    width: 300px;  /* Adjust based on your image's width */
    height: 200px; /* Adjust based on your image's height */
    overflow: hidden;
}

.slideshow img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    transition: opacity 0.5s;
}

.slideshow img.active {
    opacity: 1;
}

JavaScript

let currentImageIndex = 0;
const images = document.querySelectorAll('.slideshow img');
const totalImages = images.length;

setInterval(() => {
    // Hide the current image
    images[currentImageIndex].classList.remove('active');
    
    // Move to the next image or loop back to the first one
    currentImageIndex = (currentImageIndex + 1) % totalImages;
    
    // Show the new current image
    images[currentImageIndex].classList.add('active');
}, 3000); // Change the images every 3 seconds






python email merge

What it does

  1. Reads data from a CSV file.
  2. Uses the column named "email" from teh CSV file as the to: address.
  3. Replaces placeholders in the email text and subject line with corresponding data from the CSV file.
  4. Sends each customized email through Microsoft Outlook.

How it works

Replace 'your_file.csv', standard_email_text, and standard_subject with your actual file path and text. The script reads the CSV file, replaces placeholders in the email text and subject line with the corresponding data, and sends the emails.

What you need

Example

image-1700656423154.png

If the body text contains _index_, _name_, _ leeg_ or _URL_ these are replaced with the values in the corresponding lines. The search and replace is case-sensitive!

Set Outlook to work offline and check the email in the outbox before going back online!

Python Script

import csv
import win32com.client as win32
import sys

# Define your standard email text and subject line here
standard_email_text = """Beste _name_,

Hierbij de persoonlijke link waarmee u de voortgang van _name_ kan volgen:\n_URL_.

Voor het afronden van de studie binnen drie jaar, moeten dit schooljaar 8 blokken worden afgerond.

Groet, ...............
(deze email is automatisch gegenereerd)
"""
standard_subject = "voortgangsmonitor _name_"

# Function to send email via Outlook
def send_email(recipient, subject, body):
    outlook = win32.Dispatch('outlook.application')
    mail = outlook.CreateItem(0)
    mail.To = recipient
    mail.Subject = subject
    mail.Body = body
    mail.Send()

# Reading CSV and sending emails
with open('ouderemailC23 .csv', newline='', encoding='utf-8-sig') as csvfile:
    reader = csv.DictReader(csvfile, delimiter=';')
    for row in reader:
        if ( row['email'] == "" ): # no email, skip
            continue

        email_body = standard_email_text
        email_subject = standard_subject
        email_to = row['email']

        # Replace placeholders in the email text and subject
        for key in row:
            email_body = email_body.replace(f'_{key}_', row[key])
            email_subject = email_subject.replace(f'_{key}_', row[key])

        print(f"To: {email_to}")
        print(f"Subject: {email_subject}")
        print(f"{email_body}\n")
        print("-----------------------------------------\n")

        # Send the email
        send_email(row['email'], email_subject, email_body)

Max-Quiz

Use Case

In a classroom, as a teacher, I want to execute a formative assessment. I want to be able to start a quiz, minimize the change that students help each other and I want to be able to change quizzes, create new ones without much hassle.

Furthermore, I want to monitor the quiz once it is running and I want to be able to spot irregularities during the quiz session.

The commercial product Socrative matches this use case pretty well, but I kept on running into limitations. So I made my own quiz app.

Installation

Clone the repo

git clone https://github.com/maxbis/max-quiz

Update with composer

composer update

Database

Install the MySQL database by importing the file max-quiz-database-plus example_data.sql, note that this files also creates the database for you. If you want to name the database different, please edit the SLQ file.

Create and/or set rights to some directories

Depending on the system you are running on, you might need to create a few directories, since empty directories are not copied with GitHub. Maybe you need to set the file/directory rights, but this depends on your system and your Web server settings.

The framework Yii will give pretty clear hints for this.

The Yii app can be opened by navigating to the web directory, all routes mentioned in this document are relative to this directory.

Students view

image-1704213000660.png

The app starts by navigation to the web directory.

If you are not logged in you get a screen to start a quiz, this is the student's view.

A student need to provide his name, class and a password to start the quiz.

Student session

Once a student is started. He will always get the next unanswered questions. You can refresh the page, or do whatever. The sessions kept in a cookie that is valid for 2 hours. This is also the maximum time a student can work on a quiz.

When for what reason the student looses his session (he switched from device a to device b), you can provide the student a link to continue to finish the quiz.

Admin

Go to the login, by navigating to /admin.

The standard database has one admin account, called admin with the password admin.

The management of the users is all standard Yii: navigate to /tbl-user to manage this.

For now only username and password are used.

Quiz Screen

image-1704214311510.png

In the quiz screen you can manage the quizzes. Only active quizzes can be started.

Once a quiz is started, it can only be forced to be stopped on a student level.

Progress Screen

image-1704214756481.png

Here you can monitor the progress of the quiz. The questions are mixed per student.

By pressing on the progress column ("Progr."), you can edit the submission. You can change the name, class, correct the score, and force the quiz to be finished.

The code in shown in the left column helps to identify a user, since the code is printed in the header of the students working on the quiz.

One all students are finished, you can export the results to Excel.

Questions Screen

In this screen you get a grid with all question. Here you can link/unlink questions to a quiz.

Use the search bars (question and label) to select questions and add these to the quiz.

image-1704215215315.png

View complete quiz

On the questions screen, the first part shows the quiz data. The green dot means the quiz is active.

image-1704215094101.png

With the view button on the area where the quiz is shown, you can view a quiz and show all questions. This can be handy when you want to reflect on the quiz with students.

Import/export Questions

From this screen you can go to import and export where you can import/export questions.

The format used is shown in the import screen and can also be seen when exporting a series of questions. Note that only the linked question of the quiz will be exported.

When the optional ID is provided in an import, you can update questions via import/export. Of course, you can also use the GUI.

--

Wix

Een veld op een form op "hidden" zetten.

Als je in de form editor op een veld klikt dan kan je aan de rechterkant de checkbox hidden aan klikken:

image-1716123349783.png

Op het form dat de gebruiker ziet, is dit veld dan niet meer zichtbaar.

Via script kan je het veld een waarde geven. In developer mode zie je onderaan een script.

Dit script is standaard 'leeg' en bevat alleen het begin en eind (hetgeen in het voorbeeld hieronder op regel 1 en 4 staat). Een regel die begint met // is een commentaarregel. In het voorbeeld hieronder zijn de commentaarregels verwijderd.

w.onReady(function () {
	$w("#input5").value = "Hidden informatie";
	$w("#hidden02").value = "Dit is een test";
});

Bovenstaande code zet de waarde van twee velden. Het veld dat hierboven op hidden is gezet heeft een ID #input5 en de waarde wordt "Hidden informatie" (regel 2 van de code). Een ander veld met het ID #hidden02 krijgt ook een waarde op regel 3. Op deze manier kan je elk veld een waarde geven.

--

PHP en GMAIL

In (any) project directory:

composer require phpmailer/phpmailer

Create app password in Google

google account - security 0 2-Step Verification - App passwords

emailer

PHP code (this will accept a posted form and email all form fields).

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

// Your Gmail credentials
$gmailUsername = 'user-name@gmail.com';
$gmailPassword = '16-char-app-password'; // under 2 FA in google account settings

// Recipient email address
$recipientEmail = 'to-user@server.com';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $emailContent = "Form Submission:\n\n";

    foreach ($_POST as $key => $value) {
        $emailContent .= "$key: $value\n";
    }

    $mail = new PHPMailer(true);
    try {
        // Server settings
        $mail->isSMTP();
        $mail->Host = 'smtp.gmail.com';
        $mail->SMTPAuth = true;
        $mail->Username = $gmailUsername;
        $mail->Password = $gmailPassword;
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $mail->Port = 587;

        // Recipients
        $mail->setFrom($gmailUsername, 'Form Submission');
        $mail->addAddress($recipientEmail);

        // Content
        $mail->isHTML(false);
        $mail->Subject = 'New Form Submission';
        $mail->Body    = $emailContent;

        $mail->send();
        echo 'Message has been sent';
    } catch (Exception $e) {
        echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
    }
}
?>

Form example

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Form Submission</title>
</head>
<body>
    <form action="process_form.php" method="post">
        <label for="name">Name:</label>
        <input type="text" id="name" name="name"><br><br>
        
        <label for="email">Email:</label>
        <input type="email" id="email" name="email"><br><br>
        
        <label for="message">Message:</label>
        <textarea id="message" name="message"></textarea><br><br>
        
        <input type="submit" value="Submit">
    </form>
</body>
</html>


Brand-Brothers Forms

Nieuwe locatie

https://www.roc.ovh/books/brand-brothers

Handleiding

Deze handleiding beschrijft de verschillende parameters die je kunt gebruiken bij het configureren van een bier selectie formulier.

Het form wordt aangeroepen door middel van een URL en alle parameters worden in de URL meegegeven.

Voorbeeld:

https://....../.../brand-brothers/forms/?eigenaar=naam&merk=Texels&set=Texels-vuurtorenbar&minbeers=3&beerfilter=amstel&options=1,2,3,4,25,26&t=1&maxbeers=3

Spaties in URL

In de gehele URL moeten spaties worden gecodeerd als %20.

Parameters

De parameters zoals in het voorbeeld getoond, worden hieronder beschreven. Elke parameter is rood gemarkeerd.

minbeers
maxbeers
Verborgen Velden
t (Testmodus)
options
beerfilter

Options aanpassen

Om options aan te passen kan deze URL worden gebruikt:

https://....../.../brand-brothers/forms/options

of nieuwe interface

https://....../.../brand-brothers/forms/options/index2.php
Optienummer

Elke optie heeft een nummer. Aan de hand van dit nummer wordt de optie op het formulieer geplaatst. De nummers hoeven niet uniek te zijn. Wanneer meerdere opties hetzelfde nummer hebben, worden alle opties op het fomrulier getoond wanneer deze optie wordt gekozen.

Optienaam

De naam van de optie is de naam die op de aanvraag verschijnt (email).

Optielabel

Het label is de de naam zoals die op het formulier verschijnt.

Extra naam

De extra naam is de (open) vraag die wordt gesteld indien de optie wordt geslecteerd. De naam is de naam zoals die op het aanvraag (email) verschijnt.

Extra label

Het extra label is de (open) vraag die wordt gesteld indien de optie wordt geslecteerd. Het label is de naam zoals die op het formulier verschijnt.

URL naar options (back-up)

De 'database' waarin de options worden opgeslagen kun je via de volgende URLs controleren:

https://.../.../brand-brothers/forms/options/options.js
https://.../.../brand-brothers/forms/options/options.json

Deze bestanden zou je ook als (extra) back-up kunnen gebruiken.

De twee bestanden bevatten dezelfde informatie, maar zijn om technische redenen op een andere wijze vormgegeven.

Options kunnen niet worden aangepast?

Als de opties niet kunnen worden aangepast, controleer dan de twee bestanden. Zijn de wijzigingen in deze bestanden wel aangepast dan zorgt de cache van de browser ervoor dat de wijzigingen niet (direct) worden getoond. Laadt de pagina dan opnieuw en leeg de browser cache (dit werkt op elke browser anders).

Beers aanpassen

(dit is nog nooit in productie getest)

https://............/brand-brothers/forms/beers

of nieuwe interface

https://............/brand-brothers/forms/beers/index2.php

Een beer heeft een ID en een naam zoals dat op het form te zien is. Zorg ervoor dat de ID's uniek blijven.

Equipmentlist

(in ontwikkeling)

https://..../brand-brothers/equipment-list/folders.php

--

SSH Checklist

SSH Key Setup Checklist

  1. Generate SSH Key Pair

    • Ensure that you have generated an SSH key pair on the client machine (system a).
      • Run the following command and check for the existence of ~/.ssh/id_rsa (private key) and ~/.ssh/id_rsa.pub (public key):

        ls -l ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
    • If the keys do not exist, generate them using:

      ssh-keygen -t rsa -b 4096
    • Ensure the keys have appropriate permissions (600 for private and 644 for public keys):

      chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub
  2. Copy Public Key to Remote Server

    • Ensure that the public key has been copied to system b and appended to the ~/.ssh/authorized_keys file.
      • Use the ssh-copy-id command to copy the key:

        ssh-copy-id username@system_b
      • Alternatively, you can manually copy the contents of ~/.ssh/id_rsa.pub to ~/.ssh/authorized_keys on system b.
    • Verify that the authorized_keys file has the correct permissions:

      chmod 600 ~/.ssh/authorized_keys
    • Make sure the .ssh directory has the correct permissions:

      chmod 700 ~/.ssh
  3. Check SSH Daemon Configuration on Remote Server

    • Ensure the SSH daemon is configured to allow key-based authentication. Check /etc/ssh/sshd_config on system b for the following settings:
      • PubkeyAuthentication yes
      • AuthorizedKeysFile .ssh/authorized_keys
      • PasswordAuthentication no (optional, for enforcing key-based auth only)
    • Restart the SSH daemon to apply changes:

      sudo systemctl restart sshd
  4. Verify Ownership and Permissions

    • Check ownership and permissions of the user's home directory on system b:
      • Ensure that the home directory and .ssh directory are owned by the user and have appropriate permissions:

        chown -R username:username /home/username chmod 700 /home/username/.ssh
  5. Ensure Correct SSH Command Usage

    • Use the correct username and hostname when attempting to SSH into system b:

      ssh username@system_b
    • If using a non-standard SSH port, specify it using the -p option:

      ssh -p <port_number> username@system_b
  6. Check SSH Agent (Optional)

    • Ensure that the SSH agent is running and the key is added to it, especially if using ssh-agent for key management:

      eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa
    • Verify the keys added to the agent:

      ssh-add -l
  7. Review SSH Debugging Output

    • Use the -v option with the SSH command to enable verbose mode, which can provide detailed debugging information:
      bash
      ssh -v username@system_b
    • Look for lines indicating whether the key is being offered and any errors that may indicate why the key is being rejected.
  8. Network Issues

    • Ensure there are no network issues preventing the connection. Check that system b is reachable via the network.
    • Verify that the firewall on system b is allowing incoming SSH connections on the specified port.
  9. SELinux and AppArmor (Linux Specific)

    • If system b uses SELinux, ensure it is not blocking SSH connections:

      sudo setenforce 0 # Temporarily disable for testing
    • If using AppArmor, check that it allows SSHD to read the authorized_keys file.
  10. Check for Multiple Keys (Optional)

    • If multiple keys are present, specify the exact key to use:

      ssh -i ~/.ssh/id_rsa username@system_b

By following this checklist, you should be able to identify and resolve most issues preventing SSH key-based authentication. If problems persist, examining the verbose output from the SSH command can provide further clues.

Books

  1. Black Heart (2018) - read
    The first book introduces Detective Dan Riley as he investigates the brutal murder of a woman found dead in a luxury hotel suite. As the investigation unfolds, dark secrets emerge, leading to a web of lies, obsession, and revenge. A thrilling police procedural with psychological elements.

  2. The Couple on Cedar Close (2019) - read
    This novel centers around a seemingly perfect couple, until the wife is found dead and the husband becomes the prime suspect. Detective Riley must dig deeper into their lives to uncover shocking truths that no one saw coming.

  3. The Stranger's Wife (2020) - read
    In this book, two women from vastly different lives find themselves linked by a series of tragic events. Riley works to solve a complex case involving abuse, betrayal, and a violent crime, with plenty of twists and turns along the way.

  4. The Woman Inside (2021) - read
    After surviving a near-fatal attack, Daisey Garrett wakes up in the hospital with no memory of what happened. With the help of Detective Riley, she attempts to piece together the events of that night, while her troubled personal life adds further complications.

  5. The Night of the Party (2022)
    This novel explores the secrets of an elite social circle after a shocking murder at a glamorous party. As Detective Riley investigates, he uncovers hidden grudges and a complex tapestry of deceit.

  6. The Lie in Our Marriage (2023) - now
    The sixth book focuses on a couple celebrating their 25th wedding anniversary, but beneath the surface, their relationship is falling apart. A series of dark secrets and lies unravel, leading to a gripping conclusion as Detective Riley is called to solve yet another mystery.

  7. The Housewife’s Secret (2024) - read

Grid View - Max MVC

Below is sample documentation that explains how to configure each column in your grid. You can include this in your project’s documentation (for example, as a README or developer guide).


Grid Column Data Structure

Each column in the grid is defined as an associative array. The following keys are available:

Required Keys

Optional Keys

Example of a Complete Column Configuration

Below is a sample array of columns that demonstrates how to configure different aspects:

$columns = [
  [
    'name'       => 'Order ID',
    'data'       => 'order_id',
    'width'      => '80px',
    'align'      => 'left',
    'sortable'   => true,
    'filter'     => 'text',
  ],
  [
    'name'       => 'Customer',
    'data'       => 'customer_name',
    'width'      => '150px',
    'align'      => 'left',
    'sortable'   => true,
    'filter'     => 'select',
  ],
  [
    'name'       => 'Price',
    'data'       => 'price',
    'width'      => '80px',
    'align'      => 'right',
    'formatter'  => 'number_format($item["price"], 2, ".", ",")',
    'aggregate'  => 'sum',
    'sortable'   => true,
    'filter'     => 'none',
  ],
  [
    'name'       => 'Quantity',
    'data'       => 'quantity',
    'width'      => '60px',
    'align'      => 'right',
    'aggregate'  => 'sum',
    'sortable'   => true,
    'filter'     => 'none',
  ],
  [
    'name'       => 'Total',
    'data'       => '{price} * {quantity}', // Calculated column using tokens
    'width'      => '100px',
    'align'      => 'right',
    'formatter'  => 'number_format($value, 2, ".", ",")', // $value refers to the computed total
    'aggregate'  => 'sum',
    'sortable'   => false,
    'filter'     => 'none',
  ],
  [
    'name'       => 'Secret Code',
    'data'       => 'secret_code',
    'hide'       => true, // Hidden from the view but used for calculations or references
    'sortable'   => false,
    'filter'     => 'none',
  ],
];

Notes


This documentation provides an overview of how to set up and customize the grid’s column definitions. Adjust the examples to match your application’s needs, and feel free to extend the configuration with additional keys or logic as required.

VU

Cheat Sheet – Virtual Environment Manager

Standard

python3 -m venv .venv

source .venv/bin/activate // Linux

.venv\Scripts\activate // Windows
Create and Manage Environments
Command Description
vu new <envname> Create a new virtual environment
vu rm <envname> Delete (remove) an environment
vu ls List all virtual environments
vu cd <envname> Print path to the environment
Interactive Environment
Command Description
vu activate <envname> Start a new shell with the environment active
exit Exit the activated shell
Other Helpful Commands
Command Description
vu which <envname> Show path to Python binary in the env
vu home Show the root directory where vu stores envs
Typical Workflow
vu new myproject
vu run myproject pip install flask
vu run myproject python app.py

Or interactively:

vu activate myproject
# now you're inside the virtualenv
python
exit

Weetjes / Quiz vragen

Wat is het verschil tussen include en require?

A) Geen verschil
B) require stopt het script bij een fout, include niet
C) include is sneller
D) require is alleen voor functies

Antwoord: B

Wat doet de isset() functie in PHP?

A) Kijkt of een variabele een lege string is
B) Kijkt of een variabele bestaat én niet null is
C) Kijkt of een array een waarde bevat
D) Zet een variabele

Antwoord: B

Wie wordt gezien als de uitvinder van het World Wide Web?

A) Bill Gates
B) Linus Torvalds
C) Tim Berners-Lee
D) Steve Jobs

Antwoord: C
(Tim Berners-Lee ontwikkelde het WWW in 1989)

Wat betekent de afkorting SSD in computerhardware?

A) Static Storage Drive
B) Super Speed Disk
C) Solid State Drive
D) Sequential Storage Device

Antwoord: C

Waarvoor wordt HTML gebruikt?

A) Styling van webpagina's
B) Structuur van een webpagina opbouwen
C) Server-side logica
D) Databases beheren

Antwoord: B

Wat betekent de afkorting CSS?

A) Computer Styled Sheets
B) Cascading Style Sheets
C) Creative Style Syntax
D) Custom Styling System

Antwoord: B

Welke tag gebruik je om een link te maken in HTML?

A) <link>
B) <a>
C) <href>
D) <url>

Antwoord: B

Welke van deze talen draait in de browser van de gebruiker?

A) PHP
B) Python
C) JavaScript
D) SQL

Antwoord: C

Wat doet de <img> tag in HTML?

A) Voegt een video toe
B) Voegt een afbeelding toe
C) Maakt een koptekst
D) Start een animatie

Antwoord: B

Welke eigenschap in CSS bepaalt de tekstkleur?

A) background-color
B) font-size
C) text-style
D) color

Antwoord: D

Wat doet console.log() in JavaScript?

A) Maakt een pop-up op het scherm
B) Stuurt gegevens naar de server
C) Toont informatie in de ontwikkelaarstools
D) Ververst de pagina

Antwoord: C

Denken in Systemen

(AI generated, LM Notebook)

Samenvatting

Donella H. Meadows' "Thinking in Systems" is een fundamentele gids voor het begrijpen van de complexe dynamiek van systemen en hoe we effectiever met ze kunnen omgaan. Het boek benadrukt dat systeemdenken essentieel is om de wereld om ons heen te begrijpen, de grondoorzaken van problemen te identificeren en duurzame veranderingen te creëren.

Hier zijn de belangrijkste concepten die in het boek worden uitgelegd:

Donella Meadows' werk moedigt ons aan om de wereld te zien als een complex web van onderling verbonden elementen, in plaats van geïsoleerde problemen, wat ons in staat stelt om diepere inzichten te verwerven en effectievere interventies te plegen.

FAQ in 8 vragen

Wat is een systeem en hoe kan ik het herkennen?

Een systeem is een verzameling van onderling verbonden elementen die samen een functie vervullen en gedrag vertonen dat niet te herleiden is tot de afzonderlijke delen. Om te bepalen of iets een systeem is, kun je jezelf drie vragen stellen: 1) Kun je de onderdelen identificeren? 2) Beïnvloeden de onderdelen elkaar? en 3) Produceren de onderdelen samen een effect dat anders is dan het effect van elk onderdeel afzonderlijk? Concrete voorbeelden van systemen zijn een school, een stad, een fabriek, een dier of een boom. Zelfs immateriële zaken zoals schooltrots of academische bekwaamheid kunnen elementen van een systeem zijn. Daarentegen is zand dat toevallig op een weg gestrooid is geen systeem, omdat het ontbreekt aan specifieke onderlinge verbindingen of functies.

Wat zijn "stocks" en "flows" in een systeem, en waarom zijn ze belangrijk?

"Stocks" (voorraden) zijn de fundamenten van elk systeem; ze representeren de hoeveelheid materiaal of informatie die op een bepaald moment in het systeem aanwezig is, zoals water in een badkuip, een populatie, boeken in een boekhandel, of zelfs je zelfvertrouwen. Stocks zijn de "geheugens" van het systeem, de cumulatieve resultaten van de geschiedenis van veranderende flows. "Flows" (stromen) zijn de bewegingen van materiaal of informatie die stocks vullen of legen. Dit kunnen bijvoorbeeld vulling en legen zijn, geboorten en sterfgevallen, aankopen en verkopen. Het begrijpen van de dynamiek van stocks en flows, oftewel hoe ze over tijd veranderen, is essentieel voor het begrijpen van complex systeemgedrag. Stocks veranderen over het algemeen langzaam en fungeren als vertragingen, buffers of schokdempers in een systeem, waardoor inflows en outflows tijdelijk losgekoppeld en onafhankelijk van elkaar kunnen zijn.

Wat is een feedbackloop en welke twee hoofdtypen feedbackloops zijn er?

Een feedbackloop is het mechanisme dat een verandering in een stock beïnvloedt door een flow in of uit diezelfde stock. Het is een gesloten keten van causale verbanden die begint bij een stock, door beslissingen of regels die afhankelijk zijn van het niveau van die stock, en dan weer teruggaat via een flow om de stock te veranderen. Er zijn twee hoofdtypen feedbackloops:

  1. Balancerende feedbackloops (B): Deze loops zijn doelgericht of stabiliteitsgericht. Ze proberen een stock op een bepaalde waarde of binnen een bepaald bereik te houden. Een balancerende loop is gericht tegen elke verandering die aan het systeem wordt opgelegd, en probeert de stock terug te brengen naar zijn gewenste staat (bijvoorbeeld een thermostaat die de kamertemperatuur reguleert).
  2. Versterkende feedbackloops (R): Deze loops veroorzaken groei of daling van een stock door een constante fractie van zichzelf. Ze zorgen ervoor dat een verandering in dezelfde richting blijft voortgaan (bijvoorbeeld rente op een bankrekening: hoe meer geld, hoe meer rente, wat leidt tot nog meer geld).

Hoe beïnvloeden vertragingen (delays) het gedrag van systemen?

Vertragingen zijn alomtegenwoordig in systemen en zijn sterke bepalende factoren van systeemgedrag. Elke stock is op zichzelf al een vertraging, en de meeste flows kennen vertragingen, zoals verzendvertragingen, perceptievertragingen of verwerkingsvertragingen. Stocks reageren pas geleidelijk op veranderingen, zelfs op plotselinge veranderingen, door langzaam te vullen of te legen. Het aanpassen van de lengte van een vertraging kan een grote verandering teweegbrengen in het gedrag van een systeem. Het is cruciaal om te begrijpen waar en hoe lang vertragingen optreden in informatiestromen of fysieke processen, omdat dit krachtige beleidshefbomen kunnen zijn om het systeem gemakkelijker of moeilijker te beheren.

Wat is "bounded rationality" en de implicaties ervan voor systeemgedrag?

"Bounded rationality" (begrensde rationaliteit) verwijst naar de logica die leidt tot beslissingen of acties die zinvol zijn binnen één deel van een systeem, maar niet redelijk zijn binnen een bredere context of wanneer ze worden gezien als onderdeel van het grotere systeem. Mensen zijn geen alwetende, rationele optimaliseerders, maar eerder "satisficers" die proberen hun behoeften voldoende te bevredigen voordat ze verdergaan met de volgende beslissing. We handelen rationeel binnen onze beperkte kennis en informatie, negeren vaak de gevolgen van onze acties voor het hele systeem, en zien zelden het volledige scala aan mogelijkheden. Dit betekent dat het plaatsen van nieuwe actoren in hetzelfde systeem de prestaties van het systeem niet zal verbeteren als de onderliggende informatie, prikkels, doelen, stressfactoren en beperkingen die de begrensde rationaliteit van de actoren bepalen, niet worden aangepakt door het systeem te herontwerpen.

Waarom zijn systeemgrenzen en "clouds" belangrijk in systeemmodellering?

In systeemmodellering is het noodzakelijk om grenzen te stellen om een systeem te kunnen analyseren en begrijpen, aangezien "er geen aparte systemen zijn; de wereld is een continuüm." Waar je een grens trekt, hangt af van het doel van de analyse en de vragen die je wilt beantwoorden. "Clouds" (wolken) in systeemdiagrammen vertegenwoordigen bronnen of bestemmingen voor flows die voor het huidige doel van de discussie als buiten het systeem worden beschouwd. Het is belangrijk om je bewust te zijn van de aannames die je maakt wanneer je een cloud gebruikt. Als bijvoorbeeld grondstoffen gegarandeerd overvloedig zijn, volstaat een cloud. Maar als er een tekort aan materialen zou kunnen ontstaan, en deze stock niet in het mentale systeemmodel wordt opgenomen, kan dit leiden tot verrassingen in de toekomst. Een te nauwe afbakening kan leiden tot het over het hoofd zien van belangrijke invloeden, zoals de impact van economische ontwikkeling buiten de officiële perimeter van een nationaal park op de ecologie binnen het park.

Wat is de "tragedy of the commons" en hoe kan deze worden opgelost?

De "tragedy of the commons" (tragedie van de meent) ontstaat wanneer individuen, handelend in hun eigen belang, een gemeenschappelijke hulpbron uitputten, omdat de voordelen van hun acties voor henzelf zijn, terwijl de kosten (uitputting van de hulpbron) worden gedeeld door iedereen. Dit leidt tot een onvermijdelijke ondergang als de gemeenschap onbeperkt groeit in een wereld die beperkt is. De oplossing hiervoor is niet eenvoudig, maar omvat vaak "mutual coercion, mutually agreed upon" (wederzijdse dwang, wederzijds overeengekomen). Dit kan verschillende vormen aannemen, zoals:

Waarom is het belangrijk om naar het doel van een systeem te kijken en het meten van het succes?

Het doel of de intentie van een systeem is een van de krachtigste hefbomen om het gedrag ervan te beïnvloeden. Het doel is de richtinggever van het systeem, de definieerder van discrepanties die actie vereisen, en de indicator van naleving, falen of succes waar balancerende feedbackloops naar toe werken. Als het doel slecht is gedefinieerd, als het niet meet wat het hoort te meten, of als het niet het werkelijke welzijn van het systeem weerspiegelt, kan het systeem onmogelijk een wenselijk resultaat produceren. Systemen hebben de neiging om precies datgene te produceren waarnaar gevraagd wordt. Een veelvoorkomende fout is het verwarren van inspanning met resultaat, bijvoorbeeld het meten van het succes van gezinsplanning in termen van geïmplanteerde spiraaltjes in plaats van geboortecijfers. Een van de ergste voorbeelden hiervan is het gebruik van het Bruto Nationaal Product (BNP) als maatstaf voor nationaal economisch succes, terwijl het de menselijke welvaart vaak onvoldoende weergeeft. Het is cruciaal om doelen te stellen op basis van wat werkelijk belangrijk is, in plaats van wat gemakkelijk meetbaar is, en om de kwaliteit boven de kwantiteit te stellen.

Study Guide

Denkend in Systemen: Een Gedetailleerde Studiegids

Deze studiegids is ontworpen om uw begrip van het bronmateriaal uit "Thinking in Systems" van Donella H. Meadows te toetsen en te verdiepen.

Quiz: Korte Antwoordvragen

Beantwoord elke vraag in 2-3 zinnen.

  1. Wat is het fundamentele verschil tussen een Slinky en een lege doos in de context van systeemdenken? De Slinky's veerkracht en beweging komen voort uit zijn interne structuur en onderlinge verbindingen. De lege doos heeft deze inherente eigenschappen niet; de beweging wordt volledig bepaald door externe manipulatie.
  2. Waarom benadrukt Meadows het gebruik van diagrammen en tijdsgrafieken bij het bespreken van systemen? Systemen werken gelijktijdig in meerdere richtingen en zijn onderling verbonden. Woorden zijn lineair, terwijl visuele representaties zoals diagrammen de simultane aard van systeeminteracties beter kunnen weergeven.
  3. Hoe bepalen we of een verzameling elementen een "systeem" vormt? Een verzameling elementen is een systeem als de delen elkaar beïnvloeden, en samen een effect produceren dat verschilt van het effect van elk afzonderlijk deel. Er moeten identificeerbare onderdelen zijn met specifieke onderlinge verbindingen en functies.
  4. Wat is het verschil tussen een 'stock' en een 'flow' in een systeem, en hoe zijn ze gerelateerd? Een stock is een hoeveelheid of accumulatie die op een bepaald moment kan worden gemeten (bijv. water in een badkuip). Een flow is de beweging van materiaal of informatie die een stock in de loop van de tijd vult of leegt (bijv. instroom en uitstroom van water).
  5. Leg uit waarom stocks worden beschouwd als "vertragingen" of "buffers" in systemen. Stocks nemen tijd om te veranderen, zelfs als de flows plotseling veranderen, omdat flows ook tijd nodig hebben om te stromen. Dit betekent dat stocks veranderingen opvangen en vertragen, waardoor ze fungeren als stabilisatoren in het systeem.
  6. Wat is een 'balancing feedback loop' en geef een kort voorbeeld? Een balancing feedback loop is een stabiliserende, doelzoekende lus die een stock op een bepaalde waarde of binnen een bereik probeert te houden. Een voorbeeld is een thermostaat die de kamertemperatuur reguleert door de verwarming aan of uit te zetten.
  7. Wat is een 'reinforcing feedback loop' en geef een kort voorbeeld? Een reinforcing feedback loop is een lus die een verandering in het systeem versterkt en leidt tot exponentiële groei of verval. Een voorbeeld is een spaarrekening: hoe meer geld u heeft, hoe meer rente u verdient, wat weer bijdraagt aan meer geld en dus meer rente.
  8. Waarom is het concept van 'bounded rationality' cruciaal voor systeemdenkers? Bounded rationality verwijst naar het feit dat individuen beslissingen nemen op basis van beperkte informatie en een beperkte focus op hun eigen nabije belangen. Dit betekent dat beslissingen die rationeel zijn voor een onderdeel van het systeem, niet noodzakelijkerwijs het welzijn van het gehele systeem bevorderen.
  9. Hoe kunnen "vertragingen" ("delays") de dynamiek van een systeem beïnvloeden en waarom zijn ze belangrijk om te begrijpen? Vertragingen zijn overal aanwezig in systemen en kunnen de gedragsdynamiek sterk bepalen, soms leidend tot oscillaties of onverwachte resultaten. Het begrijpen van de aard en lengte van vertragingen is essentieel om systeemgedrag te kunnen analyseren en potentieel te beïnvloeden.
  10. Wat is de 'tragedy of the commons' en hoe kan dit systeemprobleem worden aangepakt? De tragedy of the commons treedt op wanneer individuen, handelend in hun eigenbelang, een gedeelde, beperkte hulpbron uitputten. Het kan worden aangepakt door "wederzijdse dwang, wederzijds overeengekomen", zoals het instellen van regels, quota, prijzen, of fysieke barrières voor het gebruik van de gemeenschappelijke bron.

Antwoordsleutel Quiz

  1. Wat is het fundamentele verschil tussen een Slinky en een lege doos in de context van systeemdenken? Het verschil ligt in hun interne structuur. De Slinky's veerbeweging komt voort uit zijn eigen inherente eigenschappen en onderlinge verbindingen, terwijl de doos alleen beweegt als deze extern wordt gemanipuleerd en geen interne dynamiek heeft.
  2. Waarom benadrukt Meadows het gebruik van diagrammen en tijdsgrafieken bij het bespreken van systemen? Systemen zijn multidirectioneel en gelijktijdig met elkaar verbonden, wat moeilijk is om lineair met woorden te beschrijven. Diagrammen en grafieken bieden een taal die de simultane en onderling verbonden aard van systeemverschijnselen beter kan vastleggen.
  3. Hoe bepalen we of een verzameling elementen een "systeem" vormt? Een verzameling is een systeem als de onderdelen elkaar beïnvloeden en samen een effect produceren dat verschilt van het effect van elk afzonderlijk deel. Dit impliceert dat er specifieke onderlinge verbindingen en een functie aanwezig zijn, in tegenstelling tot een willekeurige opeenhoping.
  4. Wat is het verschil tussen een 'stock' en een 'flow' in een systeem, en hoe zijn ze gerelateerd? Een 'stock' is een meetbare hoeveelheid of accumulatie op een bepaald moment, zoals water in een badkuip. Een 'flow' is de stroom van materiaal of informatie die de stock in de loop van de tijd verandert, zoals de instroom of uitstroom van water. Flows vullen of legen stocks.
  5. Leg uit waarom stocks worden beschouwd als "vertragingen" of "buffers" in systemen. Stocks veranderen langzaam omdat flows tijd nodig hebben om te stromen, zelfs als de flows abrupt veranderen. Dit betekent dat stocks veranderingen opvangen en vertragen, waardoor ze een stabiliserend effect hebben en fungeren als schokdempers in het systeem.
  6. Wat is een 'balancing feedback loop' en geef een kort voorbeeld? Een balancing feedback loop is een stabiliserende, doelzoekende lus die een stock op een gewenste waarde of binnen een bereik houdt door veranderingen tegen te werken. Een koelende kop koffie die de kamertemperatuur benadert, is een voorbeeld van zo'n lus die streeft naar evenwicht.
  7. Wat is een 'reinforcing feedback loop' en geef een kort voorbeeld? Een reinforcing feedback loop is een lus die een initiële verandering versterkt, wat leidt tot exponentiële groei of afname. Het voorbeeld van een rentedragende bankrekening toont dit: hoe meer geld op de rekening, hoe meer rente wordt verdiend, wat de groei verder stimuleert.
  8. Waarom is het concept van 'bounded rationality' cruciaal voor systeemdenkers? Bounded rationality benadrukt dat mensen handelen op basis van beperkte informatie en hun directe belangen, vaak zonder de gevolgen voor het hele systeem te overzien. Dit is cruciaal omdat het verklaart waarom individueel 'rationele' beslissingen collectief tot ongewenste systeemprestaties kunnen leiden.
  9. Hoe kunnen "vertragingen" ("delays") de dynamiek van een systeem beïnvloeden en waarom zijn ze belangrijk om te begrijpen? Vertragingen zijn alomtegenwoordig en bepalen sterk het systeemgedrag, vaak leidend tot oscillaties of onverwachte resultaten. Het nauwkeurig identificeren van de locatie en lengte van vertragingen is essentieel, omdat het aanpassen ervan krachtige beleidsinstrumenten kan zijn om systeemgedrag te sturen.
  10. Wat is de 'tragedy of the commons' en hoe kan dit systeemprobleem worden aangepakt? De tragedy of the commons beschrijft de uitputting van een gedeelde hulpbron wanneer individuen hun eigenbelang nastreven. Dit probleem kan worden aangepakt door mechanismen van "wederzijdse dwang, wederzijds overeengekomen", zoals regulering, quota, heffingen of privatisering om het gebruik te beperken.

Essayvragen

  1. Bespreek de rol van "stocks" en "flows" als fundamentele bouwstenen van systemen. Hoe beïnvloeden hun dynamiek het gedrag van complexe systemen, en geef concrete voorbeelden uit het bronmateriaal om uw argumenten te ondersteunen.
  2. Analyseer de begrippen 'balancing feedback loops' en 'reinforcing feedback loops'. Hoe interacteren deze twee soorten loops om complex systeemgedrag te creëren? Illustreer uw antwoord met voorbeelden van zowel natuurlijke als mensgemaakte systemen.
  3. "De grenzen van een systeem hangen af van het doel van de discussie – de vragen die we willen stellen." Bespreek deze bewering van Meadows. Waarom is het trekken van grenzen noodzakelijk, maar ook potentieel misleidend, in systeemmodellering? Gebruik voorbeelden zoals 'clouds' en de evolutie van parkmanagement om uw punt te verduidelijken.
  4. Meadows stelt dat "er altijd grenzen aan groei zullen zijn." Leg uit wat zij hiermee bedoelt, zowel vanuit een zelfopgelegd als een systeem-opgelegd perspectief. Hoe relateert dit concept zich aan de 'tragedy of the commons' en welke lessen kunnen we hieruit trekken voor duurzaam beheer van hulpbronnen?
  5. Het concept van 'bounded rationality' verklaart waarom goedbedoelde individuele acties vaak tot ongewenste systeemuitkomsten leiden. Bespreek hoe de structuur van een systeem, inclusief informatie, prikkels en doelen, de beslissingen van actoren vormt. Hoe kan het herontwerpen van deze structuren leiden tot betere systeemprestaties?

Woordenlijst van Sleuteltermen

--

Verkiezingen 2025

Israël–Palestina

Pro-Israël → Pro-Palestina

PVV → VVD → JA21 → NSC → CDA → D66 → SP → PvdD → GroenLinks–PvdA → DENK

Standpunten Israël–Palestina
Partij Kernpunten
PVV Uiterst pro-Israël; éénstaatoplossing, ambassade Jeruzalem.
VVD Pro-Israël; diplomatie, geen sancties, intern verdeeld.
JA21 Sterk pro-Israël; Hamas/Iran dreiging benadrukt.
NSC Licht pro-Israël; tweestatenoplossing, geen sancties.
CDA Zelfverdediging Israël, maar humanitair recht; tweestatenoplossing.
D66 Tweestatenoplossing (1967-grenzen); erkenning Palestijnse staat.
SP Kritisch; noemt oorlog mogelijk genocide; erkenning Palestina.
PvdD Pro-Palestina; sancties tegen Israël, gelijkwaardigheid.
GroenLinks–PvdA Wapenembargo, sancties, stop nederzettingen.
DENK Uiterst pro-Palestina; sancties, boycot, directe erkenning.

Immigratie

Restrictief → Ruimhartig

PVV → JA21 → VVD → NSC → CDA → D66 → SP → GroenLinks–PvdA → PvdD → DENK

Standpunten Immigratie
Partij Kernpunten
PVV Immigratie islamitische landen stoppen, asiel afschaffen.
JA21 Asiel beperken, opvang in regio, minder arbeidsmigratie.
VVD Instroom beperken, opvang in regio, kennismigratie welkom.
NSC Strengere regels, integratie, opvang in regio.
CDA Opvang in regio, streng terugkeerbeleid, ruimte voor MKB.
D66 Menswaardig asielbeleid in EU, kennismigratie open.
SP Humaan asielbeleid, kritisch op arbeidsmigratie door bedrijven.
GroenLinks–PvdA Solidaire opvang, bescherming tegen uitbuiting.
PvdD Humaan asielbeleid, bescherming vluchtelingenrechten.
DENK Sterk pro-migratie; gelijke kansen en rechten.

Bedrijven & Vestigingsklimaat

Pro-bedrijven → Kritisch op bedrijven

VVD → JA21 → NSC → CDA → PVV → D66 → GroenLinks–PvdA → SP → PvdD → DENK

Standpunten Bedrijven
Partij Kernpunten
VVD Zeer pro-bedrijven, lage lasten, aantrekkelijk klimaat.
JA21 Lagere lasten, minder regeldruk, tegen beurstaksen.
NSC Vestigingsklimaat belangrijk, maar streng op constructies.
CDA Pro-MKB, industrie behouden, maar duurzaamheidsregels.
PVV Lagere lasten, vooral voor nationale bedrijven.
D66 Balans: steun innovatie, hogere lasten op vervuiling.
GroenLinks–PvdA Hogere winsten/kapitaal belasten, beurstaks.
SP Forse belastingen op winsten en aandeleninkoop.
PvdD Zware lasten op vervuiling, strengere regels.
DENK Sociale rechtvaardigheid boven bedrijfsbelangen.

Belastingdruk Particulieren

Laag → Hoog

PVV → VVD → JA21 → NSC → CDA → D66 → DENK → GroenLinks–PvdA → PvdD → SP

Standpunten Belastingdruk Particulieren
Partij Kernpunten
PVV Lasten verlagen (energie, btw, zorg), lagere belastingdruk.
VVD Lage lasten werkenden, beperken inkomstenbelasting.
JA21 Lagere inkomsten- en erfbelasting, tegen vermogenslasten.
NSC Middeninkomens ontzien, milde stijging hogere inkomens.
CDA Gezinnen en middeninkomens ontzien, eerlijke verdeling.
D66 Arbeid omlaag, vermogen en vervuiling omhoog.
DENK Lage inkomens ontzien, hoge inkomens en kapitaal zwaarder.
GroenLinks–PvdA Progressief stelsel, hogere lasten top, lagere lasten midden.
PvdD Arbeid ontzien, hogere belasting op vervuiling en vermogen.
SP S terke herverdeling, veel hogere lasten rijkdom/vermogen.

Inkomen & Werk

Marktgericht / lage herverdeling → Sterke herverdeling / inkomensgelijkheid

VVD → JA21 → PVV → NSC → CDA → D66 → DENK → GroenLinks–PvdA → PvdD → SP

Standpunten Inkomen & Werk
Partij Kernpunten
VVD Lage lasten op werk; stimuleren ondernemerschap en hoge inkomens; beperkt herverdelingsbeleid.
JA21 Lagere lasten op arbeid; meer ruimte voor ondernemers en middeninkomens; tegen extra progressieve belastingen.
PVV Lastenverlichting voor midden- en lage inkomens; meer koopkracht; minder nadruk op herverdeling via belastingen.
NSC Focus op middeninkomens; eerlijk loon; beperkt hogere lasten voor topinkomens; balans tussen markt en bescherming.
CDA Waarde voor werk en gezin; inkomensverschillen accepteren, maar steun voor kwetsbare groepen; gematigde herverdeling.
D66 Lasten verschuiven van arbeid naar vermogen en vervuiling; minimumloon verhogen; stimuleren werk via scholing.
DENK Gelijke kansen op de arbeidsmarkt; hogere lasten voor hoge inkomens; bestrijden van discriminatie op werkvloer.
GroenLinks–PvdA Sterke inkomensherverdeling; hogere belastingen voor topinkomens; verhoging minimumloon en betere sociale zekerheid.
PvdD Meer gelijkheid; hogere lasten voor vervuilende en rijke groepen; basiszekerheid centraal boven marktwerking.
SP Zeer sterk voor herverdeling; forse verhoging minimumloon; hogere belastingen voor grootverdieners; inkomensverschillen terugdringen.

Vermogensbelasting

Laag → Hoog

VVD → PVV → JA21 → NSC → CDA → D66 → DENK → GroenLinks–PvdA → PvdD → SP

Standpunten Vermogensbelasting
Partij Kernpunten
VVD Tegen hogere vermogensbelasting; geen beurstaks.
PVV Lastenverlichting sparen/huizen; tegen hogere vermogensbelasting.
JA21 Tegen vermogens- en beurstaks; lagere erfbelasting.
NSC Aanpak constructies, spaarders ontzien.
CDA Kleine vermogens ontzien, milde verhoging top.
D66 Meer progressiviteit; hogere vermogensbelasting.
DENK Hogere belasting op hoge vermogens; eerlijke verdeling.
GroenLinks–PvdA Progressieve vermogensbelasting, beurstaks.
PvdD Extra belasting vermogen, koppeling aan ecologie.
SP Forse vermogensbelasting; aanpak grootkapitaal.

Europa (EU-integratie)

Minder EU / nationaler → Meer EU / federaler

PVV → JA21 → SP → NSC → VVD → CDA → PvdD → DENK → GroenLinks–PvdA → D66

Standpunten Europa (EU-integratie)
Partij Kernpunten
PVV S terk EU-kritisch; soevereiniteit boven EU; tegen verdere integratie (tot en met uittredingsretoriek).
JA21 Minder macht voor Brussel; geen overdracht van bevoegdheden; strenger op migratie en grenzen in EU-kader.
SP Links EU-kritisch; tegen neoliberale regels; samenwerking ja, geen federale EU of begrotingsunie.
NSC Nuchter en terughoudend; subsidiariteit; kritischer op nieuwe overdracht van bevoegdheden.
VVD Pro-EU voor handel/veiligheid; geen federale sprongen; strenger op begrotings- en migratieregels.
CDA Constructief pro-EU; hervormen i.p.v. federaliseren; samenwerking op veiligheid, landbouw en economie.
PvdD EU voor klimaat/dierenwelzijn; kritisch op landbouw- en handelsbeleid; geen federale focus.
DENK Overwegend pro-EU; inzet op grondrechten en bescherming arbeidsmigratie binnen EU-kader.
GroenLinks–PvdA Duidelijk pro-EU; versterking voor klimaat, sociaal beleid en rechtsstaat.
D66 Zeer pro-EU/federaler; verdieping integratie (defensie, rechtsstaat, klimaat, innovatie).

Landbouw en Stikstof

Boeren beschermen / minder regels → Strenge stikstof / krimp veestapel

PVV → JA21 → CDA → VVD → NSC → DENK → SP → D66 → GroenLinks–PvdA → PvdD

Standpunten Landbouw en Stikstof
Partij Kernpunten
PVV Boeren maximaal ontzien; stikstofnormen versoepelen; geen gedwongen krimp/onteigening.
JA21 Regeldruk omlaag; techniek en innovaties i.p.v. krimp; kritischer op Natura2000/meetmethodes.
CDA Boerenperspectief centraal; gebiedsgericht maatwerk; liefst vrijwillige uitkoop.
VVD Mix van innovatie, verduurzaming en vrijwillige uitkoop; doelen naleven met zo min mogelijk dwang.
NSC Realistische doelen; gebiedsgericht; eerst meten en plannen verbeteren; dwang als laatste redmiddel.
DENK Duurzaam en sociaal: milieudoelen met compensatie; eerlijk inkomen voor boeren.
SP Ecologische doelen halen, kleine/gezinsbedrijven beschermen; aanpak megastallen en ketenmacht.
D66 Sneller natuurherstel; duidelijke reductie; vrijwillige uitkoop grootschalig, krimp waar nodig.
GroenLinks–PvdA Strenge stikstofaanpak; veestapel verkleinen; natuur/waterkwaliteit prioriteit; eerlijke transitie.
PvdD Vergaande krimp veestapel; uitfaseren intensieve veehouderij; natuur- en dierenwelzijn voorop.

Klimaat & Energie

Fossiele energie behouden → Snelle verduurzaming / fossiel uitfaseren

PVV → JA21 → CDA → VVD → NSC → SP → DENK → GroenLinks–PvdA → D66 → PvdD

Standpunten Klimaat & Energie
Partij Kernpunten
PVV Klimaatbeleid “hysterie”; fossiele brandstoffen behouden; tegen klimaatplannen en windmolens.
JA21 Pragmatisch: energiezekerheid via gas en kernenergie; tegen snelle uitfasering fossiel; kritischer op subsidies.
CDA Stapsgewijs verduurzamen; mix van kernenergie, hernieuwbaar en innovatie; sectoren meenemen.
VVD Klimaatbeleid met oog voor economie; kernenergie, waterstof, innovatie; fossiel afbouwen bij zekerheid.
NSC Realistisch: reductie nodig, maar tempo/kosten beheersen; kernenergie belangrijk.
SP Eerlijke transitie; energierekening omlaag; investeren in publieke energiebedrijven en isolatie.
DENK Verduurzaming met sociale rechtvaardigheid; beleid betaalbaar houden voor gezinnen.
GroenLinks–PvdA Ambitieus; hernieuwbaar, isolatie en ov; fossiel snel uitfaseren.
D66 Hogere klimaatdoelen; zon, wind en kernenergie; NL koploper.
PvdD Vergaand; fossiel snel afbouwen; tegen kernenergie; focus op natuur, hernieuwbaar, consumptie omlaag.

Sociaal-cultureel beleid (identiteit & diversiteit)

Nationale identiteit → Multicultureel / diversiteit centraal

PVV → JA21 → NSC → VVD → CDA → SP → PvdD → GroenLinks–PvdA → D66 → DENK

Standpunten Sociaal-cultureel beleid (identiteit & diversiteit)
Partij Kernpunten
PVV Nadruk op Nederlandse identiteit; tegen islamisering en diversiteitsbeleid; “eigen cultuur eerst”.
JA21 Beperken immigratie en culturele invloed; kritischer op diversiteitsbeleid; nationale waarden.
NSC Waarden en normen behouden; gematigd kritisch op identiteitspolitiek; wel ruimte voor integratie.
VVD Integratieplicht; burgerschap en taal; diversiteit mag, geen aparte behandeling.
CDA Gemeenschapswaarden; verbondenheid; integratie via samenleving en onderwijs.
SP Gelijkheid voor iedereen; kritisch op symboolpolitiek; nadruk op solidariteit en gelijke kansen.
PvdD Gelijke rechten; steun voor inclusiebeleid; ethiek en rechtvaardigheid.
GroenLinks–PvdA S terk pro-diversiteit; actief tegen discriminatie; diversiteit als verrijking.
D66 Vrijheid en diversiteit; pro-LHBTQ+; inclusie en multiculturaliteit.
DENK Uiterst pro-diversiteit; bestrijding racisme en discriminatie; diversiteit als kracht.

Defensie & NAVO

Minder defensie-uitgaven → Meer investeren in NAVO/leger

PvdD → SP → DENK → GroenLinks–PvdA → D66 → CDA → NSC → VVD → JA21 → PVV

Standpunten Defensie & NAVO
Partij Kernpunten
PvdD Zeer kritisch op militaire uitgaven; drastische verlaging; focus op vrede, klimaat, diplomatie.
SP Tegen verhoging NAVO-uitgaven; defensie nationaal; minder interventies.
DENK Defensie als bescherming, kritisch op interventies; meer diplomatie; minder wapenwedloop.
GroenLinks–PvdA NAVO-bijdragen halen met nadruk op samenwerking en vredesmissies; kritisch op wapenuitgaven.
D66 Verhoging richting NAVO-norm; sterke Europese defensiesamenwerking.
CDA Traditioneel pro-defensie; NAVO en krijgsmacht versterken; structureel verhogen.
NSC Verhoging defensiebudget; NAVO-verplichtingen nakomen; realistisch beleid.
VVD S terk pro-defensie; NAVO-norm halen/vasthouden; investeren in materieel en cyber.
JA21 Zeer pro-defensie; meer soevereiniteit; investeren in krijgsmacht; NAVO-bijdrage halen.
PVV Extreem pro-defensie; forse verhoging; nationale veiligheid, politie en krijgsmacht.

Onderwijs & Gelijkheid

Meer keuzevrijheid / minder overheid → Meer gelijkheid / sterkere overheid

VVD → JA21 → CDA → NSC → PVV → D66 → DENK → GroenLinks–PvdA → PvdD → SP

Standpunten Onderwijs & Gelijkheid
Partij Kernpunten
VVD Keuzevrijheid voor ouders/scholen; steun bijzonder onderwijs; nadruk op prestaties.
JA21 Meer autonomie en marktwerking; ruimte voor selectie; minder overheidsbemoeienis.
CDA Versterken bijzonder onderwijs; waarden en gemeenschap; overheid faciliteert.
NSC Basisvaardigheden centraal; ongelijkheid tegengaan; diversiteit behouden.
PVV Orde en discipline; Nederlandse identiteit; minder nadruk op gelijke-kansenbeleid.
D66 Kansengelijkheid; investeren in leraren en innovatie; minder vroege selectie.
DENK Tegen discriminatie; kansengelijkheid centraal; meer diversiteit en inclusie.
GroenLinks–PvdA Gelijke kansen; meer geld naar achterstandsscholen; minder selectie, meer inclusie.
PvdD Onderwijs voor duurzaamheid en gelijkheid; brede vorming i.p.v. prestatiecultuur.
SP Tegen kansenongelijkheid; meer geld naar publieke scholen; stoppen met marktwerking.

Wonen & Huurbeleid

Vrije markt / minder regels → Sterke regulering / veel sociale huur

VVD → JA21 → PVV → NSC → CDA → D66 → DENK → SP → GroenLinks–PvdA → PvdD

Standpunten Wonen & Huurbeleid
Partij Kernpunten
VVD Meer bouwen door marktpartijen; stimuleren koopsector; beperkte regulering huren.
JA21 Woningbouw stimuleren via markt; minder regels; huurregulering beperkt houden.
PVV Betaalbare woningen vooral voor Nederlanders; beperkt reguleren; kritisch op woningtoewijzing aan statushouders.
NSC Balans tussen markt en regulering; wil huurders beter beschermen; tegelijk sneller bouwen.
CDA Investeren in bouwen; gemengd beleid: regulering waar nodig, marktwerking behouden; focus op gezinnen.
D66 Meer middenhuur en sociale huur; huurregulering versterken; tegelijkertijd inzet op nieuwbouw.
DENK Meer betaalbare huurwoningen; bescherming tegen discriminatie en scheefwonen; regulering vergroten.
SP Sterk reguleren huurmarkt; fors uitbreiden sociale woningbouw; woningcorporaties versterken.
GroenLinks–PvdA Veel meer sociale huur; strikte huurregulering; stevig ingrijpen in markt voor betaalbaarheid.
PvdD Sterke regulering en duurzaamheid centraal; meer sociale huur; nadruk op ecologische woonoplossingen.

Hypotheekrenteaftrek

Behouden → Volledige afbouw/afschaffing

PVV → JA21 → CDA → VVD → NSC → DENK → D66 → GroenLinks–PvdA → PvdD → SP

Standpunten Hypotheekrenteaftrek
Partij Kernpunten
PVV Volledig behouden; huizenbezit beschermen; tegen verdere beperking van de aftrek.
JA21 Behoud HRA; wil lasten op huizenbezit verlagen; ziet aftrek als stimulans voor middenklasse.
CDA Wil HRA grotendeels behouden; geleidelijke aanpassingen mogelijk, maar zekerheid voor huiseigenaren staat voorop.
VVD Afbouw zoals afgesproken doorzetten (aftrektarief verlagen), maar tegen volledige afschaffing.
NSC Voorzichtige verdere afbouw mogelijk; eerlijker verdeling tussen huurders en kopers; geleidelijk invoeren.
DENK Open voor hervorming; wil ongelijkheid huurders–kopers aanpakken, maar tegen plotselinge afschaffing.
D66 Wil HRA sneller afbouwen; lasten verschuiven naar vermogen; huizenmarkt minder scheef maken.
GroenLinks–PvdA Wil sterke afbouw; HRA vooral voor hogere inkomens afschaffen; geld naar betaalbare huurwoningen.
PvdD Wil versnelde afbouw; ziet HRA als subsidie voor overconsumptie en milieubelastend bouwen.
SP Wil volledige afschaffing voor hoge inkomens; drastische hervorming; richten op betaalbare huisvesting i.p.v. fiscale voordelen.

Kinderopvang

Beperkt / inkomensafhankelijk → Gratis / universeel

PVV → JA21 → VVD → CDA → NSC → DENK → SP → PvdD → GroenLinks–PvdA → D66

Standpunten Kinderopvang
Partij Kernpunten
PVV Geen universeel gratis kinderopvang; ondersteuning alleen voor Nederlandse gezinnen; kritischer op kosten en migratie-effecten.
JA21 Tegen gratis opvang voor iedereen; steun afhankelijk van inkomen en werk; wil misbruik tegengaan.
VVD Ruimhartige kinderopvangtoeslag, maar niet volledig gratis; vooral gericht op werkende ouders en arbeidsparticipatie.
CDA Kinderopvang deels inkomensafhankelijk; combinatie werk en gezin ondersteunen; geen volledig gratis opvang.
NSC Betaalbare opvang belangrijk, maar wil gericht beleid; geen universele gratis opvang, maar inkomensafhankelijk en beheerst.
DENK Wil betaalbare opvang voor iedereen; inkomensafhankelijk, met nadruk op kansengelijkheid en inclusie.
SP Vier dagen per week gratis kinderopvang; opvang als publieke voorziening; gelijke kansen voor alle kinderen.
PvdD Gratis kinderopvang als recht; koppeling met duurzaamheid en gezonde voeding; nadruk op gelijkheid.
GroenLinks–PvdA Vier dagen per week gratis opvang voor alle kinderen; universaliteit en kansengelijkheid centraal.
D66 Het verstgaand: gratis kinderopvang bijna volledig invoeren; opvang als recht voor ieder kind, niet gekoppeld aan werk.

Overheidstekort

Bezuinigen / strikte begrotingsdiscipline → Meer lenen / investeren met tekort

JA21 → VVD → CDA → NSC → PVV → D66 → DENK → GroenLinks–PvdA → PvdD → SP

Standpunten Overheidstekort
Partij Kernpunten
JA21 Strikte begrotingsdiscipline; tegen hoge staatsschuld; wil bezuinigen i.p.v. lenen.
VVD Voorzichtig met tekort; wil ruimte houden voor bedrijven en lage belastingen; beperkte investeringen.
CDA Degelijk begrotingsbeleid; investeren mag, maar alleen binnen Europese kaders; voorzichtig met schuld.
NSC Begrotingsdiscipline belangrijk; maar ruimte voor investeringen in zorg en onderwijs; gematigde lijn.
PVV Wil meer uitgeven aan zorg en veiligheid; minder oog voor begrotingsdiscipline; bezuinigen niet prioriteit.
D66 Ruimte om te lenen voor klimaat en onderwijs; begroting in balans op lange termijn; meer investeringsgericht.
DENK Meer investeren in sociale voorzieningen en kansengelijkheid; begroting mag tijdelijk in tekort gaan.
GroenLinks–PvdA Bereid meer te lenen voor klimaat, zorg en onderwijs; tekort gebruiken als investeringsinstrument.
PvdD Meer lenen en investeren voor duurzaamheid en natuur; begroting ondergeschikt aan ecologische doelen.
SP Geen angst voor tekort; wil fors investeren in publieke sector; bezuinigen afgewezen, lasten bij grootkapitaal.

Hoe een Economie Werkt: Het Eilandverhaal

De tekst is een uitgebreide allegorie die de fundamentele principes van de economie uitlegt, beginnend met een primitieve samenleving op een eiland. De kern van het verhaal draait om productiviteitkapitaalaccumulatie en innovatie. Door het verhaal van drie eilandbewoners – Able, Baker en Charlie – wordt duidelijk gemaakt hoe sparen, lenen en investeren leiden tot een toename van de welvaart voor alle betrokkenen. Uiteindelijk laat de tekst zien hoe een groeiende economie leidt tot specialisatie, de opkomst van diensten en de introductie van geld als ruilmiddel, waarbij de focus ligt op het belang van gereedschappen en efficiëntie voor het vervullen van menselijke behoeften.

Het Begin

Er waren eens drie mannen — Able, Baker en Charlie — die samen op een eiland woonden. Geen tropisch paradijs hoor, maar een ruige, kale plek zonder luxe. Hun menu? Simpel: vis. Altijd vis. Ontbijt, lunch én diner.

Gelukkig wemelde het rondom het eiland van de wonderlijk identieke vissen, precies groot genoeg om één man een dag te voeden. Maar er was één probleem: er bestond daar nog geen enkele visserijtechniek. Geen hengels, geen boten, geen fancy sonar. Het beste wat ze konden doen, was het water in springen en de glibberige beesten met hun blote handen proberen te grijpen.

Met die onhandige methode lukte het elke man precies één vis per dag te vangen. Net genoeg om morgen weer op te staan en opnieuw te beginnen. Zo draaide hun hele economie: wakker worden, vissen, eten, slapen. Niet bepaald een bruisend bestaan, maar ach — beter dan doodgaan.

In hun supereenvoudige, sushi-gebaseerde samenleving gold één harde regel:

Geen spaargeld!

Geen krediet!

Geen investeringen!

Alles wat gevangen werd, verdween meteen in de pan. Geen voorraad, geen “visbank” voor moeilijke tijden.

Toch waren Able, Baker en Charlie geen domme jongens. Net als ieder ander mens wilden ze hun leven verbeteren. Maar zolang ze per dag maar net één vis konden vangen, zaten ze vast op het minimum om te overleven.

Op een avond, terwijl hij naar de sterrenhemel staarde, zuchtte Able: “Is dit het nou? Er moet toch meer zijn in het leven dan vis vangen met mijn handen?”

Hij droomde van betere, hippe palmbladkleding. Van een hut die de moesson kon trotseren. En — jawel — van een carrière als filmregisseur. Maar hoe kom je ooit toe aan dromen als je de hele dag achter vissen aanzit?

Toen begon er iets te ratelen in zijn hoofd. Wat nou als hij een apparaat zou maken dat de hand van de mens verlengt én de vis minder kans geeft om te ontsnappen? Een geniale ingeving: een net! Daarmee kon hij in minder tijd méér vissen vangen. En met de vrijgekomen tijd kon hij zich eindelijk richten op zijn kledinglijn, een degelijk dak boven zijn hoofd en natuurlijk dat briljante filmscenario.

De orkestmuziek begon in zijn hoofd te zwellen, hij zag het al helemaal voor zich: een leven zonder dagelijkse visdrama’s. Vol goede moed begon hij palmbast tot touw te draaien.

De volgende dag keek Baker hem verbaasd aan. “Wat doe je nou? Op dieet zeker? Straks verhonger je.”

Able straalde: “Nee, ik bouw een apparaat dat me oceanen vol vis gaat opleveren. Als ik klaar ben, zal ik minder hoeven vissen en nooit meer honger lijden.”

Charlie rolde met zijn ogen. “Dit is waanzin, ik zeg je… waanzin! En als het mislukt, kom je niet bij mij bedelen om een stukje vis.”

Maar Able liet zich niet ontmoedigen en vlocht rustig door. Aan het eind van de dag was het zover: zijn net was klaar. Hij had, zonder dat hij het zo noemde, kapitaal gecreëerd — en dat met lege maag.

Die nacht lag hij hongerig in het zand, terwijl Baker en Charlie tevreden knorden met volle buiken. Maar in zijn hoofd dansten de vissen hem al tegemoet. Hij wist: morgen komt mijn moment.

En inderdaad: de volgende ochtend werd hij eerst nog uitgelachen.

“Leuk hoedje!” grinnikte Baker.

“Maar een beetje warm voor tennis,” voegde Charlie toe.

Able haalde zijn schouders op. “Lach maar, jongens. We zullen zien wie er lacht als ik tot aan mijn oksels in de visdarmen sta.”

Onhandig waggelde hij de branding in met zijn vreemde uitvinding. Maar na wat stuntelen kreeg hij de slag te pakken en — hap! — de eerste vis zat erin.

Baker en Charlie stopten met lachen. Een uur later trok Able zijn tweede vis van de dag op het strand. Hun monden vielen open: normaal kostte het hen een hele dag om er maar één te vangen!

En zo veranderde de economie van het eiland in één klap. Able had zijn productiviteit verdubbeld. Niet alleen goed voor hem, maar uiteindelijk ook voor iedereen.

Terwijl hij naar zijn vangst keek, dacht hij triomfantelijk: “Met één dag vissen kan ik nu twee dagen eten. Dat betekent dat ik elke andere dag iets anders kan doen. De mogelijkheden zijn eindeloos!”

Uitleg

Doordat Able zijn productiviteit had verdubbeld, kon hij nu méér produceren dan hij zelf nodig had om op te eten. En precies dáár begint de magie van economie: uit hogere productiviteit vloeien alle andere voordelen voort.

Voor hij zijn gok waagde en dagenlang met een knorrende maag een net zat te vlechten, bestond er op het eiland geen enkele vorm van spaargeld. Alles wat werd gevangen, werd dezelfde dag nog opgesmikkeld. Maar doordat Able bereid was dat risico te nemen en zichzelf één dagje honger te gunnen, had hij het allereerste stuk kapitaal van het eiland gebouwd: een net!

En dat net leverde meteen meer vis op dan hij kon verstouwen. Overschot! Reserve! Voorraad! (En om dit sprookje werkbaar te houden, doen we even alsof vis nooit bederft.)

Dat beetje extra productie, die spaarpot in de vorm van vis, is het levenssap van elke gezonde economie. Vanaf dat moment veranderde alles: het eiland had niet langer alleen maar een dagelijks overlevingsritme, maar een echte basis om te groeien.

Voor alle diersoorten — behalve de onze — draait economie in feite maar om één ding: dag tot dag overleven. Voedsel is schaars, het weer is genadeloos, roofdieren liggen op de loer, ziektes zijn verraderlijk, en echte innovaties komen maar zelden voor. Het beste wat dieren kunnen bereiken, is een schamele overleving… met tussendoor nog net genoeg tijd voor voortplanting.

Meer is beter....

Wij mensen zouden precies hetzelfde lot hebben (zoals trouwens nog helemaal niet zo lang geleden het geval was), ware het niet voor twee dingen: ons grote brein en onze handige handen. Door die twee samen te gebruiken, zijn we erin geslaagd gereedschappen en machines te maken die ons vermogen om méér uit onze omgeving te halen enorm vergroten.

Econoom Thomas Woods daagt zijn studenten graag uit met een gedachte-experiment: stel je voor dat alle machines en gereedschappen plotseling verdwijnen. Auto’s, tractors, hoogovens, schoppen, kruiwagens, zagen, hamers, speren… alles! Pats, foetsie! En alles wat we consumeren, zouden we weer met onze blote handen moeten jagen, verzamelen, planten en maken.

Dat zou niet fraai zijn. Stel je voor hoe lastig eten wordt als je groot wild te lijf moet gaan met je tanden, vuisten en nagels. Vergeet het maar. Een konijn zou misschien nog wel lukken… maar ja, je moet het eerst nog vangen. Groenten verbouwen? Oogsten met je handen, en geen zakken om de boel in te stoppen. Kleren en meubels maken? Zonder fabrieken, zonder scharen, zonder spijkers? Succes ermee.

Ondanks ons verstand zouden we economisch gezien niet beter af zijn dan chimpansees of orang-oetans.

Gereedschappen maken echt het verschil. Ze maken een economie mogelijk. Speren helpen ons bij de jacht, schoppen bij het planten van gewassen, en netten bij het vangen van vis. Al die hulpmiddelen versterken de kracht van ons werk. Hoe meer we kunnen maken, hoe meer we kunnen consumeren, en hoe welvarender ons leven wordt.

De simpelste definitie van economie is dan ook: het zo goed mogelijk benutten van schaarse middelen (en bijna álles is schaars) om zoveel mogelijk menselijke behoeften te vervullen. Gereedschappen, kapitaal en innovatie zijn de sleutels van die vergelijking.

Met dat in gedachten is het makkelijk te zien wat een economie laat groeien: telkens betere manieren vinden om méér dingen te maken die mensen graag willen hebben. En dat principe verandert nooit — hoe groot een economie uiteindelijk ook wordt.

We gaan door met het sprookje...

Able, de ondernemer van het eiland, leek een glanzende toekomst tegemoet te gaan. Maar wat betekende dat voor de rest? Was er niet net een klassenverschil ontstaan — de ‘haves’ en de ‘have-nots’? Zou Baker en Charlie’s leven nu slechter worden door Able’s succes? Waarschijnlijk niet. Want ook al had Able helemaal niet de bedoeling om iemand anders te helpen dan zichzelf, zijn kapitaal zou uiteindelijk iedereen ten goede komen.

Toen Baker en Charlie zagen hoe makkelijk Able nu zijn vissen binnenhaalde, konden ze hun nieuwsgierigheid niet bedwingen.

“Hé, Able,” zei Charlie, “je gebruikt dat ding maar om de dag. Laat mij het dan gebruiken als jij iets anders gaat doen.”

“Kom op, deel een beetje van de rijkdom, vriend,” voegde Baker toe.

Maar Able was niet van gisteren. Hij herinnerde zich zijn eigen hongerige dagen, hun spottende opmerkingen, en bovenal het risico dat hij had genomen. Wat als ze mijn net kapotmaken? Wat als ik het nooit terugkrijg? Dan ben ik weer terug bij af. Dag designer palmbladmode! Dus hield hij de boot af: “Sorry jongens, geen sprake van. Ik heb mijn eigen net gemaakt, dus jullie kunnen dat ook. Het voordeel is dat je nu in elk geval wéét dat het werkt!”

Charlie fronste. “Maar hoe weet ik dat ik het goed doe? Ik heb nog nooit zoiets gemaakt. En bovendien: ik kan niet zo goed tegen honger, ik ga ervan trillen. Voor ik een fatsoenlijk net heb, ben ik waarschijnlijk al verhongerd.”

Baker dacht even na en kwam met een ander voorstel. “Oké gierigaard, jij wilt ons geen gunsten doen, dat begrijpen we. Maar wat als je ons een paar van je reservevissen uitleent om van te leven terwijl we ons eigen net maken? Dan verhongeren we niet, en we betalen je elke vis netjes terug zodra we extra hebben gevangen.”

Dat klonk al beter, maar Able bleef sceptisch. “En wat als jullie gewoon een dagje op het strand gaan liggen bakken in de zon? Of wat als jullie netten helemaal niet werken? Dan krijg ik mijn vissen nooit meer terug en ben ik mijn spaargeld kwijt. Nee hoor, daar trap ik niet in.”

Baker en Charlie begrepen dat hij een punt had: ze vroegen hem eigenlijk om risico te nemen zonder er zelf iets voor terug te doen. Toch lonkte het vooruitzicht van extra vis te sterk. Dus broedden ze verder en bedachten een deal.

“Luister,” zei Baker, “laten we een afspraak maken: voor elke vis die jij ons uitleent, betalen wij er twee terug. Honderd procent winst! Waar anders op dit eiland ga je zo’n rendement halen?”

Dat trok Able’s aandacht. Zijn ogen begonnen te glimmen. “Nu wordt het interessant!” Hij rekende snel: als ik twee vissen uitleen en vier terugkrijg, ben ik zonder enig werk twee vissen rijker. Ik word gewoon een vistycoon!

Het leek bijna alsof hij de snor van een Hollywoodschurk stond te twirlen. Maar in werkelijkheid was het minder sinister dan het klonk. Want ook al wilde Able alleen zijn eigen voorraadkast vullen, zijn zogenaamde “hebzucht” zorgde ervoor dat de anderen een kans kregen die ze anders nooit gehad zouden hebben.

Toch had Able meerdere opties:

  1. Hij kon gewoon zijn vissen bewaren voor later. Veilig, maar dan groeide zijn spaargeld niet.

  2. Hij kon zijn spaargeld gewoon zelf opeten. Lekker, maar weg spaargeld.

  3. Hij kon een heuse nettenverhuur beginnen. Twee extra netten bouwen, die verhuren voor een halve vis per dag, en voilà: hij had genoeg inkomen om nooit meer zelf te vissen. Hallo, vervroegd pensioen!

  4. Hij kon, zoals Baker voorstelde, zijn vissen uitlenen tegen rente — met het risico dat hij ze nooit terugzag.

Keuzes, keuzes, keuzes.

Kort samengevat: met spaargeld kun je vijf dingen doen — sparen, consumeren, uitlenen, investeren, of een slimme mix van dit alles.

Uiteindelijk hakte Able de knoop door: hij besloot de lening te verstrekken.

Uitleg

Voor sommigen leek het misschien alsof Able zijn voordeel gebruikte om zijn behoeftige buren uit te buiten. En ja, hij maakte winst zonder zelf extra te werken. Maar dat betekende niet dat hij zomaar “iets voor niets” kreeg. Zijn winst was de vergoeding voor het risico dat hij nam. Bovendien stond zijn winst de vooruitgang van Baker en Charlie helemaal niet in de weg.

Doordat Able zijn spaargeld wilde laten renderen, kregen Baker en Charlie de kans om hun eigen netten te bouwen zonder zichzelf uit te hongeren. Lukte het hen, dan hadden ze hun economische toekomst verbeterd én hun magen gevuld. Alles wat daarbovenop kwam was bonus — of beter gezegd: extra visolie. En als het mislukte, en ze hun lening niet konden terugbetalen? Dan draaide Able zelf voor het verlies op. Kortom: een geldschieter kan alleen profiteren als de lener óók profiteert.

Natuurlijk zien niet alle mensen die wederzijdse voordelen even duidelijk. Stel je eens voor dat Baker en Charlie, jaloers op Able’s groeiende rijkdom, besloten dat ze recht hadden op een deel van zijn spaargeld.

“Moet je die vent zien pronken in zijn chique palmblad-smokings,” mopperde Baker, “terwijl wij ons elke dag in het zweet werken met glibberige vissen. Heeft hij nog nooit van liefdadigheid gehoord? Hij kan mij toch gerust een visje of twee missen, zodat ik af en toe een dagje vrij kan nemen? Hij heeft er zoveel liggen dat hij het verschil niet eens zou merken.”

Charlie knikte instemmend. “Ja, deel die rijkdom eens, elitaire visbaron!”

Of stel je een ander scenario voor: dat Able zich schuldig voelde over zijn rijkdom en zich liet overhalen om gewoon wat vissen weg te geven, zonder er iets voor terug te vragen. Wat zouden Baker en Charlie dan doen met die gratis vissen?

Waarschijnlijk zouden ze de kans grijpen om lekker een dagje niets te doen. En hoewel er natuurlijk helemaal niets mis is met ontspanning (sterker nog, het is vaak het uiteindelijke doel van al ons werk), zou hun vakantie geen enkel visje extra aan de economie toevoegen. Dus hoe edelmoedig het ook klinkt, liefdadigheid zou de productiviteit van het eiland niet verhogen. Een lening daarentegen wél.

De kern van het verhaal: alles wat leidt tot méér vissen (lees: productie), komt het hele eiland ten goede. Hoe meer vis er is, hoe meer mogelijkheden er zijn — om meer te eten, om andere dingen te doen naast vissen… of simpelweg om een dagje helemaal niets te doen.

Sommigen zullen zich afvragen: wat als Able een échte gierigaard blijkt te zijn, die al zijn nieuwe rijkdom alleen maar gebruikt om steeds rijker en rijker te worden?

Is dat werkelijk een gevaar? Niet echt. Want de enige manier waarop zijn spaargeld kan groeien (zonder dat hij zelf werkt), is door het beschikbaar te maken voor de andere eilandbewoners. Als hij het oppot, gebeurt er niets: zijn rijkdom blijft gelijk of slinkt gewoon doordat hij het zelf opeet. Het mooie van particulier kapitalisme is juist dat zelfs wie alléén door eigenbelang wordt gedreven, gedwongen wordt om de levensstandaard van anderen mee omhoog te trekken.

Belangrijk inzicht

Rijkdom is altijd relatief. In een primitieve samenleving waar nauwelijks iets geproduceerd wordt, kan zelfs de rijkste man niet tippen aan het materiële welzijn van de armste in een geïndustrialiseerde economie. In de Middeleeuwen misten zelfs de machtigste koningen basisgemakken die tegenwoordig in elk doorsnee huishouden te vinden zijn: centrale verwarming, stromend water en verse groente in de winter.

Baker en Charlie zouden misschien dromen dat twee vissen per dag pure luxe is. Maar vanuit ons perspectief is dat nauwelijks jaloersmakend. Toch vinden veel mensen het oneerlijk dat er verschillen in rijkdom bestaan. Vaak leeft de gedachte dat de rijken rijk worden ten koste van de armen. In de moderne economie heet dat ook wel de “arbeidswaardetheorie”: het idee dat winst ontstaat door arbeiders minder te betalen dan ze waard zijn. In dat denkbeeld kunnen ondernemers — of dat nu Able is of een multinational — alleen rijk worden door anderen arm te maken.

Maar dat klinkt moreel verontwaardigd, en heeft weinig met de werkelijkheid te maken. Rijkdom ontstaat omdat iemand iets van waarde biedt. Able biedt leningen aan wie zelf geen spaargeld heeft. Als hij winst maakt, komt dat alleen doordat de dienst die hij levert waardevol is voor anderen.

Natuurlijk, als Able een bullebak zou zijn die simpelweg de helft van de vangst van zijn buren afperste, dán was zijn rijkdom direct verbonden met hun armoede. Maar dat soort dwang voegt niets toe aan de productieve capaciteit van het eiland. Hij zou slechts afpakken wat anderen hadden geproduceerd. Sterker nog, de totale productie zou waarschijnlijk dalen, omdat de slachtoffers minder gingen werken zodra ze beseften dat hun inzet toch gestolen werd.

Geschiedenis staat bol van zulke voorbeelden van dwang: slavernij, horigheid, lijfeigenschap. Ja, mensen werken onder druk, maar veel beter werken ze wanneer ze zélf profiteren van hun arbeid.

Helaas is grootschalige economische vrijheid zeldzaam in de wereldgeschiedenis. Maar wanneer eigenbelang de ruimte krijgt, groeit de productieve capaciteit razendsnel. Het gebruik van krediet is daar een perfect voorbeeld van: zolang geldschieters en leners vrij zijn om hun eigen voorwaarden af te spreken, profiteren uiteindelijk alle partijen. Maar — zoals we later zullen zien — kan die markt flink verstoord worden door invloeden van buitenaf. En dan, tja… meestal eindigt dat in een ramp.

Dankzij Able’s bereidheid én vermogen om leningen te verstrekken, hadden Baker en Charlie nu ook netten die ze eerder niet bezaten. Met netten voor iedereen was de gezamenlijke visvangst van het eiland gestegen van drie vissen per dag naar zes. De economie was in één klap verdubbeld, en de toekomst zag er ineens een stuk rooskleuriger uit.

Maar dit gebeurde niet alleen omdat de drie mannen ontevreden waren met hun karige leventje. Hun honger — of zoals economen het noemen: “vraag” — was wel nodig om groei aan te wakkeren, maar niet voldoende om het voor elkaar te krijgen.

Vraag naar méér is menselijk. Wat we ook hebben, we willen altijd meer. Misschien niet altijd meer spullen, maar wél meer tijd, meer plezier en meer keuzemogelijkheden. En dat vraagt allemaal om extra kapitaal. Waarschijnlijk klaagden Able, Baker en Charlie al járen over hun visdieet. Het verschil was dat ze nu eindelijk hun productiviteit konden vergroten om die wensen waar te maken.

Met hun extra vissen konden de eilandbewoners nu eindelijk meer dan één vis per dag eten. Maar let op: de economie groeide niet omdat ze meer consumeerden. Nee, ze consumeerden meer omdat de economie groeide. Klinkt logisch, toch? Toch is het verbazingwekkend hoeveel moderne economen erin slagen om zo’n eenvoudig idee ingewikkeld te maken.

Veel economen denken namelijk dat je vraag kunt vergroten door mensen simpelweg meer geld te geven. Maar dat verandert de werkelijke vraag helemaal niet — het verandert alleen hoeveel ze kunnen uitgeven aan wat er al geproduceerd is. Pas als de productie toeneemt, kunnen mensen echt méér krijgen van wat ze willen.

We gaan door met het sprookje...

Na een paar weken vingen Able, Baker en Charlie vissen bij de vleet met hun nieuw gebouwde netten. Twee vissen per dag per persoon werd de nieuwe standaard. Na dat magere dieet van één vis per dag kon je ze moeilijk kwalijk nemen dat ze nu wat meer namen. Maar, omdat ze inmiddels hadden geproefd van de voordelen van zelfopoffering, besloten ze een deel van die overvloed toch opzij te leggen. Om de paar dagen deden ze het gewoon weer met één vis per persoon, en de rest ging in de spaarpot.

Doordat ze niet meer elk wakkere moment hoefden te vissen, kregen ze eindelijk de vrijheid om zich met andere nuttige én plezierige dingen bezig te houden. Able stortte zich op het ontwerpen van functionelere — en eerlijk is eerlijk, véél stijlvollere — palmbladkleding. Baker verrijkte zijn dieet en kookkunsten door kokosnoten te verzamelen, en Charlie bouwde de allereerste hut van het eiland.

Alles ging prima, maar Baker kreeg al snel grotere dromen. “Als we met handnetten de productie kunnen verdubbelen,” zei hij, “waarom dan niet een stap verder? Laten we industrieel gaan!” Hij schetste plannen voor een revolutionair visvangsysteem: een gigantische onderwaterval met éénrichtingsdeuren. Vissen konden er wel in… maar niet meer uit. Een soort hotel zonder uitcheckbalie.

Als het werkte, hoefden ze nooit meer zelf te vissen!

Maar al gauw zag Baker dat dit project veel te groot was om in zijn eentje te trekken. Het materiaal, het vlechtwerk, het bouwen… zijn spierkracht, spaargeld en slimheid schoten tekort voor zo’n megaklus. Dus stelde hij een joint venture voor: samen een bedrijf oprichten, hun spaargeld bundelen, en een hele week besteden aan de bouw.

Natuurlijk waren er risico’s. Net als bij Able’s eerste net was er geen enkele garantie dat het zou werken. En zelfs als het werkte, kon het gevaarte bij de eerste ruwe zee in stukken breken. Alleen dit keer stond er niet één vis op het spel, maar meer dan twintig!

Toch won hun honger naar méér vis het van de angst om hun spaargeld kwijt te raken. Dus besloten ze ervoor te gaan.

Na een week keihard ploeteren stond hij er: de allereerste megavanger van het eiland. En hij deed wat hij beloofde: gemiddeld twintig vissen per week, bijna zonder moeite. Af en toe een reparatie of beetje onderhoud, maar verder liep het ding bijna vanzelf. Al snel dreven ze in de vissen.

Met de snel groeiende spaarvoorraad bouwden ze al gauw nóg een mega-vanger. Vissen werden zo overvloedig dat ze hun tijd volledig konden wijden aan andere projecten.

Charlie gebruikte zijn spaargeld om surfplanken te bouwen, waarmee hij een ultracoole nieuwe vrijetijdsbesteding introduceerde.

Able richtte een heuse kledinglijn op, zodat niet alleen hijzelf maar iedere eilandbewoner zijn imago kon opfrissen. In zijn vrije tijd begon hij zelfs aan zijn eenmans-toneelstuk.

En Baker? Die stortte zich op het hardnekkige transportprobleem van het eiland en ontwierp de allereerste kano én de eerste kar.

--

Dezelfde economische regels die gelden in een eenvoudige samenleving, zijn ook van kracht in een ingewikkeldere. Able’s eerste stap — kapitaal scheppen door persoonlijke opoffering — had niet alleen hemzelf, maar alle eilandbewoners geholpen. Dankzij zijn verstandige leenprogramma kwamen er steeds meer handnetten, en die productiviteit werd vervolgens benut om nóg efficiëntere visvangmachines te bouwen. Het resultaat: een beter dieet, mooiere kleding, makkelijker vervoer, vrije tijd én zelfs een beginnende surfcultuur.

De verhalen over deze ongekende luxe verspreidden zich al snel naar andere eilanden, waar men nog altijd met de blote hand viste en geen tijd had om op een surfplank te staan. Al gauw kwamen er immigranten op zoek naar een beter leven.

De hogere productiviteit maakte dat het eiland een grotere bevolking kon onderhouden, en die bevolking zorgde op haar beurt voor meer economische diversiteit. Sommigen gingen werken bij de mega-vangers, anderen leenden vissen om land vrij te maken voor landbouw — eindelijk een gebalanceerd dieet! — en weer anderen stapten in allerlei nieuwe beroepen. Zo ontstonden er huttenbouwers, kano-bouwers, wagenmakers, noem maar op.

Doordat voedsel en gereedschappen zo efficiënt werden geproduceerd, hoefden sommige mensen zelf niets tastbaars meer te maken om te overleven. Zo werd de dienstensector geboren.

Een paar creatieve eilanders vonden dat rauwe vis best wat spannender kon. Met kruiden en vuur ontwikkelden ze heuse kookkunsten. Hun gerechten werden zó gewaardeerd dat vissers en huttenbouwers bereid waren een deel van hun vangst in te ruilen voor een goede maaltijd. Charlie’s nakomelingen zagen hoe populair surfen werd en begonnen zelfs een surfschool.

Naarmate er meer beroepen en diensten kwamen, ontstond er behoefte aan een ruilmiddel. Het oude systeem — ruilhandel — was omslachtig. Stel: een speermaker wilde lekker eten, maar de kok had geen speer nodig. Hoeveel maaltijden zou één speer eigenlijk waard zijn? Het was tijd voor iets universeels: geld.

En wat lag meer voor de hand dan vis? Iedereen at ze, iedereen kende hun waarde. Eén vis stond nog altijd gelijk aan één dag overleven. Zo werd vis het betaalmiddel. In korte tijd werden lonen en prijzen uitgedrukt in vissen, en de hele prijslijst van het eiland was gebaseerd op de intrinsieke waarde van die ene vis.

Efficiëntie en specialisatie

Een economie waarin mensen zich kunnen specialiseren is altijd sterker dan een samenleving waar iedereen hetzelfde doet. Specialisatie verhoogt de productie en dus de welvaart.

Neem Duffy, een eilandbewoner met talent voor houtbewerking. De gemiddelde eilandbewoner deed vijf dagen over het bouwen van een kano. Omdat hij in die tijd niet viste, kostte hem dat tien vissen aan gemiste inkomsten. Duffy kon echter een kano in vier dagen maken. Voor hem betekende dat maar acht vissen aan gemist inkomen. Hij kon dus winst maken door een kano te verkopen voor negen vissen. Voor anderen een koopje, want zij zouden er zelf tien vissen aan kwijt zijn. Iedereen won.

Maar negen vissen was voor velen nog een hoop geld. Alleen de rijksten konden zich een kano veroorloven, de rest moest sparen en intussen maar blijven zwemmen.

Tot Duffy besloot zijn spaargeld te investeren in gereedschap, speciaal om kano’s mee te maken. Net zoals Able generaties eerder deed, consumeerde hij minder om kapitaalgoederen te creëren. Met beter gereedschap halveerde zijn bouwtijd naar twee dagen. Nu hoefde hij maar vier vissen aan kosten goed te maken. Verlaagde hij zijn prijs naar zes vissen, dan was hij niet alleen winstgevender (twee vissen winst per kano in plaats van één), maar kon hij ook twee keer zoveel kano’s produceren.

Dit was niet alleen goed voor Duffy, maar voor het hele eiland. Meer mensen konden zich een kano veroorloven tegen zes vissen, zijn klantenkring groeide en kano’s werden van luxeartikel een gebruiksvoorwerp voor iedereen. Dankzij sparen, innovatie en investering daalden de prijzen, en de voordelen van kano-bezit waren niet langer voorbehouden aan de rijken.

Uitleg

Zoals we in het verhaal van Duffy hebben gezien, doen dalende prijzen hem helemaal geen pijn. Integendeel: naarmate prijzen overal dalen door vergelijkbare productiviteitsstijgingen in andere beroepen, kan hij met dezelfde vissen méér dingen kopen.

Innovatie is eenrichtingsverkeer. Tenzij mensen plots alles vergeten wat ze ooit geleerd hebben, stapelt efficiëntie zich alleen maar op. Het gevolg? Prijzen hebben de neiging om op de lange termijn te dalen.

En dat heeft nog een bijkomend effect: dalende prijzen moedigen sparen aan. Want als eilandbewoners doorhebben dat hun vis in de toekomst méér kan opleveren dan vandaag, dan houden ze er liever een paar achter de hand. Hoe gek het ook klinkt: een vis gespaard is écht een vis verdiend. En dat sparen vergroot de hoeveelheid kapitaal die beschikbaar is voor leningen.

Werkgelegenheid

Naarmate de samenleving complexer werd, besloten steeds meer eilandbewoners om voor anderen te werken en hun arbeid te ruilen voor loon.

De waarde van arbeid wordt altijd vermenigvuldigd door het gebruik van kapitaal. Hoe beter het kapitaal, hoe waardevoller de arbeid. Met een bulldozer graaf je immers een véél groter gat dan met een schep, ook al span je je met beide even hard in. Het is dus altijd slimmer om met het beste kapitaal te werken dat beschikbaar is.

In een vrije samenleving kiezen de bewoners zelf wiens kapitaal ze gebruiken om hun arbeid te versterken. Op een paar artistieke types na, die er vrijwillig voor kozen “zonder net te vissen”, had elke arbeider drie mogelijkheden:

Omdat de eerste optie zelfopoffering vraagt en de tweede risico met zich meebrengt, kozen de meeste eilanders voor optie drie. En dan kregen ze loon.

Zo kwam Finnigan, een nieuwkomer op het eiland. Een sterke kerel, maar als visser weinig succesvol. Dus besloot hij zich te specialiseren in vistransport. Met puur spierballenwerk kon hij 100 vissen per dag van het strand naar de hutten slepen. Tegen een vrachtprijs van 2% verdiende hij daar twee vissen per dag mee.

Maar hij kreeg stevige concurrentie van Murray’s Kar-bedrijf. Murray had eerder een lening afgesloten om een viskar te bouwen. Daarmee kon hij 300 vissen per dag vervoeren, ook al was hij lang niet zo sterk als Finnigan. Dankzij zijn hogere productiviteit kon hij een tarief van slechts 1% rekenen en tóch drie vissen per dag verdienen. Lager tarief, méér winst.

Zonder kapitaal zat Finnigan dus klem. Maar Murray rook een kans: hij zag dat Finnigan met een kar wel 400 vissen per dag zou kunnen vervoeren. Tegen 1% leverde dat vier vissen per dag op. Dus bood Murray hem een baan aan: drie vissen per dag loon. De vierde hield hij zelf als winst.

Voor Finnigan was het aantrekkelijk: met hetzelfde werk werd hij productiever, kon hij lagere tarieven vragen én meer verdienen dan alleen. Murray verdiende één vis per dag extra en kon ondertussen stoppen met zelf vissen sjouwen. Zo had hij tijd om meer karren te bouwen en meer mensen in dienst te nemen.

En hoe meer karren er kwamen, hoe lager de vrachtkosten voor alle eilanders.

Misschien zou Finnigan later genoeg kunnen sparen om zelf een kar te bouwen en zo zijn oude baas te beconcurreren. Om dat te voorkomen, moest Murray hem méér betalen dan hij alleen ooit had kunnen verdienen — genoeg om hem tevreden te houden.

Maar laten we niet vergeten: Murray deed dit allemaal uit winstbejag, niet uit liefdadigheid. Toch profiteerde Finnigan mee met een beter loon, en profiteerden álle eilanders door lagere kosten.

Overige thema's banken, (internationale)handel, .....en meer.

Klassiek versus Keynesiaans

Klassiek vs. Keynesiaans economisch denken

 

Klassiek economisch denken

Keynesiaans economisch denken

Tijd

18e–19e eeuw (Smith, Ricardo)

20e eeuw (John M. Keynes)

Motor economie

Aanbod (productie, ondernemers, kapitaal)

Vraag (consumptie, investeringen, overheidsuitgaven)

Marktwerking

Markt herstelt zichzelf, altijd evenwicht

Markt kan blijven steken in crisis

Overheid

Minimaal ingrijpen (“laissez-faire”)

Actief ingrijpen nodig in slechte tijden

Werkloosheid

Tijdelijk, verdwijnt vanzelf

Kan langdurig blijven bestaan

Oplossing crisis

Wachten tot lonen dalen → werk komt terug

Overheid stimuleert vraag (bijv. investeringen, subsidies)

Overheidsfinanciën

Altijd in evenwicht houden

Tekorten toegestaan in recessie, sparen in hoogconjunctuur

Beeldspraak

Economie = zelfregulerend mechanisme

Economie = auto die soms moet worden aangeduwd

 

Kennis-Checks

Doel

Het doel van de Kennis-Checks is (op volgorde van prioriteit):

Planning

Elk blok wordt afgesloten met twee Kennis-Checks.

De eerste wordt afgenomen nadat het blok is doorlopen volgens de nominale planning (3-jarig).

De tweede wordt ongeveer twee weken later gepland.

Naast deze twee Kennis-Checks worden geen reguliere herkansingen geboden.

Voldoende

De Kennis-Check is multiplechoice en bevat rond de 25 vragen met elk 4 tot 6 antwoordmogelijkheden.

De score wordt berekend als het percentage goede antwoorden, zonder rekening te houden met de gokfactor.

Bij 25 vragen en gemiddeld 5 antwoordmogelijkheden moet een student volgens de algemeen geldende norm 16 vragen goed hebben voor een voldoende. Daarbij wordt impliciet uitgegaan van 20% gokscore (1 op 5). Wij hanteren de norm 13.

Eis

Score per blok

De hoogste score per blok geldt.

Om studenten gemotiveerd te houden om ook na het behalen van een voldoende de tweede kans serieus te benutten, krijgt een student die beide keren een voldoende haalt 2 procentpunten bij zijn/haar hoogste score.

Voorbeelden
Score 1 Score 2 Eindresultaat
54 71 71
72 53 72
71 73 75
Score over meerdere blokken

Om over meerdere blokken te bepalen of aan de eis wordt voldaan geld:

  1. De laatste twee blokken moeten beiden voldoenden(55% of hoger)  zijn
  2. Het gemiddelde over alle blokken moet voldoende zijn (55% of hoger).

Of anders uitgelegd:

Periode
Eis
1 - Voldoende voor blok 1 én 2.
2 Voorlopig Studieadvies Voldoende gemiddeld over blok 1 t/m 4 én voldoende voor blok 3 én 4.
3 Definitief Studieadvies Voldoende gemiddeld over blok 1 t/m 6 én voldoende voor blok 5 én 6.
4 Studiecontract/overgang Voldoende gemiddeld over blok 1 t/m 8 én voldoende voor blok 7 én 8.

Herkansing

Indien in periode 2, 3 of 4 niet aan de eis is voldaan, kan een beroep worden gedaan op uitzonderlijke omstandigheden. De student kan dan verzoeken om één herkansing. Het verzoek moet onderbouwd zijn en de zorgcoördinator bepaalt, eventueel aan de hand van een extra gesprek, of het verzoek kan worden gehonoreerd.

--

zie voor versnellen: https://www.roc.ovh/books/overig-notes/page/versnellen

Versnellen

1. Uitgangspunt: Nominale planning

Het eerste leerjaar is opgebouwd rond een nominaal leerschema waarin studenten acht inhoudelijke blokken afronden binnen één schooljaar.

Op basis van dit schema worden instructiemomenten en ondersteuning gepland, met als doel: alle studenten richting het beoogde uitstroomniveau begeleiden.

2. Differentiatie in leertrajecten

Om tegemoet te komen aan verschillen in tempo, behoefte en prestaties, hanteren wij vier niveaus van differentiatie. De indeling is dynamisch en wordt periodiek geëvalueerd door de eerstejaars Dev-docent in overleg met SLB’ers.

2.1 Nominaal traject

Studenten in dit traject volgen de reguliere route van acht blokken per jaar.

De totale verwachtte studieduur voor deze studenten is 3 jaar.

Zij ontvangen instructie en begeleiding volgens het standaardrooster. Dit rooster wordt in de eerste weken van het schooljaar voor het hele jaar opgesteld.

2.2 Nominaal Plus (versnellen)

Studenten die zelfstandig en ambitieus willen werken, kunnen in aanmerking komen voor versnelling.

Voorwaarden voor deelname aan dit traject zijn:

  1. De student geeft zelf aan te willen versnellen.
  2. De student heeft geen achterstand ten opzichte van het nominale schema.
  3. De student loopt voor en op het nominal schema en is 1.5 keer verder (150%).
  4. De eerstejaars Dev-docent geeft toestemming. De houding in de klas is goed.
  5. De student heeft minimaal 65% gescoord op de kennistoetsen.
  6. De presentie is ruim voldoende 90% of meer en in ieder geval > 80%.
  7. Deelname aan het wekelijkse ‘versnellerslesuur’ is verplicht.

Versnellen gebeurt altijd in groepjes: het is een gezamenlijke, zelfstandige aanpak waarbij studenten elkaar ondersteunen.

Bij slechts één student kan versnellen beperkt of vervangen worden door maatwerkverdieping of een ondersteunende rol binnen reguliere lessen.

Samengevat

Aanweigheid minimaal 80%
Kennis Check Scores minimaal 65%
Voortgang 150% van nominaal (8 blokken per jaar)

2.3 Kleine achterstand (opstroomtraject)

Studenten die achterlopen maar nog minimaal 70% van de nominale voortgang behalen, vallen onder deze categorie.

Zij krijgen wekelijkse verplichte extra ondersteuning op school met als doel terug te keren naar het nominale schema.

De begeleiding is gericht op het inhalen van de achterstand en het weer kunnen aansluiten bij het nominale beeld.

2.4 Grote achterstand

Studenten met een forse achterstand (onder de 70%-norm) krijgen intensieve begeleiding.

3. Evaluatie en monitoring

4. Toetsing en normering

Per blok wordt de voortgang gemeten aan de hand van kennistoetsen.

De minimale norm om een blok als ‘behaald’ te registreren is een kennistoetsscore van 55% of hoger.

De norm voor deelname aan het versnellende traject is 65% of hoger .

--

zie voor kennis-check berekeningen: https://www.roc.ovh/books/overig-notes/page/kennis-checks

Prompt - Atlas - CMON - nakijken

(experimental)

You are an AI assistant that helps a teacher evaluate student homework submissions and output structured grading data.

## Extraction Rules (IDs, attempts, metadata)
- Read each `user_id` from the value next to the user name starting with u:
- Read each `submission_id` from teh value next to the user and user_id, starting with u:
- Read the `assignment_id` from the assignment link in the SAME student block:
  `<a href="https://talnet.instructure.com/courses/[COURSE_ID]/assignments/[ASSIGNMENT_ID]">…</a>`
  Use that numeric tail as `"assignment_id"`. This can be a comma seperated list.
- Read `course_id` from the same assignment link (the `/courses/[COURSE_ID]/` segment).
- Read the attempt cap string from the rating line, e.g.:
  `(Poging 2, max 12/12, vorige score 6)` or `(Poging 4, max 9/12)`
  • Attempts = number after “Poging”.  
  • Visible maximum = first number after “max” (e.g., `12` in `max 12/12`, or `9` in `max 9/12`).  
- Read submission timestamp from the block’s date/time label (e.g., `29-10 13:47`) and copy that into `"submitted_at"` as-is.
- Read checked state from the “Rate” checkbox in the block:
  • If the “Rate” checkbox is present and checked → `"checked": true`.  
  • Otherwise → `"checked": false`.
- If any specific ID field is truly missing in the provided HTML, set it to `0` (do not invent values).

## Evaluation Rules
1. Ratings range from 0 to [MAX_POINTS].
2. If all requirements are correct **and** attempts ≤ 3 → give **full points** (but do not exceed visible “max”).
3. If attempts ≥ 4 → the **maximum rating** equals the visible “max” value shown (e.g. “max 9/12” → 9).
4. Give partial points if partly correct; give 0 if missing, unreadable, wrong, or not matching the assignment.
5. Never exceed the visible “max” for that submission (even if [MAX_POINTS] is higher).
6. Consider “Expected Words/Keywords” only as soft guidance; do not over-penalize if evidence in the screenshot/PDF clearly shows correctness.
7. Rate based on the criteria printed right under the student name.
8. Next to the feedback input box, we see the feedback on the previous submission from teh student, this is not rellevant for this submission.

## Feedback Rules
- Language: Dutch or English (match the page language).
- Keep it **short, clear, constructive** — 1–2 sentences max.
- Confirm correctness (or main issue), then give 1 improvement tip.
- Example tone:
  - “Netjes gedaan, je hebt de header juist aangepast.”
  - “Correct uitgevoerd, maar volgende keer graag één duidelijke screenshot.”
  - “Bijna goed — controleer of de tag echt kleiner is dan <h1>.”
  - “Omdat dit poging 4 is, iets lagere score.”

## Output Requirements
Return ONLY valid JSON in this exact format — no explanation before or after the JSON:

{
  "version": "1.0",
  "metadata": {
    "cohort": "[COHORT]",
    "assignment_id": [numeric from the blocks; if mixed, use 0],
    "assignment_name": "[ASSIGNMENT_NAME]",
    "course_id": [COURSE_ID or 0],
    "course_name": "[COURSE_NAME]",
    "created_at": "YYYY-MM-DDTHH:MM:SS.mmmZ",
    "total_submissions": [COUNT]
  },
  "submissions": [
    {
      "submission_id": [integer from <input name='submission_id[]' value='...'>],
      "user_id": [integer from <input name='user_id[]' value='...'> or 0],
      "user_name": "Student Name",
      "rating": [integer respecting attempt cap and visible max],
      "feedback": "Short constructive feedback (1–2 sentences).",
      "checked": true,
      "submitted_at": "DD-MM HH:MM"
    }
  ]
}

## Notes
- Include **all** submissions that appear in the provided HTML.
- If multiple different assignment IDs are present across blocks, set `metadata.assignment_id = 0` but still fill each block’s IDs (`submission_id`, `user_id`) correctly and keep the shared `course_id` when available; otherwise use 0.
- Ensure valid, parseable JSON (no trailing commas).

Raspberry Pi2 Screen issues

This summary captures the "perfect storm" of hardware and software conflicts you are facing. It is designed to be shared with developers or used as a reference for future troubleshooting.

1. Hardware Inventory

2. Software Environment

3. The Core Problem: "The Legacy Gap"

The fundamental issue is that 2015 hardware is trying to communicate with a 2025 operating system.


4. Technical Facts for Future Reference

Fact Detail
Confirmed Working OS Raspbian Jessie (Legacy Kernel 4.x).
Fail Symptom Persistent White Screen (Backlight on, logic off).
Key Error Message lgpio.error: 'GPIO not allocated' or ImportError for legacy bitbang classes.
Incompatibility Modern vc4-kms-v3d graphics driver conflicts with SPI GPIO access.
Bus Speed Limit Shift registers typically fail above 1MHz to 2MHz on modern Pi hardware.
Pin Mapping (BCM) DC=9, RST=22, MOSI=10, SCK=11, CS=8.

If the "Zero Feed-in" automation is the priority, these are the only viable ways to view your data:

  1. The Web Dashboard: Since you are on a Pi 2, running a lightweight Flask web server allows you to see the status on your phone or laptop without using any GPIO pins for display.

  2. HDMI Status Screen: Since you have the "Desktop" version of Trixie, you can auto-launch a full-screen Python/Tkinter window on your HDMI monitor to show the power stats.

  3. Hardware Upgrade: Replace the 2015 KeDei with a modern I2C OLED (SSD1306) or a Waveshare SPI display that has native driver support in the 2025 Linux kernel.

Would you like me to help you set up the "Auto-Launching HDMI Dashboard" since you already have the Raspberry Pi Desktop environment running?