diff --git a/README.md b/README.md index 6bf52fd..4bce260 100644 --- a/README.md +++ b/README.md @@ -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–20 are playable**, units 21–30 are locked placeholders + **units 1–21 are playable**, units 22–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** – twenty unlocked units (theory slides + practice): +- **Computer networks path** – twenty-one 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” @@ -84,7 +84,8 @@ GTK 4 interface. 17. Aktivní prvky – slides + quiz 18. Switch (podrobně) – slides + quiz 19. Směrování (Routing) – slides + quiz - 20. Směrovač a brána – slides + quiz + 20. Směrovač a brána – slides + quiz + 21. Adresy a rámce v ethernetu – 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): @@ -307,11 +308,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–20** are open. Unit 1 (**Výpočet IP adres**) +5. On the networks path, units **1–21** 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–20 each have theory slides followed by - a multiple-choice quiz (basic concepts through routers and gateways). - Units 21–30 stay locked placeholders. + with check / “show solution”. Units 2–21 each have theory slides followed by + a multiple-choice quiz (basic concepts through Ethernet addresses/frames). + Units 22–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. @@ -462,7 +463,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–20 jsou hratelné**, 21–30 jsou zamčené + s 30 jednotkami; **jednotky 1–21 jsou hratelné**, 22–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é @@ -488,7 +489,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í** – dvacet odemčených jednotek (snímky + cvičení): +- **Cesta počítačových sítí** – jednadvacet 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 @@ -509,7 +510,8 @@ moderním GTK 4 rozhraním stylovaným přes CSS. 17. Aktivní prvky – snímky + kvíz 18. Switch (podrobně) – snímky + kvíz 19. Směrování (Routing) – snímky + kvíz - 20. Směrovač a brána – snímky + kvíz + 20. Směrovač a brána – snímky + kvíz + 21. Adresy a rámce v ethernetu – 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): @@ -730,10 +732,11 @@ 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–20**. Jednotka 1 (**Výpočet IP +5. Na síťové cestě jsou otevřené jednotky **1–21**. 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–20 mají snímky teorie a kvíz s výběrem - (od základních pojmů po směrovač a bránu). Jednotky 21–30 zůstávají zamčené. + „ukázat řešení“. Jednotky 2–21 mají snímky teorie a kvíz s výběrem + (od základních pojmů po ethernetové adresy a rámce). Jednotky 22–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é. @@ -777,8 +780,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–20 - (1: VLSM cvičení; 2–20: kvízy s výběrem) +net.c cesta počítačových sítí (30 uzlů), jednotky 1–21 + (1: VLSM cvičení; 2–21: 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 diff --git a/i18n.c b/i18n.c index bcec3ba..e65dc11 100644 --- a/i18n.c +++ b/i18n.c @@ -317,6 +317,12 @@ const TrEntry tr_ui[] = { "7 slides about routers and gateways, then a quiz."}, {"net_ex20_title", "Kvíz: směrovač a brána", "Quiz: router and gateway"}, + {"net_unit21", "Adresy a rámce v ethernetu", + "Ethernet addresses and frames"}, + {"net_unit21_sub", "8 snímků o MAC a typech rámců a pak kvíz.", + "8 slides about MAC and frame types, then a quiz."}, + {"net_ex21_title", "Kvíz: ethernet adresy a rámce", + "Quiz: Ethernet addresses and frames"}, {"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."}, @@ -358,6 +364,8 @@ const TrEntry tr_ui[] = { "Quiz on routing"}, {"net_quiz20_head", "Kvíz ke směrovači a bráně", "Quiz on router and gateway"}, + {"net_quiz21_head", "Kvíz k ethernetovým adresám a rámcům", + "Quiz on Ethernet addresses and frames"}, {"net_slide_next", "Další", "Next"}, {"net_slide_prev", "Zpět", "Back"}, {"net_slide_start", "Přejít na cvičení", "Go to the exercise"}, @@ -676,6 +684,20 @@ const TrEntry tr_content[] = { "A gateway connects a LAN to a different environment"}, {"Pojem brána někdy označuje router nebo LAN–WAN připojení", NULL, "Gateway sometimes means a router or LAN–WAN connection"}, + {"MAC adresa Ethernetu má 48 bitů a je unikátní", NULL, + "An Ethernet MAC address is 48 bits and unique"}, + {"IEEE přidělí výrobci první 3 byty adresy", NULL, + "IEEE assigns the manufacturer the first 3 address bytes"}, + {"Ethernet II: EtherType > 1500 (IP = 0800h)", NULL, + "Ethernet II: EtherType > 1500 (IP = 0800h)"}, + {"IEEE 802.3: délka ≤ 1500 a rámec 802.2", NULL, + "IEEE 802.3: length ≤ 1500 and an 802.2 frame"}, + {"Raw 802.3: Novell/IPX, začíná FFFFh", NULL, + "Raw 802.3: Novell/IPX, starts with FFFFh"}, + {"Max. Ethernet II = 1518 B", NULL, + "Max Ethernet II frame = 1518 B"}, + {"Min. rámec 64 B kvůli koliznímu okénku", NULL, + "Min frame is 64 B due to the collision window"}, {"čtrnáct", NULL, "fourteen"}, {"sedmnáct", NULL, "seventeen"}, {"dvacet", NULL, "twenty"}, diff --git a/main.c b/main.c index 8be123b..65ffe2f 100644 --- a/main.c +++ b/main.c @@ -266,6 +266,7 @@ void activate(GtkApplication *app, gpointer user_data) { {"netunit18", "netex18", build_net_unit18_page, build_net_unit18_exercise_page}, {"netunit19", "netex19", build_net_unit19_page, build_net_unit19_exercise_page}, {"netunit20", "netex20", build_net_unit20_page, build_net_unit20_exercise_page}, + {"netunit21", "netex21", build_net_unit21_page, build_net_unit21_exercise_page}, }; for (guint i = 0; i < G_N_ELEMENTS(net_pages); i++) { diff --git a/maturita.h b/maturita.h index 965c376..afc83c6 100644 --- a/maturita.h +++ b/maturita.h @@ -69,7 +69,8 @@ #define NET18_SLIDES 5 #define NET19_SLIDES 7 #define NET20_SLIDES 7 -#define NET_LESSONS 20 +#define NET21_SLIDES 8 +#define NET_LESSONS 21 #define HW_UNITS 10 #define HW_LESSONS 3 #define HW_SLIDES 3 @@ -1103,6 +1104,7 @@ GtkWidget *build_net_unit17_page(void); GtkWidget *build_net_unit18_page(void); GtkWidget *build_net_unit19_page(void); GtkWidget *build_net_unit20_page(void); +GtkWidget *build_net_unit21_page(void); GtkWidget *net_qz_combo(void); void net_qz_set_prefix(GtkComboBoxText *c, int pfx); int net_qz_prefix(GtkComboBoxText *c); @@ -1136,6 +1138,7 @@ GtkWidget *build_net_unit17_exercise_page(void); GtkWidget *build_net_unit18_exercise_page(void); GtkWidget *build_net_unit19_exercise_page(void); GtkWidget *build_net_unit20_exercise_page(void); +GtkWidget *build_net_unit21_exercise_page(void); void activate(GtkApplication *app, gpointer user_data); int main(int argc, char **argv); diff --git a/net.c b/net.c index 580d934..863ac63 100644 --- a/net.c +++ b/net.c @@ -5,7 +5,7 @@ NetLesson net_lessons[NET_LESSONS] = { /* UI unit N maps to lesson content: unit 1 = IP/VLSM (extra); - * units 2–20 = source topics (Základní pojmy … směrovač a brána). */ + * units 2–21 = source topics (Základní pojmy … ethernet adresy/rámce). */ { .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" }, @@ -26,6 +26,7 @@ NetLesson net_lessons[NET_LESSONS] = { { .n_slides = NET18_SLIDES, .unit_page = "netunit18", .ex_page = "netex18" }, { .n_slides = NET19_SLIDES, .unit_page = "netunit19", .ex_page = "netex19" }, { .n_slides = NET20_SLIDES, .unit_page = "netunit20", .ex_page = "netex20" }, + { .n_slides = NET21_SLIDES, .unit_page = "netunit21", .ex_page = "netex21" }, }; void net_paragraph(GtkWidget *box, const char *text) { @@ -467,7 +468,8 @@ 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_unit19", "net_unit20" + "net_unit16", "net_unit17", "net_unit18", "net_unit19", "net_unit20", + "net_unit21" }; card = gtk_button_new(); @@ -1800,6 +1802,92 @@ GtkWidget *build_net_unit20_page(void) { slides, NET20_SLIDES); } +GtkWidget *build_net_unit21_page(void) { + static const NetSlide slides[NET21_SLIDES] = { + { + "1 / 8 • Ethernet", "Síťový hardware", + NULL, + { + "Jeden ze standardů síťového hardware.", + "Dnes nejpoužívanější.", + NULL, + }, + }, + { + "2 / 8 • Adresy", "48bitová MAC", + "Tip: IEEE přidělí první 3 B, výrobce další 3 B", + { + "Adresa má 48 bitů (6 bytů) a je celosvětově jedinečná.", + "Je pevně v síťové kartě už od výroby.", + "Výrobci dostávají bloky adres od IEEE.", + NULL, + }, + }, + { + "3 / 8 • Rámce", "Typy hlaviček", + NULL, + { + "Rámec = skupina bitů na linkové vrstvě.", + "Hlavička má adresy odesílatele/příjemce a typ obsahu.", + "Typy: Ethernet II, IEEE 802.3, 802.3 SNAP, raw 802.3.", + NULL, + }, + }, + { + "4 / 8 • Ethernet II", "DIX + EtherType", + "Tip: EtherType > 1500 (např. IP = 0800h)", + { + "Původní DIX Ethernet.", + "Hlavička: příjemce 6 B, odesílatel 6 B, EtherType 2 B.", + "EtherType identifikuje protokol (IP, IPX…).", + NULL, + }, + }, + { + "5 / 8 • IEEE 802.3", "Délka místo typu", + NULL, + { + "Místo EtherType je údaj o délce (vždy ≤ 1500).", + "Uvnitř je rámec 802.2 (stejný i pro Token Ring).", + "Typ protokolu je v SAP mezi linkovou a síťovou vrstvou.", + NULL, + }, + }, + { + "6 / 8 • Raw 802.3", "Novell / IPX", + NULL, + { + "„Holý“ rámec 802.3 bez 802.2 (Novell).", + "Funguje jen v prostředí IPX.", + "Paket začíná dvěma byty FFFFh.", + NULL, + }, + }, + { + "7 / 8 • SNAP", "802.2 SNAP", + "Tip: byty 15–16 za délkou = AAAAh", + { + "Vložen do rámce 802.3.", + "Rozšiřuje identifikaci protokolu až na 5 bytů.", + NULL, + }, + }, + { + "8 / 8 • Velikost", "Min / max / MTU", + NULL, + { + "Max. Ethernet II: 1500 + 18 = 1518 B.", + "Min. velikost: 64 B (kolizní okénko).", + "MTU je obvyklé omezení velikosti na routerech.", + NULL, + }, + }, + }; + + return build_net_unit_page(&net_lessons[20], "net_unit21", "net_unit21_sub", + slides, NET21_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. */ @@ -3085,3 +3173,43 @@ GtkWidget *build_net_unit20_exercise_page(void) { (int)G_N_ELEMENTS(net20_qs)); } +const ChoiceQ net21_qs[] = { + {"Ethernetová adresa má:", + {"48 bitů (6 bytů) a je jedinečná", "Jen 16 bitů", "Jen 32 bitů IP", + "Jen 8 bitů SAP"}, 4, 0}, + {"První 3 byty MAC adresy přiděluje:", + {"IEEE výrobci", "Jen uživatel v BIOS", "Jen DNS server", + "Jen Aloha"}, 4, 0}, + {"Ethernet II v hlavičce používá:", + {"EtherType (např. IP = 0800h, hodnota > 1500)", + "Jen délku ≤ 1500 bez typu", "Jen FFFFh bez adres", + "Jen AAAAh bez MAC"}, 4, 0}, + {"IEEE 802.3 místo EtherType má:", + {"Údaj o délce (≤ 1500) a uvnitř 802.2", "Jen cut-through", + "Jen 64 B MTU bez délky", "Jen laserovou hlavičku"}, 4, 0}, + {"Raw 802.3 (Novell):", + {"Bez 802.2, jen IPX, začíná FFFFh", "Funguje jen s HTTP", + "Má vždy EtherType 0800h", "Nemá žádné adresy"}, 4, 0}, + {"Maximální rámec Ethernet II je:", + {"1518 B (1500 + 18)", "64 B", "900 µm", "250 µm"}, 4, 0}, + {"Minimální velikost rámce plyne z:", + {"Kolizního okénka (64 B)", "Jen z MTU routeru", "Jen z SNAP AAAAh", + "Jen z Token Ring"}, 4, 0}, +}; + +const char *net21_hints[] = { + "MAC adresa Ethernetu má 48 bitů a je unikátní", + "IEEE přidělí výrobci první 3 byty adresy", + "Ethernet II: EtherType > 1500 (IP = 0800h)", + "IEEE 802.3: délka ≤ 1500 a rámec 802.2", + "Raw 802.3: Novell/IPX, začíná FFFFh", + "Max. Ethernet II = 1518 B", + "Min. rámec 64 B kvůli koliznímu okénku", +}; + +GtkWidget *build_net_unit21_exercise_page(void) { + return build_net_mcq_page(20, "netunit21", "net_ex21_title", "net_quiz21_head", + net21_qs, net21_hints, + (int)G_N_ELEMENTS(net21_qs)); +} +