Add network unit 17 on active network devices.

Cover repeater, transceiver, hub, switch, router and gateway with a quiz.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
pepaskopec-blip 2026-09-14 12:24:22 +02:00
commit 247d3af8af
5 changed files with 156 additions and 19 deletions

View file

@ -31,7 +31,7 @@ GTK 4 interface.
German learning path German learning path
- **Správa počítačových sítí / Computer Network Administration** is open too - **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; (shown with a Wi-Fi icon) and leads to a 30-unit computer-networks path;
**units 1–16 are playable**, units 17–30 are locked placeholders **units 1–17 are playable**, units 18–30 are locked placeholders
- **Technické vybavení / Computer Hardware** is open (chip icon) and leads - **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 to a 10-unit hardware path; **units 1–3 are playable**, units 4–10 are
locked placeholders locked placeholders
@ -62,7 +62,7 @@ GTK 4 interface.
- **Hints & model answers** – in exercises where you write or complete a German - **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 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 check button also reveals the correct German sentence so you can compare
- **Computer networks path** – sixteen unlocked units (theory slides + practice): - **Computer networks path** – seventeen unlocked units (theory slides + practice):
1. **Výpočet IP adres / IP Address Calculation** – 4-slide VLSM walkthrough 1. **Výpočet IP adres / IP Address Calculation** – 4-slide VLSM walkthrough
and four interactive subnetting tasks (prefix, network, broadcast, host and four interactive subnetting tasks (prefix, network, broadcast, host
range) with check and “show solution” range) with check and “show solution”
@ -80,7 +80,8 @@ GTK 4 interface.
13. Topologie sítě – slides + quiz 13. Topologie sítě – slides + quiz
14. Optika – slides + quiz 14. Optika – slides + quiz
15. Ochrana a montáž optiky – slides + quiz 15. Ochrana a montáž optiky – slides + quiz
16. Metody přístupu – slides + quiz 16. Metody přístupu – slides + quiz
17. Aktivní prvky – slides + quiz
Progress for networks is saved to `progress/net.conf` (one flag per unit); 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 completed network units show a checkmark on the path and count in Statistics
- **Computer hardware path** – three unlocked units (theory slides + quiz): - **Computer hardware path** – three unlocked units (theory slides + quiz):
@ -303,11 +304,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 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 an exercise. Units 2 and 3 are available even if the earlier units are not
finished yet. finished yet.
5. On the networks path, units **1–16** are open. Unit 1 (**Výpočet IP adres**) 5. On the networks path, units **1–17** are open. Unit 1 (**Výpočet IP adres**)
walks through four VLSM slides and then four interactive subnetting tasks walks through four VLSM slides and then four interactive subnetting tasks
with check / “show solution”. Units 2–16 each have theory slides followed by with check / “show solution”. Units 2–17 each have theory slides followed by
a multiple-choice quiz (basic concepts through access methods like CSMA). a multiple-choice quiz (basic concepts through active devices like switches
Units 17–30 stay locked placeholders. and routers). Units 18–30 stay locked placeholders.
6. On the hardware path, units **1–3** are open (architecture / von Neumann, 6. On the hardware path, units **1–3** are open (architecture / von Neumann,
computer history generations, bit & byte), each with slides and a quiz. computer history generations, bit & byte), each with slides and a quiz.
Units 4–10 stay locked. Units 4–10 stay locked.
@ -458,7 +459,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 - **Deutsch** je otevřený (bublina s německou vlajkou) a vede na německou
učební cestu učební cestu
- **Správa počítačových sítí** je také otevřená (ikona Wi‑Fi) a vede na 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–16 jsou hratelné**, 17–30 jsou zamčené s 30 jednotkami; **jednotky 1–17 jsou hratelné**, 18–30 jsou zamčené
placeholdery placeholdery
- **Technické vybavení** je otevřené (ikona čipu) a vede na cestu - **Technické vybavení** je otevřené (ikona čipu) a vede na cestu
s 10 jednotkami; **jednotky 1–3 jsou hratelné**, 4–10 jsou zamčené s 10 jednotkami; **jednotky 1–3 jsou hratelné**, 4–10 jsou zamčené
@ -484,7 +485,7 @@ moderním GTK 4 rozhraním stylovaným přes CSS.
„Was siehst du?“, řazení vět, chybějící písmena) „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 - **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 český význam; po kontrole se ukáže i správná německá věta
- **Cesta počítačových sítí** – šestnáct odemčených jednotek (snímky + cvičení): - **Cesta počítačových sítí** – sedmnáct odemčených jednotek (snímky + cvičení):
1. **Výpočet IP adres** – 4 snímky VLSM a čtyři interaktivní úlohy 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í“ (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 2. Základní pojmy a rozdělení sítí – snímky + kvíz
@ -501,7 +502,8 @@ moderním GTK 4 rozhraním stylovaným přes CSS.
13. Topologie sítě – snímky + kvíz 13. Topologie sítě – snímky + kvíz
14. Optika – snímky + kvíz 14. Optika – snímky + kvíz
15. Ochrana a montáž optiky – snímky + kvíz 15. Ochrana a montáž optiky – snímky + kvíz
16. Metody přístupu – snímky + kvíz 16. Metody přístupu – snímky + kvíz
17. Aktivní prvky – snímky + kvíz
Postup u sítí se ukládá do `progress/net.conf` (příznak na jednotku); 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 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): - **Cesta technického vybavení** – tři odemčené jednotky (snímky + kvíz):
@ -722,11 +724,10 @@ Po spuštění se zobrazí úvodní obrazovka. Odtud:
4. Otevřete **"Neue Freunde"** (jednotka 1), **"Aus aller Welt"** (2) nebo 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 **"Bei uns zu Hause"** (3) a vyberte bublinu cvičení. Jednotky 2 a 3 jdou
otevřít i bez dokončení předchozích. otevřít i bez dokončení předchozích.
5. Na síťové cestě jsou otevřené jednotky **1–16**. Jednotka 1 (**Výpočet IP 5. Na síťové cestě jsou otevřené jednotky **1–17**. Jednotka 1 (**Výpočet IP
adres**) má 4 snímky VLSM a pak 4 interaktivní úlohy s kontrolou / adres**) má 4 snímky VLSM a pak 4 interaktivní úlohy s kontrolou /
„ukázat řešení“. Jednotky 2–16 mají snímky teorie a kvíz s výběrem „ukázat řešení“. Jednotky 2–17 mají snímky teorie a kvíz s výběrem
(od základních pojmů po metody přístupu). Jednotky 17–30 zůstávají (od základních pojmů po aktivní prvky). Jednotky 18–30 zůstávají zamčené.
zamčené.
6. Na cestě technického vybavení jsou otevřené jednotky **1–3** (architektura / 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. von Neumann, historie generací, bit a byte), každá se snímky a kvízem.
Jednotky 4–10 zůstávají zamčené. Jednotky 4–10 zůstávají zamčené.
@ -770,8 +771,8 @@ exercise_u1.c cvičení jednotky 1 („Neue Freunde“)
exercise_u2.c cvičení jednotky 2 („Aus aller Welt“) exercise_u2.c cvičení jednotky 2 („Aus aller Welt“)
exercise_u3.c cvičení jednotky 3 („Bei uns zu Hause“) exercise_u3.c cvičení jednotky 3 („Bei uns zu Hause“)
settings.c panel nastavení (režim, téma, jazyk) settings.c panel nastavení (režim, téma, jazyk)
net.c cesta počítačových sítí (30 uzlů), jednotky 1–16 net.c cesta počítačových sítí (30 uzlů), jednotky 1–17
(1: VLSM cvičení; 2–16: kvízy s výběrem) (1: VLSM cvičení; 2–17: kvízy s výběrem)
hw.c cesta technického vybavení (10 uzlů), jednotky 1–3 hw.c cesta technického vybavení (10 uzlů), jednotky 1–3
(architektura, historie, bit/byte + kvízy) (architektura, historie, bit/byte + kvízy)
main.c vstupní bod aplikace a zapojení stránek main.c vstupní bod aplikace a zapojení stránek

