Verifying the Workstation

Keep a script that prints every version you depend on; run it after upgrades and paste its output into bug reports.

check_workstation.sh: print the versions the book was tested withShell
#!/bin/bash
# check_workstation.sh: print the versions this book was tested with. Rerun after upgrades.
source ~/de-venv/bin/activate
export PATH="$HOME/.duckdb/cli/1.5.5:$PATH"
. /etc/os-release
echo "OS       $PRETTY_NAME, kernel $(uname -r)"
echo "Hardware $(nproc) CPUs, $(free -g | awk '/^Mem:/ {print $2}') GiB RAM"
echo "Docker   $(docker version --format '{{.Server.Version}}'),"\
     "Compose $(docker compose version --short)"
echo "DuckDB   CLI $(duckdb --version | cut -d' ' -f1)"
python -c "import sys, duckdb as d, pyarrow as p, matplotlib as m; print('Python  ',
  sys.version.split()[0], '| duckdb', d.__version__, '| pyarrow', p.__version__,
  '| matplotlib', m.__version__, '| query', d.sql('SELECT 42').fetchone()[0])"
Output
OS       Ubuntu 26.04.1 LTS, kernel 6.18.33.2-microsoft-standard-WSL2
Hardware 4 CPUs, 31 GiB RAM
Docker   29.8.1, Compose 5.5.1
DuckDB   CLI v1.5.5
Python   3.14.4 | duckdb 1.5.5 | pyarrow 25.0.1 | matplotlib 3.11.2 | query 42

The machine has 32 GB, but WSL2 6 shows 31 GiB to Linux. Four CPUs and 31 GiB are enough for every chapter if you run one heavy service at a time: Spark 129 , the Airflow 129 scheduler and Trino 403,499 each want most of the cores while working, so stop one before starting the next. Compare timings in this book as ratios, not seconds.