Achter Fund (Uebung-Verweise) und Phase 8.3: Dockerfile

Zwei Dinge in einem Commit, weil beide den Plan abschliessen.

ACHTER FUND: sieben Saetze der Bauart "Uebung 8.5 laesst Sie diese Balance
untersuchen" - und sechs davon standen in alter Zaehlung. "8" war in Version
03 das QP/NLP-Kapitel, heute ist es Kapitel 11. Dieselbe Familie wie die
Denkfehler-Verweise aus 6.1a, nur mit einem Wort, das keine der bestehenden
Pruefungen kannte.

Aufgaben haben kein eigenes Label, ein {ref:} auf eine einzelne Aufgabe ist
also nicht moeglich. Verwiesen wird stattdessen auf Abschnitt plus
Aufgabentitel - und der ist stabil. Jedes Ziel wurde einzeln ueber die alte
Zaehlung bestimmt und am Zusammenhang geprueft.

Ein Fall war knifflig: "Uebung 6.7 (Wochendienstplan)" meinte die siebte
CP-SAT-Aufgabe der alten Zaehlung, also "Eigener Dienstplan" - die heute an
achter Stelle steht, weil in Phase 6.3 eine Aufgabe davor eingefuegt wurde.
Wer nur die Kapitelnummer angepasst haette, waere bei der falschen Aufgabe
gelandet.

--check kennt jetzt auch "Uebung"/"Übung". Gegengetestet.

PHASE 8.3: Dockerfile, zweistufig. Die erste Stufe uebersetzt die
Abhaengigkeiten in eine virtuelle Umgebung und braucht dafuer einen
Compiler, die zweite kopiert nur /opt/venv. Installiert werden die Gruppen
finance, large-scale, api und dev aus pyproject.toml; figures fehlt bewusst,
weil es zusaetzlich Graphviz verlangt.

Es wurde nicht behauptet, sondern gebaut. Ergebnis: 1,31 GB, und darin der
Installationstest mit allen drei Solver-Funktionstests bestanden, die 33
pytest-Tests bestanden und alle 69 netzfreien Programme fehlerfrei -
einschliesslich der drei aus 8.2, deren spawn-Isolation im Container ebenso
traegt wie ausserhalb.

Zwei Dinge, die der Bau gelehrt hat: libgomp1 fehlt im python:3.12-slim-Image
und wird von OR-Tools und HiGHS zur Laufzeit gebraucht (sonst
"libgomp.so.1: cannot open shared object file"). Und ein eigener Fehler:
USER kurs stand vor dem mkdir /buch/output, /buch gehoert root, der Bau
brach in der letzten Zeile ab. Beides steht jetzt als Kommentar im
Dockerfile.

Das Image fuehrt die Programme aus und baut das Buch nicht. Ein
.dockerignore haelt Website, PDF und Notebooks aus dem Build-Kontext. Und es
enthaelt ortools UND highspy, obwohl sie sich nicht gemeinsam importieren
lassen - der Konflikt wird zur Laufzeit durch getrennte Prozesse geloest,
nicht durch Weglassen.

Damit ist Phase 8 abgeschlossen und der Plan abgearbeitet.

Stand: 825 Querverweise, 76 Programme, 33 pytest-Tests, PDF 760 Seiten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
dschlueter 2026-09-08 13:18:05 +02:00
commit 35cc0da166
22 changed files with 232 additions and 29 deletions

View file

