#!/usr/bin/env python3 """Years 2–4 of networks and hardware. Slides plus a four-question quiz.""" from pathlib import Path ROOT = Path(__file__).resolve().parents[1] def c(text): return '"' + text.replace("\\", "\\\\").replace('"', '\\"') + '"' def S(kicker, title, tip, *lines): return (kicker, title, tip, lines) def Q(prompt, options, correct, hint): if len(options) != 4: raise SystemExit(f"need 4 options: {prompt}") if not 0 <= correct < 4: raise SystemExit(prompt) return (prompt, options, correct, hint) def L(title, title_en, sub, sub_en, slides, quiz): if len(slides) != 3 or len(quiz) != 4: raise SystemExit(title) return { "title": title, "title_en": title_en, "sub": sub, "sub_en": sub_en, "slides": slides, "quiz": quiz, } def course(prefix, sub, sub_en, lessons): if len(lessons) != 8: raise SystemExit(f"{prefix} has {len(lessons)}") return {"prefix": prefix, "sub": sub, "sub_en": sub_en, "lessons": lessons} NET2 = course( "net2", "VLAN, STP, DHCP, DNS, NAT, IPv6, statické směrování a ACL.", "VLANs, STP, DHCP, DNS, NAT, IPv6, static routing and ACLs.", [ L("VLAN a trunk", "VLANs and trunks", "Logické sítě na jednom přepínači a značkovaný spoj.", "Logical networks on one switch and a tagged link.", [ S("1 / 3 • VLAN", "Oddělení provozu", "Tip: VLAN není samostatný kabel, je to značka v rámci.", "VLAN sdružuje porty do jedné vysílací domény.", "Počítače v různých VLAN spolu přímo na druhé vrstvě nemluví.", "Číslo VLAN se na trunku vozí ve značce 802.1Q.", "Nativní VLAN na trunku jede neznačkovaná. Na obou koncích musí sedět."), S("2 / 3 • Porty", "Access a trunk", "Tip: access port patří do jedné VLAN, trunk jich nese víc.", "Access port se připojuje ke koncovému zařízení.", "Trunk spojuje přepínače nebo přepínač s routerem.", "Povolené VLAN na trunku omezí, co smí přejít.", "Špatně nastavený trunk pustí cizí VLAN do špatné sítě."), S("3 / 3 • Provoz", "K čemu se VLAN hodí", "Tip: oddělení hostů od školy nesmí stát jen na hesle Wi-Fi.", "Hosté, škola a správa mohou sdílet jeden přepínač.", "Hlasová VLAN oddělí telefony od dat.", "Mezi VLAN se dostane jen směrovač nebo přepínač třetí vrstvy.", "VLAN zmenšuje broadcast, nenahrazuje firewall."), ], [ Q("Co VLAN na přepínači dělá?", ["Sdruží porty do jedné vysílací domény", "Zrychlí procesor serveru", "Nahradí šifrování WPA3", "Přidělí veřejnou IPv4 adresu"], 0, "VLAN odděluje provoz na druhé vrstvě."), Q("Jak se VLAN pozná na trunku?", ["Značkou 802.1Q v rámci", "Jinou MAC adresou zdroje", "Jiným konektorem RJ11", "Bitem v ICMP"], 0, "802.1Q vloží do ethernetového rámce číslo VLAN."), Q("Kam patří access port?", ["Ke koncovému počítači v jedné VLAN", "Jen mezi dvěma routery", "Na optický spoj s vlnovým multiplexem", "Do napájecího zdroje"], 0, "Access port má jednu VLAN a značku obvykle sundá."), Q("Jak spolu mluví dvě různé VLAN?", ["Přes směrování, ne přímo na druhé vrstvě", "Samy od sebe, VLAN je jen barva kabelu", "Jedině přes ARP broadcast do všech VLAN", "Jen když mají stejnou MAC adresu"], 0, "Mezi VLAN je potřeba router nebo L3 switch."), ]), L("STP a smyčky", "STP and loops", "Proč smyčka na druhé vrstvě shodí síť a jak ji STP přeruší.", "Why a layer-2 loop takes the network down, and how STP breaks it.", [ S("1 / 3 • Smyčka", "Broadcastová bouře", "Tip: na druhé vrstvě není TTL, rámec může kroužit donekonečna.", "Dva kabely mezi stejnými přepínači vytvoří smyčku.", "Broadcast se kopíruje na všechny porty a vrátí se zpět.", "Přepínač se zahltí a přestane přenášet užitečný provoz.", "Na třetí vrstvě paket TTL snižuje, ethernetový rámec ne."), S("2 / 3 • STP", "Jedna aktivní cesta", "Tip: STP nevybírá nejrychlejší cestu pro data, brání smyčce.", "Přepínače si volí root bridge, obvykle nejnižší bridge ID.", "Některé porty zůstanou ve stavu blocking a rámce nepřeposílají.", "Když aktivní linka spadne, blocking port se může otevřít.", "RSTP reaguje rychleji než původní STP."), S("3 / 3 • Ochrana", "Porty, které nemají přepínat", "Tip: port k tiskárně nemá poslouchat cizí BPDU.", "PortFast na access portu zrychlí připojení počítače.", "BPDU Guard port shodí, když na něm přijde BPDU.", "Root Guard brání tomu, aby se cizí switch stal rootem.", "Záložní kabel má smysl, ale jen se zapnutým STP."), ], [ Q("Proč je smyčka na přepínačích nebezpečná?", ["Broadcast může kroužit bez omezení TTL", "IPv4 přestane mít masku", "DNS přejmenuje domény", "Procesor v počítači se vypne"], 0, "Ethernetový rámec nemá TTL."), Q("Co STP s nadbytečným portem udělá?", ["Nechá ho blokovat, aby nevznikla smyčka", "Zdvojnásobí rychlost obou kabelů", "Smaže MAC tabulku navždy", "Přesměruje port na VLAN 1 a vypne ostatní"], 0, "Blocking port rámce nepřeposílá, dokud není potřeba."), Q("K čemu je BPDU Guard?", ["Shodí access port, na kterém se objeví cizí přepínač", "Šifruje heslo k Wi-Fi", "Přiděluje IPv6 adresy", "Měří útlum optiky"], 0, "Na portu pro počítač nemá co dělat protokol přepínačů."), Q("Které tvrzení o RSTP sedí?", ["Na výpadek reaguje rychleji než původní STP", "Ruší potřebu VLAN", "Funguje jen na IPv6", "Nahrazuje směrovací tabulku"], 0, "RSTP zkracuje čekání při změně topologie."), ]), L("DHCP a DNS", "DHCP and DNS", "Kdo přiděluje adresu a kdo překládá jméno.", "Who hands out an address, and who translates a name.", [ S("1 / 3 • DHCP", "Adresa bez opisování", "Tip: DHCP dává adresu na čas, ne navždy.", "Klient pošle broadcast a hledá server.", "Nabídka obsahuje adresu, masku, bránu a DNS.", "Zapůjčení má dobu platnosti a klient ji obnovuje.", "Rezervace přiváže adresu ke konkrétní MAC adrese."), S("2 / 3 • Rozsah", "Co se nesmí překrývat", "Tip: dva servery se stejnou adresou v jedné síti si škodí.", "Rozsah musí ležet v síti, kterou má brána.", "Statické adresy serverů do rozsahu nepatří, nebo se vyloučí.", "Špatná brána v nabídce odřízne celou VLAN od internetu.", "DHCP relay přenese požadavek z VLAN, kde server není."), S("3 / 3 • DNS", "Jméno na adresu", "Tip: DNS není totéž co DHCP. Jedno dává adresu, druhé jméno.", "A záznam ukazuje na IPv4, AAAA na IPv6.", "Reverzní PTR překládá adresu zpět na jméno.", "Rekurzivní resolver se ptá dál, autoritativní server zónu vlastní.", "TTL u záznamu říká, jak dlouho se smí odpověď cacheovat."), ], [ Q("Co klient od DHCP obvykle dostane?", ["Adresu, masku, bránu a DNS", "Jen heslo k Wi-Fi", "Novou MAC adresu", "Kořenový certifikát webu"], 0, "To jsou čtyři údaje, bez kterých stanice v síti nepracuje."), Q("Proč se rezervace v DHCP hodí?", ["Zařízení s danou MAC dostane pořád stejnou adresu", "Vypne potřebu masky", "Nahradí směrování", "Zašifruje disk"], 0, "Rezervace je vhodná pro tiskárny a kamery."), Q("Čím se liší A a AAAA?", ["A je IPv4, AAAA je IPv6", "A je pošta, AAAA je web", "A je jméno VLAN, AAAA je číslo portu", "Oba ukazují jen na IPv4"], 0, "Čtyři A v názvu připomínají delší IPv6 adresu."), Q("K čemu je DHCP relay?", ["Pošle požadavek z jiné VLAN k serveru", "Překládá jména bez DNS", "Blokuje STP", "Mění rychlost portu na 10 Gb/s"], 0, "Broadcast DHCP jinak VLAN neopustí."), ]), L("NAT a PAT", "NAT and PAT", "Jedna veřejná adresa pro mnoho počítačů.", "One public address for many computers.", [ S("1 / 3 • NAT", "Soukromé adresy ven", "Tip: 192.168.0.0/16 a 10.0.0.0/8 na internetu směrovat nejdou.", "NAT přepíše zdrojovou adresu při odchodu z lokální sítě.", "Zpět router podle tabulky překladů provoz vrátí.", "Zvenku nikdo sám od sebe spojení dovnitř nenaváže.", "To je vedlejší efekt, ne náhrada firewallu."), S("2 / 3 • PAT", "Mnoho počítačů, jedna adresa", "Tip: PAT si pamatuje i číslo portu, ne jen adresu.", "Více vnitřních adres sdílí jednu veřejnou.", "Rozliší je zdrojový port.", "Domácí router dělá téměř vždy PAT, ne čistý NAT jedna ku jedné.", "Dojdou-li porty, nová spojení se neotevřou."), S("3 / 3 • Dovnitř", "Když má server být vidět", "Tip: přesměrování portu otevře jen tu službu, kterou opravdu chcete.", "Port forward pošle příchozí port na vnitřní adresu.", "Na serveru pak musí poslouchat daná služba a firewall ji pustit.", "DMZ na domácím routeru vystaví jeden počítač hodně otevřeně.", "Lepší je konkrétní port než celá DMZ."), ], [ Q("Proč stanice s adresou 192.168.1.20 není z internetu vidět přímo?", ["Je to soukromá adresa a ven jde až přes NAT", "IPv4 takové adresy nezná", "MAC adresa se na internetu nesmí použít jako jméno", "DNS soukromé adresy maže"], 0, "Soukromé rozsahy se mezi poskytovateli nesměrují."), Q("Čím se PAT liší od NAT jedna ku jedné?", ["Více vnitřních adres sdílí jednu veřejnou a liší se portem", "PAT šifruje provoz", "PAT funguje jen pro IPv6", "PAT ruší potřebu brány"], 0, "Překlad zahrnuje adresu i port."), Q("K čemu je přesměrování portu?", ["Příchozí spojení na daný port pošle na vnitřní server", "Přidělí VLAN", "Zapne STP", "Změní masku celé školy na /8"], 0, "Bez něj zvenku na vnitřní web sami nedosáhnete."), Q("Proč NAT není firewall?", ["Jen překládá adresy, pravidla provozu řeší firewall", "NAT umí totéž co antivir", "NAT kontroluje hesla uživatelů", "NAT šifruje Wi-Fi"], 0, "Nechtěný publikovaný port NAT klidně pustí."), ]), L("IPv6 základy", "IPv6 basics", "Delší adresa, jiný zápis a co se nemění.", "A longer address, a different notation, and what stays the same.", [ S("1 / 3 • Adresa", "128 bitů", "Tip: nuly v jedné skupině za sebou smí zkrátit :: jen jednou.", "Adresa má osm skupin po čtyřech hexadecimálních číslicích.", "Prefix se píše jako /64, ne jako stará maska 255.255.255.0.", "Link-local adresa fe80:: platí jen na tom spoji.", "Globální adresa je vidět i mimo místní spoj."), S("2 / 3 • Přidělení", "SLAAC a DHCPv6", "Tip: výchozí bránu v IPv6 často ohlašuje router, ne DHCP.", "Router advertisement řekne prefix a jestli se stanice smí nastavit sama.", "SLAAC složí adresu z prefixu a identifikátoru rozhraní.", "DHCPv6 přidá adresu nebo jen DNS, podle příznaků.", "Obě varianty mohou běžet vedle sebe."), S("3 / 3 • Vedle IPv4", "Dual stack", "Tip: IPv6 nevypínejte jen proto, že mu nerozumíte. Rozbitý IPv6 zpomalí i weby.", "Počítač může mít IPv4 i IPv6 naráz.", "DNS AAAA záznam rozhoduje, jestli se klient zkusí spojit po IPv6.", "NAT u IPv6 není nutný tak jako u IPv4, ale firewall ano.", "Ping na IPv6 je jiný příkaz než ping na IPv4, podle systému."), ], [ Q("Jak je IPv6 adresa dlouhá?", ["128 bitů", "32 bitů", "48 bitů", "256 bitů"], 0, "IPv4 má 32 bitů, IPv6 čtyřikrát tolik."), Q("Která adresa je link-local?", ["fe80::1", "192.168.1.1", "8.8.8.8", "255.255.255.255"], 0, "fe80:: platí jen na místním spoji."), Q("Kdo v IPv6 často oznámí prefix?", ["Router advertisement", "ARP request", "STP hello", "Jen ruční zápis do hosts"], 0, "Router říká stanicím, jaký prefix na spoji platí."), Q("Co znamená dual stack?", ["Zařízení používá IPv4 i IPv6", "Dva switche v jedné VLAN", "Dvě masky u jedné IPv4 adresy", "Záloha jen na pásku"], 0, "Oba protokoly běží současně."), ]), L("Statické směrování", "Static routing", "Ruční cesta, metrika a kdy přestane stačit.", "A hand-written route, the metric, and when it is no longer enough.", [ S("1 / 3 • Trasa", "Kam s paketem", "Tip: směrovací tabulka se dívá na síť, ne na jednu adresu stanice.", "Záznam říká síť, masku nebo prefix a další skok.", "Další skok musí být dosažitelný na přímo připojeném rozhraní.", "Výchozí trasa 0.0.0.0/0 chytí vše, co nemá přesnější záznam.", "Přesnější prefix vyhraje nad kratším."), S("2 / 3 • Metrika", "Když je cest víc", "Tip: nižší administrativní vzdálenost znamená důvěryhodnější zdroj trasy.", "Statická trasa má lepší vzdálenost než OSPF nebo RIP.", "Metrika porovnává trasy ze stejného zdroje.", "Plovoucí statická trasa má horší vzdálenost a čeká jako záloha.", "Špatný další skok vytvoří černou díru: paket odejde a ztratí se."), S("3 / 3 • Meze", "Kdy ruční tabulka nestačí", "Tip: deset poboček se statickými trasami neudržíte po každé změně.", "Statika je přehledná v malé síti a na okraji k poskytovateli.", "Neumí sama obejít spadlou cestu, pokud záloha není připravená.", "Na směrovači musí sedět trasa tam i zpět, jinak odpověď nepřijde.", "Změna adresace znamená obejít všechny ruční záznamy."), ], [ Q("Na co se směrovač dívá při výběru trasy?", ["Na síť a prefix, ne na jméno počítače", "Na barvu kabelu", "Na VLAN jméno v DNS", "Jen na MAC adresu cíle"], 0, "Třetí vrstva směruje podle prefixu."), Q("Která trasa je výchozí?", ["0.0.0.0/0", "255.255.255.255/32", "192.168.1.1/32", "::1/128"], 0, "Nulová síť s nulovým prefixem chytí zbytek."), Q("Co je plovoucí statická trasa?", ["Záložní ruční trasa s horší vzdáleností", "Trasa, která plave mezi VLAN bez routeru", "Automatický OSPF", "Záznam jen v ARP"], 0, "Nastoupí, až když zmizí lepší cesta."), Q("Proč odpověď ze serveru nedorazí, i když tam paket došel?", ["Chybí zpáteční trasa", "TCP nemá porty", "IPv4 neumí odpovědi", "Switch maže cílové MAC adresy"], 0, "Cesta musí existovat oběma směry."), ]), L("ACL a filtrování", "ACLs and filtering", "Seznam, který provoz pustí a který zahodí.", "A list that permits traffic or drops it.", [ S("1 / 3 • Pravidla", "Pořadí rozhoduje", "Tip: první shoda vyhrává. Obecné povolení na začátku pozdější zákaz schová.", "ACL zkouší řádky shora dolů.", "Na konci bývá tiché zamítnutí všeho ostatního.", "Pravidlo umí adresu, protokol a port.", "Jedno špatné pořadí otevře službu, kterou jste chtěli zavřít."), S("2 / 3 • Směr", "Dovnitř a ven", "Tip: blíž zdroji filtrujte to, co nemá vůbec vstoupit.", "Příchozí ACL sedí na paketech, které do rozhraní vcházejí.", "Odchozí ACL sedí na paketech, které rozhraní opouštějí.", "Filtr na VLAN rozhraní hlídá provoz mezi sítěmi.", "ACL na směrovači nevidí provoz, který zůstane uvnitř jednoho switche."), S("3 / 3 • Praxe", "Co obvykle pustit", "Tip: nejdřív povolte, co potřebujete, a zbytek nechte spadnout.", "Správa směrovače nemá poslouchat z hostovské VLAN.", "Do serverové sítě pusťte jen porty služeb, které tam jsou.", "ICMP můžete omezit, ale úplný zákaz ztíží hledání chyb.", "Po změně ACL ověřte, že legitimní provoz pořád prochází."), ], [ Q("Jak ACL vybírá pravidlo?", ["Použije první řádek, který sedí", "Sečte všechny řádky a udělá průměr", "Vždy použije poslední řádek", "Ptá se DNS"], 0, "Pořadí je součást významu seznamu."), Q("Co udělá tiché zamítnutí na konci?", ["Zahodí provoz, který žádný řádek nepovolil", "Povolí všechno, co zbylo", "Přepne port do trunku", "Pošle paket do IPv6"], 0, "Co není povoleno, neprojde."), Q("Proč ACL na routeru nehlídá dva počítače v jedné VLAN?", ["Jejich rámce jdou jen přes switch a k routeru nemusí", "ACL umí jen Wi-Fi", "VLAN nemá MAC adresy", "TCP takový provoz šifruje před switchem"], 0, "Provoz uvnitř VLAN zůstane na druhé vrstvě."), Q("Kam nepatří správa routeru?", ["Do hostovské sítě", "Na konzolový port technika", "Do správní VLAN", "Na šifrované SSH z dohledu"], 0, "Host nemá mít cestu na správu infrastruktury."), ]), L("Podniková Wi-Fi", "Enterprise Wi-Fi", "SSID, WPA3 a proč jedno heslo na nástěnce nestačí.", "SSIDs, WPA3, and why one password on the wall is not enough.", [ S("1 / 3 • SSID", "Více sítí, jedna infrastruktura", "Tip: hostovské SSID má skončit v jiné VLAN než učitelé.", "Jedno rádio může ohlašovat víc SSID.", "Každé SSID se mapuje na VLAN.", "Schované SSID není zabezpečení, jméno jde pořád zachytit.", "Stejné SSID na více přístupových bodech umožní přechod."), S("2 / 3 • Klíče", "WPA2 a WPA3", "Tip: společné heslo PSK se nedá vzít jednomu člověku, aniž by ho dostali všichni.", "WPA2-Personal sdílí jedno heslo.", "WPA2-Enterprise ověřuje uživatele přes RADIUS.", "WPA3 lépe chrání i slabší hesla a má lepší dopředné utajení.", "Starý WEP se nepoužívá."), S("3 / 3 • Pokrytí", "Kanály a přechod", "Tip: dva sousední body na stejném kanále si překážejí.", "Pásmo 2,4 GHz má málo nepřekrývajících se kanálů.", "5 GHz má víc kanálů a hůř prochází zdí.", "Výkon nesmí být zbytečně vysoký, jinak buňky slyší i cizí provoz.", "Roaming funguje, když se SSID a zabezpečení shodují."), ], [ Q("Kam má vést hostovské SSID?", ["Do vlastní VLAN, oddělené od školní sítě", "Do stejné sítě jako ředitelna", "Přímo do správy routeru", "Do sítě bez DHCP i bez izolace"], 0, "Host nemá vidět školní servery."), Q("Čím se liší WPA2-Enterprise od společného hesla?", ["Každý uživatel se ověřuje zvlášť, často přes RADIUS", "Nemá šifrování", "Funguje jen na 2,4 GHz", "Sdílí jeden klíč napsaný na tabuli"], 0, "Účet jde odebrat jednomu člověku."), Q("Proč schované SSID není ochrana?", ["Jméno sítě jde při připojení stejně zachytit", "Skryté SSID nejde vůbec použít", "WPA3 ho zakazuje", "Switch ho vyhlásí v STP"], 0, "Utajené jméno není šifra."), Q("Co vadí dvěma sousedním AP na stejném kanále?", ["Slyší se a kazí si přenos", "Smažou si VLAN", "Přestanou dělat DHCP", "Změní IPv6 na IPv4"], 0, "Kanály se mají plánovat, ne nechat náhodě."), ]), ], ) NET3 = course( "net3", "OSPF, směrování mezi VLAN, WAN, VPN, firewall, QoS a dohled.", "OSPF, inter-VLAN routing, WAN, VPN, firewalls, QoS and monitoring.", [ L("OSPF", "OSPF", "Směrovače si samy řeknou, jaké sítě znají.", "Routers tell each other which networks they know.", [ S("1 / 3 • Sousedé", "Stejná oblast", "Tip: OSPF soused nevznikne, když se neshoduje oblast nebo hello.", "Směrovače v jednom spoji si vymění hello.", "Hello interval a dead interval musí sedět.", "Oblast 0 je páteř. Ostatní oblasti se k ní připojují.", "Pasivní rozhraní hello neposílá, třeba k počítačům."), S("2 / 3 • Cena", "Kratší neznamená míň skoků", "Tip: OSPF sčítá cenu linek, ne počet routerů jako RIP.", "Rychlejší linka má obvykle nižší cenu.", "Součet cen rozhodne, kudy paket půjde.", "Ruční cena umí odtáhnout provoz ze špatné linky.", "Změna topologie se přepočítá bez přepisování statických tras."), S("3 / 3 • Tabulka", "Co se z OSPF stane", "Tip: v tabulce uvidíte zdroj trasy, ne jen další skok.", "Naučená síť se vloží do směrovací tabulky.", "Když lepší cesta spadne, použije se náhradní.", "Redistribuce natáhne do OSPF i statiku nebo jiný protokol.", "Špatná redistribuce umí do sítě pustit cizí trasy."), ], [ Q("Co musí u OSPF sousedů sedět?", ["Oblast a časy hello", "Stejná MAC adresa", "Stejné SSID", "Stejný počet VLAN na switchi"], 0, "Nesoulad hello nebo oblasti sousedství nesestaví."), Q("Podle čeho OSPF vybírá cestu?", ["Podle součtu cen linek", "Podle počtu písmen v názvu routeru", "Podle VLAN ID", "Podle stáří DNS záznamu"], 0, "Cena vyjadřuje náklad cesty, často odvozený z rychlosti."), Q("K čemu je pasivní rozhraní?", ["Neposílá hello tam, kde žádný soused být nemá", "Vypne směrování celé sítě", "Zapne NAT", "Skryje SSID"], 0, "K uživatelům se hello zbytečně neposílá."), Q("Co je oblast 0?", ["Páteř, ke které se ostatní oblasti připojují", "VLAN pro hosty", "Výchozí heslo WPA", "Číslo konzolového portu"], 0, "Bez páteře se víc oblastí OSPF nespojí správně."), ]), L("Směrování mezi VLAN", "Inter-VLAN routing", "Jedna brána pro každou VLAN.", "One gateway for each VLAN.", [ S("1 / 3 • Router na tyči", "Jeden spoj, víc VLAN", "Tip: trunk k routeru nese značky a každá VLAN má své podrozhraní.", "Switch pošle trunk do routeru.", "Každá VLAN má vlastní IP bránu.", "Stanice má jako bránu adresu své VLAN, ne cizí.", "Bez trasy mezi VLAN k sobě sítě nedosáhnou."), S("2 / 3 • L3 switch", "Směrování v přepínači", "Tip: přepínač třetí vrstvy má pro VLAN rozhraní SVI.", "SVI je virtuální rozhraní s adresou brány.", "Provoz mezi VLAN nemusí odejít na samostatný router.", "ACL na SVI hlídá, která VLAN kam smí.", "Zapomenuté SVI znamená, že VLAN nemá bránu."), S("3 / 3 • Chyby", "Když to nejde", "Tip: nejdřív ověřte, že stanice je ve správné VLAN a má správnou bránu.", "Špatná maska na bráně rozhodí celou VLAN.", "Trunk, který VLAN nepropouští, bránu odstřihne.", "Stanice v access portu špatné VLAN dostane cizí DHCP.", "Kontrola: adresa, maska, brána, VLAN, trunk, ACL."), ], [ Q("Co je brána pro stanici ve VLAN?", ["Adresa routeru nebo SVI v té samé VLAN", "Libovolná veřejná DNS adresa", "MAC adresa switche", "Číslo VLAN zapsané do masky"], 0, "Brána musí být dosažitelná na druhé vrstvě, tedy ve stejné VLAN."), Q("Co je SVI?", ["Virtuální rozhraní VLAN na L3 přepínači", "Typ optického vlákna", "Protokol pošty", "Záloha konfigurace"], 0, "SVI nese IP adresu brány dané VLAN."), Q("Jak router na tyči pozná VLAN?", ["Podle značky 802.1Q na trunku", "Podle barvy LED na počítači", "Podle jména v DNS", "Podle rychlosti ventilátoru"], 0, "Každé podrozhraní patří jedné značce."), Q("Co udělá trunk, který VLAN 20 nepropouští?", ["Střihne bránu VLAN 20 od zbytku sítě", "Smaže OSPF v celé škole", "Přepne Wi-Fi na WEP", "Zdvojí adresy DHCP"], 0, "Povolené VLAN na trunku jsou součást návrhu."), ]), L("WAN", "WAN", "Spoj mezi pobočkami a k poskytovateli.", "A link between sites and towards the provider.", [ S("1 / 3 • Okraj", "Kde končí vaše síť", "Tip: za routerem k poskytovateli už neřídíte fyzickou cestu.", "WAN spojuje vzdálené sítě přes síť, kterou nevlastníte.", "Poskytovatel vám dá adresu, bránu a často i VLAN.", "Výchozí trasa obvykle míří právě sem.", "Výpadek poslední míle odřízne pobočku, i když jádro žije."), S("2 / 3 • Technologie", "Čím se to vozí", "Tip: dnešní WAN často vypadá jako ethernet, i když pod ním je jiná síť.", "Starší spoje používaly pronajaté linky a PPP.", "MPLS u poskytovatele spojí pobočky jako jednu službu.", "Metro Ethernet přivede do budovy běžný ethernetový port.", "Rychlost, odezva a ztráty jsou parametry, které se sledují."), S("3 / 3 • Návrh", "Co domluvit", "Tip: záložní spoj má smysl jen s cestou, která se na něj umí přepnout.", "Jedna přípojka je jednoduchá a křehká.", "Druhý poskytovatel sníží riziko, když nejde stejnou trasou.", "Adresy od poskytovatele musí sedět s vaším NAT a firewallem.", "Na okraji filtrujte, co do školy z internetu lézt nemá."), ], [ Q("Co je WAN z pohledu školy?", ["Spoj mimo budovu, často přes poskytovatele", "Kabel mezi dvěma porty jednoho switche", "VLAN pro tiskárny", "Diskové pole"], 0, "WAN překračuje místní síť."), Q("Kam obvykle míří výchozí trasa?", ["K poskytovateli", "Na tiskárnu", "Do STP rootu", "Na adresu 127.0.0.1"], 0, "Co směrovač nezná, pošle ven."), Q("Proč dva spoje stejnou ulicí nemusí být záloha?", ["Jedna porucha překope oba naráz", "OSPF dva spoje zakazuje", "IPv4 umí jen jednu bránu na světě", "Ethernet nesmí mít zálohu"], 0, "Fyzicky oddělená trasa je součást redundance."), Q("Co je metro Ethernet?", ["WAN služba, která u vás končí ethernetovým portem", "Wi-Fi ve vlaku", "Protokol místo DNS", "Typ procesoru"], 0, "Pod portem může být síť poskytovatele, vy vidíte ethernet."), ]), L("VPN", "VPN", "Šifrovaný tunel přes síť, které nevěříte.", "An encrypted tunnel across a network you do not trust.", [ S("1 / 3 • Tunel", "Cizí síť jako kabel", "Tip: VPN neschová provoz před sítí, ve které tunel končí.", "Mezi dvěma body se postaví šifrovaný tunel.", "Uvnitř mohou téct soukromé adresy.", "Venku je vidět jen obal mezi konci tunelu.", "Bez shodných klíčů nebo certifikátů tunel nevstane."), S("2 / 3 • Dva tvary", "Pobočka a člověk", "Tip: site-to-site spojuje sítě, remote access jednoho uživatele.", "Site-to-site propojí dvě pobočky trvale.", "Remote access pustí notebook do školní sítě.", "Uživatel se ověřuje účtem, ne jen společným heslem na zdi.", "Split tunnel posílá tunelem jen školní sítě, zbytek jde přímo."), S("3 / 3 • Chyby", "Když tunel stojí a data ne", "Tip: tunel může svítit zeleně a přesto chybí trasa dovnitř.", "Musí sedět návrh šifry na obou koncích.", "Firewall po cestě musí pustit port VPN.", "Uvnitř musí existovat trasa do cílových sítí.", "Příliš široký tunel stáhne na školu i provoz, který tam být neměl."), ], [ Q("Co VPN před cizí sítí skrývá?", ["Obsah a vnitřní adresy, venku je vidět obal tunelu", "I to, že nějaký provoz existuje", "MAC adresu switche ve třídě", "Úplně všechno včetně konců tunelu"], 0, "Koncové adresy tunelu vidět jsou, náklad ne."), Q("Čím se liší site-to-site od remote access?", ["První spojuje sítě, druhá připojuje uživatele", "První je Wi-Fi, druhá je VLAN", "Obě jen mění DNS", "Remote access nejde šifrovat"], 0, "Notebook není druhá pobočka, i když tunel vypadá podobně."), Q("Proč tunel svítí, ale server nehraje?", ["Chybí trasa nebo firewall uvnitř", "IPv4 zakazuje VPN", "STP tunely maže", "DNS přejmenuje šifru"], 0, "Šifra a dosažitelnost jsou dvě vrstvy."), Q("Co je split tunnel?", ["Tunelem jde jen provoz do vnitřních sítí", "Každý paket se rozpůlí", "VPN bez šifry", "Dva SSID na jednom kanále"], 0, "Internet z notebooku pak nemusí téct přes školu."), ]), L("Firewall a zóny", "Firewalls and zones", "Kdo s kým smí mluvit, ne jen jestli kabel svítí.", "Who may talk to whom, not only whether the cable is lit.", [ S("1 / 3 • Zóny", "Důvěra není stejná", "Tip: LAN, WAN a DMZ nemají stejná pravidla.", "Rozhraní se sdruží do zón podle důvěry.", "Z důvěryhodnější zóny ven se často povoluje snáz.", "Z internetu dovnitř se povoluje jen to, co je schválené.", "Pravidlo se píše od zóny ke zóně, ne jen na jednu adresu."), S("2 / 3 • Stav", "Pamatuje si spojení", "Tip: stavový firewall pustí odpověď, aniž byste psali pravidlo nazpátek.", "Nové spojení se kontroluje proti politice.", "Odpověď patřící ke spojení se pustí.", "Bezestavový filtr zkoumá každý paket zvlášť.", "Ukončené spojení se z tabulky smaže."), S("3 / 3 • DMZ", "Server, který má být vidět", "Tip: web v DMZ nemá mít cestu ke všem diskům ve škole.", "Veřejná služba sedí v oddělené zóně.", "Z internetu se otevře jen její port.", "Z DMZ do LAN se pustí jen to, co služba opravdu potřebuje.", "Kompromitovaný web pak neotevře celou školu."), ], [ Q("Proč se zóny liší?", ["Mají jinou důvěru a tedy jiná pravidla", "Každá zóna musí mít vlastní DNS jméno switche", "Zóny nahrazují IP adresy", "Bez zón nejde STP"], 0, "Internet a učebna nejsou stejně důvěryhodné."), Q("Co umí stavový firewall?", ["Pustí odpověď k už otevřenému spojení", "Smaže VLAN", "Přidělí MAC adresu", "Nahradí směrovací protokol"], 0, "Pamatuje si, kdo spojení začal."), Q("Kam patří veřejný web, který nemá vidět celou LAN?", ["Do DMZ", "Do stejné sítě jako účtárna", "Na access port ředitele", "Do nativní VLAN trunku bez pravidel"], 0, "DMZ omezí, kam se útočník dostane dál."), Q("Co samotná zóna ještě není?", ["Náhrada za konkrétní pravidla služeb", "Způsob, jak sdružit rozhraní", "Hranice důvěry", "Místo, kam se píše politika"], 0, "Zóna bez pravidel nic nechrání."), ]), L("QoS", "QoS", "Když je linka plná, někdo musí dostat přednost.", "When the link is full, someone has to go first.", [ S("1 / 3 • Fronty", "Ne všechno snese čekání", "Tip: QoS nevytvoří rychlost, jen rozhodne, kdo počká.", "Hlas a videohovor kazí zpoždění a kolísání.", "Záloha disku snese čekání líp než telefonát.", "Fronta na úzké lince řadí pakety.", "Bez označení provozu switch neví, co je hlas."), S("2 / 3 • Značky", "Kdo si řekne o přednost", "Tip: značce z koncového portu nevěřte, uživatel si ji může nastavit sám.", "IP hlavička umí nést DSCP.", "Ethernet umí prioritu na VLAN značce.", "Na vstupu se značka přepíše podle politiky.", "Hlasová VLAN se často značí automaticky."), S("3 / 3 • Praxe", "Kde to má smysl", "Tip: na prázdné gigabitové lince QoS nic viditelného neudělá.", "Úzké hrdlo bývá WAN, ne páteřní switch.", "Rezervace pro hlas nesmí sežrat celou linku.", "Testujte hovor ve chvíli, kdy běží velká kopie.", "Špatná politika umí zpomalit i správu sítě."), ], [ Q("Co QoS neumí?", ["Vyrobit větší rychlost linky", "Dát přednost hlasu před zálohou", "Omezit kolísání hovoru", "Označit provoz"], 0, "Dělí existující kapacitu, nepřidá ji."), Q("Proč se značka z počítače přepisuje?", ["Uživatel by si jinak dal nejvyšší prioritu", "DSCP nejde číst", "IPv4 značky zakazuje", "STP značky maže"], 0, "Důvěryhodná značka vznikne na vstupu podle pravidel."), Q("Kde QoS obvykle pomůže nejdřív?", ["Na pomalé WAN lince", "Na prázdném 10Gb portu mezi switchi", "Uvnitř jednoho počítače na smyčce", "Na vypnutém Wi-Fi"], 0, "Přednost se projeví, až když se linka plní."), Q("Který provoz čekání snese hůř?", ["Telefonní hovor", "Noční kopie disku", "Stahování aktualizace", "Archiv pošty"], 0, "Hlas potřebuje malé a stálé zpoždění."), ]), L("Dohled sítě", "Watching the network", "SNMP, syslog a co z grafu opravdu plyne.", "SNMP, syslog, and what a graph really tells you.", [ S("1 / 3 • SNMP", "Čísla z zařízení", "Tip: SNMPv2c posílá jméno komunity skoro jako heslo v čistém textu.", "Dohled se ptá na vytížení, chyby a stav portů.", "Komunita není ozdoba, je to přístup.", "SNMPv3 umí uživatele a šifrování.", "Zařízení má poslouchat SNMP jen ze sítě dohledu."), S("2 / 3 • Syslog", "Věty o tom, co se stalo", "Tip: log na zařízení se při restartu může ztratit. Posílejte ho pryč.", "Syslog odnáší hlášky na server.", "Úrovně od ladění po nouzi se nemají všechny sypat do jedné hromady.", "Čas na zařízeních musí sedět, jinak nejde srovnat události.", "NTP je proto součást dohledu, ne jen hodiny na zdi."), S("3 / 3 • Čtení", "Graf není diagnóza", "Tip: špička jednou za den může být záloha, ne útok.", "Chyby na portu často znamenají kabel nebo duplex.", "Vytrvalé vytížení WAN řekne, jestli je čas na silnější spoj.", "Výpadek, který nikdo nevidí, se bude opakovat.", "Upozornění má chodit člověku, který může reagovat."), ], [ Q("Proč SNMPv2c nestačí na nezabezpečené síti?", ["Jméno komunity jde odposlechnout", "Neumí číst vytížení", "Funguje jen na IPv6", "Maže syslog"], 0, "Komunita cestuje bez pořádné ochrany. Lepší je SNMPv3."), Q("Proč posílat syslog pryč ze zařízení?", ["Lokální log se při restartu může ztratit", "Syslog nahrazuje heslo", "Switch jinak vypne porty", "DNS bez logu nefunguje"], 0, "Po restartu už příčinu pádu na zařízení nemusíte najít."), Q("K čemu je při dohledu NTP?", ["Aby časy událostí šly srovnat", "Aby přidělil VLAN", "Aby šifroval Wi-Fi", "Aby nahradil SNMP"], 0, "Bez společného času nejde říct, co bylo dřív."), Q("Co často znamenají rostoucí chyby na portu?", ["Špatný kabel nebo duplex", "Že je VLAN správně", "Že OSPF konverguje", "Že DNS TTL vypršelo"], 0, "Fyzická vrstva se v počítadlech chyb projeví dřív než v teorii."), ]), L("Záloha konfigurace", "Configuration backups", "Co uložit, než se přepínač vymění.", "What to save before a switch is replaced.", [ S("1 / 3 • Běžící a uložená", "Restart není uložení", "Tip: změna v běžící konfiguraci po restartu zmizí, dokud ji neuložíte.", "Běžící konfigurace je to, co zařízení právě dělá.", "Startovní se načte po zapnutí.", "Uložení zkopíruje běžící do startovní.", "Bez uložení druhý den síť vypadá jako včera."), S("2 / 3 • Kopie ven", "Nejen na zařízení", "Tip: záloha na tom samém přepínači shoří spolu s ním.", "Konfigurace patří na server mimo to zařízení.", "Ukládejte i verzi, ať víte, co se změnilo.", "Hesla v exportu mohou být čitelná. Soubor chraňte.", "Automatická záloha po změně porazí dobrý úmysl."), S("3 / 3 • Popis", "Aby to přečetl i kolega", "Tip: port bez popisu je za půl roku hádanka.", "Popis portu říká, co je na druhém konci.", "Schéma VLAN a adres má sedět s konfigurací.", "Změna bez poznámky se špatně vrací.", "Nový switch postavíte z zálohy jen tehdy, když záloha existuje."), ], [ Q("Co se stane se změnou, kterou neuložíte?", ["Po restartu zmizí", "Zapíše se do VLAN navždy", "Přepíše firmware", "Pošle se sama do DNS"], 0, "Běžící konfigurace není totéž co startovní."), Q("Proč záloha jen na tom samém switchi nestačí?", ["S poškozeným switchem zmizí i ona", "Switch zálohy šifruje tak, že je nečitelné i pro vás", "STP zálohy maže", "IPv6 zálohy zakazuje"], 0, "Kopie musí žít jinde."), Q("Co má být u portu napsané?", ["Co je na druhém konci", "Heslo administrátora", "Celá směrovací tabulka", "Soukromý klíč VPN"], 0, "Popis portu šetří hodiny při poruše."), Q("Proč chránit soubor se zálohou?", ["Může obsahovat čitelná hesla", "Soubor sám otevírá porty", "DNS ho publikuje", "Je větší než disk"], 0, "Export není vždy v zašifrované podobě."), ]), ], ) NET4 = course( "net4", "Návrh adres, redundance, 802.1X, hledání chyb, cloud a maturita.", "Address plans, redundancy, 802.1X, troubleshooting, cloud and the exam.", [ L("Adresní plán", "An address plan", "Sítě se navrhují dřív, než se zapojí první kabel.", "Networks are designed before the first cable is patched.", [ S("1 / 3 • Rozsahy", "Každá VLAN má svůj prefix", "Tip: nenechávejte v každé síti jen čtyři volné adresy.", "Nejdřív spočítejte stanice, tiskárny, AP a rezervu.", "Brána, síťová a broadcast adresa se do stanic nepočítají.", "Sousední VLAN nemají mít překryv.", "Dokument říká, která čísla jsou volná."), S("2 / 3 • Členění", "Škola není jedna velká síť", "Tip: /16 na celou budovu se snadno spravuje a špatně izoluje.", "Učebny, správa, servery, hosté a telefony patří odděleně.", "Stejný řád čísel ve všech budovách se líp pamatuje.", "Souhrn tras na páteři zmenší tabulku.", "Výjimka pro jednu tiskárnu se má zapsat, ne jen zapamatovat."), S("3 / 3 • Změna", "Plán, který jde rozšířit", "Tip: když přidáte budovu, neměli byste přečíslovat celou školu.", "Nechte v páteřním rozsahu díry pro další sítě.", "Přechod na nový prefix znamená DHCP, DNS, brány i firewall.", "IPv6 prefix se plánuje stejně vědomě, ne jako dodatek.", "Tabulka adres je součást maturity i běžného provozu."), ], [ Q("Co se v síti /24 nedá přiřadit stanici?", ["Adresa sítě a broadcast", "První použitelná adresa", "Adresa brány, pokud ji stanice nemá mít", "Adresa s lichým posledním oktetem"], 0, "Krajní adresy mají zvláštní význam. Brána se stanicím také nedává dvakrát."), Q("Proč nerozdat celé škole jednu velkou síť?", ["Špatně se izoluje porucha i provoz", "IPv4 to zakazuje", "Switch umí jen 8 adres", "DNS pak nejde spustit"], 0, "Menší sítě se líp hlídají a míň se ruší broadcastem."), Q("K čemu je souhrn tras?", ["Jedna trasa pokryje víc menších sítí", "Smaže VLAN", "Nahradí NAT", "Zapne WPA3"], 0, "Páteř nemusí znát každou učebnu zvlášť."), Q("Co patří do adresního plánu?", ["Prefix, VLAN, brána a k čemu síť je", "Jen heslo Wi-Fi", "Typ procesoru serveru", "Seznam učitelů"], 0, "Bez účelu sítě je tabulka jen sloupec čísel."), ]), L("Redundance", "Redundancy", "Druhá cesta, která se opravdu použije.", "A second path that is actually used.", [ S("1 / 3 • Dvojice", "Dva boxy nestačí", "Tip: dva switche se stejnou konfigurací nejsou záloha, dokud provoz neumí přejít.", "Redundance chce druhou cestu i protokol, který ji hlídá.", "STP řeší smyčku na druhé vrstvě.", "Na třetí vrstvě zálohu hlídá směrování nebo HSRP a příbuzné protokoly.", "Jedna brána v DHCP znamená, že pád routeru odstřihne všechny."), S("2 / 3 • Brána", "Virtuální adresa", "Tip: stanice mají jako bránu virtuální adresu, ne jednu fyzickou krabici.", "Dva směrovače sdílejí jednu adresu brány.", "Aktivní drží provoz, druhý čeká.", "Když aktivní ztichne, druhý adresu převezme.", "Stanice nemusí dostat nové DHCP."), S("3 / 3 • Zkouška", "Nevyzkoušená záloha je teorie", "Tip: vytáhněte kabel v okně, kdy smíte, ne až při maturitní písemce.", "Ověřte, že záložní cesta opravdu přenáší data.", "Sledujte, za jak dlouho se provoz vrátí.", "Záložní zdroj má jinou pojistku a jinou fázi, když to jde.", "Zápis z zkoušky říká, co se má stát příště."), ], [ Q("Proč dva stejné routery samy o sobě nestačí?", ["Stanice musí mít kam přejít, když jeden ztichne", "IPv4 povoluje jen jeden router v budově", "Druhý router maže VLAN", "STP dva routery zakazuje"], 0, "Bez společné nebo přepínané brány počítače zůstanou na mrtvé adrese."), Q("Co stanice používá při protokolu virtuální brány?", ["Virtuální adresu, ne konkrétní krabici", "Svou vlastní MAC jako bránu", "Adresu DNS", "Broadcast 255.255.255.255 jako další skok"], 0, "Převzetí adresy stanice nepozná jako výměnu DHCP."), Q("Kdy se záloha ověřuje?", ["Nanečisto, dřív než o ni opřete provoz", "Až když síť leží", "Jen na papíře", "Záloha se ověřovat nemá, ať se nepokazí"], 0, "Nevyzkoušený přepínač překvapí v nejhorší chvíli."), Q("Co na druhé vrstvě řeší náhradní kabel?", ["STP, jinak vznikne smyčka", "Jen NAT", "Jen WPA3", "Nic, ethernet smyčky umí sám"], 0, "Druhý kabel bez STP je recept na bouři."), ]), L("802.1X", "802.1X", "Port pustí data, až když se zařízení představí.", "A port forwards data only after the device identifies itself.", [ S("1 / 3 • Port", "Nejdřív průkaz", "Tip: dokud ověření neskončí, na portu nemá téct běžný provoz.", "Počítač se prokáže certifikátem nebo jménem a heslem.", "Switch se ptá serveru RADIUS.", "Až pak pustí port do dané VLAN.", "Neznámé zařízení zůstane venku nebo v omezené síti."), S("2 / 3 • Lidé a věci", "Ne všechno umí 802.1X", "Tip: tiskárna bez klienta potřebuje výjimku, ne vypnutí celé ochrany.", "Počítač v doméně zvládne ověření sám.", "Tiskárna, kamera a telefon často ne.", "MAB pustí zařízení podle MAC adresy. Tu jde zfalšovat.", "Výjimka má být na konkrétní port, ne na celý switch."), S("3 / 3 • VLAN", "Kam koho pustit", "Tip: učitel a host nemají po ověření skončit ve stejné VLAN.", "Úspěch může přiřadit VLAN podle skupiny.", "Neúspěch skončí v síti bez přístupu k serverům.", "Účet jde odebrat, aniž by se měnilo heslo Wi-Fi.", "Stejný princip sedí na kabel i na podnikovou Wi-Fi."), ], [ Q("Kdo rozhodne, že zařízení smí do sítě?", ["RADIUS na základě údajů od switche", "Sám kabel podle barvy", "DNS záznam A", "STP root"], 0, "Switch se ptá, server odpovídá."), Q("Proč MAB není silné ověření?", ["MAC adresu lze zfalšovat", "MAC adresa je jednorázové heslo", "MAB šifruje silněji než certifikát", "Funguje jen na IPv6"], 0, "Adresa na štítku není průkaz."), Q("Kam patří zařízení, které ověřením neprojde?", ["Do omezené sítě nebo nikam", "Do VLAN serverů", "Na trunk všech VLAN", "Do správy routeru"], 0, "Neúspěch nemá otevírat vnitřní síť."), Q("Jaká je výhoda účtů proti jednomu heslu Wi-Fi?", ["Jednomu člověku jde přístup odebrat", "Heslo se nemusí nikdy měnit, protože účty ho ruší", "Netřeba RADIUS ani switch", "WEP pak stačí"], 0, "Sdílené heslo po odchodu člověka zná pořád."), ]), L("Hledání chyby", "Troubleshooting", "Postup zdola nahoru, ne náhodné restarty.", "Bottom-up steps, not random reboots.", [ S("1 / 3 • Vrstvy", "Nejdřív světlo na portu", "Tip: nehledejte chybu v DNS, když port nesvítí.", "Fyzická vrstva: kabel, port, napájení, duplex, chyby.", "Druhá vrstva: VLAN, MAC tabulka, trunk, STP.", "Třetí vrstva: adresa, maska, brána, trasa, ACL.", "Výš: DNS, port služby, firewall na konci."), S("2 / 3 • Jedna změna", "Ať víte, co pomohlo", "Tip: pět změn naráz nic nenaučí.", "Zapište, co vidíte, než něco přepnete.", "Ověřte jednu hypotézu.", "Ping na bránu, pak za ni, pak jméno.", "Když oprava sedí, uložte konfiguraci a dopište důvod."), S("3 / 3 • Rozsah", "Koho to postihlo", "Tip: jeden počítač je jiná chyba než celá učebna.", "Jeden stroj: jeho kabel, port, adresa, účet.", "Celá VLAN: brána, DHCP, trunk, SVI.", "Celá škola: jádro, firewall, poskytovatel.", "Čas začátku často sedí se změnou, kterou někdo neoznámil."), ], [ Q("Co ověříte jako první, když port nesvítí?", ["Kabel, port a napájení", "Záznam AAAA", "Cenu OSPF", "Pravidlo QoS pro hlas"], 0, "Vyšší vrstvy nemají na čem jet."), Q("Proč měnit jen jednu věc?", ["Ať je vidět, která změna pomohla", "Switch víc změn zakazuje", "IPv4 umí jen jednu opravu denně", "DNS jinak smaže zónu"], 0, "Více zásahů naráz zamaskuje příčinu."), Q("Celá učebna nedostane adresu. Kde začnete?", ["DHCP, VLAN a brána té sítě", "Heslem jednoho studenta k webu", "Jasem monitoru", "Verzí prohlížeče"], 0, "Společný příznak ukazuje na společnou službu."), Q("Co uděláte, když oprava sedí?", ["Uložíte konfiguraci a zapíšete důvod", "Restartujete všechno ještě jednou", "Smažete popis portů", "Vypnete dohled, ať neruší"], 0, "Neuložená oprava do rána zmizí."), ]), L("Cloud a hybrid", "Cloud and hybrid networks", "Část služeb není ve skříni na chodbě.", "Some services are no longer in the cupboard in the corridor.", [ S("1 / 3 • Kam s tím", "Vlastní sál, nebo cizí", "Tip: cloud neruší síť ve škole, mění jen to, kam vede spoj.", "Veřejný cloud provozuje poskytovatel a vy si berete službu.", "Soukromý cloud je pořád vaše zařízení, jen obalené portálem.", "Hybrid nechá část dat ve škole a část venku.", "Účet a síťová cesta jsou pořád vaše odpovědnost."), S("2 / 3 • Cesta", "Jak se tam školní síť dostane", "Tip: služba v cloudu bez cesty a bez jmen je jen faktura.", "VPN do cloudu vypadá jako další pobočka.", "Veřejná služba jede přes internet a firewall.", "DNS musí ukazovat na nové adresy.", "Výpadek WAN teď shodí i to, co dřív jelo z místního serveru."), S("3 / 3 • Hranice", "Kdo zálohuje a kdo pustí dovnitř", "Tip: poskytovatel nezálohuje vaše data, dokud to není ve smlouvě.", "Pravidla firewallu se stěhují s službou.", "Účty v cloudu mají mít stejný řád jako účty ve škole.", "Test obnovy platí i pro data, která nejsou ve vašem racku.", "Škola pořád řeší osobní údaje, i když disk je jinde."), ], [ Q("Co hybridní síť znamená?", ["Část služeb je ve škole a část u poskytovatele", "Dva switche v jedné VLAN", "IPv4 i papírový sešit", "Wi-Fi bez hesla"], 0, "Hranice školy už není hranicí všech služeb."), Q("Co se pokazí, když WAN spadne a pošta je jen v cloudu?", ["Škola se k poště nedostane", "Místní switch přestane dělat VLAN", "STP zvolí cloud jako root", "Nic, cloud WAN nepotřebuje"], 0, "Cesta ven je součást dostupnosti služby."), Q("Kdo zálohuje data v cloudu?", ["Ten, koho to smlouva a nastavení opravdu určují", "Vždy automaticky stát", "STP", "Nikdo, cloud zálohy zakazuje"], 0, "Předpoklad, že poskytovatel zálohuje vše, často neplatí."), Q("Co škola řeší i u cizího disku?", ["Kdo má přístup a jak se chrání osobní údaje", "Jen barvu loga", "Jen typ ventilátoru v sále poskytovatele", "Nic, odpovědnost přechází celá"], 0, "Umístění dat nemaže pravidla přístupu."), ]), L("Automatizace", "Automation", "Opakovanou práci ať dělá skript, ne deset kliknutí.", "Let a script do the repeated work, not ten clicks.", [ S("1 / 3 • SSH", "Správa bez společného hesla na lístečku", "Tip: Telnet posílá heslo čitelně. Na správu patří SSH.", "Klíč jde odebrat konkrétnímu člověku.", "Heslo v příkazu historie nemá ležet.", "Přístup omezte na správní síť.", "Záznam, kdo se přihlásil, patří do logu."), S("2 / 3 • Opakování", "Stejná VLAN ve dvaceti switchích", "Tip: ruční opis se v desátém switchi liší v jednom čísle.", "Šablona drží názvy VLAN a popis portů.", "Skript změnu pošle na seznam zařízení.", "Nejdřív ho pusťte na jednom switchi.", "Záloha před hromadnou změnou je povinnost, ne ozdoba."), S("3 / 3 • Mez", "Skript není výmluva", "Tip: automat neopraví špatný záměr, jen ho provede rychleji.", "Kontrola po běhu srovná, co opravdu sedí.", "Tajné heslo nepatří do veřejného souboru.", "Člověk pořád schvaluje změnu, která shodí výuku.", "Verzovaný soubor konfigurace ukáže, kdo řádek změnil."), ], [ Q("Proč na správu nepoužívat Telnet?", ["Heslo jde po síti čitelně", "Telnet neumí IPv4", "Switch Telnet zakazuje standardem STP", "Telnet maže VLAN"], 0, "SSH spojení chrání."), Q("Jak pustíte stejnou změnu do dvaceti switchů?", ["Šablonou a skriptem, neopisovat ji dvacetkrát", "Jen restartem všech naráz", "Přes DHCP", "Jedním broadcastem bez kontroly"], 0, "Nejdřív jeden switch, pak ostatní."), Q("Co před hromadnou změnou uděláte?", ["Zálohu konfigurací", "Vypnete dohled", "Smažete popisy portů", "Zakážete SSH"], 0, "Ať se máte kam vrátit."), Q("Co skript neumí?", ["Poznat, že záměr byl špatně", "Poslat stejný příkaz víckrát", "Uložit konfiguraci", "Připojit se přes SSH"], 0, "Rychlost neopraví chybný příkaz."), ]), L("Provoz a maturita", "Operations and the exam", "Síť ve škole má pravidla, ne jen blikající porty.", "A school network has rules, not only blinking ports.", [ S("1 / 3 • Řád", "Kdo smí co změnit", "Tip: heslo admin na lístečku u switche není provozní řád.", "Účty jsou jmenné, ne jedno společné admin.", "Změna ve výuce se hlásí dopředu.", "Hostovská síť je oddělená a časově omezená.", "Osobní údaje v logu se nenechávají ležet bez důvodu."), S("2 / 3 • Výpadek", "Co říct a co udělat", "Tip: nejdřív rozsah a dopad, pak ladění detailu.", "Řekněte, co nejede a koho se to týká.", "Oddělte výpadek poskytovatele od chyby ve škole.", "Po obnově ověřte poštu, přihlášení i tisk, ne jen ping.", "Krátký zápis příště zkrátí stejnou poruchu."), S("3 / 3 • U zkoušky", "Co umět ukázat", "Tip: maturita chce důvod, ne jen zkratku.", "Umíte přečíst adresu, masku, bránu a VLAN.", "Umíte říct, k čemu je trunk, NAT, firewall a záloha.", "Schéma malé sítě nakreslíte i bez nápovědy.", "Postup hledání chyby od kabelu po službu odvykládáte po vrstvách."), ], [ Q("Jak nemají vypadat účty ke switchi?", ["Jedno heslo admin pro celou sborovnu", "Jmenný účet s možností odebrání", "Přístup jen ze správní sítě", "Záznam přihlášení"], 0, "Společné heslo nejde vzít jednomu člověku."), Q("Co řeknete jako první při výpadku?", ["Co nejede a koho se to týká", "Celou směrovací tabulku zpaměti", "Typ ventilátoru v racku", "Že se to vyřeší samo"], 0, "Rozsah je důležitější než první domněnka."), Q("Co po obnově nestačí?", ["Jen ping na bránu", "Ověřit poštu a přihlášení", "Podívat se na tisk", "Zkontrolovat, že VLAN sedí"], 0, "Brána může žít a služba pořád ne."), Q("Co u maturity k VLAN umíte říct?", ["Odděluje provoz a mezi VLAN se směruje", "Je to typ pevného disku", "Nahrazuje zálohu konfigurace", "Je totéž co WPA3"], 0, "Definice a důvod, ne jen zkratka."), ]), L("Dokumentace sítě", "Network documentation", "Schéma, které sedí s tím, co je ve zdi.", "A diagram that matches what is actually in the wall.", [ S("1 / 3 • Schéma", "Co na něm má být", "Tip: schéma z doby instalace bez datumu je pohádka.", "Jsou na něm jádro, učebny, VLAN a přípojka ven.", "Adresní plán sedí se schématem, ne s pamětí.", "Porty páteře mají popisky na obou koncích.", "Datum a jméno autora říkají, jak je obrázek starý."), S("2 / 3 • Změna", "Nejdřív papír, pak kabel", "Tip: přepojit a zapsat až za měsíc znamená, že zápis už nesedí.", "Změna VLAN se zapíše ve stejný den.", "Fotka rozvaděče doplní schéma tam, kde čáry lžou.", "Hesla do schématu nepatří. Patří do trezoru účtů.", "Kopie schématu není jen na počítači, který ta síť živí."), S("3 / 3 • Předání", "Až tu nebudete", "Tip: kolega má síť převzít bez vašeho telefonu.", "Seznam zařízení, adres správy a kde leží zálohy.", "Kontakt na poskytovatele a číslo spoje.", "Co se nesmí restartovat ve výuce.", "Jedna stránka je lepší než nikde neuložená hlava."), ], [ Q("Co do schématu sítě nepatří?", ["Heslo správce", "VLAN a jejich účel", "Přípojka k poskytovateli", "Datum, kdy naposledy sedělo"], 0, "Heslo patří jinam než na obrázek, který visí ve sborovně."), Q("Kdy se změna zapíše?", ["V den, kdy se provede", "Až se na ni někdo zeptá u maturity", "Jen když spadne celá škola", "Zápis není potřeba, stačí paměť"], 0, "Nezapsaná změna je příští závada."), Q("Proč mít kopii schématu i mimo školní server?", ["Když síť neběží, schéma na ní neotevřete", "Server schémata maže", "IPv6 schémata zakazuje", "STP obrázky nepouští"], 0, "Dokumentace má přežít výpadek toho, co popisuje."), Q("Co má kolega najít bez vašeho telefonu?", ["Adresy správy, zálohy a kontakt na poskytovatele", "Jen barvu racku", "Vaše soukromé heslo", "Nic, síť se nepředává"], 0, "Provoz nesmí stát na jednom člověku."), ]), ], ) HW2 = course( "hw2", "Monitory, tisk, sběrnice, chlazení, sestavení, UEFI a diagnostika.", "Displays, printing, buses, cooling, assembly, UEFI and diagnostics.", [ L("Monitory", "Displays", "Panel, rozlišení a proč 60 Hz není jediné číslo.", "The panel, the resolution, and why 60 Hz is not the only number.", [ S("1 / 3 • Panel", "LCD a OLED", "Tip: rozbité podsvícení LCD zhasne obraz, i když panel pořád kreslí.", "LCD svítí podsvícením a panel světlo cloní.", "OLED svítí samotnými body a umí opravdovou černou.", "Lesklý panel má vyšší kontrast a víc odlesků.", "Uhlopříčka v palcích není totéž co pracovní plocha v bodech."), S("2 / 3 • Obraz", "Rozlišení a frekvence", "Tip: nativní rozlišení panelu je to, na které je mřížka bodů.", "Nižší rozlišení interpoluje a obraz měkne.", "Obnovovací frekvence říká, kolikrát za sekundu se obraz překreslí.", "Odezva panelu není totéž co frekvence.", "HDR chce vyšší jas, ne jen zaškrtnutou volbu."), S("3 / 3 • Kabel", "Obraz musí stihnout pásmo", "Tip: starý kabel nebo slabá verze HDMI oseká frekvenci i rozlišení.", "DisplayPort a HDMI mají verze s různým datovým tokem.", "VGA je analogové a na dlouhém kabelu měkne.", "USB-C obraz poveze jen tehdy, když port umí alternativní režim.", "Dokovací stanice má vlastní limit, ne limit notebooku."), ], [ Q("Čím se OLED liší od běžného LCD?", ["Body samy svítí a černá je opravdu zhasnutá", "Nemá rozlišení", "Jede jen po VGA", "Nepotřebuje grafickou kartu"], 0, "LCD obraz skládá cloněním podsvícení."), Q("Co je nativní rozlišení?", ["Počet bodů, na který je panel vyroben", "Nejvyšší číslo v herním menu bez ohledu na panel", "Rychlost procesoru", "Počet USB portů"], 0, "Jiné rozlišení se musí přepočítat."), Q("Proč 4K při 144 Hz někdy nejde?", ["Kabel nebo verze portu nestihne datový tok", "OLED zakazuje frekvenci nad 60 Hz", "IPv4 omezuje monitory", "BIOS maže rozlišení"], 0, "Pásmo portu je strop, ne přání v menu."), Q("Kdy USB-C nepřenese obraz?", ["Když port umí jen data a nabíjení", "Když je kabel černý", "Když má notebook SSD", "Když je v síti VLAN"], 0, "Konektor stejného tvaru ještě neznamená DisplayPort v něm."), ]), L("Tisk a sken", "Print and scan", "Laser, inkoust a síťová fronta.", "Laser, inkjet, and a network queue.", [ S("1 / 3 • Princip", "Toner a kapky", "Tip: laser netaví toner na papír sám, dělá to zapékací válec.", "Laser nabije válec a toner se chytí podle obrazu.", "Inkoust stříká kapky a hodí se na fotky i občasný tisk.", "Zaschnutá hlava je častější než porucha desky.", "Termotransfer na štítky není totéž co kancelářský laser."), S("2 / 3 • Síť", "Jedna tiskárna pro učebnu", "Tip: tiskárna s vlastní adresou má rezervaci v DHCP.", "Sdílená tiskárna na počítači žije, jen když je ten počítač zapnutý.", "Síťová tiskárna poslouchá sama.", "Fronta na serveru drží ovladač na jednom místě.", "Špatný ovladač tiskne znaky místo stránky."), S("3 / 3 • Sken", "Obraz zpět do počítače", "Tip: rozlišení 600 dpi na text stačí, plakát chce víc.", "Plochý skener i podavač mají jiný limit gramáže.", "ADF nezvládne sešité listy.", "Síťový sken může poslat soubor do složky nebo na poštu.", "Sklo a podavač se mažou, jinak jsou na stránce pruhy."), ], [ Q("Co v laserové tiskárně připevní toner k papíru?", ["Zapékací válec", "Inkoustová hlava", "Ventilátor zdroje", "VGA kabel"], 0, "Teplo a tlak toner zataví."), Q("Kdy sdílená tiskárna na učitelském počítači netiskne?", ["Když je ten počítač vypnutý", "Když má tiskárna vlastní IP a server", "Když je v síti DHCP", "Když je papír v zásobníku"], 0, "Sdílení přes počítač z toho počítače dělá server."), Q("Proč dát tiskárně rezervaci v DHCP?", ["Aby ovladače mířily pořád na stejnou adresu", "Aby se zvýšilo rozlišení", "Aby toner vydržel dýl", "Aby nešla skenovat"], 0, "Nová adresa po restartu rozbije frontu."), Q("Co podavač skeneru nezvládne?", ["Sešitou sadu listů", "Jednotlivé běžné listy", "Černobílý text", "Odeslání do složky, pokud to umí firmware"], 0, "Sešit patří na sklo, ne do ADF."), ]), L("Sběrnice a disky", "Buses and drives", "USB, SATA a NVMe nejsou zaměnitelné jen konektorem.", "USB, SATA and NVMe are not interchangeable just because of the plug.", [ S("1 / 3 • USB", "Versie a napájení", "Tip: port USB-A 2.0 fyzicky vezme i rychlý flash disk a stáhne ho na svou rychlost.", "USB 2.0, 3.x a 4 se liší tokem dat.", "USB-C je tvar, ne záruka rychlosti.", "Thunderbolt po stejném tvaru umí obraz, síť i disk.", "Hub bez napájení nestačí pro víc disků."), S("2 / 3 • SATA", "Klasické disky", "Tip: napájení SATA a datový kabel jsou dva různé vodiče.", "HDD i starší SSD sedí na SATA.", "Rychlost rozhraní je strop, disk může být pomalejší.", "Kabel bez západky vypadne a disk zmizí z BIOSu.", "Externí box schová SATA za USB."), S("3 / 3 • NVMe", "SSD přímo na PCIe", "Tip: M.2 je rozměr destičky. NVMe a SATA na M.2 nejsou totéž.", "NVMe jede po PCIe a obchází starý řadič SATA.", "Slot M.2 na desce může umět jen jednu z variant.", "Dlouhá destička do krátkého slotu nepatří.", "Bez chlazení rychlé SSD ve špičce zpomalí."), ], [ Q("Co říká samotný tvar USB-C?", ["Jen tvar konektoru, ne rychlost ani obraz", "Vždy Thunderbolt", "Vždy 40 Gb/s", "Vždy nabíjení 100 W a DisplayPort"], 0, "Schopnosti určuje řadič a kabel, ne obrys."), Q("Čím se NVMe liší od SATA SSD?", ["Jede po PCIe, ne po starém SATA", "Nemá paměťové buňky", "Jde zapojit jen do VGA", "Nepotřebuje desku"], 0, "Protokol a sběrnice jsou rychlejší cesta."), Q("Co může umět slot M.2?", ["Jen SATA, jen NVMe, nebo obojí, podle desky", "Vždy obojí", "Jen grafickou kartu", "Jen operační paměť"], 0, "Manuál desky je závaznější než tvar zářezu."), Q("Proč rychlé SSD ve špičce zpomalí?", ["Přehřeje se a stáhne výkon", "SATA mu sebere VLAN", "BIOS maže buňky", "USB-C ho přepne na 2.0 vždy"], 0, "Řadič hlídá teplotu."), ]), L("Chlazení", "Cooling", "Vzduch musí mít kudy dovnitř a ven.", "Air needs a way in and a way out.", [ S("1 / 3 • Tok", "Podtlak a přetlak", "Tip: všechny ventilátory foukající dovnitř bez odtahu jen víří prach.", "Vpředu a dole se vzduch nasává, vzadu a nahoře odchází.", "Filtr patří na vstup, ne na výfuk.", "Zavřená přední stěna designové skříně škrtí přívod.", "Kabel přes ventilátor je ucpaný filtr."), S("2 / 3 • CPU", "Chladič musí sednout", "Tip: pasta není vrstva másla. Má vyplnit nerovnosti.", "Vzduchový chladič potřebuje místo k bočnici.", "Voda odvede teplo do radiátoru, který pořád potřebuje vzduch.", "Špatně dotažený chladič pustí teplotu hned po startu.", "Limit teploty v BIOSu je pojistka, ne pracovní režim."), S("3 / 3 • Prach", "Tichý vrah zdroje", "Tip: vrstva prachu na žebru je izolace.", "Zdroj s filtrem se čistí, nezalepuje.", "Notebookový výfuk do měkké deky se udusí.", "Po roce bez čištění rostou otáčky a teplota.", "Čištění stlačeným vzduchem nedrží ventilátor v roztočeném stavu naslepo."), ], [ Q("Kam patří prachový filtr?", ["Na vstup vzduchu", "Jen na výfuk vzadu", "Dovnitř zdroje bez mřížky", "Na displej"], 0, "Filtruje se to, co teprve vstupuje."), Q("Co dělá příliš silná vrstva pasty?", ["Zhorší přestup tepla", "Zvýší takt samo", "Nahradí chladič", "Opraví špatný socket"], 0, "Pasta vede hůř než kov chladiče."), Q("Proč vodní chlazení pořád potřebuje vzduch?", ["Radiátor musí teplo předat do místnosti", "Voda chladí jen při otevřeném okně skříně", "Čerpadlo jede na VGA", "Bez ventilátoru se voda vaří vždy do minuty"], 0, "Okruh teplo přesune, radiátor ho odvede."), Q("Co udělá notebook na dece?", ["Zakryje sání a přehřeje se", "Zvýší jas panelu", "Přepne disk na NVMe", "Opraví ventilátor"], 0, "Sání bývá zespodu."), ]), L("Sestavení", "Building a PC", "Pořadí, které nerozbije desku.", "An order that does not break the board.", [ S("1 / 3 • Příprava", "Nejdřív mimo skříň", "Tip: sestavu nejdřív oživte na stole. Ve skříni se špatně hledá nedosedlá paměť.", "Deska, procesor, chladič a jeden modul paměti.", "Zdroj mimo skříň a obraz na základní grafiku.", "Až potom disk, karty a zbytek paměti.", "Antistatická podložka a klidné ruce porazí koberec."), S("2 / 3 • Socket", "Procesor nemá kam spadnout", "Tip: ohnutý pin na desce LGA nevrátíte pinzetou naslepo.", "Trojúhelník na procesoru sedí se značkou na socketu.", "Páka se zavírá až když procesor leží rovně.", "Pasta až po usazení, ne do socketu.", "Chladič se dotahuje křížem, ne jednou stranou nadoraz."), S("3 / 3 • Skříň", "Kabely jsou součást airflow", "Tip: distanční sloupky pod deskou musí sedět s otvory, jinak deska zkratuje.", "Nejdřív zdroj a distanční sloupky, potom deska.", "Napájení desky, procesoru a karty jsou tři různé konektory.", "Přední USB a tlačítko mají malé konektory podle manuálu.", "První start se sleduje: ventilátory, obraz, pípnutí nebo LED."), ], [ Q("Proč oživit sestavu nejdřív mimo skříň?", ["Nedosedlá paměť se ve skříni hledá hůř", "Ve skříni nejde zapnout zdroj", "BIOS ve skříni neběží", "Pasta venku schne"], 0, "Minimum dílů na stole ukáže, jestli jádro žije."), Q("Co se nesmí stát pinům na socketu LGA?", ["Ohnout je", "Nechat je v socketu", "Srovnat procesor podle značky", "Zavřít páku až po usazení"], 0, "Pin na desce je křehký."), Q("K čemu jsou distanční sloupky?", ["Drží desku dál od plechu skříně", "Napájí ventilátor", "Jsou to šrouby do disku", "Uzemňují jen přední LED"], 0, "Bez nich nebo se špatnými sloupky deska zkratuje."), Q("Který konektor nepatří do napájení procesoru?", ["PCIe konektor grafické karty místo EPS", "Hlavní 24pin na desku", "EPS konektor k socketu", "SATA napájení disku"], 0, "Konektory si jsou podobné a sedí špatně záměrně."), ]), L("UEFI a boot", "UEFI and boot", "Co se děje, než naběhne systém.", "What happens before the operating system starts.", [ S("1 / 3 • Firmware", "BIOS a UEFI", "Tip: UEFI není jen barevné menu. Umí jiné dělení disku a Secure Boot.", "Firmware otestuje železo a najde disk se systémem.", "UEFI používá tabulku GPT, starý BIOS často MBR.", "Secure Boot pustí jen podepsaný zavaděč.", "Vypnutí Secure Bootu je výjimka, ne výchozí rada."), S("2 / 3 • Pořadí", "Z čeho se startuje", "Tip: flash disk v pořadí před systémem nabootuje omylem instalaci.", "Nabídka bootu umí jednorázově vybrat zařízení.", "Disk bez zavaděče se v seznamu nechytí.", "Více systémů potřebuje bootovací nabídku, ne přepisování pořád dokola.", "Síťový boot PXE hledá obraz na serveru."), S("3 / 3 • Heslo", "Menu není pro celou třídu", "Tip: heslo BIOSu bez záznamu je past, až se bude měnit disk.", "Heslo na setup brání přehazování bootu.", "Heslo na disk je silnější a bez něj jsou data nedostupná.", "Clear CMOS heslo setupu často smaže a vezme i nastavení.", "Po změně profilu paměti ověřte, že systém naběhne dvakrát."), ], [ Q("Co Secure Boot hlídá?", ["Aby se spustil jen důvěryhodný zavaděč", "Aby měl disk aspoň 1 TB", "Aby ventilátor točil na maximum", "Aby nešel USB flash disk vůbec zapojit"], 0, "Nepodepsaný zavaděč se nespustí."), Q("Čím se liší GPT od MBR?", ["GPT je tabulka oddílů pro UEFI a větší disky", "GPT je typ pasty", "MBR je jen pro NVMe", "Jsou to totéž"], 0, "Starý MBR má omezení, na která velký disk naráží."), Q("Proč nenechat flash disk trvale první v bootu?", ["Omylem z něj naběhne cizí systém", "Flash disk vypne Secure Boot navždy", "UEFI flash disky zakazuje", "Smaže TPM"], 0, "Jednorázová nabídka bootu je bezpečnější."), Q("Co často udělá vymazání CMOS?", ["Smaže heslo setupu i ostatní volby", "Smaže jen soubory na ploše", "Přepne Windows na jiný jazyk", "Opraví ohnutý pin"], 0, "Je to návrat firmware k výchozímu stavu."), ]), L("Diagnostika", "Diagnostics", "POST, pípání a minimum, které ještě naběhne.", "POST, beep codes, and the smallest build that still starts.", [ S("1 / 3 • POST", "Test hned po zapnutí", "Tip: žádný obraz a žádné pípnutí neznamená automaticky mrtvý procesor.", "Firmware zkouší procesor, paměť a grafiku.", "Kódy na displeji desky jsou přesnější než staré pípání.", "Reproduktor skříně musí být zapojený, jinak ticho nic neřekne.", "Manuál desky překládá kódy. Nejsou u všech stejné."), S("2 / 3 • Minimum", "Uberte, co může lhát", "Tip: jeden modul paměti v doporučeném slotu porazí čtyři najednou.", "Ven grafika, pokud má procesor vlastní obraz.", "Ven disky a karty.", "Zkuste jiný kabel obrazu a jiný port.", "Až jádro naběhne, vracejte díly po jednom."), S("3 / 3 • Paměť a disk", "Náhodné pády", "Tip: pád až ve Windows může být paměť, ne jen ovladač.", "Test paměti běží déle než jedno pípnutí.", "Chyby čtení disku se projeví v jeho vlastních statistikách.", "Přehřátí shodí stroj až při zátěži, ne v menu BIOSu.", "Vyměněný díl ověřte stejnou zkouškou, která předtím selhala."), ], [ Q("Co POST dělá?", ["Po zapnutí zkouší základní díly", "Instaluje systém", "Formátuje SSD", "Stahuje ovladače z internetu"], 0, "Je to první test firmware, ne operační systém."), Q("Proč začít s jedním modulem paměti?", ["Špatný modul nebo slot se snáz odhalí", "Deska víc modulů zakazuje", "BIOS umí jen 4 GB", "Druhý modul maže UEFI"], 0, "Minimum dílů zužuje chybu."), Q("Kdy se přehřátí často neprojeví?", ["V menu BIOSu bez zátěže", "Při dlouhém testu procesoru", "Ve hře", "Při kódování videa"], 0, "Teplota roste až s odběrem."), Q("Co ověří výměnu dílu?", ["Stejná zkouška, která předtím selhala", "Jen to, že ventilátor se točí", "Nová tapeta", "Jiná barva skříně"], 0, "Bez opakování testu nevíte, jestli to byla příčina."), ]), L("Porty a dokování", "Ports and docks", "Co z notebooku opravdu vyleze.", "What a laptop can actually drive.", [ S("1 / 3 • Dok", "Jeden kabel, mnoho omezení", "Tip: levný USB hub není dok. Nepřenese obraz, který port neumí.", "Dok může nést obraz, síť i napájení.", "Limit je nejslabší článek: port, kabel nebo dok.", "Dva externí monitory chtějí port, který to umí, ne přání uživatele.", "Napájení přes dok nemusí stačit hernímu notebooku."), S("2 / 3 • Síť", "Kabel z notebooku", "Tip: mnoho tenkých notebooků už ethernet nemá a potřebuje adaptér.", "USB adaptér je síťová karta mimo šasi.", "Rychlost adaptéru bývá 1 Gb/s, ne rychlost školní páteře.", "Dok s vlastní síťovkou má vlastní MAC adresu.", "Rezervace DHCP na MAC notebooku pak neplatí pro dok."), S("3 / 3 • Výběr", "Na co se ptát", "Tip: stejný USB-C na dvou noteboocích nemá stejné schopnosti.", "Kolik obrazů, jaké rozlišení a jestli se notebook nabíjí.", "Jestli síť jede z doku, nebo se čeká Wi-Fi.", "Jestli čtečka karet a USB sedí verzi, kterou škola používá.", "Manuál portu je důležitější než fotka konektoru."), ], [ Q("Kdy USB-C dok nepřenese dva monitory?", ["Když port notebooku umí jen data", "Když je dok černý", "Když je v učebně VLAN", "Když má disk NVMe"], 0, "Dok neumí vyrobit schopnost, kterou port nemá."), Q("Proč DHCP rezervace na notebook neplatí přes dok?", ["Dok má vlastní MAC adresu", "DHCP doky zakazuje", "VLAN maže rezervace", "Ethernet nemá MAC"], 0, "Rezervace sedí na adresu, kterou server vidí."), Q("Co je nejslabší článek řetězu obrazu?", ["Port, kabel nebo dok, podle toho, co umí nejmíň", "Vždy monitor", "Vždy procesor", "Vždy tapeta"], 0, "Datový tok musí projít všemi."), Q("Čím se liší USB hub od doku s obrazem?", ["Hub sám o sobě obraz z datového portu nevyrobí", "Hub je vždy rychlejší", "Dok neumí napájení", "Jsou to totéž"], 0, "Obraz chce alternativní režim nebo DisplayPort v kabelu."), ]), ], ) HW3 = course( "hw3", "RAID, NAS, servery, virtualizace, zálohy, UPS a firmware.", "RAID, NAS, servers, virtualisation, backups, UPS and firmware.", [ L("RAID", "RAID", "Více disků jako jeden svazek, ne jako záloha.", "Several drives as one volume, not as a backup.", [ S("1 / 3 • Zrcadlo", "RAID 1", "Tip: zrcadlo přežije pád jednoho disku, ne smazání souboru.", "Stejná data jsou na dvou discích.", "Kapacita je jako jeden disk.", "Čtení může být rychlejší, zápis ne dvojnásobný.", "Po výměně disku se pole musí obnovit."), S("2 / 3 • Prokládání", "RAID 0 a 5", "Tip: RAID 0 při pádu jednoho disku ztratí všechno.", "RAID 0 skládá rychlost a kapacitu a nemá ochranu.", "RAID 5 snese pád jednoho disku z aspoň tří.", "Parita zabere kapacitu jednoho disku.", "Obnova velkého pole trvá dlouho a druhý pád v té době je zkáza."), S("3 / 3 • Řadič", "Hardware a software", "Tip: pole z jiného řadiče v novém serveru nemusí naběhnout.", "Hardwarový řadič má vlastní cache a baterii.", "Softwarové pole řeší systém a je přenosnější.", "Cache bez ochrany při výpadku proudu rozbije zápis.", "RAID nenahrazuje zálohu na jiné místo."), ], [ Q("Co RAID 1 přežije?", ["Pád jednoho z dvojice disků", "Smazání souboru uživatelem", "Požár místnosti", "Ransomware na obou discích naráz"], 0, "Oba disky mají stejná data, včetně chyby, kterou tam zapíšete."), Q("Co je RAID 0?", ["Prokládání bez ochrany při pádu disku", "Zrcadlo", "Záloha na pásku", "Šifrování disku"], 0, "Rychlost a kapacita, nulová odolnost."), Q("Proč RAID není záloha?", ["Neochrání před smazáním, malwarem ani požárem skříně", "Protože neumí víc než dva disky", "Protože Windows RAID zakazuje", "Protože parita maže soubory"], 0, "Záloha je další kopie jinde a v jiném čase."), Q("Co hrozí velkému poli při obnově?", ["Druhý disk spadne dřív, než se obnova dopočítá", "Pole se samo přepne na RAID 0", "BIOS smaže paritu", "NIC se při obnově nesmí točit"], 0, "Obnova je dlouhá a disky jsou stejně staré."), ]), L("NAS a sítě disků", "NAS and storage networks", "Disky, které nejsou uvnitř jednoho počítače.", "Drives that are not inside one computer.", [ S("1 / 3 • NAS", "Souborový server v krabici", "Tip: NAS v učebně bez zálohy je jen jeden košík na všechna data.", "Nabízí složky po síti.", "Má vlastní účty nebo se ptá školního adresáře.", "Dva porty se dají spojit, ale jen když to umí i switch.", "Hlučný diskový provoz nepatří do tiché učebny."), S("2 / 3 • SAN", "Disk jako místní", "Tip: SAN nedává složku, dává blokové zařízení.", "Server vidí disk, i když leží jinde.", "Síť pro SAN se nemíchá s provozem žáků.", "Špatné zónování vystaví disk cizímu serveru.", "Výpadek této sítě shodí systémy, které na disku jedou."), S("3 / 3 • Soubor", "Práva a snímky", "Tip: snímek disku není záloha, dokud leží na stejném poli.", "Práva na složce mají sedět se skupinami, ne s jedním účtem učitele.", "Snímek umí vrátit soubor smazaný dopoledne.", "Plný svazek zastaví i zdánlivě nesouvisející službu.", "Kapacita se hlídá dřív, než svítí červeně."), ], [ Q("Co NAS obvykle nabízí?", ["Složky po síti", "Blokový disk celé škole bez oprávnění", "Náhradu procesoru v noteboocích", "Obraz monitoru"], 0, "Je to souborová služba."), Q("Čím se SAN liší?", ["Server dostane disk jako bloky, ne jako složku", "Je to jen jiné jméno pro USB flash disk", "Jede jen po Wi-Fi", "Nemá disky"], 0, "Souborový systém si na těch blocích dělá až server."), Q("Proč snímek na stejném poli není záloha?", ["Pád pole vezme i snímek", "Snímek nejde vytvořit", "Snímek maže RAID", "SMB snímky zakazuje"], 0, "Záloha musí přežít ztrátu původního úložiště."), Q("Kam nepatří hlučné diskové pole?", ["Do tiché učebny vedle žáků", "Do racku s odtahem", "Do místnosti se zámek", "Do sítě oddělené od hostů"], 0, "Hluk a přístup jsou součást návrhu."), ]), L("Servery a rack", "Servers and racks", "Skříň, do které se nedává herní počítač naležato.", "A cabinet that is not a gaming PC on its side.", [ S("1 / 3 • Tvar", "Racková jednotka", "Tip: 1U je výška, ne výkon.", "Server v racku se měří v jednotkách U.", "Kolejnice musí unést hloubku skříně.", "Napájecí lišta není prodlužovačka z kuchyně.", "Proud a teplo se počítají dopředu, ne až když jistič spadne."), S("2 / 3 • Vzduch", "Studená ulička", "Tip: servery v racku sají vepředu a foukají dozadu. Otočený kus kazí ostatním.", "Studený vzduch jde před servery, teplý za ně.", "Zaslepení prázdných pozic nutí vzduch přes stroje.", "Kabelová armáda před sáním je ucpávka.", "Teplota v místnosti není teplota uvnitř 1U serveru."), S("3 / 3 • Vzdáleně", "Když nejste ve škole", "Tip: vzdálená správa má vlastní port a vlastní heslo.", "IPMI nebo iDRAC žije i když systém ne.", "Patří do správní sítě, ne do učebny.", "Konzole v racku je záloha, když síť správy spadne.", "Štítek na serveru říká, co na něm jede."), ], [ Q("Co znamená 1U?", ["Výšku zařízení v racku", "Výkon jednoho jádra", "Rychlost disku", "Počet zdrojů"], 0, "Je to rozměr, ne třída výkonu."), Q("Kudy má server v racku sát vzduch?", ["Vepředu a foukat dozadu", "Zezadu dopředu", "Jen shora bez mřížky", "Z podlahy dírami v desce"], 0, "Otočený server ohřívá sousedům sání."), Q("K čemu je vzdálená správa serveru?", ["Ovládáte ho, i když systém neběží", "Nahrazuje zálohu dat", "Je to Wi-Fi pro žáky", "Maže RAID"], 0, "Vidíte obraz a umíte stroj zapnout po síti."), Q("Kam nepatří port vzdálené správy?", ["Do žákovské VLAN", "Do správní sítě", "Za firewall", "Na heslo jiné než admin na lístečku"], 0, "Je to klíče od serveru."), ]), L("Virtualizace", "Virtualisation", "Více systémů na jednom železe.", "Several systems on one piece of hardware.", [ S("1 / 3 • Hypervizor", "Kdo rozděluje železo", "Tip: virtuální počítač nemá vlastní zdroj. Dělí se o ten fyzický.", "Hypervizor pouští více systémů nad jedním hardwarem.", "Každý systém má vlastní diskový soubor a virtuální síťovku.", "Paměť, kterou slíbíte navíc, se ve špičce potká.", "Pád fyzického serveru shodí všechny hosty naráz."), S("2 / 3 • Síť", "Virtuální switch", "Tip: VLAN ve virtuálu musí sedět s trunkem na fyzické kartě.", "Virtuální switch propojí hosty mezi sebou.", "Most je pustí ven fyzickým portem.", "Izolovaná síť jen mezi virtuály ven nevede.", "Špatný trunk vystaví správní virtuál do učebny."), S("3 / 3 • Disk", "Soubor není kouzlo", "Tip: tenký disk roste a může zaplnit svazek, na kterém leží.", "Tenké provizionování slíbí víc, než je na začátku obsazeno.", "Snímek před změnou umí vrátit systém.", "Zapomenuté snímky zpomalí disk a zaplní úložiště.", "Záloha virtuálu patří mimo ten samý disk."), ], [ Q("Co se stane, když spadne fyzický server s pěti virtuály?", ["Spadnou všechny, pokud nemají kam utéct", "Přežije aspoň správní virtuál", "Hypervizor je přenese na notebook", "Nic, virtuál zdroj nepotřebuje"], 0, "Sdílejí jedno železo."), Q("K čemu je most virtuálního switche?", ["Pustí virtuál do fyzické sítě", "Smaže VLAN", "Nahradí RAID", "Zapne Secure Boot hostitele"], 0, "Bez mostu virtuál ven neodejde."), Q("Čím je tenký disk nebezpečný?", ["Doroste a zaplní úložiště pod sebou", "Nejde zálohovat", "Nemá souborový systém", "Vypne hypervizor"], 0, "Slíbená kapacita není volné místo."), Q("Co udělá zapomenutý snímek?", ["Roste a zpomaluje disk", "Smaže heslo BIOSu", "Opraví RAID 0", "Přidá paměť"], 0, "Snímek je dočasná pojistka, ne trvalý režim."), ]), L("Zálohování", "Backups", "Kopie, kterou umíte vrátit.", "A copy you can actually restore.", [ S("1 / 3 • Pravidlo", "Tři místa", "Tip: kopie na tom samém disku přežije jen omyl v koši, ne pád disku.", "Jedna kopie je málo, když leží u originálu.", "Druhá má být mimo stroj a třetí mimo budovu, když na tom záleží.", "Verze v čase vrátí soubor z pátku, ne jen ze včerejška.", "Šifrovaná záloha bez klíče je hromada nic."), S("2 / 3 • Co zálohovat", "Ne jen plochu", "Tip: obraz systému bez dat školy je pěkná, ale prázdná záchrana.", "Data, účty a konfigurace sítě jsou různé věci.", "Poštovní schránka v cloudu má vlastní nastavení retence.", "Databáze se nezálohuje kopírováním otevřeného souboru naslepo.", "Seznam, co se nezálohuje, má být vědomý."), S("3 / 3 • Zkouška", "Obnova je součást zálohy", "Tip: záloha, kterou jste nikdy neobnovili, je hypotéza.", "Jednou za čas obnovte soubor i celý systém nanečisto.", "Měřte, jak dlouho obnova trvá.", "Zápis říká, kdo má klíče a kde leží média.", "Po ransomware rozhoduje stáří poslední čisté kopie."), ], [ Q("Proč nestačí kopie na stejném disku?", ["Pád disku vezme originál i kopii", "Systém druhou složku zakazuje", "RAID ji sám smaže", "NTFS umí jen jeden soubor"], 0, "Chyba média je společná."), Q("Co není pořádná zkouška zálohy?", ["Jen to, že noční úloha svítí zeleně", "Obnova jednoho souboru", "Změřený čas obnovy systému", "Ověření, že klíč k šifře existuje"], 0, "Zelená fajfka neznamená, že data jdou otevřít."), Q("Co rozhoduje po ransomware?", ["Jestli existuje čistá kopie starší než nákaza", "Barva skříně", "Počet ventilátorů", "Verze spořiče obrazovky"], 0, "Šifrovaná záloha z doby, kdy už malware běžel, je taky šifrovaná."), Q("Proč nekopírovat otevřenou databázi jako obyčejný soubor?", ["Rozpracovaný zápis bude nekonzistentní", "Databáze nemá soubor", "SMB databáze zakazuje", "Kopie by smazala RAID"], 0, "Běžící databáze se zálohuje nástrojem, který umí konzistentní snímek."), ]), L("UPS", "UPS", "Minuty na uložení, ne náhradní elektrárna.", "Minutes to shut down cleanly, not a spare power station.", [ S("1 / 3 • Úkol", "Překlenout výpadek", "Tip: malá UPS neutáhne učebnu. Utáhne server, než se uloží.", "Při výpadku přejde na baterii.", "Čas běhu závisí na odběru, ne na nálepce bez zátěže.", "Server dostane signál a vypne se po pořádku.", "Tiskárna a monitor na UPS servery okrádají o minuty."), S("2 / 3 • Tvar", "Ne každá UPS je pro zdroj serveru", "Tip: levná UPS s obdélníkovým průběhem modernímu zdroji vadí.", "Sinusový výstup je jistější pro aktivní PFC zdroje.", "Výkon ve voltampérech není totéž co watty na štítku zdroje.", "Přetížená UPS spadne právě ve výpadku.", "Zkouška pod zátěží ukáže skutečné minuty."), S("3 / 3 • Baterie", "Spotřební díl", "Tip: baterie po třech letech v teple už slíbené minuty nedá.", "Test baterie nečeká na první bouřku.", "Výměna se dělá dřív, než článek nabobtná.", "Teplá místnost baterii ničí rychleji.", "UPS není náhrada za zálohu dat."), ], [ Q("K čemu malá UPS u serveru je?", ["Aby se systém stihl uložit a vypnout", "Aby učebna jela celé odpoledne", "Aby nahradila zálohu disků", "Aby chladila rack"], 0, "Jsou to minuty, ne směna."), Q("Proč na UPS nepatří laserová tiskárna?", ["Má velký odběr a sebere čas serverům", "Tiskárna UPS zničí vždy okamžitě", "USB tiskárny UPS zakazuje", "Toner potřebuje jinou frekvenci"], 0, "Špička zapékání baterii vybíjí zbytečně."), Q("Co ukáže jen nálepka bez zátěže?", ["Optimistický čas, který v provozu neplatí", "Přesné minuty při plném serveru", "Stav RAID", "Teplotu procesoru"], 0, "Měří se s tím, co na UPS opravdu visí."), Q("Jak často baterie přestane držet slib?", ["Po letech, dřív v teple", "Nikdy, je součástí zdroje navždy", "Až po deseti minutách prvního provozu", "Jen když je UPS černá"], 0, "Je to spotřební díl a má se zkoušet."), ]), L("Firmware", "Firmware", "Aktualizace, která nejde udělat uprostřed hodiny.", "An update that is not applied in the middle of a lesson.", [ S("1 / 3 • Co to je", "Program v železe", "Tip: firmware není ovladač ve Windows. Žije v zařízení i bez systému.", "Deska, disk, switch i BIOS mají vlastní verzi.", "Chyba ve firmware shodí zařízení bez ohledu na systém.", "Výrobce vydává opravy i roky po prodeji.", "Neznámá verze se nejdřív zjistí, potom se teprve stahuje."), S("2 / 3 • Postup", "Jedno zařízení, zdroj, záloha", "Tip: aktualizace při bouřce bez UPS je způsob, jak dostat cihlu.", "Přečtěte, co verze opravuje a co rozbije.", "Záloha konfigurace switche jde bokem.", "Napájení nesmí vypadnout v půlce zápisu.", "Po dokončení ověřte, že naběhla i služba, ne jen dioda."), S("3 / 3 • Řada", "Ne všechno v pátek odpoledne", "Tip: neaktualizujte jádro sítě a jediný server ve stejné hodině.", "Nejdřív méně důležité zařízení.", "Okno, kdy smí síť ležet, je domluvené.", "Když nová verze zlobí, musíte umět předchozí.", "Zápis verze patří k zařízení, ne do hlavy jednoho člověka."), ], [ Q("Čím se firmware liší od ovladače?", ["Je v zařízení a běží i bez operačního systému", "Je to jen soubor na ploše", "Maže se s přeinstalací vždy", "Umí ho jen tiskárna"], 0, "BIOS a firmware disku přežijí nový systém."), Q("Co před aktualizací switche uložíte?", ["Konfiguraci a zajistíte napájení", "Jen tapetu na ploše", "Heslo Wi-Fi na tabuli", "Nic, aktualizace si pamatuje sama"], 0, "Přerušený zápis a chybějící záloha jsou dvě pasti."), Q("Proč neaktualizovat jádro a jediný server naráz?", ["Když obojí selže, nemáte z čeho učit ani spravovat", "Výrobce to technicky zakazuje vždy", "Firmware umí jen jedno zařízení na budovu", "UPS to nesežere"], 0, "Nechte si cestu zpět."), Q("Co po aktualizaci ověříte?", ["Že služba opravdu naběhla, ne jen že svítí dioda", "Že je krabice teplejší", "Že se změnila barva menu", "Nic, firmware se neověřuje"], 0, "Start zařízení není totéž co fungující síť."), ]), L("Měření výkonu", "Measuring performance", "Číslo bez podmínek nic neznamená.", "A number without the conditions means nothing.", [ S("1 / 3 • Co měřit", "Úzké hrdlo", "Tip: rychlý procesor nezachrání pomalý disk, na kterém systém čeká.", "Sledujte procesor, paměť, disk a síť zvlášť.", "Vytížení 100 % chvíli není chyba, trvale ano.", "Fronta na disku řekne víc než otáčky ventilátoru.", "Jedno číslo z herního testu není návrh školního serveru."), S("2 / 3 • Podmínky", "Stejná zkouška", "Tip: srovnávejte stejný test, stejná data a stejný čas běhu.", "Studený start a druhý běh z cache nejsou totéž.", "Notebook na baterii schválně zpomalí.", "Antivirus v testu umí sežrat výsledek.", "Zapište verzi systému i to, co na pozadí jelo."), S("3 / 3 • Rozhodnutí", "Kdy dokoupit", "Tip: nejdřív paměť nebo disk, ne automaticky nejnovější procesor.", "Málo paměti žene systém na disk a všechno zpomalí.", "Plný a pomalý disk kazí i silný procesor.", "Slabé Wi-Fi nezrychlíte výměnou grafické karty.", "Nákup bez měření je odhad."), ], [ Q("Co neznamená krátká špička procesoru na 100 %?", ["Že je procesor nutně slabý", "Že je všechno v pořádku navždy", "Že disk neexistuje", "Že se má hned vyměnit deska"], 0, "Záleží, jestli špička trvá a jestli na ní někdo čeká."), Q("Proč druhý běh testu bývá rychlejší?", ["Data už jsou v cache", "Procesor se sám přetaktuje natrvalo", "Disk se zmenší", "BIOS test podruhé vynechá"], 0, "Cache není výkon železa v prvním čtení."), Q("Co často zpomalí celý systém dřív než procesor?", ["Málo paměti a pomalý disk", "Příliš mnoho USB myš", "Barva skříně", "Počet ikon na ploše"], 0, "Systém pak pořád čeká na stránkování."), Q("Co k výsledku testu patří zapsat?", ["Verze, napájení a co jelo na pozadí", "Jen nejvyšší číslo", "Jméno učitele", "Heslo k BIOSu"], 0, "Bez podmínek číslo nejde zopakovat."), ]), ], ) HW4 = course( "hw4", "Údržba, TPM, nákup, mobily, periferie, ekologie a maturita.", "Maintenance, TPM, buying, mobiles, peripherals, disposal and the exam.", [ L("Údržba", "Maintenance", "Čištění a revize dřív, než něco shoří.", "Cleaning and checks before something burns.", [ S("1 / 3 • Prašnost", "Řád, ne až když hučí", "Tip: otevřená skříň vysátá naslepo umí nasát prach dovnitř zdroje.", "Filtry se perou dřív, než zčernají.", "Zdroj se neotevírá. Čistí se zvenku.", "Klávesnice a myš učebny jsou spotřební a špinavé.", "Zápis, kdy se učebna dělala, příště určí interval."), S("2 / 3 • Kontakty", "Uvolněný kabel vypadá jako mrtvá deska", "Tip: než objednáte desku, domáčkněte napájení a vyzkoušejte jiný kabel obrazu.", "Oxidy na stolních konektorech kazí obraz i USB.", "Ohnutý konektor HDMI se do portu necpe silou.", "Napájecí kabel s poškozenou izolací se vyřadí, nelepí páskou.", "Prodlužovačka pod kobercem je požár, ne úspora místa."), S("3 / 3 • Evidence", "Co ve třídě vůbec je", "Tip: bez inventárního čísla nepoznáte, který zdroj se vrací do záruky.", "Štítek, umístění a rok pořízení.", "Záruka a doklad nejsou v šuplíku jednoho člověka.", "Odepsaný stroj se nevrací do sítě s původním účtem.", "Pravidelná prohlídka je levnější než hodina bez učebny."), ], [ Q("Co se při údržbě se zdrojem nedělá?", ["Neotevírá se", "Omývá se mu mřížka zvenku", "Kontroluje se kabel", "Píše se, kdy byl čištěný"], 0, "Uvnitř je napětí i po odpojení."), Q("Co uděláte s kabelem s porušenou izolací?", ["Vyřadíte ho", "Zalepíte izolepou a vrátíte pod koberec", "Schováte ho za skříň", "Dáte ho k žákovskému počítači"], 0, "Poškozená izolace je požár a úraz."), Q("K čemu je inventární číslo?", ["Aby šlo dohledat záruku a umístění", "Aby zrychlilo procesor", "Nahrazuje heslo BIOSu", "Je to sériové číslo Windows"], 0, "Bez něj je reklamace hádanka."), Q("Kam nepatří odepsaný počítač?", ["Zpět do sítě s původními účty", "Do evidence odpadu", "K smazání disků", "Mimo žákovskou VLAN"], 0, "Starý účet na mrtvém stroji je pořád díra, když ho někdo zapne."), ]), L("TPM a Secure Boot", "TPM and Secure Boot", "Železo, které hlídá start systému.", "Hardware that watches the system start.", [ S("1 / 3 • TPM", "Klíče mimo disk", "Tip: TPM není heslo, které uživatel píše při každém startu.", "Čip drží klíče použité při startu a šifrování disku.", "Bez něj některé systémy šifrování disku odmítnou.", "Vymazání TPM bez zálohy klíčů znamená ztrátu přístupu k disku.", "Na virtuálu bývá TPM také virtuální a patří k tomu stroji."), S("2 / 3 • Start", "Řetěz důvěry", "Tip: Secure Boot a TPM řeší start, ne to, co uživatel spustí odpoledne.", "Firmware ověří zavaděč.", "Zavaděč ověří jádro.", "Cizí systém z flash disku bez podpisu nenaběhne.", "V laboratoři se výjimka zapíše, nenechá vypnutá navždy."), S("3 / 3 • Zámek", "Kensington není šifra", "Tip: lankový zámek zdrží odnesení, data chrání šifrování disku.", "Zámek skříně zpomalí toho, kdo chce odnést RAM.", "Heslo BIOSu zpomalí toho, kdo chce přeházet boot.", "Šifra disku zastaví toho, kdo disk odnese.", "Všechny tři vrstvy řeší jiného zloděje."), ], [ Q("Co TPM drží?", ["Klíče pro start a šifrování", "Zálohu všech dokumentů školy", "Obraz monitoru", "Seznam VLAN"], 0, "Není to úložiště souborů."), Q("Co se stane po vymazání TPM bez zálohy klíčů?", ["Šifrovaný disk nemusí jít otevřít", "Zrychlí se start", "Smaže se jen spořič", "Nic, TPM klíče nepoužívá"], 0, "Klíč v čipu bez kopie je pryč."), Q("Co Secure Boot nezastaví?", ["Program, který uživatel spustí v už naběhlém systému", "Nepodepsaný zavaděč", "Cizí systém z flashe, pokud podpis chybí", "Změnu řetězu startu"], 0, "Hlídá start, ne každé pozdější kliknutí."), Q("Co ochrání data na odcizeném disku?", ["Šifrování disku", "Jen lankový zámek skříně", "Heslo spořiče", "Inventární štítek"], 0, "Zámek zdrží odnesení celé skříně, ne čtení disku na jiném stroji."), ]), L("Nákup sestavy", "Buying a computer", "Nejdřív práce, potom krabice.", "The work comes first, then the box.", [ S("1 / 3 • Účel", "Učebna není střih videa", "Tip: stejná sestava pro psaní a pro CAD je buď drahá, nebo pomalá.", "Kancelář chce spolehlivost, ticho a dost paměti na prohlížeč.", "Střih a CAD chtějí procesor, paměť a často grafiku.", "Server chce ECC nebo aspoň diskové pole a správu, ne podsvícení.", "Počet portů a dokování je součást ceny, ne doplněk potom."), S("2 / 3 • Čísla", "Co srovnávat", "Tip: více jader nepomůže programu, který umí jen jedno.", "Paměť berte s rezervou na čtyři roky, ne na dnešní minimum.", "SSD jako systémový disk je základ. Velký sklad může být pomalejší.", "Zdroj má rezervu nad součtem štítků, ne jen přesný součet.", "Záruka na místě je u učebny levnější než odvoz dvaceti strojů."), S("3 / 3 • Stejnost", "Jedna image", "Tip: dvacet různých desek znamená dvacet ovladačů.", "Stejný model v učebně zjednoduší image i náhradní díl.", "Dokoupit za dva roky stejnou desku často nejde. Pište, co je uvnitř.", "Nejlevnější kus bez portů, které učebna používá, levný není.", "Příkon a hluk patří do zadání, ne až do reklamace."), ], [ Q("Podle čeho se volí sestava?", ["Podle práce, kterou na ní škola dělá", "Podle barvy krabice", "Podle nejvyššího čísla v reklamě", "Podle počtu RGB ventilátorů"], 0, "CAD a psaní dopisu nechtějí stejné železo."), Q("Proč v učebně stejný model?", ["Jedna image a jeden náhradní díl", "Aby se lišily ovladače", "Aby každý stroj bootoval jinak", "Zákon to vyžaduje kvůli VLAN"], 0, "Různé desky znamenají různou údržbu."), Q("Co u zdroje nestačí?", ["Součet štítků bez rezervy", "Rezerva nad typický odběr", "Správný formát do skříně", "Pojistka, která sedí k rozvodu"], 0, "Špička a stárnutí se do přesného součtu nevejdou."), Q("Co zdraží zdánlivě levný notebook?", ["Chybějící porty a dok, který musíte dokoupit", "To, že má SSD", "To, že má záruku", "To, že je tichý"], 0, "Učebna bez obrazových výstupů potřebuje doky."), ]), L("Mobilní zařízení", "Mobile devices", "Tablet a telefon ve školní síti.", "Tablets and phones on the school network.", [ S("1 / 3 • Správa", "Cizí kapsy", "Tip: telefon žáka není školní majetek a nepatří mu školní certifikát natrvalo.", "Školní tablet se dá zapsat do správy a na dálku smazat.", "Soukromý telefon do správy školy nepatří.", "Účet školy na soukromém zařízení má jít odebrat.", "Ztracený školní tablet bez správy je cizí počítač s vašimi daty."), S("2 / 3 • Síť", "Kam ho pustit", "Tip: telefon učitelů ve stejné VLAN jako servery je zbytečné riziko.", "Hostovská nebo mobilní síť je oddělená.", "Školní tablet může dostat jinou síť než návštěva.", "Sdílené tablety se mezi žáky mažou nebo přepínají profil.", "Nabíjení ve třídě je otázka pojistek, ne jen kabelů na stole."), S("3 / 3 • Život", "Baterie a pád", "Tip: cyklování baterie v nabíjecím kufru ji po dvou letech unaví.", "Obal a popruh jsou součást nákupu, ne charita.", "Aktualizace systému se dělají hromadně, ne podle nálady.", "Rozbitý displej se nevrací do oběhu s trčícím sklem.", "Evidence IMEI nebo sériového čísla patří k inventuře."), ], [ Q("Čím se liší školní tablet od soukromého telefonu?", ["Školní jde zapsat do správy a na dálku vymazat", "Soukromý musí mít školní certifikát navždy", "Jsou to stejné režimy", "Tablet nepatří do inventury"], 0, "Majetek školy se dá spravovat, kapsa žáka ne."), Q("Kam nepatří učitelský telefon?", ["Do VLAN se servery", "Do oddělené mobilní sítě", "Na účet, který jde odebrat", "Mimo žákovská data, pokud to jde"], 0, "Ztracený telefon nemá být klíč k serverům."), Q("Co sdílený tablet mezi žáky potřebuje?", ["Mazání profilu nebo oddělené účty", "Jedno heslo napsané na obalu", "Trvalou složku předchozího žáka", "Vypnuté aktualizace"], 0, "Cizí účet na dalším žákovi je únik."), Q("Co patří do evidence tabletu?", ["Sériové číslo a umístění", "Jen barva obalu", "Heslo žáka", "Soukromé fotky"], 0, "Bez čísla ho nepoznáte v kupě stejných."), ]), L("Periferie v provozu", "Peripherals in daily use", "Tiskárny, projektory a co se na nich láme.", "Printers, projectors, and what actually breaks.", [ S("1 / 3 • Projektor", "Lampa a síť", "Tip: lampa má hodiny. Nečekejte, až praskne uprostřed hodiny.", "Zdroj obrazu a kabel jsou častější chyba než deska.", "Filtr projektoru se ucpe prachem a přístroj se vypne.", "Stropní držák se dotahuje, nevěší se na něj.", "Náhradní kabel ve třídě je levnější než přestávka."), S("2 / 3 • Tisk", "Fronta a toner", "Tip: prázdný toner a zaseknutý papír jsou dvě různé hlášky.", "Sklad toneru má být suchý, ne na topení.", "Účet tisku omezí náhodné desítky stran.", "Síťová tiskárna se po výměně adresy musí najít znovu.", "Servisní interval bubnu není totéž co výměna toneru."), S("3 / 3 • Drobnosti", "Myš, sluchátka, kamera", "Tip: bezdrátová myš bez náhradní baterie je v hodině mrtvá.", "Sluchátka ve třídě mají být omyvatelná.", "Kamera na dálkovou výuku chce světlo před obličejem, ne za zády.", "USB přijímač myši ztracený v portu projektoru se špatně hledá.", "Spotřební věci se objednávají dřív, než dojde poslední kus."), ], [ Q("Co u projektoru kontrolovat dřív než desku?", ["Zdroj obrazu, kabel a filtr", "Jen typ žárovky ve stropě učebny", "Heslo Wi-Fi", "Verzi BIOSu učitelského telefonu"], 0, "Obraz často končí na kabelu."), Q("Čím se liší toner a buben?", ["Toner je prach s barvou, buben je díl, který obraz přenáší", "Jsou to totéž", "Buben se mění každý den", "Toner je jen u inkoustové tiskárny"], 0, "Prázdný toner a unavený buben vypadají na stránce jinak."), Q("Proč účty tisku?", ["Omezí náhodné velké tisky", "Zvýší rozlišení", "Nahradí papír", "Vypnou skener"], 0, "Fronta bez limitu tiskne omylem celé knihy."), Q("Co ve třídě dochází bez náhrady jako první?", ["Baterie, kabely a spotřební díly", "Procesory", "Rackové lišty", "TPM čipy"], 0, "Drobnost zastaví hodinu stejně jako velká porucha."), ]), L("Ekologie a data", "Disposal and data", "Vyhozený disk pořád obsahuje školu.", "A discarded drive still contains the school.", [ S("1 / 3 • Disk", "Smazat neznamená vyhodit", "Tip: rychlé formátování nechá data čitelná.", "Před vyřazením se disk smaže tak, aby nešel běžně obnovit.", "Nefunkční disk se fyzicky zničí, ne jen odloží.", "SSD se maže příkazem, který buňky opravdu uvolní.", "Potvrzení o likvidaci patří k inventuře."), S("2 / 3 • Železo", "Není to směsný odpad", "Tip: monitor a deska nepatří do popelnice za školou.", "Elektroodpad se odevzdává na určené místo.", "Baterie zvlášť, a nabobtnané ještě opatrněji.", "Toner je taky odpad s režimem, ne koš ve sborovně.", "Štítek s jménem žáka se před odvozem sundá."), S("3 / 3 • Darování", "Starý stroj ven ze školy", "Tip: darovaný počítač bez smazání účtů je dar i s přístupy.", "Nejdřív data, potom majetek.", "Licence vázaná na školu se nesmí odstěhovat s počítačem.", "Zápis, komu stroj připadl, chrání školu.", "Nefunkční dar je jen přesun odpadu."), ], [ Q("Proč nestačí rychlé formátování?", ["Data jdou často obnovit", "Formát disk fyzicky rozbije", "SSD formát zakazuje", "Smaže i TPM v jiném počítači"], 0, "Zmizí odkaz, ne obsah buněk."), Q("Kam nepatří stará deska?", ["Do směsného koše", "Do elektroodpadu", "K evidované likvidaci", "Po smazání dat, pokud se vyřazuje"], 0, "Elektroodpad má vlastní režim."), Q("Co před darem počítače uděláte?", ["Smažete data a ověříte licence", "Necháte účty, ať se nový majitel přihlásí", "Jen umyjete skříň", "Přilepíte heslo na víko"], 0, "Dar není předání školní sítě."), Q("Čím se maže SSD líp než jedním přepisem naslepo?", ["Příkazem, který buňky opravdu uvolní", "Smazáním koše", "Změnou tapety", "Vypnutím Secure Boot"], 0, "Řadič SSD přepis naslepo nemusí uložit tam, kde čekáte."), ]), L("Metodika závady", "A fault method", "Jedna věta, která drží celý postup.", "One sentence that holds the whole procedure.", [ S("1 / 3 • Příznak", "Co přesně nejde", "Tip: ‚nejde počítač‘ může být černý obraz, špatné heslo i spadlá síť.", "Zeptejte se, co uživatel čekal a co vidí.", "Od kdy a jestli to jde jinde.", "Jedna učebna, nebo jen jeden stůl.", "Bez příznaku se mění díly naslepo."), S("2 / 3 • Izolace", "Nejužší místo", "Tip: fungující kabel a fungující port rozdělí chybu na dvě hromady.", "Vyměňte kabel, port, účet nebo zařízení, vždy jen jedno.", "Když náhradní kus funguje, původní je vinný nebo špatně nastavený.", "Když nefunguje ani náhradní, chyba je ve společné věci.", "Pište si mezivýsledky. Paměť po obědě lže."), S("3 / 3 • Závěr", "Oprava a prevence", "Tip: vyměněný kabel bez zápisu se příští měsíc tváří jako záhada.", "Opravte příčinu, ne jen příznak na jednom stole.", "Řekněte uživateli, co se změnilo.", "Díly do opravy nepatří zpátky do skříně potichu.", "Opakovaná závada chce úpravu nákupu nebo zapojení."), ], [ Q("Co je první otázka?", ["Co přesně nejde a od kdy", "Jakou má deska barvu", "Jestli je ve škole VLAN 20", "Kolik stojí nový notebook"], 0, "Příznak zužuje vrstvu, kterou budete zkoušet."), Q("Proč měnit jen jeden díl?", ["Ať víte, který rozdíl pomohl", "Sklad má jen jeden kabel", "BIOS víc výměn zakazuje", "Uživatel jinak zapomene heslo"], 0, "Dvě výměny naráz nic nedokážou."), Q("Náhradní kabel taky nejde. Co z toho plyne?", ["Chyba je spíš ve portu, účtu nebo zařízení", "Oba kabely jsou vždy špatné", "Síť nemá smysl", "Je rozbitý TPM"], 0, "Společné selhání ukazuje na společnou část."), Q("Co patří do zápisu opravy?", ["Příznak, příčina a co se vyměnilo", "Jen ‚hotovo‘", "Heslo uživatele", "Soukromý názor na učitele"], 0, "Příště podle zápisu nezačínáte od nuly."), ]), L("Opakování k maturitě", "Exam review", "Železo, které umíte pojmenovat a zdůvodnit.", "Hardware you can name and justify.", [ S("1 / 3 • Tok dat", "Od kliknutí k disku", "Tip: maturita chce cestu, ne seznam zkratek.", "Vstup, paměť, procesor, sběrnice, disk a výstup.", "RAM je pracovní, disk je trvalý. Není to totéž.", "Grafika může mít vlastní paměť a pořád jede po sběrnici.", "Úzké hrdlo je nejpomalejší článek této cesty."), S("2 / 3 • Spolehlivost", "Co drží učebnu", "Tip: záloha, RAID a UPS řeší tři různé nehody.", "RAID drží provoz při pádu disku.", "Záloha vrátí data z jiného místa a času.", "UPS dá čas na vypnutí.", "Firmware a čištění jsou prevence, ne oprava po požáru."), S("3 / 3 • Rozhodnutí", "Proč právě tahle krabice", "Tip: umíte obhájit paměť, disk a porty pro konkrétní učebnu.", "Kancelář, střih a server mají jiné priority.", "Stejný model ve třídě šetří image.", "Vyřazení začíná smazáním dat.", "Závadu vedete od příznaku po jedné změně."), ], [ Q("Čím se liší RAM a disk?", ["RAM je pracovní paměť, disk drží data i bez napájení", "Jsou to totéž", "Disk je vždy rychlejší", "RAM se zálohuje na pásku"], 0, "Vypnutí smaže obsah RAM, ne uložený soubor na disku."), Q("Co vrátí soubor smazaný před týdnem?", ["Záloha z dřívějšího dne, ne RAID", "RAID 1 sám", "UPS", "Secure Boot"], 0, "RAID má pořád aktuální, tedy i smazaný stav."), Q("Co dá UPS?", ["Čas na pořádné vypnutí", "Kopii dat v jiné budově", "Rychlejší procesor", "Nový disk"], 0, "Baterie není archiv."), Q("Čím začíná vyřazení počítače?", ["Smazáním dat", "Sundáním obalu", "Darem bez kontroly", "Zápisem do VLAN"], 0, "Nejdřív obsah, potom plech."), ]), ], ) COURSES = [NET2, NET3, NET4, HW2, HW3, HW4] BACK = { "net2": "netyears", "net3": "netyears", "net4": "netyears", "hw2": "hwyears", "hw3": "hwyears", "hw4": "hwyears", } TITLE = { "net2": "net_year2", "net3": "net_year3", "net4": "net_year4", "hw2": "hw_year2", "hw3": "hw_year3", "hw4": "hw_year4", } PTR = { "net2": "qy_net2", "net3": "qy_net3", "net4": "qy_net4", "hw2": "qy_hw2", "hw3": "qy_hw3", "hw4": "qy_hw4", } def emit(): lines = [ '#include "graduately.h"', "", "/* Generated by scripts/gen-it-years.py. Do not edit by hand. */", "", ] i18n = [] pages = [] for course in COURSES: p = course["prefix"] i18n.append( f' {{"{p}_sub", {c(course["sub"])}, {c(course["sub_en"])}}},' ) for n, lesson in enumerate(course["lessons"], start=1): i18n.append( f' {{"{p}_unit{n}", {c(lesson["title"])}, {c(lesson["title_en"])}}},' ) i18n.append( f' {{"{p}_unit{n}_sub", {c(lesson["sub"])}, {c(lesson["sub_en"])}}},' ) i18n.append( f' {{"{p}_ex{n}_title", {c("Kvíz: " + lesson["title"])}, ' f'{c("Quiz: " + lesson["title_en"])}}},' ) i18n.append( f' {{"{p}_quiz{n}_head", {c("Kvíz k tématu " + lesson["title"])}, ' f'{c("Quiz on " + lesson["title_en"])}}},' ) lines.append(f"static GtkWidget *build_{p}_unit{n}_page(void) {{") lines.append(" static const NetSlide slides[] = {") for kicker, title, tip, bullets in lesson["slides"]: lines.append(" {") lines.append(f" {c(kicker)}, {c(title)}, {c(tip)},") lines.append(" {") for bullet in bullets: lines.append(f" {c(bullet)},") lines.append(" NULL,") lines.append(" },") lines.append(" },") lines.append(" };") lines.append( f' return quizyear_unit({PTR[p]}, {n - 1}, "{p}_unit{n}", ' f'"{p}_unit{n}_sub", slides, (int)(sizeof slides / sizeof slides[0]));' ) lines.append("}") lines.append("") lines.append(f"static GtkWidget *build_{p}_unit{n}_exercise_page(void) {{") lines.append(" static const ChoiceQ qs[] = {") for prompt, options, correct, _hint in lesson["quiz"]: opts = ", ".join(c(o) for o in options) lines.append(f" {{{c(prompt)}, {{{opts}}}, 4, {correct}}},") lines.append(" };") lines.append(" static const char *hints[] = {") for _prompt, _options, _correct, hint in lesson["quiz"]: lines.append(f" {c(hint)},") lines.append(" };") lines.append( f' return quizyear_quiz({PTR[p]}, {n - 1}, "{p}_ex{n}_title", ' f'"{p}_quiz{n}_head", qs, hints, (int)(sizeof qs / sizeof qs[0]));' ) lines.append("}") lines.append("") pages.append((f"{p}unit{n}", f"build_{p}_unit{n}_page")) pages.append((f"{p}ex{n}", f"build_{p}_unit{n}_exercise_page")) lines.append("void add_it_year_pages(GtkStack *stack) {") lines.append(" quizyear_boot();") for course in COURSES: p = course["prefix"] lines.append( f' gtk_stack_add_named(stack, quizyear_map({PTR[p]}), "{p}map");' ) for name, fn in pages: lines.append(f' gtk_stack_add_named(stack, {fn}(), "{name}");') lines.append("}") lines.append("") (ROOT / "src" / "it_year_pages.c").write_text("\n".join(lines) + "\n", encoding="utf-8") (ROOT / "src" / "it_years_i18n.inc").write_text("\n".join(i18n) + "\n", encoding="utf-8") print(f"wrote {len(COURSES) * 8} lessons") if __name__ == "__main__": emit()