Add network unit 19 on routing principles and algorithms.

Cover adaptive vs static routing, control types, metrics and distance vector.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
pepaskopec-blip 2026-09-14 12:46:25 +02:00
commit 0f211e3185
5 changed files with 170 additions and 18 deletions

View file

@ -31,7 +31,7 @@ GTK 4 interface.
German learning path
- **Správa počítačových sítí / Computer Network Administration** is open too
(shown with a Wi-Fi icon) and leads to a 30-unit computer-networks path;
**units 1–18 are playable**, units 19–30 are locked placeholders
**units 1–19 are playable**, units 20–30 are locked placeholders
- **Technické vybavení / Computer Hardware** is open (chip icon) and leads
to a 10-unit hardware path; **units 1–3 are playable**, units 4–10 are
locked placeholders
@ -62,7 +62,7 @@ GTK 4 interface.
- **Hints & model answers** – in exercises where you write or complete a German
sentence the Czech meaning is shown right away as a hint, and clicking the
check button also reveals the correct German sentence so you can compare
- **Computer networks path** – eighteen unlocked units (theory slides + practice):
- **Computer networks path** – nineteen unlocked units (theory slides + practice):
1. **Výpočet IP adres / IP Address Calculation** – 4-slide VLSM walkthrough
and four interactive subnetting tasks (prefix, network, broadcast, host
range) with check and “show solution”
@ -82,7 +82,8 @@ GTK 4 interface.
15. Ochrana a montáž optiky – slides + quiz
16. Metody přístupu – slides + quiz
17. Aktivní prvky – slides + quiz
18. Switch (podrobně) – slides + quiz
18. Switch (podrobně) – slides + quiz
19. Směrování (Routing) – slides + quiz
Progress for networks is saved to `progress/net.conf` (one flag per unit);
completed network units show a checkmark on the path and count in Statistics
- **Computer hardware path** – three unlocked units (theory slides + quiz):
@ -305,11 +306,11 @@ When launched, the application shows the welcome screen. From there:
unit 2 or **"Bei uns zu Hause"** for unit 3, then pick any bubble to start
an exercise. Units 2 and 3 are available even if the earlier units are not
finished yet.
5. On the networks path, units **1–18** are open. Unit 1 (**Výpočet IP adres**)
5. On the networks path, units **1–19** are open. Unit 1 (**Výpočet IP adres**)
walks through four VLSM slides and then four interactive subnetting tasks
with check / “show solution”. Units 2–18 each have theory slides followed by
a multiple-choice quiz (basic concepts through switch forwarding modes).
Units 19–30 stay locked placeholders.
with check / “show solution”. Units 2–19 each have theory slides followed by
a multiple-choice quiz (basic concepts through routing algorithms).
Units 20–30 stay locked placeholders.
6. On the hardware path, units **1–3** are open (architecture / von Neumann,
computer history generations, bit & byte), each with slides and a quiz.
Units 4–10 stay locked.
@ -460,7 +461,7 @@ moderním GTK 4 rozhraním stylovaným přes CSS.
- **Deutsch** je otevřený (bublina s německou vlajkou) a vede na německou
učební cestu
- **Správa počítačových sítí** je také otevřená (ikona Wi‑Fi) a vede na cestu
s 30 jednotkami; **jednotky 1–18 jsou hratelné**, 19–30 jsou zamčené
s 30 jednotkami; **jednotky 1–19 jsou hratelné**, 20–30 jsou zamčené
placeholdery
- **Technické vybavení** je otevřené (ikona čipu) a vede na cestu
s 10 jednotkami; **jednotky 1–3 jsou hratelné**, 4–10 jsou zamčené
@ -486,7 +487,7 @@ moderním GTK 4 rozhraním stylovaným přes CSS.
„Was siehst du?“, řazení vět, chybějící písmena)
- **Nápovědy a vzorové odpovědi** – u psaných / doplňovaných vět je hned
český význam; po kontrole se ukáže i správná německá věta
- **Cesta počítačových sítí** – osmnáct odemčených jednotek (snímky + cvičení):
- **Cesta počítačových sítí** – devatenáct odemčených jednotek (snímky + cvičení):
1. **Výpočet IP adres** – 4 snímky VLSM a čtyři interaktivní úlohy
(prefix, síť, broadcast, rozsah uzlů) s kontrolou a „ukázat řešení“
2. Základní pojmy a rozdělení sítí – snímky + kvíz
@ -505,7 +506,8 @@ moderním GTK 4 rozhraním stylovaným přes CSS.
15. Ochrana a montáž optiky – snímky + kvíz
16. Metody přístupu – snímky + kvíz
17. Aktivní prvky – snímky + kvíz
18. Switch (podrobně) – snímky + kvíz
18. Switch (podrobně) – snímky + kvíz
19. Směrování (Routing) – snímky + kvíz
Postup u sítí se ukládá do `progress/net.conf` (příznak na jednotku);
dokončené jednotky mají fajfku na cestě a počítají se ve Statistikách
- **Cesta technického vybavení** – tři odemčené jednotky (snímky + kvíz):
@ -726,10 +728,10 @@ Po spuštění se zobrazí úvodní obrazovka. Odtud:
4. Otevřete **"Neue Freunde"** (jednotka 1), **"Aus aller Welt"** (2) nebo
**"Bei uns zu Hause"** (3) a vyberte bublinu cvičení. Jednotky 2 a 3 jdou
otevřít i bez dokončení předchozích.
5. Na síťové cestě jsou otevřené jednotky **1–18**. Jednotka 1 (**Výpočet IP
5. Na síťové cestě jsou otevřené jednotky **1–19**. Jednotka 1 (**Výpočet IP
adres**) má 4 snímky VLSM a pak 4 interaktivní úlohy s kontrolou /
„ukázat řešení“. Jednotky 2–18 mají snímky teorie a kvíz s výběrem
(od základních pojmů po switch podrobně). Jednotky 19–30 zůstávají zamčené.
„ukázat řešení“. Jednotky 2–19 mají snímky teorie a kvíz s výběrem
(od základních pojmů po směrování). Jednotky 20–30 zůstávají zamčené.
6. Na cestě technického vybavení jsou otevřené jednotky **1–3** (architektura /
von Neumann, historie generací, bit a byte), každá se snímky a kvízem.
Jednotky 4–10 zůstávají zamčené.
@ -773,8 +775,8 @@ exercise_u1.c cvičení jednotky 1 („Neue Freunde“)
exercise_u2.c cvičení jednotky 2 („Aus aller Welt“)
exercise_u3.c cvičení jednotky 3 („Bei uns zu Hause“)
settings.c panel nastavení (režim, téma, jazyk)
net.c cesta počítačových sítí (30 uzlů), jednotky 1–18
(1: VLSM cvičení; 2–18: kvízy s výběrem)
net.c cesta počítačových sítí (30 uzlů), jednotky 1–19
(1: VLSM cvičení; 2–19: kvízy s výběrem)
hw.c cesta technického vybavení (10 uzlů), jednotky 1–3
(architektura, historie, bit/byte + kvízy)
main.c vstupní bod aplikace a zapojení stránek

22
i18n.c
View file

@ -305,6 +305,12 @@ const TrEntry tr_ui[] = {
"5 slides about CAM and switching modes, then a quiz."},
{"net_ex18_title", "Kvíz: switch podrobně",
"Quiz: switch in detail"},
{"net_unit19", "Směrování (Routing)",
"Routing"},
{"net_unit19_sub", "7 snímků o směrovacích algoritmech a pak kvíz.",
"7 slides about routing algorithms, then a quiz."},
{"net_ex19_title", "Kvíz: směrování",
"Quiz: routing"},
{"net_quiz_intro",
"Vyberte u každé otázky jednu správnou odpověď a stiskněte Zkontrolovat.",
"Choose one correct answer for each question and press Check."},
@ -342,6 +348,8 @@ const TrEntry tr_ui[] = {
"Quiz on active network devices"},
{"net_quiz18_head", "Kvíz ke switchi podrobně",
"Quiz on switches in detail"},
{"net_quiz19_head", "Kvíz ke směrování",
"Quiz on routing"},
{"net_slide_next", "Další", "Next"},
{"net_slide_prev", "Zpět", "Back"},
{"net_slide_start", "Přejít na cvičení", "Go to the exercise"},
@ -632,6 +640,20 @@ const TrEntry tr_content[] = {
"Store-and-forward checks the whole frame including CRC"},
{"Fragment-free čte prvních 64 bytů kvůli kolizím", NULL,
"Fragment-free reads the first 64 bytes for collision detection"},
{"Směrování běží na síťové (3.) vrstvě ISO/OSI", NULL,
"Routing runs on the network (3rd) ISO/OSI layer"},
{"Adaptivní algoritmy reagují na změny a sdílí stav sítě", NULL,
"Adaptive algorithms react to changes and share network state"},
{"Statické cesty nastaví správce a samy se nemění", NULL,
"Static routes are set by an admin and do not change themselves"},
{"Centralizované směrování padá s výpadkem centra", NULL,
"Centralized routing fails if the center fails"},
{"Distribuované: výměna informací a vlastní tabulky", NULL,
"Distributed: information exchange and local tables"},
{"Nižší metrika = lepší / rychlejší trasa", NULL,
"Lower metric = better / faster route"},
{"Distance Vector: výměna tabulek se sousedy (např. každých 30 s)", NULL,
"Distance Vector: exchange tables with neighbors (e.g. every 30 s)"},
{"čtrnáct", NULL, "fourteen"},
{"sedmnáct", NULL, "seventeen"},
{"dvacet", NULL, "twenty"},

1
main.c
View file

@ -264,6 +264,7 @@ void activate(GtkApplication *app, gpointer user_data) {
{"netunit16", "netex16", build_net_unit16_page, build_net_unit16_exercise_page},
{"netunit17", "netex17", build_net_unit17_page, build_net_unit17_exercise_page},
{"netunit18", "netex18", build_net_unit18_page, build_net_unit18_exercise_page},
{"netunit19", "netex19", build_net_unit19_page, build_net_unit19_exercise_page},
};
for (guint i = 0; i < G_N_ELEMENTS(net_pages); i++) {

View file

@ -67,7 +67,8 @@
#define NET16_SLIDES 4
#define NET17_SLIDES 7
#define NET18_SLIDES 5
#define NET_LESSONS 18
#define NET19_SLIDES 7
#define NET_LESSONS 19
#define HW_UNITS 10
#define HW_LESSONS 3
#define HW_SLIDES 3
@ -1099,6 +1100,7 @@ GtkWidget *build_net_unit15_page(void);
GtkWidget *build_net_unit16_page(void);
GtkWidget *build_net_unit17_page(void);
GtkWidget *build_net_unit18_page(void);
GtkWidget *build_net_unit19_page(void);
GtkWidget *net_qz_combo(void);
void net_qz_set_prefix(GtkComboBoxText *c, int pfx);
int net_qz_prefix(GtkComboBoxText *c);
@ -1130,6 +1132,7 @@ GtkWidget *build_net_unit15_exercise_page(void);
GtkWidget *build_net_unit16_exercise_page(void);
GtkWidget *build_net_unit17_exercise_page(void);
GtkWidget *build_net_unit18_exercise_page(void);
GtkWidget *build_net_unit19_exercise_page(void);
void activate(GtkApplication *app, gpointer user_data);
int main(int argc, char **argv);

128
net.c
View file

@ -5,7 +5,7 @@
NetLesson net_lessons[NET_LESSONS] = {
/* UI unit N maps to lesson content: unit 1 = IP/VLSM (extra);
* units 2–18 = source topics (Základní pojmy … switch podrobně). */
* units 2–19 = source topics (Základní pojmy … směrování). */
{ .n_slides = NET_SLIDES, .unit_page = "netunit1", .ex_page = "netex1" },
{ .n_slides = NET2_SLIDES, .unit_page = "netunit2", .ex_page = "netex2" },
{ .n_slides = NET3_SLIDES, .unit_page = "netunit3", .ex_page = "netex3" },
@ -24,6 +24,7 @@ NetLesson net_lessons[NET_LESSONS] = {
{ .n_slides = NET16_SLIDES, .unit_page = "netunit16", .ex_page = "netex16" },
{ .n_slides = NET17_SLIDES, .unit_page = "netunit17", .ex_page = "netex17" },
{ .n_slides = NET18_SLIDES, .unit_page = "netunit18", .ex_page = "netex18" },
{ .n_slides = NET19_SLIDES, .unit_page = "netunit19", .ex_page = "netex19" },
};
void net_paragraph(GtkWidget *box, const char *text) {
@ -465,7 +466,7 @@ void net_add_node(GtkFixed *fixed, int index) {
"net_unit1", "net_unit2", "net_unit3", "net_unit4", "net_unit5",
"net_unit6", "net_unit7", "net_unit8", "net_unit9", "net_unit10",
"net_unit11", "net_unit12", "net_unit13", "net_unit14", "net_unit15",
"net_unit16", "net_unit17", "net_unit18"
"net_unit16", "net_unit17", "net_unit18", "net_unit19"
};
card = gtk_button_new();
@ -1641,6 +1642,85 @@ GtkWidget *build_net_unit18_page(void) {
slides, NET18_SLIDES);
}
GtkWidget *build_net_unit19_page(void) {
static const NetSlide slides[NET19_SLIDES] = {
{
"1 / 7 • Princip", "Směrování paketů",
"Tip: 3. vrstva ISO/OSI – síťová",
{
"Rozhodování o dalším směru přenosu paketů do cílové sítě.",
"Probíhá na síťové vrstvě modelu ISO/OSI.",
"K rozhodování se používají směrovací algoritmy.",
NULL,
},
},
{
"2 / 7 • Adaptivní", "Dynamické algoritmy",
NULL,
{
"Reagují na změny v síti (výpadek linky, přetížení).",
"Vyžadují pravidelnou výměnu informací mezi směrovači.",
NULL,
},
},
{
"3 / 7 • Neadaptivní", "Statické algoritmy",
NULL,
{
"Nereagují na změny v síti.",
"Cesty pevně definuje správce.",
"Při výpadku části sítě může spojení spadnout.",
NULL,
},
},
{
"4 / 7 • Řízení", "Centralizované a izolované",
NULL,
{
"Centralizované: centrum počítá cesty pro všechny směrovače.",
"Výpadek centra = pád směrování; v praxi skoro nepoužívané.",
"Izolované: směrovač se rozhoduje sám z lokálních informací.",
"Izolované se používá spíš jako doplněk při přetížení.",
NULL,
},
},
{
"5 / 7 • Distribuované", "Výměna mezi směrovači",
NULL,
{
"Směrovače si vyměňují informace.",
"Každý si udržuje vlastní směrovací tabulku.",
NULL,
},
},
{
"6 / 7 • Tabulka", "Next Hop a metrika",
"Tip: nižší metrika = lepší / rychlejší trasa",
{
"Záznam: cílová síť, next hop a metrika.",
"Next hop = nejbližší soused, kterému paket předáme.",
"Metrika číselně ohodnocuje cestu.",
"Při více cestách se volí ta s nejnižší metrikou.",
NULL,
},
},
{
"7 / 7 • Distance Vector", "Příklad algoritmu",
"Tip: např. výměna tabulek každých 30 s",
{
"Směrovače znají jen své přímé sousedy.",
"Pravidelně si posílají kopie směrovacích tabulek.",
"Informace se šíří krok za krokem po celé síti.",
"Každý směrovač si spočítá nejlepší trasu do známých sítí.",
NULL,
},
},
};
return build_net_unit_page(&net_lessons[18], "net_unit19", "net_unit19_sub",
slides, NET19_SLIDES);
}
/* Solutions below are the canonical "largest subnet first, in order A–D"
* allocation. Scenario 3 does not fit into a /24 as written, which is why
* its "solution" explains that instead. */
@ -2841,3 +2921,47 @@ GtkWidget *build_net_unit18_exercise_page(void) {
(int)G_N_ELEMENTS(net18_qs));
}
const ChoiceQ net19_qs[] = {
{"Směrování probíhá na vrstvě:",
{"Fyzické", "Síťové (3. ISO/OSI)", "Jen aplikační", "Jen linkové"}, 4, 1},
{"Adaptivní (dynamické) algoritmy:",
{"Reagují na změny a vyměňují informace mezi směrovači",
"Nikdy nemění cesty", "Fungují jen na fyzické vrstvě",
"Nepoužívají metriku"}, 4, 0},
{"Neadaptivní (statické) směrování:",
{"Má cesty pevně nastavené správcem", "Samo opraví každý výpadek",
"Nepotřebuje směrovací tabulku", "Běží jen na Wi-Fi"}, 4, 0},
{"Centralizované směrování v praxi:",
{"Se skoro nepoužívá – výpadek centra shodí směrování",
"Je jediný standard internetu", "Neexistuje žádné centrum",
"Pracuje jen s MAC adresami"}, 4, 0},
{"Distribuované směrování znamená, že:",
{"Směrovače si vyměňují informace a každý má vlastní tabulku",
"Jedno centrum řídí všechny cesty", "Směrovač nezná žádné sousedy",
"Pakety jdou jen přes hub"}, 4, 0},
{"Metrika ve směrovací tabulce:",
{"Číselně hodnotí cestu – nižší je lepší",
"Je vždy jen MAC adresa", "Nemá vliv na výběr trasy",
"Nahrazuje next hop"}, 4, 0},
{"Distance Vector typicky:",
{"Posílá sousedům kopie tabulek a šíří informace krok za krokem",
"Počítá cesty jen v jednom centru", "Ignoruje přímé sousedy",
"Pracuje jen na aplikační vrstvě"}, 4, 0},
};
const char *net19_hints[] = {
"Směrování běží na síťové (3.) vrstvě ISO/OSI",
"Adaptivní algoritmy reagují na změny a sdílí stav sítě",
"Statické cesty nastaví správce a samy se nemění",
"Centralizované směrování padá s výpadkem centra",
"Distribuované: výměna informací a vlastní tabulky",
"Nižší metrika = lepší / rychlejší trasa",
"Distance Vector: výměna tabulek se sousedy (např. každých 30 s)",
};
GtkWidget *build_net_unit19_exercise_page(void) {
return build_net_mcq_page(18, "netunit19", "net_ex19_title", "net_quiz19_head",
net19_qs, net19_hints,
(int)G_N_ELEMENTS(net19_qs));
}