@ -81,7 +81,7 @@ sie unerwartet ab, ist etwas kaputtgegangen.
| Größe des Gesamtdokuments | 606 KB | **1 622 KB** |
| Hauptüberschriften | 131 | **302** |
| registrierte Abschnitte | 122 | **296** |
| aufgelöste Querverweise | 314 | **818** (0 unaufgelöst) |
| aufgelöste Querverweise | 314 | **825** (0 unaufgelöst) |
| Indexmarken | 295 | **328** |
| Beispielprogramme | 41 | **76** (alle lauffähig) |
| PDF-Seiten | — | **760** |
@ -1822,6 +1822,59 @@ entfernt, und `--check` meldet diesen Fall jetzt. Gegengetestet.
Stand danach: 818 Querverweise, PDF **760** Seiten, 69 netzfreie Programme fehlerfrei.
### ✅ Achter Fund: die „Übung N.N"-Verweise
Sieben Sätze der Bauart „Übung 8.5 lässt Sie diese Balance untersuchen" — und **sechs davon
standen in alter Zählung**. „8" war in Version 03 das QP/NLP-Kapitel, heute ist es
Kapitel 11. Dieselbe Familie wie die Denkfehler-Verweise aus 6.1a, nur mit einem Wort, das
keine der bestehenden Prüfungen kannte.
Aufgaben haben kein eigenes Label, ein `{ref:}` auf eine einzelne Aufgabe ist also nicht
möglich. Verwiesen wird stattdessen auf **Abschnitt plus Aufgabentitel** — und der ist
stabil: „die Aufgabe *Gültigkeitsbereich des Schattenpreises*
({ref:sec:lp-uebungsaufgaben})". Jedes Ziel wurde einzeln über die alte Zählung bestimmt
und am Zusammenhang geprüft.
**Ein Fall war knifflig:** „Übung 6.7 (Wochendienstplan)" meinte die siebte CP-SAT-Aufgabe
der alten Zählung, also *Eigener Dienstplan* — die heute an achter Stelle steht, weil ich in
Phase 6.3 selbst eine Aufgabe davor eingefügt habe. Wer nur die Kapitelnummer angepasst
hätte, wäre bei der falschen Aufgabe gelandet.
`--check` kennt jetzt auch „Übung"/„Uebung". Gegengetestet. Querverweise 818 → 825.
### ✅ 8.3 Dockerfile — gebaut und durchgemessen
Setzt den letzten Teil von Paket 1 aus `Verbesserungen_02.md` um. Zweistufig: Die erste
Stufe übersetzt die Abhängigkeiten in eine virtuelle Umgebung und braucht dafür einen
Compiler, die zweite kopiert nur `/opt/venv` — die Bauumgebung landet nicht im Image.
Installiert werden die Gruppen `finance`, `large-scale`, `api` und `dev` aus
`pyproject.toml`; `figures` fehlt bewusst, weil es zusätzlich Graphviz verlangt.
**Es wurde nicht behauptet, sondern gebaut.** Ergebnis: **1,31 GB**, und darin
* der `Installationstest.py` mit allen drei Solver-Funktionstests bestanden,
* die 33 pytest-Tests bestanden,
* **alle 69 netzfreien Programme fehlerfrei** — einschließlich der drei aus 8.2, deren
`spawn`-Isolation im Container ebenso trägt wie außerhalb.
**Zwei Dinge, die der Bau gelehrt hat.** Erstens: `libgomp1` fehlt im
`python:3.12-slim`-Image und wird von OR-Tools und HiGHS zur Laufzeit gebraucht — ohne es
scheitert der erste Solveraufruf mit `libgomp.so.1: cannot open shared object file`.
Zweitens, ein eigener Fehler: Ich hatte `USER kurs` **vor** das `mkdir /buch/output` gesetzt;
`/buch` gehört root, und der Bau brach in der letzten Zeile ab. Beides steht jetzt als
Kommentar im Dockerfile.
Das Image führt die Programme aus und **baut das Buch nicht** — pandoc, xelatex und inkscape
wären zusammen über ein Gigabyte ohne Nutzen für jemanden, der die Beispiele durchrechnen
will. Ein `.dockerignore` hält Website, PDF und Notebooks aus dem Build-Kontext.
Und der Punkt, der erklärungsbedürftig ist: Das Image enthält `ortools` **und** `highspy`,
obwohl sie sich nicht gemeinsam importieren lassen. Der Konflikt wird nicht durch Weglassen
gelöst, sondern zur Laufzeit durch getrennte Prozesse — ein Image mit nur einem von beiden
könnte die Hälfte der Beispiele nicht ausführen.
**Damit ist Phase 8 abgeschlossen und der Plan abgearbeitet.**
---
## 8. Commit-Historie des V04-Strangs