22
i18n.c
View file

@ -293,6 +293,12 @@ const TrEntry tr_ui[] = {
"4 slides about collisions and CSMA, then a quiz."}, "4 slides about collisions and CSMA, then a quiz."},
{"net_ex16_title", "Kvíz: metody přístupu", {"net_ex16_title", "Kvíz: metody přístupu",
"Quiz: access methods"}, "Quiz: access methods"},
{"net_unit17", "Aktivní prvky",
"Active network devices"},
{"net_unit17_sub", "7 snímků o hubu, switchi a routeru a pak kvíz.",
"7 slides about hubs, switches and routers, then a quiz."},
{"net_ex17_title", "Kvíz: aktivní prvky",
"Quiz: active network devices"},
{"net_quiz_intro", {"net_quiz_intro",
"Vyberte u každé otázky jednu správnou odpověď a stiskněte Zkontrolovat.", "Vyberte u každé otázky jednu správnou odpověď a stiskněte Zkontrolovat.",
"Choose one correct answer for each question and press Check."}, "Choose one correct answer for each question and press Check."},
@ -326,6 +332,8 @@ const TrEntry tr_ui[] = {
"Quiz on fiber protection and installation"}, "Quiz on fiber protection and installation"},
{"net_quiz16_head", "Kvíz k metodám přístupu", {"net_quiz16_head", "Kvíz k metodám přístupu",
"Quiz on access methods"}, "Quiz on access methods"},
{"net_quiz17_head", "Kvíz k aktivním prvkům",
"Quiz on active network devices"},
{"net_slide_next", "Další", "Next"}, {"net_slide_next", "Další", "Next"},
{"net_slide_prev", "Zpět", "Back"}, {"net_slide_prev", "Zpět", "Back"},
{"net_slide_start", "Přejít na cvičení", "Go to the exercise"}, {"net_slide_start", "Přejít na cvičení", "Go to the exercise"},
@ -585,6 +593,20 @@ const TrEntry tr_content[] = {
"After a collision, CSMA/CD waits a random time and retries"}, "After a collision, CSMA/CD waits a random time and retries"},
{"CSMA/CA rezervuje médium přes RTS/CTS", NULL, {"CSMA/CA rezervuje médium přes RTS/CTS", NULL,
"CSMA/CA reserves the medium with RTS/CTS"}, "CSMA/CA reserves the medium with RTS/CTS"},
{"Repeater zesiluje signál na fyzické vrstvě", NULL,
"A repeater amplifies the signal at the physical layer"},
{"Transceiver převádí mezi médii (např. metalika ↔ optika)", NULL,
"A transceiver converts between media (e.g. copper ↔ fiber)"},
{"Hub rozešle přijatá data do všech ostatních portů", NULL,
"A hub floods received data to all other ports"},
{"Bridge/switch = linková vrstva, rámce a MAC", NULL,
"Bridge/switch = data-link layer, frames and MAC"},
{"Switch dělí síť na kolizní domény", NULL,
"A switch splits the network into collision domains"},
{"Router = síťová vrstva, pakety a IP, propojuje sítě", NULL,
"A router = network layer, packets and IP, connects networks"},
{"Gateway převádí mezi odlišnými architekturami/protokoly", NULL,
"A gateway converts between different architectures/protocols"},
{"čtrnáct", NULL, "fourteen"}, {"čtrnáct", NULL, "fourteen"},
{"sedmnáct", NULL, "seventeen"}, {"sedmnáct", NULL, "seventeen"},
{"dvacet", NULL, "twenty"}, {"dvacet", NULL, "twenty"},

1
main.c
View file

@ -261,6 +261,7 @@ void activate(GtkApplication *app, gpointer user_data) {
{"netunit14", "netex14", build_net_unit14_page, build_net_unit14_exercise_page}, {"netunit14", "netex14", build_net_unit14_page, build_net_unit14_exercise_page},
{"netunit15", "netex15", build_net_unit15_page, build_net_unit15_exercise_page}, {"netunit15", "netex15", build_net_unit15_page, build_net_unit15_exercise_page},
{"netunit16", "netex16", build_net_unit16_page, build_net_unit16_exercise_page}, {"netunit16", "netex16", build_net_unit16_page, build_net_unit16_exercise_page},
{"netunit17", "netex17", build_net_unit17_page, build_net_unit17_exercise_page},
}; };
for (guint i = 0; i < G_N_ELEMENTS(net_pages); i++) { for (guint i = 0; i < G_N_ELEMENTS(net_pages); i++) {

View file

@ -64,7 +64,8 @@
#define NET14_SLIDES 5 #define NET14_SLIDES 5
#define NET15_SLIDES 3 #define NET15_SLIDES 3
#define NET16_SLIDES 4 #define NET16_SLIDES 4
#define NET_LESSONS 16 #define NET17_SLIDES 7
#define NET_LESSONS 17
#define HW_UNITS 10 #define HW_UNITS 10
#define HW_LESSONS 3 #define HW_LESSONS 3
#define HW_SLIDES 3 #define HW_SLIDES 3
@ -1090,6 +1091,7 @@ GtkWidget *build_net_unit13_page(void);
GtkWidget *build_net_unit14_page(void); GtkWidget *build_net_unit14_page(void);
GtkWidget *build_net_unit15_page(void); GtkWidget *build_net_unit15_page(void);
GtkWidget *build_net_unit16_page(void); GtkWidget *build_net_unit16_page(void);
GtkWidget *build_net_unit17_page(void);
GtkWidget *net_qz_combo(void); GtkWidget *net_qz_combo(void);
void net_qz_set_prefix(GtkComboBoxText *c, int pfx); void net_qz_set_prefix(GtkComboBoxText *c, int pfx);
int net_qz_prefix(GtkComboBoxText *c); int net_qz_prefix(GtkComboBoxText *c);
@ -1119,6 +1121,7 @@ GtkWidget *build_net_unit13_exercise_page(void);
GtkWidget *build_net_unit14_exercise_page(void); GtkWidget *build_net_unit14_exercise_page(void);
GtkWidget *build_net_unit15_exercise_page(void); GtkWidget *build_net_unit15_exercise_page(void);
GtkWidget *build_net_unit16_exercise_page(void); GtkWidget *build_net_unit16_exercise_page(void);
GtkWidget *build_net_unit17_exercise_page(void);
void activate(GtkApplication *app, gpointer user_data); void activate(GtkApplication *app, gpointer user_data);
int main(int argc, char **argv); int main(int argc, char **argv);

114
net.c
View file

@ -5,7 +5,7 @@
NetLesson net_lessons[NET_LESSONS] = { NetLesson net_lessons[NET_LESSONS] = {
/* UI unit N maps to lesson content: unit 1 = IP/VLSM (extra); /* UI unit N maps to lesson content: unit 1 = IP/VLSM (extra);
* units 2–16 = source topics (Základní pojmy … metody přístupu). */ * units 2–17 = source topics (Základní pojmy … aktivní prvky). */
{ .n_slides = NET_SLIDES, .unit_page = "netunit1", .ex_page = "netex1" }, { .n_slides = NET_SLIDES, .unit_page = "netunit1", .ex_page = "netex1" },
{ .n_slides = NET2_SLIDES, .unit_page = "netunit2", .ex_page = "netex2" }, { .n_slides = NET2_SLIDES, .unit_page = "netunit2", .ex_page = "netex2" },
{ .n_slides = NET3_SLIDES, .unit_page = "netunit3", .ex_page = "netex3" }, { .n_slides = NET3_SLIDES, .unit_page = "netunit3", .ex_page = "netex3" },
@ -22,6 +22,7 @@ NetLesson net_lessons[NET_LESSONS] = {
{ .n_slides = NET14_SLIDES, .unit_page = "netunit14", .ex_page = "netex14" }, { .n_slides = NET14_SLIDES, .unit_page = "netunit14", .ex_page = "netex14" },
{ .n_slides = NET15_SLIDES, .unit_page = "netunit15", .ex_page = "netex15" }, { .n_slides = NET15_SLIDES, .unit_page = "netunit15", .ex_page = "netex15" },
{ .n_slides = NET16_SLIDES, .unit_page = "netunit16", .ex_page = "netex16" }, { .n_slides = NET16_SLIDES, .unit_page = "netunit16", .ex_page = "netex16" },
{ .n_slides = NET17_SLIDES, .unit_page = "netunit17", .ex_page = "netex17" },
}; };
void net_paragraph(GtkWidget *box, const char *text) { void net_paragraph(GtkWidget *box, const char *text) {
@ -463,7 +464,7 @@ void net_add_node(GtkFixed *fixed, int index) {
"net_unit1", "net_unit2", "net_unit3", "net_unit4", "net_unit5", "net_unit1", "net_unit2", "net_unit3", "net_unit4", "net_unit5",
"net_unit6", "net_unit7", "net_unit8", "net_unit9", "net_unit10", "net_unit6", "net_unit7", "net_unit8", "net_unit9", "net_unit10",
"net_unit11", "net_unit12", "net_unit13", "net_unit14", "net_unit15", "net_unit11", "net_unit12", "net_unit13", "net_unit14", "net_unit15",
"net_unit16" "net_unit16", "net_unit17"
}; };
card = gtk_button_new(); card = gtk_button_new();
@ -1514,6 +1515,74 @@ GtkWidget *build_net_unit16_page(void) {
slides, NET16_SLIDES); slides, NET16_SLIDES);
} }
GtkWidget *build_net_unit17_page(void) {
static const NetSlide slides[NET17_SLIDES] = {
{
"1 / 7 • Přehled", "Aktivní prvky",
NULL,
{
"Aktivní prvky zpracovávají nebo převádí signál / data.",
"Liší se podle vrstvy ISO/OSI, na které pracují.",
NULL,
},
},
{
"2 / 7 • Repeater", "Opakovač",
"Tip: fyzická vrstva",
{
"Zesiluje signál a tím zvyšuje dosah.",
NULL,
},
},
{
"3 / 7 • Transceiver", "Konvertor",
"Tip: fyzická vrstva",
{
"Převádí signál mezi různými médii.",
"Například metaliku na optiku.",
NULL,
},
},
{
"4 / 7 • Hub", "Rozbočovač",
"Tip: fyzická vrstva – „hloupý“ prvek",
{
"Co přijme na jednom portu, rozešle do všech ostatních.",
NULL,
},
},
{
"5 / 7 • Bridge/Switch", "Most a přepínač",
"Tip: linková vrstva – rámce a MAC",
{
"Pracují s rámci a MAC adresami.",
"Switch dělí síť na kolizní domény.",
NULL,
},
},
{
"6 / 7 • Router", "Směrovač",
"Tip: síťová vrstva – pakety a IP",
{
"Pracuje s pakety a IP adresami.",
"Propojuje různé sítě.",
NULL,
},
},
{
"7 / 7 • Gateway", "Brána",
"Tip: vyšší vrstvy",
{
"Převádí mezi odlišnými architekturami nebo protokoly.",
NULL,
},
},
};
return build_net_unit_page(&net_lessons[16], "net_unit17", "net_unit17_sub",
slides, NET17_SLIDES);
}
/* Solutions below are the canonical "largest subnet first, in order A–D" /* 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 * allocation. Scenario 3 does not fit into a /24 as written, which is why
* its "solution" explains that instead. */ * its "solution" explains that instead. */
@ -2636,3 +2705,44 @@ GtkWidget *build_net_unit16_exercise_page(void) {
(int)G_N_ELEMENTS(net16_qs)); (int)G_N_ELEMENTS(net16_qs));
} }
const ChoiceQ net17_qs[] = {
{"Repeater (opakovač) hlavně:",
{"Zesiluje signál a zvyšuje dosah", "Směruje IP pakety",
"Převádí mezi protokoly vyšších vrstev", "Rezervuje médium RTS/CTS"}, 4, 0},
{"Transceiver typicky:",
{"Převádí signál mezi různými médii", "Dělí síť jen podle DNS",
"Je vždy jen brána", "Pracuje jen s UDP"}, 4, 0},
{"Hub (rozbočovač) je:",
{"„Hloupý“ prvek – data z jednoho portu pošle všem ostatním",
"Směrovač na síťové vrstvě", "Jen laserový zdroj",
"Jen MAC filtr bez portů"}, 4, 0},
{"Bridge a switch pracují na vrstvě:",
{"Fyzické", "Linkové (rámce a MAC)", "Aplikační", "Jen transportní"}, 4, 1},
{"Switch mimo jiné:",
{"Dělí síť na kolizní domény", "Nikdy nepoužívá MAC adresy",
"Funguje jen jako hub bez portů", "Převádí jen ASCII"}, 4, 0},
{"Router pracuje s:",
{"Pakety a IP adresami a propojuje sítě", "Jen koaxiálem bez IP",
"Jen huby bez směrování", "Jen RTS/CTS"}, 4, 0},
{"Gateway (brána) především:",
{"Převádí mezi odlišnými architekturami/protokoly",
"Jen zesiluje bitový signál", "Jen tvoří kolize",
"Jen lámání vlákna"}, 4, 0},
};
const char *net17_hints[] = {
"Repeater zesiluje signál na fyzické vrstvě",
"Transceiver převádí mezi médii (např. metalika ↔ optika)",
"Hub rozešle přijatá data do všech ostatních portů",
"Bridge/switch = linková vrstva, rámce a MAC",
"Switch dělí síť na kolizní domény",
"Router = síťová vrstva, pakety a IP, propojuje sítě",
"Gateway převádí mezi odlišnými architekturami/protokoly",
};
GtkWidget *build_net_unit17_exercise_page(void) {
return build_net_mcq_page(16, "netunit17", "net_ex17_title", "net_quiz17_head",
net17_qs, net17_hints,
(int)G_N_ELEMENTS(net17_qs));
}