Open software as four years from Windows and Office to policy.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
pepaskopec-blip 2026-10-11 19:25:48 +02:00
commit 264f4a73d8
84 changed files with 3327 additions and 4 deletions

View file

@ -76,6 +76,8 @@ Intel Mac, jiná architektura nebo úpravy kódu → [sestavení ze zdroje](#ses
- **Prezentační grafika** — 4 ročníky, v každém 8 lekcí: Photoshop od pixelu
po plakát, Premiere Pro a ve čtvrtém ročníku Illustrator, After Effects
a InDesign
- **Programové vybavení** — 4 ročníky, v každém 8 lekcí: Windows a licence,
Word a Excel, Access a MySQL, pak WordPress, Power BI, dávkové soubory a zásady
- **Programování** — 4 ročníky C# po vzoru W3Schools. U každé lekce se kód
píše a spouští vedle výkladu, od výpisu po třídy, LINQ a async
- **Český jazyk a literatura** — literatura (4 ročníky, 32 lekcí podle osnov
@ -97,7 +99,7 @@ Intel Mac, jiná architektura nebo úpravy kódu → [sestavení ze zdroje](#ses
### Použití
1. **Úvod** ukáže postup a mřížku předmětů. Otevřený předmět spustí cestu. Zamčená dlaždice zatím nic neotevře: programové vybavení.
1. **Úvod** ukáže postup a mřížku předmětů. Každý předmět spustí svou cestu.
2. U němčiny je učebnice (Neue Freunde, Aus aller Welt, Bei uns zu Hause) a čtyři ročníky. Ostatní otevřené předměty mají ročníky, lekce nebo knihy.
3. Z cesty se otevře výklad, poslech, čtení, psaní nebo kvíz.
4. **Statistiky**, **Nastavení** a **Hledat** jsou v postranním panelu na Macu. Na telefonu a v desktopové aplikaci jsou na záložkách, hledání navíc ikonou lupy. Zkratka je `Cmd/Ctrl+K`.

View file

@ -34,6 +34,8 @@ import org.maturita.maturita.ui.LessonListScreen
import org.maturita.maturita.ui.FyzQuizScreen
import org.maturita.maturita.ui.PgQuizScreen
import org.maturita.maturita.ui.PgYearsScreen
import org.maturita.maturita.ui.SwQuizScreen
import org.maturita.maturita.ui.SwYearsScreen
import org.maturita.maturita.ui.TgQuizScreen
import org.maturita.maturita.ui.TgYearsScreen
import org.maturita.maturita.ui.MathPracticeScreen
@ -645,6 +647,63 @@ private fun MaturitaAppBody(vm: AppViewModel) {
}
}
is Route.Pg4Ex -> PgQuizScreen(vm, 4, r.id)
Route.SwYears -> SwYearsScreen(vm)
Route.SwMap -> LessonListScreen(
vm, vm.tr("sw_year1"), vm.tr("sw_sub"),
vm.content.sw.map { l ->
val id = l.int("id")
LessonRow(vm.tr(l.str("titleKey")), vm.progress.swDone(id), Route.SwLesson(id))
},
)
is Route.SwLesson -> {
val l = vm.content.swLesson(r.id)
if (l != null) SlidesScreen(vm, vm.tr(l.str("titleKey")), vm.tr(l.str("subKey")), l.arr("slides")) {
vm.replace(Route.SwEx(r.id))
}
}
is Route.SwEx -> SwQuizScreen(vm, 1, r.id)
Route.Sw2Map -> LessonListScreen(
vm, vm.tr("sw_year2"), vm.tr("sw2_sub"),
vm.content.sw2.map { l ->
val id = l.int("id")
LessonRow(vm.tr(l.str("titleKey")), vm.progress.sw2Done(id), Route.Sw2Lesson(id))
},
)
is Route.Sw2Lesson -> {
val l = vm.content.sw2Lesson(r.id)
if (l != null) SlidesScreen(vm, vm.tr(l.str("titleKey")), vm.tr(l.str("subKey")), l.arr("slides")) {
vm.replace(Route.Sw2Ex(r.id))
}
}
is Route.Sw2Ex -> SwQuizScreen(vm, 2, r.id)
Route.Sw3Map -> LessonListScreen(
vm, vm.tr("sw_year3"), vm.tr("sw3_sub"),
vm.content.sw3.map { l ->
val id = l.int("id")
LessonRow(vm.tr(l.str("titleKey")), vm.progress.sw3Done(id), Route.Sw3Lesson(id))
},
)
is Route.Sw3Lesson -> {
val l = vm.content.sw3Lesson(r.id)
if (l != null) SlidesScreen(vm, vm.tr(l.str("titleKey")), vm.tr(l.str("subKey")), l.arr("slides")) {
vm.replace(Route.Sw3Ex(r.id))
}
}
is Route.Sw3Ex -> SwQuizScreen(vm, 3, r.id)
Route.Sw4Map -> LessonListScreen(
vm, vm.tr("sw_year4"), vm.tr("sw4_sub"),
vm.content.sw4.map { l ->
val id = l.int("id")
LessonRow(vm.tr(l.str("titleKey")), vm.progress.sw4Done(id), Route.Sw4Lesson(id))
},
)
is Route.Sw4Lesson -> {
val l = vm.content.sw4Lesson(r.id)
if (l != null) SlidesScreen(vm, vm.tr(l.str("titleKey")), vm.tr(l.str("subKey")), l.arr("slides")) {
vm.replace(Route.Sw4Ex(r.id))
}
}
is Route.Sw4Ex -> SwQuizScreen(vm, 4, r.id)
Route.CsYears -> CsYearsScreen(vm)
Route.CsMap -> LessonListScreen(
vm, vm.tr("cs_year1"), vm.tr("cs_sub"),

View file

@ -282,6 +282,26 @@ class AppViewModel(val content: Content, val platform: Platform) {
refresh()
}
fun markSw(id: Int) {
progress.markSw(id)
refresh()
}
fun markSw2(id: Int) {
progress.markSw2(id)
refresh()
}
fun markSw3(id: Int) {
progress.markSw3(id)
refresh()
}
fun markSw4(id: Int) {
progress.markSw4(id)
refresh()
}
fun markCs(id: Int) {
progress.markCs(id)
refresh()

View file

@ -131,6 +131,19 @@ sealed class Route(val page: String) {
data object Pg4Map : Route("pg4map")
data class Pg4Lesson(val id: Int) : Route("pg4unit$id")
data class Pg4Ex(val id: Int) : Route("pg4ex$id")
data object SwYears : Route("swyears")
data object SwMap : Route("swmap")
data class SwLesson(val id: Int) : Route("swunit$id")
data class SwEx(val id: Int) : Route("swex$id")
data object Sw2Map : Route("sw2map")
data class Sw2Lesson(val id: Int) : Route("sw2unit$id")
data class Sw2Ex(val id: Int) : Route("sw2ex$id")
data object Sw3Map : Route("sw3map")
data class Sw3Lesson(val id: Int) : Route("sw3unit$id")
data class Sw3Ex(val id: Int) : Route("sw3ex$id")
data object Sw4Map : Route("sw4map")
data class Sw4Lesson(val id: Int) : Route("sw4unit$id")
data class Sw4Ex(val id: Int) : Route("sw4ex$id")
data object CsYears : Route("csyears")
data object CsMap : Route("csmap")
data class CsLesson(val id: Int) : Route("csunit$id")
@ -298,6 +311,19 @@ sealed class Route(val page: String) {
Pg4Map -> listOf(Subjects, PgYears, Pg4Map)
is Pg4Lesson -> listOf(Subjects, PgYears, Pg4Map, this)
is Pg4Ex -> listOf(Subjects, PgYears, Pg4Map, Pg4Lesson(id), this)
SwYears -> listOf(Subjects, SwYears)
SwMap -> listOf(Subjects, SwYears, SwMap)
is SwLesson -> listOf(Subjects, SwYears, SwMap, this)
is SwEx -> listOf(Subjects, SwYears, SwMap, SwLesson(id), this)
Sw2Map -> listOf(Subjects, SwYears, Sw2Map)
is Sw2Lesson -> listOf(Subjects, SwYears, Sw2Map, this)
is Sw2Ex -> listOf(Subjects, SwYears, Sw2Map, Sw2Lesson(id), this)
Sw3Map -> listOf(Subjects, SwYears, Sw3Map)
is Sw3Lesson -> listOf(Subjects, SwYears, Sw3Map, this)
is Sw3Ex -> listOf(Subjects, SwYears, Sw3Map, Sw3Lesson(id), this)
Sw4Map -> listOf(Subjects, SwYears, Sw4Map)
is Sw4Lesson -> listOf(Subjects, SwYears, Sw4Map, this)
is Sw4Ex -> listOf(Subjects, SwYears, Sw4Map, Sw4Lesson(id), this)
CsYears -> listOf(Subjects, CsYears)
CsMap -> listOf(Subjects, CsYears, CsMap)
is CsLesson -> listOf(Subjects, CsYears, CsMap, this)
@ -369,6 +395,11 @@ fun routeFromPage(page: String): Route? = when (page) {
"pg2map" -> Route.Pg2Map
"pg3map" -> Route.Pg3Map
"pg4map" -> Route.Pg4Map
"swyears" -> Route.SwYears
"swmap" -> Route.SwMap
"sw2map" -> Route.Sw2Map
"sw3map" -> Route.Sw3Map
"sw4map" -> Route.Sw4Map
"csyears" -> Route.CsYears
"csmap" -> Route.CsMap
"cs2map" -> Route.Cs2Map
@ -519,6 +550,30 @@ fun routeFromPage(page: String): Route? = when (page) {
Regex("""pgex(\d+)""").matchEntire(page)?.let {
return Route.PgEx(it.groupValues[1].toInt())
}
Regex("""sw4unit(\d+)""").matchEntire(page)?.let {
return Route.Sw4Lesson(it.groupValues[1].toInt())
}
Regex("""sw4ex(\d+)""").matchEntire(page)?.let {
return Route.Sw4Ex(it.groupValues[1].toInt())
}
Regex("""sw3unit(\d+)""").matchEntire(page)?.let {
return Route.Sw3Lesson(it.groupValues[1].toInt())
}
Regex("""sw3ex(\d+)""").matchEntire(page)?.let {
return Route.Sw3Ex(it.groupValues[1].toInt())
}
Regex("""sw2unit(\d+)""").matchEntire(page)?.let {
return Route.Sw2Lesson(it.groupValues[1].toInt())
}
Regex("""sw2ex(\d+)""").matchEntire(page)?.let {
return Route.Sw2Ex(it.groupValues[1].toInt())
}
Regex("""swunit(\d+)""").matchEntire(page)?.let {
return Route.SwLesson(it.groupValues[1].toInt())
}
Regex("""swex(\d+)""").matchEntire(page)?.let {
return Route.SwEx(it.groupValues[1].toInt())
}
Regex("""cs4unit(\d+)""").matchEntire(page)?.let {
return Route.Cs4Lesson(it.groupValues[1].toInt())
}

View file

@ -64,6 +64,10 @@ class Content(root: JSONObject) {
val pg2 = raw.arr("pg2")
val pg3 = raw.arr("pg3")
val pg4 = raw.arr("pg4")
val sw = raw.arr("sw")
val sw2 = raw.arr("sw2")
val sw3 = raw.arr("sw3")
val sw4 = raw.arr("sw4")
val cs = raw.arr("cs")
val cs2 = raw.arr("cs2")
val cs3 = raw.arr("cs3")
@ -128,6 +132,10 @@ class Content(root: JSONObject) {
fun pg2Lesson(id: Int) = pg2.firstOrNull { it.int("id") == id }
fun pg3Lesson(id: Int) = pg3.firstOrNull { it.int("id") == id }
fun pg4Lesson(id: Int) = pg4.firstOrNull { it.int("id") == id }
fun swLesson(id: Int) = sw.firstOrNull { it.int("id") == id }
fun sw2Lesson(id: Int) = sw2.firstOrNull { it.int("id") == id }
fun sw3Lesson(id: Int) = sw3.firstOrNull { it.int("id") == id }
fun sw4Lesson(id: Int) = sw4.firstOrNull { it.int("id") == id }
fun csLesson(id: Int) = cs.firstOrNull { it.int("id") == id }
fun cs2Lesson(id: Int) = cs2.firstOrNull { it.int("id") == id }
fun cs3Lesson(id: Int) = cs3.firstOrNull { it.int("id") == id }

View file

@ -107,6 +107,14 @@ class ProgressStore(private val prefs: Prefs, content: Content) {
fun markPg3(id: Int) { mark("pg3.$id") }
fun pg4Done(id: Int) = done("pg4.$id")
fun markPg4(id: Int) { mark("pg4.$id") }
fun swDone(id: Int) = done("sw.$id")
fun markSw(id: Int) { mark("sw.$id") }
fun sw2Done(id: Int) = done("sw2.$id")
fun markSw2(id: Int) { mark("sw2.$id") }
fun sw3Done(id: Int) = done("sw3.$id")
fun markSw3(id: Int) { mark("sw3.$id") }
fun sw4Done(id: Int) = done("sw4.$id")
fun markSw4(id: Int) { mark("sw4.$id") }
fun csDone(id: Int) = done("cs.$id")
fun markCs(id: Int) { mark("cs.$id") }
fun cs2Done(id: Int) = done("cs2.$id")
@ -368,6 +376,38 @@ fun summarize(content: Content, p: ProgressStore): ProgressSum {
sum.doneUnits += 1
}
}
content.sw.forEach { l ->
sum.totalEx += 1
sum.openUnits += 1
if (p.swDone(l.int("id"))) {
sum.doneEx += 1
sum.doneUnits += 1
}
}
content.sw2.forEach { l ->
sum.totalEx += 1
sum.openUnits += 1
if (p.sw2Done(l.int("id"))) {
sum.doneEx += 1
sum.doneUnits += 1
}
}
content.sw3.forEach { l ->
sum.totalEx += 1
sum.openUnits += 1
if (p.sw3Done(l.int("id"))) {
sum.doneEx += 1
sum.doneUnits += 1
}
}
content.sw4.forEach { l ->
sum.totalEx += 1
sum.openUnits += 1
if (p.sw4Done(l.int("id"))) {
sum.doneEx += 1
sum.doneUnits += 1
}
}
content.cs.forEach { l ->
sum.totalEx += 1
sum.openUnits += 1

View file

@ -1130,6 +1130,30 @@ fun PgQuizScreen(vm: AppViewModel, year: Int, id: Int) {
}
}
@Composable
fun SwQuizScreen(vm: AppViewModel, year: Int, id: Int) {
val lesson = when (year) {
2 -> vm.content.sw2Lesson(id)
3 -> vm.content.sw3Lesson(id)
4 -> vm.content.sw4Lesson(id)
else -> vm.content.swLesson(id)
} ?: return
val spec = J(org.json.JSONObject().apply {
put("type", "choice")
put("title", vm.tr(lesson.str("exTitleKey")))
put("sub", lesson.str("quizHeadKey"))
put("questions", lesson.o.optJSONArray("quiz"))
})
DispatchExercise(vm, spec, vm.tr(lesson.str("exTitleKey"))) {
when (year) {
2 -> vm.markSw2(id)
3 -> vm.markSw3(id)
4 -> vm.markSw4(id)
else -> vm.markSw(id)
}
}
}
@Composable
fun FyzQuizScreen(vm: AppViewModel, year: Int, id: Int) {
val lesson = when (year) {

View file

@ -25,6 +25,7 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.automirrored.filled.MenuBook
import androidx.compose.material.icons.filled.Apps
import androidx.compose.material.icons.filled.Architecture
import androidx.compose.material.icons.filled.AutoAwesome
import androidx.compose.material.icons.filled.AutoStories
@ -248,6 +249,7 @@ private fun SubjectIcon(icon: String, open: Boolean) {
"ruler" -> Icon(Icons.Filled.Architecture, null, tint = tint, modifier = Modifier.size(26.dp))
"code" -> Icon(Icons.Filled.Terminal, null, tint = tint, modifier = Modifier.size(26.dp))
"brush" -> Icon(Icons.Filled.Brush, null, tint = tint, modifier = Modifier.size(26.dp))
"apps" -> Icon(Icons.Filled.Apps, null, tint = tint, modifier = Modifier.size(26.dp))
else -> Icon(Icons.Filled.Lock, null, tint = tint)
}
}
@ -369,6 +371,10 @@ fun routeProgress(vm: AppViewModel, r: Route): Pair<Int, Int>? {
Route.Pg2Map -> tally(c.pg2, p::pg2Done)
Route.Pg3Map -> tally(c.pg3, p::pg3Done)
Route.Pg4Map -> tally(c.pg4, p::pg4Done)
Route.SwMap -> tally(c.sw, p::swDone)
Route.Sw2Map -> tally(c.sw2, p::sw2Done)
Route.Sw3Map -> tally(c.sw3, p::sw3Done)
Route.Sw4Map -> tally(c.sw4, p::sw4Done)
Route.CsMap -> tally(c.cs, p::csDone)
Route.Cs2Map -> tally(c.cs2, p::cs2Done)
Route.Cs3Map -> tally(c.cs3, p::cs3Done)
@ -457,6 +463,13 @@ private fun subjectSum(vm: AppViewModel, s: J): ProgressSum {
vm.content.pg3.count { vm.progress.pg3Done(it.int("id")) } +
vm.content.pg4.count { vm.progress.pg4Done(it.int("id")) }
}
"swyears", "swmap", "sw2map", "sw3map", "sw4map" -> {
sum.totalEx = vm.content.sw.size + vm.content.sw2.size + vm.content.sw3.size + vm.content.sw4.size
sum.doneEx = vm.content.sw.count { vm.progress.swDone(it.int("id")) } +
vm.content.sw2.count { vm.progress.sw2Done(it.int("id")) } +
vm.content.sw3.count { vm.progress.sw3Done(it.int("id")) } +
vm.content.sw4.count { vm.progress.sw4Done(it.int("id")) }
}
"czechmap" -> {
val litDone = vm.content.lit.count { vm.progress.litDone(it.int("id")) } +
vm.content.lit2.count { vm.progress.lit2Done(it.int("id")) } +
@ -758,6 +771,27 @@ private fun buildSearch(vm: AppViewModel): List<Hit> {
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "fyz4unit${l.int("id")}", extra = "fyzika")
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "fyz4ex${l.int("id")}")
}
add(vm.tr("Programové vybavení"), vm.tr("search_lesson"), "swyears", extra = "office windows excel mysql")
add(vm.tr("sw_year1"), vm.tr("search_lesson"), "swmap", extra = "rocnik")
add(vm.tr("sw_year2"), vm.tr("search_lesson"), "sw2map", extra = "rocnik")
add(vm.tr("sw_year3"), vm.tr("search_lesson"), "sw3map", extra = "rocnik")
add(vm.tr("sw_year4"), vm.tr("search_lesson"), "sw4map", extra = "rocnik")
vm.content.sw.forEach { l ->
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "swunit${l.int("id")}", extra = "windows")
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "swex${l.int("id")}")
}
vm.content.sw2.forEach { l ->
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw2unit${l.int("id")}", extra = "word excel")
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw2ex${l.int("id")}")
}
vm.content.sw3.forEach { l ->
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw3unit${l.int("id")}", extra = "access mysql")
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw3ex${l.int("id")}")
}
vm.content.sw4.forEach { l ->
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw4unit${l.int("id")}", extra = "wordpress")
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw4ex${l.int("id")}")
}
add(vm.tr("Prezentační grafika"), vm.tr("search_lesson"), "pgyears", extra = "photoshop premiere illustrator")
add(vm.tr("pg_year1"), vm.tr("search_lesson"), "pgmap", extra = "rocnik")
add(vm.tr("pg_year2"), vm.tr("search_lesson"), "pg2map", extra = "rocnik")
@ -1032,6 +1066,20 @@ fun CsYearsScreen(vm: AppViewModel) {
}
}
@Composable
fun SwYearsScreen(vm: AppViewModel) {
DetailScaffold(vm, vm.tr("Programové vybavení"), vm.tr("sw_years_sub")) { inner ->
LazyColumn(contentPadding = PaddingValues(top = inner.calculateTopPadding(), bottom = inner.calculateBottomPadding() + 16.dp)) {
item {
NavRow(title = vm.tr("sw_year1"), subtitle = vm.tr("sw_sub"), leading = { LeadingBadge("1") }, progress = routeProgress(vm, Route.SwMap)) { vm.go(Route.SwMap) }
NavRow(title = vm.tr("sw_year2"), subtitle = vm.tr("sw2_sub"), leading = { LeadingBadge("2") }, progress = routeProgress(vm, Route.Sw2Map)) { vm.go(Route.Sw2Map) }
NavRow(title = vm.tr("sw_year3"), subtitle = vm.tr("sw3_sub"), leading = { LeadingBadge("3") }, progress = routeProgress(vm, Route.Sw3Map)) { vm.go(Route.Sw3Map) }
NavRow(title = vm.tr("sw_year4"), subtitle = vm.tr("sw4_sub"), leading = { LeadingBadge("4") }, progress = routeProgress(vm, Route.Sw4Map)) { vm.go(Route.Sw4Map) }
}
}
}
}
@Composable
fun PgYearsScreen(vm: AppViewModel) {
DetailScaffold(vm, vm.tr("Prezentační grafika"), vm.tr("pg_years_sub")) { inner ->

View file

@ -18,7 +18,7 @@ Skript vypíše počet lekcí, nebo chyby s cestou a číslem řádku
| Složka | Obsah |
|---|---|
| `pocitacove-site/`, `technicke-vybaveni/`, `technicka-grafika/`, `prezentacni-grafika/`, `programovani/`, `obcanska-nauka/`, `fyzika/` | `N-rocnik/`, v nich lekce |
| `pocitacove-site/`, `technicke-vybaveni/`, `technicka-grafika/`, `prezentacni-grafika/`, `programove-vybaveni/`, `programovani/`, `obcanska-nauka/`, `fyzika/` | `N-rocnik/`, v nich lekce |
| `prirodni-vedy/chemie`, `prirodni-vedy/biologie` | lekce |
| `cestina/literatura/N-rocnik` | lekce literatury |
| `cestina/mluvnice` | cvičení z mluvnice |
@ -97,7 +97,7 @@ a smažte `puvodni`.
## Běžná lekce
Sítě, hardware, technická grafika, prezentační grafika, občanka, literatura, chemie, biologie, fyzika.
Sítě, hardware, technická grafika, prezentační grafika, programové vybavení, občanka, literatura, chemie, biologie, fyzika.
```md
---

View file

@ -5,6 +5,12 @@
# cs: bullet
# en: bullet
--- 2026-10-11
cs: Programové vybavení: Windows, Word, Excel, Access, MySQL a správa účtů
cs: Čtyři ročníky, od licence a složek po WordPress, Power BI a zásady
en: Software: Windows, Word, Excel, Access, MySQL and account administration
en: Four years, from licences and folders to WordPress, Power BI and policy
--- 2026-10-11
cs: Prezentační grafika: Photoshop, Premiere Pro a další programy Adobe
cs: Čtyři ročníky, v každé lekci postup, zadání a kvíz

View file

@ -14,4 +14,4 @@
| Technická grafika | Technická grafika | Technical Graphics | ruler | tgyears | ano |
| Prezentační grafika | Prezentační grafika | Presentation Graphics | brush | pgyears | ano |
| Programování | Programování | Programming | code | csyears | ano |
| Programové vybavení | Programové vybavení | Software | lock | | ne |
| Programové vybavení | Programové vybavení | Software | apps | swyears | ano |

View file

@ -258,6 +258,20 @@
| pg3_sub | Premiere Pro: střih, zvuk, titulky a video. | Premiere Pro: the cut, sound, titles and the video. |
| pg4_sub | Illustrator, After Effects, InDesign a maturitní kampaň. | Illustrator, After Effects, InDesign and the exam campaign. |
# Programové vybavení
| Klíč | Česky | Anglicky |
|---|---|---|
| sw_years_sub | Operační systém, Office, databáze a správa Windows. | The operating system, Office, databases and Windows administration. |
| sw_year1 | 1. ročník | Year 1 |
| sw_year2 | 2. ročník | Year 2 |
| sw_year3 | 3. ročník | Year 3 |
| sw_year4 | 4. ročník | Year 4 |
| sw_sub | Software, licence a práce ve Windows. | Software, licences and working in Windows. |
| sw2_sub | Word a Excel: dokument, vzorce a graf. | Word and Excel: a document, formulas and a chart. |
| sw3_sub | Access a MySQL: tabulky, dotazy a vztahy. | Access and MySQL: tables, queries and relationships. |
| sw4_sub | WordPress, Power BI, dávkové soubory a zásady. | WordPress, Power BI, batch files and policy. |
# Programování
| Klíč | Česky | Anglicky |

View file

@ -0,0 +1,6 @@
---
nazev: Software and licences
popis: System and application programs, and the terms for using them.
nazev_cviceni: Quiz: software and licences
nadpis_kvizu: Name the kind of program and the kind of licence
---

View file

@ -0,0 +1,79 @@
---
id: sw-1-software-a-licence
nazev: Software a licence
popis: Systémové a aplikační programy a to, za jakých podmínek se smí používat.
nazev_cviceni: Kvíz: software a licence
nadpis_kvizu: Poznejte druh programu a druh licence
---
# Výklad
## Dva druhy programů
*Software*
- Software je program. Hardware je zařízení. Samotný počítač bez programu nic neudělá.
- Operační systém řídí počítač: Windows, Linux, macOS. Ve škole pracujeme ve Windows.
- Aplikační software řeší jednu práci: Word dokument, Excel tabulku, prohlížeč web.
- Ovladač je malý program k zařízení. Tiskárna bez ovladače netiskne, i když je zapnutá.
> Tip: Když program spadne a systém běží dál, spadla aplikace. Když nesvítí plocha, spadl systém.
## Licence
*Podmínky*
- Licence říká, kdo program smí nainstalovat a na kolik počítačů.
- Komerční program se kupuje, nebo se platí předplatné. Microsoft 365 je předplatné.
- OEM licence je přivázaná k jednomu počítači. Na nový stroj se nepřetahuje.
- Stažený program bez licence není zdarma. Je to kopie, kterou škola nesmí používat.
> Tip: Školní účet Microsoft 365 nepatří na domácí počítače navždy. Platí, dokud škola předplatné má.
## Zdarma není jeden pojem
*Freeware a open source*
- Freeware je zdarma, ale zdrojový kód nedostanete. Smíte ho používat za podmínek autora.
- Open source má otevřený kód. GPL navíc chce, aby odvozené programy zůstaly otevřené.
- Zkušební verze (shareware) po čase skončí, nebo omezí funkce. Není to trvalá licence.
- Na školní počítač patří jen programy, které škola schválila. Vlastní instalace se hlásí učiteli.
> Tip: Cena nula neznamená, že smíte program rozdávat dál. I freeware má licenci.
## Zadání: šest programů
*Cvičení*
- Do tabulky zapište šest programů ze školního počítače: systém, prohlížeč, Word, Excel a dva další.
- U každého napište, jestli je systémový, nebo aplikační.
- U Wordu a Excelu napište, jaká licence ve škole je: předplatné Microsoft 365, ne domácí krabice.
- Soubor pojmenujte licence.txt a uložte ho do Dokumenty. Zatím nic neinstalujte.
> Tip: Název systému zjistíte příkazem winver. Okno ukáže edici Windows a verzi.
# Kvíz
## Kam patří Microsoft Word?
- Mezi operační systémy
- [x] Mezi aplikační software
- Mezi ovladače tiskárny
- Mezi hardware
> Word řeší jednu práci, dokument. Systém pod ním je Windows.
## Co znamená OEM licence Windows?
- Smí se přenést na každý další počítač
- [x] Je vázaná na jeden počítač
- Je to totéž co GPL
- Platí jen 14 dní
> OEM se prodává s počítačem a na jiný stroj se nepřesouvá.
## Čím se freeware liší od open source?
- Freeware má otevřený zdrojový kód
- [x] Freeware je zdarma, ale kód obvykle nedostanete
- Open source se nesmí používat ve škole
- Je to totéž
> Zdarma a otevřený kód jsou dvě různé věci. GPL je otevřená licence, ne jen nulová cena.
## Který program je operační systém?
- Excel
- [x] Windows
- WordPress
- Power BI
> Windows řídí počítač. Ostatní jsou aplikace, které na systému běží.

View file

@ -0,0 +1,6 @@
---
nazev: The operating system
popis: What the system does between the user and the hardware.
nazev_cviceni: Quiz: the operating system
nadpis_kvizu: Name the role of the system
---

View file

@ -0,0 +1,79 @@
---
id: sw-1-operacni-system
nazev: Operační systém
popis: Co systém dělá mezi uživatelem a hardwarem.
nazev_cviceni: Kvíz: operační systém
nadpis_kvizu: Poznejte roli systému
---
# Výklad
## Mezi člověkem a strojem
*Role*
- Systém spouští programy, hlídá paměť a přiděluje čas procesoru.
- Souborový systém ukládá data na disk. Ve Windows je to NTFS.
- Ovladač si systém načte, aby mluvil s tiskárnou, diskem a sítí.
- Uživatel vidí plochu a okna. Jádro pod tím nevidí a do něj nesahá.
> Tip: Když dva programy chtějí tiskárnu najednou, rozhodne systém. Samy se nedomluví.
## Tři systémy
*Windows, Linux, macOS*
- Školní učebna je Windows. Příkazy a obrazovky v tomto předmětu jsou z Windows.
- Linux je častý na serverech. Stejný dokument v Excelu tam sám od sebe není.
- macOS běží na počítačích Apple. Zkratka Ctrl je tam často Cmd.
- Soubor .docx je dokument Wordu. Není to program a není to systém.
> Tip: Přípona souboru říká, čím ho otevřít. Systém podle ní vybere aplikaci.
## Start počítače
*Až po přihlášení*
- Po zapnutí naběhne firmware, pak systém, pak přihlašovací obrazovka.
- Dokud se nepřihlásíte, pracujete s účtem nikoho. Soubory uživatele jsou zamčené.
- Každý účet má vlastní plochu a složku C:\Users\jméno.
- Vypnutí přes nabídku Start uloží práci systému. Dlouhý stisk tlačítka je až poslední možnost.
> Tip: Restart po aktualizaci není trest. Systém si domlouvá soubory, které za běhu nevymění.
## Zadání: jaký systém to je
*Cvičení*
- Spusťte winver a opište edici a verzi, třeba Windows 11 Pro, verzi z okna.
- Otevřete C:\Users a napište, které složky uživatelů tam jsou. Do cizích nesaháte.
- Najděte jeden ovladač v názvu: ve Správci zařízení rozbalte Monitory nebo Tiskárny.
- Zápis uložte jako system.txt do Dokumenty. Hesla ani sériová čísla nepište.
> Tip: Správce zařízení je ve Windows devmgmt.msc. Žlutý vykřičník znamená chybějící nebo vadný ovladač.
# Kvíz
## Co dělá operační systém s pamětí?
- Nic, paměť si berou programy samy
- [x] Přiděluje ji programům
- Maže ji při každém uložení dokumentu
- Patří do Excelu
> Program požádá, systém přidělí. Dva programy nesmí psát do stejného místa.
## Jaký souborový systém používá školní Windows na disku?
- [x] NTFS
- Jen názvy souborů bez systému
- SVG
- MySQL
> NTFS drží soubory, oprávnění i větší disky. Názvy složek jsou až uvnitř něj.
## Kdy smíte sáhnout do složky jiného uživatele v C:\Users?
- Kdykoli, je to jeden počítač
- [x] Nesmíte, je to jeho účet
- Jen když je složka na ploše
- Když má dokument příponu docx
> Každý účet má vlastní soubory. Cizí složka není společný šuplík.
## Čím zjistíte edici Windows?
- [x] Příkazem winver
- Otevřením Excelu
- Smazáním koše
- Souborem .bat
> winver otevře okno O systému Windows s edicí a verzí.

View file

@ -0,0 +1,6 @@
---
nazev: Files and folders
popis: A path, an extension and order in Documents.
nazev_cviceni: Quiz: files
nadpis_kvizu: Build the path and the name
---

View file

@ -0,0 +1,79 @@
---
id: sw-1-soubory
nazev: Soubory a složky
popis: Cesta, přípona a pořádek v Dokumentech.
nazev_cviceni: Kvíz: soubory
nadpis_kvizu: Sestavte cestu a název
---
# Výklad
## Cesta
*Kde soubor leží*
- Cesta začíná diskem. C:\Users\novak\Documents\Skola\1-rocnik je složka, ne soubor.
- Zpětné lomítko odděluje složky. Dopředné lomítko je na webu, ne ve Windows.
- Dokumenty jsou %USERPROFILE%\Documents. Na každém účtu to vede jinam, příkaz je stejný.
- Plocha je taky složka. Soubor jen na ploše se ve školním pořádku ztratí.
> Tip: Do řádku adresy v Průzkumníku vložte cestu a Enter. Nemusíte proklikávat pět složek.
## Přípona
*Čím se soubor otevře*
- prihlaska.docx je Word. znamky.xlsx je Excel. poznamka.txt je prostý text.
- Windows přípony schovává. Zapněte Zobrazit, Zobrazit, Přípony názvů souborů.
- Přejmenovat foto.jpg na foto.docx z něj dokument neudělá. Změní se jen štítek.
- Dvojitá přípona faktura.pdf.exe je program, který se tváří jako dokument. Neotevírejte ho.
> Tip: Když přípony vidíte, podvodný soubor poznáte dřív, než na něj kliknete.
## Názvy
*Co je zakázané*
- V názvu nesmí být znaky \ / : * ? " < > |.
- Mezera smí být, ale v dávkových souborech pak název patří do uvozovek.
- Školní název je věcný: 2026-06-12-zadost.docx. Final-final2.docx není název.
- Datum pište rok-měsíc-den. Složka se seřadí od nejstaršího sama.
> Tip: Kopírování je Ctrl+C, vložení Ctrl+V, přesun začíná Ctrl+X. Přesun z flashky na disk soubor na flashce smaže.
## Zadání: strom školy
*Cvičení*
- V Dokumentech založte Skola, v ní 1-rocnik a v ní slozky word, excel a system.
- Do word uložte prázdný soubor poznamka.txt. Příponu ať je vidět.
- Cesta ať končí na \Skola\1-rocnik\word\poznamka.txt.
- Na ploše nic nenechávejte. Koš nevysypávejte, dokud nevíte, co v něm je.
> Tip: Nová složka je Ctrl+Shift+N. Když se jmenuje Nová složka, hned ji přejmenujte.
# Kvíz
## Která cesta vede k souboru v Dokumentech?
- [x] C:\Users\novak\Documents\Skola\1-rocnik\poznamka.txt
- https://skola/poznamka.txt
- poznamka.txt bez složky, to stačí vždy
- C:/Users/novak s obyčejnými lomítky jako jediná správná forma
> Ve Windows se složky oddělují zpětným lomítkem a cesta začíná diskem.
## Co se stane, když foto.jpg přejmenujete na foto.docx?
- Stane se z něj upravitelný dokument Word
- [x] Změní se přípona, obsah zůstane obrázek
- Soubor se uloží do koše
- Vznikne tabulka Excel
> Přípona je nápověda pro systém. Bajty obrázku se samy nepřepíšou na dokument.
## Který název je na školní odevzdání nejlepší?
- final2.docx
- [x] 2026-06-12-zadost.docx
- Nový dokument.docx
- ???.docx
> Datum rok-měsíc-den se seřadí a je z něj poznat verze. Otazník v názvu Windows ani nepustí.
## Proč zapnout zobrazení přípon?
- Aby šly soubory mazat
- [x] Aby byl vidět skutečný typ, třeba pdf.exe
- Protože bez přípony soubor nejde uložit
- Excel to vyžaduje u každé buňky
> Skrytá přípona schová, že faktura.pdf.exe je program.

View file

@ -0,0 +1,6 @@
---
nazev: Installation and updates
popis: Where a program comes from and why the system is updated.
nazev_cviceni: Quiz: installation
nadpis_kvizu: Pick a safe source
---

View file

@ -0,0 +1,79 @@
---
id: sw-1-instalace
nazev: Instalace a aktualizace
popis: Odkud se program bere a proč se systém aktualizuje.
nazev_cviceni: Kvíz: instalace
nadpis_kvizu: Vyberte bezpečný zdroj
---
# Výklad
## Odkud instalovat
*Zdroj*
- Školní programy berte z Microsoft Store, z balíčku školy, nebo z webu výrobce.
- Odkaz v mailu, tlačítko Stáhnout zdarma na cizím webu a crack nejsou zdroj.
- Instalace chce souhlas správce. Okno Řízení uživatelských účtů se neodklepává poslepu.
- Na plochu nepatří deset instalačních souborů. Po instalaci je smažte, program už je v systému.
> Tip: Název souboru setup.exe nic neříká. Říká to vydavatel v okně účtů a adresa, odkud soubor přišel.
## Aktualizace
*Windows Update*
- Aktualizace zašívá chyby, přes které se do počítače leze. Odkládat ji týdny je riziko.
- Windows Update je v Nastavení, Windows Update. Školní počítač nechte doběhnout.
- Restart po aktualizaci udělejte, když o něj systém požádá. Ne uprostřed testu, ale ten den.
- Word a Excel se v Microsoft 365 aktualizují se sadou Office, ne jen s Windows.
> Tip: Verze systému z winver se po velké aktualizaci změní. Když se měsíc nemění, aktualizace stojí.
## Odinstalace
*Aplikace*
- Program se odebírá v Nastavení, Aplikace, Nainstalované aplikace. Ne smazáním zástupce.
- Zástupce na ploše je jen odkaz. Smazáním ikony program v počítači zůstane.
- Neznámý program, který jste neinstalovali, nejdřív nahlaste. Nemusí to být hra spolužáka.
- Odinstalace nesmaže vaše dokumenty. Smaže program. Dokumenty si před velkým úklidem zkopírujte.
> Tip: Když v seznamu aplikací Word není a zástupce ano, zástupce vede do prázdna, nebo na jiný disk.
## Zadání: stav počítače
*Cvičení*
- Z winver opište verzi. V Windows Update napište, jestli je systém aktuální, nebo něco čeká.
- V nainstalovaných aplikacích najděte Word nebo Microsoft 365 a opište název, jak ho seznam uvádí.
- Najděte jeden program, který nepoznáváte, a zapište ho. Neodinstalovávejte ho bez učitele.
- Uložte stav.txt do Skola\1-rocnik\system. Nic z internetu nestahujte.
> Tip: Čas poslední aktualizace je ve Windows Update dole v historii. Stačí datum, ne seznam všech záplat.
# Kvíz
## Odkud se má školní program instalovat?
- Z odkazu v neznámém mailu
- [x] Z webu výrobce, z Store, nebo z balíčku školy
- Z stránky s nápisem crack
- Z přílohy faktura.pdf.exe
> Výrobce, obchod a škola jsou zdroje. Crack a náhodný mail nejsou.
## Co udělá smazání zástupce na ploše?
- Odinstaluje program
- [x] Smaže jen odkaz, program zůstane
- Smaže Dokumenty
- Vypne aktualizace
> Zástupce je zkratka. Program se odebírá v Nainstalovaných aplikacích.
## Proč se Windows Update nenechává měsíc stát?
- Protože jinak nejde otevřít Word
- [x] Záplaty zavírají známé díry
- Protože se jinak smaže plocha
- Aktualizace jen mění tapetu
> Neaktualizovaný systém má chyby, které už jsou veřejně popsané.
## Kdy odklepnete okno Řízení uživatelských účtů?
- Vždycky, ať instalace pokračuje
- [x] Jen když víte, jaký program a odkud ho spouštíte
- Nikdy, ani u školního balíčku
- Jen v Excelu
> Okno říká, že program chce právo správce. Neznámý vydavatel se neodklepává.

View file

@ -0,0 +1,6 @@
---
nazev: User accounts
popis: A standard user, an administrator and a password that is not the account name.
nazev_cviceni: Quiz: accounts
nadpis_kvizu: Pick the account type and the password
---

View file

@ -0,0 +1,79 @@
---
id: sw-1-ucty
nazev: Uživatelské účty
popis: Běžný uživatel, správce a heslo, které není jméno účtu.
nazev_cviceni: Kvíz: účty
nadpis_kvizu: Vyberte typ účtu a heslo
---
# Výklad
## Dva typy
*Správce a uživatel*
- Správce smí instalovat programy a měnit systém. Ve škole je to účet učitele nebo správce učebny.
- Běžný uživatel smí pracovat se svými soubory. Systémové složky mu systém zamkne.
- Denní práce nepatří na účet správce. Virus by dostal stejná práva jako vy.
- Nový školní účet pro cvičení se jmenuje zaci a je běžný uživatel, ne správce.
> Tip: Když systém požádá o heslo správce, běžný účet na to nestačí. To je záměr, ne porucha.
## Heslo
*Osm znaků*
- Heslo má aspoň 8 znaků a není to jméno účtu, ani slovo heslo, ani 12345678.
- Do příkazu se heslo nepíše. Příkaz net user zaci * /add se na heslo zeptá a na obrazovce ho neukáže.
- Heslo na papírek na monitor nepatří. Patří do hlavy, nebo do školního sejfu hesel, když ho učitel určí.
- Cizí heslo se nezkouší. Ani když je účet spolužáka odhlášený a počítač je společný.
> Tip: Hvězdička v net user znamená dotaz na heslo. Heslo napsané za příkazem zůstane v historii příkazů.
## Vlastní soubory
*Profil*
- Profil je složka C:\Users\zaci. Jsou v ní Dokumenty, Plocha a Stažené soubory.
- Soubor uložený do Dokumentů tohoto účtu jiný běžný uživatel neotevře.
- Společná složka C:\Users\Public je pro věci, které mají vidět všichni. Úkoly tam nedávejte.
- Odhlášení účet zavře. Vypnutí počítače taky. Přepnutí uživatele nechá první účet otevřený v paměti.
> Tip: Na sdíleném počítači se odhlašujte. Přepnutí uživatele nechá otevřené dokumenty v paměti.
## Zadání: účet na papíře
*Cvičení*
- Napište, jak by se založil běžný účet zaci: příkaz net user zaci * /add spuštěný jako správce.
- Napište heslo, které pravidlům nevyhovuje, a druhé, které má aspoň 8 znaků a není jméno účtu. Skutečné školní heslo nepište.
- Účet nesmí být ve skupině Administrators. Patří mezi běžné Users.
- Uložte ucet.txt do Skola\1-rocnik\system. Účet v systému zakládejte jen když to učitel výslovně řekne.
> Tip: Kdo jsem, zjistí příkaz whoami. Když vypíše správce, na denní práci jste na špatném účtu.
# Kvíz
## Jaký má být cvičný účet zaci?
- Správce, ať jde všechno
- [x] Běžný uživatel
- Účet bez hesla
- Účet hosta sdílený celou třídou bez hesla
> Denní práce běží jako běžný uživatel. Správce je na instalaci a správu, ne na Word.
## Jak se heslo předá příkazu net user?
- Napíše se za příkaz, ať je v sešitě vidět
- [x] Hvězdičkou, příkaz se zeptá a heslo neukáže
- Do názvu účtu
- Do souboru na plochu
> net user zaci * /add se zeptá. Heslo v příkazu zůstane v historii.
## Proč se denně nepracuje jako správce?
- Word jinak nejde otevřít
- [x] Program, který spustíte, dostane právo měnit systém
- Správce nemá Dokumenty
- Excel jinak nepočítá
> Škodlivý program dědí vaše práva. U správce smí instalovat a měnit systém.
## Kam patří osobní úkol?
- Do C:\Users\Public
- [x] Do Dokumentů vlastního účtu
- Do složky Windows
- Na účet spolužáka
> Public vidí každý účet na počítači. Úkol patří do vlastního profilu.

View file

@ -0,0 +1,6 @@
---
nazev: Task Manager
popis: A process, memory and startup programs. The system is not ended.
nazev_cviceni: Quiz: Task Manager
nadpis_kvizu: Pick what you may end
---

View file

@ -0,0 +1,79 @@
---
id: sw-1-spravce-uloh
nazev: Správce úloh
popis: Proces, paměť a programy po spuštění. Systém se neukončuje.
nazev_cviceni: Kvíz: Správce úloh
nadpis_kvizu: Vyberte, co smíte ukončit
---
# Výklad
## Okno
*Ctrl+Shift+Esc*
- Správce úloh se otevře Ctrl+Shift+Esc. Nehledá se přes náhodné ikony na ploše.
- Karta Procesy ukáže aplikace a to, co běží na pozadí.
- Sloupec Procesor je v procentech. Sloupec Paměť je v megabajtech.
- Vysoká paměť u prohlížeče s dvaceti kartami je běžná. Vysoká paměť neznámého procesu se hlásí.
> Tip: Když plocha nereaguje, Ctrl+Shift+Esc často projde i tehdy, když nabídka Start ne.
## Ukončit se smí aplikace
*Ne systém*
- Ukončit úlohu smíte u svého Wordu, který nereaguje. Rozpracovaný dokument si předtím uložte, jinak o něj přijdete.
- Proces Systém, Registr a aplikace systému Windows se neukončují. Počítač pak nemusí doběhnout do restartu.
- Neznámý proces nejdřív vyhledejte podle přesného názvu. Ukončení není první krok.
- Restart počítače je čistší než ukončit deset systémových procesů za sebou.
> Tip: Word, který nereaguje, ukončete a otevřete znovu. Autorecover často dokument vrátí, ale nespoléhejte na něj.
## Po spuštění
*Co startuje samo*
- Karta Aplikace po spuštění ukáže programy, které naběhnou s Windows.
- Každý takový program bere čas startu a paměť. Ve škole jich má být málo.
- Vypnutí Teams nebo prohlížeče po spuštění, když ho učitel nechce, je v pořádku. Vypnutí zabezpečení Windows není.
- Změna se projeví po příštím přihlášení, ne vždy hned.
> Tip: Povolené a zakázané je v posledním sloupci. Zakázaný program v počítači zůstane, jen se sám nespustí.
## Zadání: jeden pohled
*Cvičení*
- Otevřete Správce úloh a zapište tři aplikace, které berou nejvíc paměti. Čísla opište.
- Najděte, jestli s Windows startuje něco, co nepoznáváte. Neznámé nevypínejte, jen ho zapište.
- Systémové procesy neukončujte. Když Word nereaguje, ukončete jen Word.
- Uložte procesy.txt do Skola\1-rocnik\system.
> Tip: Řazení podle paměti je kliknutí na záhlaví sloupce Paměť. První řádek je pak ten nejtěžší.
# Kvíz
## Jakou zkratkou se otevře Správce úloh?
- [x] Ctrl+Shift+Esc
- Ctrl+S
- Win+E je Správce úloh
- Alt+F4 na ploše
> Ctrl+Shift+Esc otevře Správce přímo. Win+E je Průzkumník.
## Co smíte ukončit, když nereaguje vaše práce?
- Proces Systém
- [x] Svůj Word, který nereaguje
- Registr
- Zabezpečení Windows
> Ukončuje se zaseknutá aplikace. Systémové procesy drží počítač.
## Co dělá vypnutí programu na kartě Po spuštění?
- Odinstaluje ho
- [x] Příště se sám nespustí s Windows
- Smaže Dokumenty
- Zakáže aktualizace
> Program v počítači zůstane. Nenaběhne jen sám při přihlášení.
## Vysoká paměť u prohlížeče s mnoha kartami znamená co?
- Že se má hned ukončit Systém
- [x] Že prohlížeč prostě drží otevřené karty
- Že je disk NTFS rozbitý
- Že vypršela licence
> Každá karta bere paměť. Neznámý proces je jiný případ než prohlížeč, který jste sami otevřeli.

View file

@ -0,0 +1,6 @@
---
nazev: Securing the computer
popis: Antivirus, updates and a file that pretends to be a document.
nazev_cviceni: Quiz: security
nadpis_kvizu: Pick what stays on and what stays closed
---

View file

@ -0,0 +1,79 @@
---
id: sw-1-zabezpeceni
nazev: Zabezpečení počítače
popis: Antivir, aktualizace a soubor, který se tváří jako dokument.
nazev_cviceni: Kvíz: zabezpečení
nadpis_kvizu: Vyberte, co se nezapíná a co se neotvírá
---
# Výklad
## Zabezpečení Windows
*Defender*
- Školní Windows mají Zabezpečení Windows. Antivir se nevypíná kvůli instalaci hry.
- Ochrana v reálném čase má být zapnutá. Vypnutá ochrana je nález, ne úleva.
- Brána firewall má být zapnutá na školní síti. Vypnutí kvůli jedné hře se nedělá.
- Druhý antivir vedle Defenderu se bez učitele neinstaluje. Dva se perou a oba pak hlídají hůř.
> Tip: Zabezpečení Windows otevřete z nabídky Start. Zelené fajfky u položek jsou stav, který opisujete do úkolu.
## Soubory a maily
*Co neotvírat*
- Příloha faktura.pdf.exe se neotevírá, ani když text mailu zní věcně.
- Odkaz na přihlášení, který nečekáte, se neotvírá. Škola po hesle v mailu nepátrá.
- Flash disk neznámého původu se do školního počítače nestrká. Nejdřív učitel.
- Makro ve Wordu se povoluje, jen když dokument přišel ze školy a učitel řekl proč.
> Tip: Heslo se neposílá mailem ani do chatu. Kdo ho po vás chce zprávou, nemá ho dostat.
## Oprávnění k souboru
*NTFS*
- Pravý klik na složku, Vlastnosti, Zabezpečení ukáže, kdo smí číst a kdo zapisovat.
- Běžný uživatel zapíše do svých Dokumentů. Do C:\Windows nezapíše.
- Odebrat si vlastní právo číst vlastní Dokumenty je chyba. Složka pak nejde otevřít.
- Společná složka Public nemá být místo, kam dáváte test s jménem.
> Tip: Když soubor nejde uložit, často nemáte právo zápisu. Uložte ho do Dokumentů, ne do Program Files.
## Zadání: pět kontrol
*Cvičení*
- Opište, jestli je ochrana v reálném čase zapnutá a jestli firewall hlásí zapnuto.
- Z Windows Update opište, jestli něco čeká na restart.
- Najděte ve stažených souborech, jestli tam není soubor s dvojitou příponou. Neotvírejte ho, zapište název.
- Uložte bezpecnost.txt do Skola\1-rocnik\system. Ochranu nevypínejte.
> Tip: Když je ochrana vypnutá, nezapínejte ji naslepo třemi kliky v neznámém okně. Řekněte to učiteli, může ji vypínat školní správa.
# Kvíz
## Co má být zapnuté v Zabezpečení Windows?
- Nic, antivir zpomaluje Word
- [x] Ochrana v reálném čase a firewall
- Jen spořič obrazovky
- Jen OneDrive
> Antivir i firewall jsou součást školního počítače. Nevypínají se kvůli pohodlí.
## Který soubor neotevřete?
- poznamka.txt z vlastní složky
- [x] faktura.pdf.exe z mailu
- zadost.docx, kterou jste sami uložili
- znamky.xlsx z hodiny
> Dvojitá přípona exe je program. Mail s fakturou ho nesmí spustit.
## Kam běžný uživatel smí uložit úkol?
- Do C:\Windows
- [x] Do svých Dokumentů
- Do složky ovladačů
- Přes cizí účet
> Dokumenty vlastního účtu jsou na zápis. Systémové složky ne.
## Proč se vedle Defenderu bez učitele nedává druhý antivir?
- Windows umí jen jeden a druhý se vždy sám smaže
- [x] Dva antiviry se navzájem ruší
- Defender je freeware bez licence
- Excel pak neumí SUMA
> Dva programy, které hlídají stejné soubory, se blokují. Ve škole stačí Zabezpečení Windows.

View file

@ -0,0 +1,6 @@
---
nazev: Assignment: a school account and a tidy disk
popis: Folders, a standard account, updates and protection in one note.
nazev_cviceni: Quiz: the school account
nadpis_kvizu: Check the whole assignment
---

View file

@ -0,0 +1,79 @@
---
id: sw-1-zadani-windows
nazev: Zadání: školní účet a pořádek
popis: Složky, běžný účet, aktualizace a ochrana v jednom zápisu.
nazev_cviceni: Kvíz: školní účet
nadpis_kvizu: Zkontrolujte celé zadání
---
# Výklad
## Složky
*Strom*
- V Dokumentech je Skola\1-rocnik a v ní word, excel a system.
- Na ploše nezůstane pracovní soubor. Plocha není archiv.
- Přípony názvů jsou vidět. poznámka se nejmenuje poznámka.txt.txt.
- Názvy jsou bez znaků \ / : * ? a datum v názvu je rok-měsíc-den.
> Tip: Cestu opište z řádku adresy. Od oka se lomítka pletou.
## Účet
*zaci*
- Cvičný účet zaci je běžný uživatel. Není ve skupině Administrators.
- Heslo má aspoň 8 znaků a nezadává se do příkazu, jen přes hvězdičku v net user zaci * /add.
- Do zápisu nepatří skutečné heslo. Patří tam pravidlo a příkaz bez hesla.
- whoami na denní práci nemá ukázat účet správce.
> Tip: Účet zakládejte jen pod dohledem. V zápisu stačí postup, když učitel účet na počítači nechce.
## Stav systému
*Tři řádky*
- winver: edice a verze.
- Windows Update: aktuální, nebo čeká restart. Datum stačí.
- Zabezpečení Windows: ochrana v reálném čase zapnutá, firewall zapnutý.
- Ze Správce úloh tři nejtěžší aplikace podle paměti. Systémové procesy neukončené.
> Tip: Když je něco vypnuté, zapište to jako nález. Neopravujte firewall naslepo.
## Odevzdání
*Jeden soubor*
- Všechno je v ucto-windows.txt ve složce Skola\1-rocnik\system.
- Jsou tam cesta ke složce word, popis účtu, verze Windows a stav ochrany.
- Není tam heslo, není tam cizí soubor a není tam vypnutý Defender.
- Soubor otevřete znovu a přečtěte ho. Cesta v textu musí po vložení do adresy opravdu vyjít.
> Tip: Když cesta z textu skončí chybou, složka neexistuje, nebo je v cestě obyčejné lomítko.
# Kvíz
## Jaký účet je zaci?
- Správce
- [x] Běžný uživatel mimo skupinu Administrators
- Účet bez hesla v Public
- Sdílený účet celé třídy
> Denní účet není správce. Heslo má a do skupiny Administrators nepatří.
## Kam se ukládá pracovní soubor?
- Na plochu
- [x] Do Skola\1-rocnik a příslušné složky
- Do C:\Windows
- Do stažených souborů bez názvu
> Plocha se nearchivuje. Strom Skola drží word, excel a system odděleně.
## Co má být zapnuté?
- Jen spořič
- [x] Ochrana v reálném čase a firewall
- Dva antiviry
- Sdílení celé složky Users
> Defender a firewall zůstávají zapnuté. Do úkolu se opisuje jejich stav.
## Co v souboru ucto-windows.txt být nesmí?
- Verze z winver
- [x] Skutečné heslo
- Cesta ke složce
- Stav Windows Update
> Heslo se do textového úkolu nepíše. Příkaz ho bere přes hvězdičku, ne do sešitu.

View file

@ -0,0 +1,6 @@
---
nazev: Word: styles
popis: Heading 1, body text and spacing that is not empty lines.
nazev_cviceni: Quiz: styles
nadpis_kvizu: Pick the style and the shortcut
---

View file

@ -0,0 +1,79 @@
---
id: sw-2-word-styly
nazev: Word: styly
popis: Nadpis 1, normální text a mezery, které nejsou prázdné řádky.
nazev_cviceni: Kvíz: styly
nadpis_kvizu: Vyberte styl a zkratku
---
# Výklad
## Styl, ne ruční tučné
*Nadpis*
- Nadpis 1 je styl. Ctrl+Alt+1 ho zapne. Nadpis 2 je Ctrl+Alt+2.
- Tučné a větší písmo místo stylu vypadá jako nadpis, ale obsah z něj Word nesestaví.
- Normální text je styl Normální. Ctrl+Shift+N ho vrátí, když jste omylem v nadpisu.
- V dokumentu jsou nejvýš tři úrovně nadpisů. Čtvrtá je už nepřehledná.
> Tip: Podokno Styly otevřete z karty Domů. U odstavce je vidět, jaký styl opravdu má.
## Odstavec
*Mezery ze stylu*
- Prázdný Enter mezi odstavci se nedělá. Mezera se nastaví ve stylu, třeba 8 bodů za odstavcem.
- Řádkování školního textu je 1,15 nebo 1,5. Ne dvojité přes celou stránku bez důvodu.
- Zarovnání do bloku u delšího textu, vlevo u nadpisu a u krátkého dopisu.
- Stránka je A4. Okraje 2,5 cm ze všech stran, to je předvolba Normální.
> Tip: Konec stránky je Ctrl+Enter. Řada Enterů na další stránku se při úpravě rozjede.
## Soubor
*docx a pdf*
- Pracovní soubor je .docx. Jdou v něm styly i další úpravy.
- Na odevzdání, které se už nemá měnit, je navíc PDF.
- Jednou vyexportované PDF neupravujte dál jako jediný zdroj. Opravte docx a PDF udělejte znovu.
- Název je věcný: 2026-06-12-protokol.docx. Dokument1.docx se neodevzdává.
> Tip: Soubor, Export, Vytvořit soubor PDF. Před exportem se podívejte na náhled tisku, jestli nadpis nesedí sám na konci stránky.
## Zadání: dvoustránkový text
*Cvičení*
- Dokument A4, okraje 2,5 cm, aspoň tři nadpisy stylem Nadpis 1.
- Pod každým nadpisem aspoň jeden odstavec stylem Normální. Žádné prázdné Entery mezi nimi.
- Konec první stránky je Ctrl+Enter, ne deset prázdných řádků.
- Uložte protokol.docx do Skola\1-rocnik\word a k němu protokol.pdf.
> Tip: Když v navigačním podokně nadpisy nejsou, jsou to jen tučná písma. Označte je a dejte Ctrl+Alt+1.
# Kvíz
## Jak se má udělat nadpis, aby z něj šel obsah?
- Tučně a 16 bodů
- [x] Stylem Nadpis 1, zkratka Ctrl+Alt+1
- Pěti prázdnými Entery nad ním
- Obrázkem textu
> Obsah čte styly. Ruční tučné písmo v obsahu není.
## Čím se přejde na další stránku?
- Deseti Entery
- [x] Ctrl+Enter
- Mezerou za odstavcem 80 bodů
- Smazáním okrajů
> Ctrl+Enter je konec stránky. Prázdné řádky se při doplnění textu rozjedou.
## Jaké jsou školní okraje na A4?
- 0 cm, ať se vejde víc
- [x] 2,5 cm, předvolba Normální
- 5 cm vpravo a 0 vlevo
- Okraje se ve Wordu nenastavují
> Normální okraj je 2,5 cm. Text až do kraje papíru tiskárna často ořízne.
## Který soubor se dál upravuje?
- PDF
- [x] docx
- Jen vytištěná stránka
- Příloha exe
> docx drží styly. PDF je kopie na odevzdání.

View file

@ -0,0 +1,6 @@
---
nazev: Word: a table, a header and a table of contents
popis: A 4 by 3 table, a page number and a contents list from the headings.
nazev_cviceni: Quiz: contents
nadpis_kvizu: Pick where the contents come from
---

View file

@ -0,0 +1,79 @@
---
id: sw-2-word-obsah
nazev: Word: tabulka, záhlaví a obsah
popis: Tabulka 4×3, číslo stránky a obsah z nadpisů.
nazev_cviceni: Kvíz: obsah
nadpis_kvizu: Vyberte, odkud se obsah vezme
---
# Výklad
## Tabulka
*4 řádky a 3 sloupce*
- Tabulka se vkládá z karty Vložení. Kreslení tužkou od ruky se ve školním protokolu nedělá.
- Školní tabulka má 4 řádky a 3 sloupce: záhlaví a tři záznamy.
- Záhlaví tabulky je tučné a řádek se neopakuje jako obyčejný text pod tabulkou.
- Text v buňce se nezalamuje deseti mezerami. Šířka sloupce se táhne myší.
> Tip: Když potřebujete řádek navíc, klepněte vpravo od řádku a dejte vložit. Enter v buňce jen zalomí text.
## Záhlaví a zápatí
*Číslo stránky*
- Záhlaví je nahoře, zápatí dole. Dvojklik v okraji je otevře.
- V záhlaví je název školy a název dokumentu. V zápatí je číslo stránky.
- Číslo stránky se vloží jako pole. Ručně napsaná jednička se na druhé stránce neposune.
- Záhlaví není nadpis dokumentu. Nadpis zůstává v textu jako Nadpis 1.
> Tip: Pole čísla stránky má po označení šedé pozadí. Když je to obyčejná číslice, na další stránce se nezmění.
## Obsah
*Z nadpisů*
- Obsah je na kartě Reference, Obsah. Word ho složí z Nadpis 1 a Nadpis 2.
- Ručně psaný seznam stránek obsah není. Po vložení odstavce se rozejde.
- Po změně textu se obsah aktualizuje pravým klikem, Aktualizovat pole, a volbou celá tabulka.
- Obsah stojí na začátku, za titulní řádek, na vlastní stránce nebo hned pod názvem. Ne na konci.
> Tip: Když je obsah prázdný, nadpisy nejsou styly. Ctrl+Alt+1 a obsah aktualizujte znovu.
## Zadání: protokol s tabulkou
*Cvičení*
- Vezměte protokol.docx. Přidejte tabulku 4×3: sloupec Jméno, Třída, Stav.
- Tři řádky: Anna Nováková, 1.A, odevzdáno. Druhý a třetí řádek doplňte vlastními jmény.
- Záhlaví s názvem školy, zápatí s číslem stránky, obsah z nadpisů na začátku.
- Uložte znovu docx a nové PDF. Staré PDF přepište, ať neexistují dvě verze.
> Tip: Aktualizace obsahu se ptá, jestli jen čísla, nebo celá tabulka. Po nových nadpisech berte celou tabulku.
# Kvíz
## Jak velká je školní tabulka v tomto úkolu?
- [x] 4 řádky a 3 sloupce
- Jedna buňka
- 10 sloupců bez záhlaví
- Tabulka se ve Wordu nedělá
> Záhlaví plus tři záznamy jsou čtyři řádky. Sloupce jsou Jméno, Třída a Stav.
## Odkud Word vezme obsah?
- Z tučných vět
- [x] Ze stylů Nadpis 1 a Nadpis 2
- Z zápatí
- Z Excelu automaticky vždy
> Bez stylů nadpisů je obsah prázdný. Tučné písmo nestačí.
## Jak se má dostat na stránku číslo?
- Napsat 1 do zápatí ručně
- [x] Vložit pole čísla stránky
- Dát ho do názvu souboru
- Nepsat ho, Word ho do PDF doplní sám i bez pole
> Pole se na každé stránce samo zvýší. Ruční jednička zůstane jednička.
## Kdy se obsah aktualizuje celý, ne jen čísla stránek?
- [x] Když přibyl nadpis
- Když se jen změnila šířka okraje o milimetr a nadpisy zůstaly
- Po každém písmenu
- Obsah se neaktualizuje nikdy
> Nový nadpis do obsahu přibude jen při aktualizaci celé tabulky.

View file

@ -0,0 +1,6 @@
---
nazev: Word: a formal letter
popis: Sender, date, subject, greeting, body and signature on one page.
nazev_cviceni: Quiz: the letter
nadpis_kvizu: Put the parts in order
---

View file

@ -0,0 +1,79 @@
---
id: sw-2-word-dopis
nazev: Word: úřední dopis
popis: Odesílatel, datum, věc, oslovení, text a podpis na jedné straně.
nazev_cviceni: Kvíz: dopis
nadpis_kvizu: Seřaďte náležitosti
---
# Výklad
## Náležitosti
*Shora dolů*
- Vlevo nahoře odesílatel: škola, jméno, adresa. Vpravo datum 12. 6. 2026.
- Pod tím adresát. Pak řádek Věc: žádost o uvolnění z výuky.
- Oslovení, text, rozloučení a jméno s podpisem. Podpis je pod jménem, ne místo něj.
- Celý dopis je jedna strana A4. Druhá stránka s jedním řádkem je chyba.
> Tip: Datum pište 12. 6. 2026, ne 12/6/26. Český úřední dopis má den, měsíc a rok.
## Vzhled
*Klidný dopis*
- Písmo jedno, třeba Calibri 11 nebo 12. V dopise není Nadpis 1 přes celou šířku.
- Řádek Věc je tučný nebo jako krátký nadpis, zbytek je Normální.
- Odstavce mají mezeru za sebou. Mezi oslovením a textem není deset Enterů.
- Okraje 2,5 cm. Text do bloku. Bez obrázku, bez tabulky, bez obsahu.
> Tip: Když se poslední řádek podpisu sleze na druhou stránku, zkraťte mezeru za odstavcem, nepřidávejte menší okraje než 2 cm.
## Hromadná pošta
*Až když je řádků víc*
- Jeden dopis se píše přímo. Hromadná korespondence se vyplatí, když je adresátů aspoň deset.
- Zdroj dat je Excel s řádkem záhlaví: Jmeno, Prijmeni, Trida.
- Word na kartě Korespondence vezme tento sešit a pole vloží do oslovení.
- Sloučený výsledek se ukládá jako nový docx. Zdrojový dopis s poli si nechte zvlášť.
> Tip: Když Excel nemá záhlaví, první žák se stane názvem sloupce a z hromadné pošty vypadne.
## Zadání: žádost
*Cvičení*
- Napište žádost o uvolnění z výuky na 12. 6. 2026. Adresát je ředitel školy, odesílatel jste vy.
- V dokumentu je Věc, oslovení, aspoň dvě věty důvodu a podpis.
- Jedna strana, A4, okraje 2,5 cm. Uložte zadost.docx a zadost.pdf do složky word.
- Hromadnou poštu v tomto úkolu nedělejte. Stačí jeden dopis.
> Tip: Přečtěte dopis nahlas. Když v něm chybí, o co žádáte a který den, věta důvodu nestačí.
# Kvíz
## Kam patří datum v tomto dopisu?
- Dospodu místo podpisu
- [x] Dopravna, 12. 6. 2026
- Do názvu souboru jako jediné místo
- Do zápatí místo čísla, datum v textu být nesmí
> Datum je vpravo nahoře. Podpis dole je jméno, ne datum.
## Jak se označí, o co v dopise jde?
- [x] Řádkem Věc
- Stylem Nadpis 3 uprostřed stránky
- Obrázkem razítka
- Obsahem na druhé straně
> Věc je krátký řádek nad oslovením, třeba žádost o uvolnění z výuky.
## Kdy se použije hromadná korespondence?
- Na jeden dopis řediteli
- [x] Když je stejný dopis pro deset a víc adresátů a data jsou v Excelu
- Na každou tabulku
- Místo PDF
> Jeden dopis se píše ručně. Hromadná pošta bere řádky z Excelu se záhlavím.
## Jak dlouhý je školní dopis z tohoto zadání?
- [x] Jedna strana A4
- Přesně tři strany
- Půl stránky a zbytek prázdných Enterů
- Deset stran se styly Nadpis 1
> Žádost se vejde na jednu stranu. Druhá stránka jen s podpisem je špatně zalomená.

View file

@ -0,0 +1,6 @@
---
nazev: Excel: cells and formulas
popis: The address A1, a formula with an equals sign and a dollar lock.
nazev_cviceni: Quiz: cells
nadpis_kvizu: Complete the formula
---

View file

@ -0,0 +1,79 @@
---
id: sw-2-excel-bunky
nazev: Excel: buňky a vzorce
popis: Adresa A1, vzorec se rovnítkem a ukotvení dolarama.
nazev_cviceni: Kvíz: buňky
nadpis_kvizu: Doplňte vzorec
---
# Výklad
## Buňka
*Adresa*
- Sloupce jsou písmena, řádky čísla. B2 je druhý sloupec a druhý řádek.
- Do buňky patří jedna hodnota. Jméno a třída do jedné buňky nepatří.
- Číslo je číslo, text je text. Jeden apostróf před číslem z něj udělá text a přestane se sčítat.
- Sešit je soubor xlsx. List je záložka dole. Školní sešit má listy Ceník a Součet.
> Tip: Klik na záhlaví sloupce označí celý sloupec. Na číslo řádku celý řádek.
## Vzorec
*Rovnítko*
- Vzorec začíná =. Bez rovnítka je B2*C2 jen text a nic nespočítá.
- V ceníku je v D2 vzorec =B2*C2. B je počet, C je cena, D je částka.
- Český Excel odděluje argumenty funkcí středníkem. Krát je hvězdička, děleno lomítko.
- Vzorec se kopíruje za úchyt v pravém dolním rohu buňky. Neopisuje se do pěti buněk ručně.
> Tip: Když buňka ukáže vzorec místo výsledku, je sloupec úzký, nebo je buňka text. Zkontrolujte rovnítko.
## Posun a dolar
*A1 a $A$1*
- Zkopírování =B2*C2 o řádek níž udělá =B3*C3. Adresy se posunou.
- =$B$2 se neposune ani ve sloupci, ani v řádku. Dolar kotví.
- Sazba DPH v buňce F1 se ve vzorcích bere jako $F$1, ať kopírování neodjede na F2.
- Smazání hodnoty, na kterou vzorec ukazuje, udělá chybu. Vzorec na prázdnou buňku není nula sám od sebe, když čekal číslo a dostal text.
> Tip: Dolar jen u písmene, $B2, kotví sloupec. Dolar jen u čísla, B$2, kotví řádek.
## Zadání: ceník
*Cvičení*
- List Ceník: sloupce Polozka, Pocet, Cena, Castka. Záhlaví v řádku 1, pět položek v řádcích 2 až 6.
- Castka v D2 je =B2*C2 a dolů se táhne. Žádná částka není napsaná ručně.
- Sazba v F1 je 0,21 a v E2 je =D2*$F$1. Po zkopírování dolů pořád ukazuje na F1.
- Uložte cenik.xlsx do Skola\1-rocnik\excel.
> Tip: Klik na D2 ukáže vzorec v řádku vzorců. Když tam je jen číslo, částka je opsaná a při změně počtu se nehne.
# Kvíz
## Čím začíná vzorec?
- Závorkou
- [x] Rovnítkem
- Středníkem
- Dolarama bez rovnítka
> Bez = Excel nic nepočítá. Text B2*C2 zůstane text.
## Co je v D2, když počet je v B2 a cena v C2?
- [x] =B2*C2
- B2*C2 bez rovnítka
- =B2+C2
- Ručně spočítané číslo
> Částka je součin. Sčítání by sečetlo počet s cenou, což není částka.
## Proč je sazba ve vzorci $F$1?
- [x] Aby se při kopírování dolů adresa neposunula
- Protože dolar je měna tabulky
- Aby vzorec přestal počítat
- $ se v Excelu nesmí
> F1 je jedna buňka pro všechny řádky. Bez dolarů by druhý řádek četl F2.
## Co udělá zkopírování =B2*C2 o řádek níž?
- Nechá B2 a C2
- [x] Vznikne =B3*C3
- Smaže list
- Změní se na text
> Relativní adresa se posune o stejný počet řádků jako kopírování.

View file

@ -0,0 +1,6 @@
---
nazev: Excel: functions
popis: SUM, IF and VLOOKUP. The Czech edition separates arguments with a semicolon.
nazev_cviceni: Quiz: functions
nadpis_kvizu: Pick the right formula
---

View file

@ -0,0 +1,79 @@
---
id: sw-2-excel-funkce
nazev: Excel: funkce
popis: SUMA, KDYŽ a SVYHLEDAT. V české verzi se argumenty oddělují středníkem.
nazev_cviceni: Kvíz: funkce
nadpis_kvizu: Vyberte správný zápis
---
# Výklad
## Souhrny
*SUMA a spol.*
- SUMA(D2:D6) sečte částky. Průměr je PRŮMĚR, nejmenší MIN, největší MAX.
- POČET spočítá čísla. Prázdnou buňku nepočítá. Text nepočítá.
- Rozsah D2:D6 zahrnuje oba konce. D2:D6 jsou řádky 2 až 6, ne jen 2 a 6.
- Souhrn patří pod tabulku, nebo na list Součet. Nepočítá se na papír a neopisuje se.
> Tip: Anglický Excel má SUM a čárku. Český má SUMA a středník. Ve škole pište česky, jak to má školní Office.
## KDYŽ
*Známky*
- České známky: 1 je nejlepší, 5 je neprospěl. Prospěch je známka 1 až 4.
- =KDYŽ(D2<=4;"prospěl";"neprospěl") vrací text podle známky v D2.
- Středníky oddělují podmínku, větev ano a větev ne. Čárka v české verzi vzorec rozbije.
- Podmínka, která čeká známku aspoň 4 jako úspěch, je obráceně. Čtyřka ještě prochází, pětka ne.
> Tip: Uvozovky kolem textu ve funkci jsou povinné. Bez nich Excel hledá buňku nebo název.
## SVYHLEDAT
*Ceník*
- SVYHLEDAT najde hodnotu v levém sloupci oblasti a vrátí jiný sloupec stejného řádku.
- =SVYHLEDAT(A2;Ceník!$A$2:$C$20;3;NEPRAVDA) hledá A2, oblast je ukotvená, vrátí 3. sloupec, shoda je přesná.
- NEPRAVDA znamená přesnou shodu. PRAVDA by směla vzít nejbližší nižší a u textu plete.
- Hledaná hodnota musí být v prvním sloupci oblasti. Jinak funkce nehledá uprostřed tabulky.
> Tip: Když funkce vrátí #N/A, hodnota v prvním sloupci není. Zkontrolujte mezeru za jménem a stejný typ, text proti číslu.
## Zadání: známky a ceník
*Cvičení*
- Na list Znamky dejte pět žáků, sloupec Znamka a sloupec Stav se vzorcem KDYŽ, prospěl při známce 1 až 4.
- Pod známky SUMA nedávejte, součet známek nic neříká. Dejte PRŮMĚR.
- Na listu Ceník doplňte SVYHLEDAT, který podle kódu položky vrátí cenu. Oblast ukotvěte a dejte NEPRAVDA.
- Uložte znamky.xlsx do složky excel. Oba listy ať jsou v jednom sešitu.
> Tip: Průměr známek 1,0 až 5,0 vychází jako číslo. Když vyjde 0, počítáte prázdné buňky, nebo máte text místo čísel.
# Kvíz
## Jak se v českém Excelu zapíše součet D2 až D6?
- =SUM(D2:D6)
- [x] =SUMA(D2:D6)
- =SUMA(D2,D6)
- SUMA(D2:D6) bez rovnítka
> Česká funkce je SUMA a rozsah je D2:D6. SUM je anglická verze.
## Který vzorec označí známku 5 jako neprospěl?
- [x] =KDYŽ(D2<=4;"prospěl";"neprospěl")
- =KDYŽ(D2>=4;"prospěl";"neprospěl")
- =KDYŽ(D2<=4,"prospěl","neprospěl")
- =D2<=4
> Prochází 1 až 4, tedy menší nebo rovno 4. V češtině jsou středníky, ne čárky.
## Co znamená NEPRAVDA na konci SVYHLEDAT?
- Vypne vzorec
- [x] Chce přesnou shodu
- Sečte sloupec
- Vrátí vždy první řádek
> NEPRAVDA je přesně ta hodnota. PRAVDA bere přibližnou shodu a u kódů položek lže.
## Proč je oblast Ceník!$A$2:$C$20 ukotvená?
- [x] Aby se při kopírování vzorce dolů neposunula
- Protože jinak nejde uložit xlsx
- Dolar sčítá ceny
- SVYHLEDAT ukotvení zakazuje
> Každý řádek hledá v téže tabulce. Bez dolarů by se oblast sunula dolů s vzorcem.

View file

@ -0,0 +1,6 @@
---
nazev: Excel: charts
popis: A column chart to compare, a line chart for time. A pie only for parts of a whole.
nazev_cviceni: Quiz: charts
nadpis_kvizu: Pick the chart type
---

View file

@ -0,0 +1,79 @@
---
id: sw-2-excel-grafy
nazev: Excel: grafy
popis: Sloupcový graf pro porovnání, spojnicový pro čas. Koláč jen pro podíl celku.
nazev_cviceni: Kvíz: grafy
nadpis_kvizu: Vyberte typ grafu
---
# Výklad
## Který graf
*Typ*
- Porovnání tříd nebo položek je sloupcový graf.
- Vývoj po měsících je spojnicový. Osa x je čas, zleva doprava.
- Koláč je jen pro podíly jednoho celku, nejvýš pět výsečí. Dvanáct měsíců v koláči nečtěte.
- Dva grafy přes sebe, které říkají totéž, se nedělají.
> Tip: Když váháte, sloupec je ve škole skoro vždycky bezpečnější než koláč.
## Co musí být vidět
*Popisky*
- Graf má název, třeba Tržba po měsících. Název Graf 1 se neodevzdává.
- Osa hodnot má jednotku, Kč nebo počet. Osa kategorií má názvy, ne 1 až 12 bez legendy měsíce, pokud to z dat není jasné.
- Legenda se dá pryč, když je řada jen jedna. Zabírá místo a nic neříká.
- Data grafu jsou v buňkách. Namalovat sloupec obrázkem nejde aktualizovat.
> Tip: Klik na graf, Vybrat data. Když oblast nesedí, graf kreslí i záhlaví nebo prázdné řádky.
## Odkud bere čísla
*Tabulka*
- Nejdřív čísla, potom graf. Graf bez zdroje je obrázek.
- Nula v buňce je nula a v grafu je vidět. Prázdná buňka čáru přeruší.
- Text v číselném sloupci graf vynechá nebo ho položí jako nulu. Čísla nepište s jednotkou Kč v téže buňce.
- Změna čísla v tabulce změní graf. Když ne, graf je kopie jako obrázek.
> Tip: Kč patří do záhlaví sloupce nebo do názvu osy, ne za číslo do buňky. Jinak je buňka text.
## Zadání: jeden graf
*Cvičení*
- Na novém listu Mesice dejte leden až červen a k nim tržbu v Kč, šest čísel.
- Vložte spojnicový graf s názvem Tržba leden až červen. Jednotka ať je v názvu osy nebo v názvu grafu.
- Koláč nedělejte. Legendu jedné řady vypněte.
- Uložte do znamky.xlsx jako další list, nebo do trzba.xlsx ve složce excel.
> Tip: Náhled tisku ať graf neroztrhne na dvě stránky. Dejte ho pod tabulku, ne přes ni.
# Kvíz
## Jaký graf je na tržbu leden až červen?
- Koláč se šesti výsečemi
- [x] Spojnicový
- Náhodný 3D kužel
- Obrázek sloupců vložený z Wordu
> Čas jde zleva doprava ve spojnicovém grafu. Koláč neukáže pořadí měsíců.
## Kdy je koláč na místě?
- Na dvanáct měsíců
- [x] Na podíly jednoho celku, jen pár výsečí
- Na každou tabulku
- Když chybí název
> Koláč je celek rozdělený na pár dílů. Časová řada do něj nepatří.
## Kam nepatří Kč?
- Do názvu osy
- [x] Do buňky za číslo, třeba 120 Kč
- Do názvu grafu
- Do záhlaví sloupce
> 120 Kč je text. Graf i SUMA pak číslo nevidí.
## Co se stane po změně čísla v tabulce, když je graf v pořádku?
- Graf se musí nakreslit znovu ručně
- [x] Sloupec nebo bod se změní sám
- Excel graf smaže
- Změní se licence
> Graf je navázaný na buňky. Obrázek vložený místo grafu se sám nezmění.

View file

@ -0,0 +1,6 @@
---
nazev: Excel: a table, a filter and a pivot
popis: A list as a table, a filter and a total by class.
nazev_cviceni: Quiz: the pivot table
nadpis_kvizu: Say what goes in rows and what goes in values
---

View file

@ -0,0 +1,79 @@
---
id: sw-2-excel-kontingence
nazev: Excel: tabulka, filtr a kontingenční tabulka
popis: Seznam jako tabulka, filtr a součet podle třídy.
nazev_cviceni: Kvíz: kontingenční tabulka
nadpis_kvizu: Řekněte, co patří do řádků a co do hodnot
---
# Výklad
## Tabulka
*Ctrl+T*
- Seznam se záhlavím se označí a Ctrl+T z něj udělá tabulku. Filtr v záhlaví vznikne sám.
- Záhlaví je jeden řádek: Polozka, Trida, Castka. Dva řádky nadpisů Ctrl+T rozbije.
- Hned pod tabulku se nepíše další text. Souhrn je v řádku souhrnů, nebo na jiném listu.
- Řazení je šipka v záhlaví. Seřadit jen půlku sloupce mimo tabulku rozhodí řádky.
> Tip: Tabulka dostane na kartě Návrh název, třeba Prodej. Pak se na ni dá odkazovat jménem.
## Filtr
*Jen 1.A*
- Filtr Trida = 1.A ostatní řádky schová. Nesmaže je.
- Zrušení filtru je Vybrat vše, nebo Vymazat filtr na kartě Data.
- Řádek souhrnů tabulky sečte jen to, co filtr nechá vidět.
- Obyčejná SUMA přes stejné buňky sečte i řádky, které filtr schoval. Na filtrovaný součet to není.
> Tip: Když po filtru zmizí skoro všechno, podívejte se, jestli nemáte mezeru v názvu třídy. 1.A a 1.A s mezerou navíc jsou dvě hodnoty.
## Kontingenční tabulka
*Součet podle třídy*
- Kontingenční tabulka je na kartě Vložení. Zdroj je tabulka i se záhlavím.
- Do řádků přijde Trida. Do hodnot Součet z Castka. Sloupce nechte prázdné, dokud není druhý rozměr.
- Známky se v kontingenci nesčítají. U známek dejte průměr, u peněz součet.
- Kontingence patří na nový list. Když ji položíte přes zdroj, zdroj přepíšete.
> Tip: Po změně dat dejte Obnovit. Kontingenční tabulka se sama nehne.
## Zadání: prodej po třídách
*Cvičení*
- List Prodej: aspoň 12 řádků, sloupce Polozka, Trida, Castka. Třídy jen 1.A a 1.B.
- Ctrl+T a název tabulky Prodej. Filtr ať umí ukázat jen 1.A a zase všechno.
- Kontingenční tabulka na novém listu: řádky Trida, hodnoty součet Castka.
- Uložte prodej.xlsx do složky Skola\1-rocnik\excel. Ruční součty vedle kontingence nepište.
> Tip: Když kontingence ukáže Počet místo Součet, v hodnotách počítá buňky. Přepněte souhrn na Součet.
# Kvíz
## Co udělá Ctrl+T na seznamu se záhlavím?
- Smaže ho
- [x] Udělá z něj tabulku s filtrem
- Převede ho na PDF
- Uzamkne list heslem
> Tabulka má filtr v záhlaví a jde pojmenovat. Obyčejná oblast to nemá.
## Co sečte jen řádky, které filtr nechá vidět?
- Obyčejná SUMA přes celou oblast
- [x] Řádek souhrnů tabulky
- Nadpis grafu
- Ručně opsaný součet
> SUMA schované řádky filtru pořád počítá. Řádek souhrnů tabulky bere jen viditelné.
## Kam v kontingenční tabulce patří Trida a kam Castka?
- Trida do hodnot jako součet, Castka do řádků
- [x] Trida do řádků, součet Castka do hodnot
- Obojí do filtrů a nikam jinam
- Trida do názvu souboru
> Řádky jsou třídy. Hodnoty jsou součet peněz. Součet názvů tříd nedává smysl.
## Kdy se u známek v kontingenci použije průměr?
- Vždy se známky sčítají
- [x] Když má vyjít průměrná známka, ne součet známek
- Průměr Excel neumí
- Jen u textu
> Součet známek nic neříká. Peníze se sčítají, známky se průměrují.

View file

@ -0,0 +1,6 @@
---
nazev: Assignment: a report and a sheet
popis: A Word letter and an Excel grade sheet in one folder.
nazev_cviceni: Quiz: the Office hand-in
nadpis_kvizu: Check both files
---

View file

@ -0,0 +1,79 @@
---
id: sw-2-zadani-office
nazev: Zadání: protokol a tabulka
popis: Dopis ve Wordu a známky v Excelu v jedné složce.
nazev_cviceni: Kvíz: odevzdání Office
nadpis_kvizu: Zkontrolujte oba soubory
---
# Výklad
## Word
*Žádost*
- zadost.docx je jedna strana A4, okraje 2,5 cm, datum 12. 6. 2026 vpravo nahoře.
- Je v ní řádek Věc, oslovení, aspoň dvě věty a podpis. Není v ní obsah ani tabulka.
- K protokolu z dřívějška, pokud ho máte, patří styly Nadpis 1 a PDF.
- PDF se jmenuje stejně jako docx. Dvě verze final a final2 se neodevzdávají.
> Tip: Náhled tisku má ukázat jednu stránku. Podpis na druhé stránce znamená moc velké mezery.
## Excel
*Známky*
- znamky.xlsx má list Znamky: jméno, známka, stav.
- Stav je vzorec =KDYŽ(D2<=4;"prospěl";"neprospěl") nebo se sloupcem známky, který opravdu máte. Známka 5 je neprospěl.
- Pod tabulkou je PRŮMĚR známek, ne jejich součet.
- Čísla jsou čísla. Text 1 nebo 120 Kč ve stejné buňce se nepočítá.
> Tip: Klik na buňku stavu musí v řádku vzorců ukázat KDYŽ. Opsané slovo prospěl se při změně známky nehne.
## Kontrola vzorců
*Ne opis*
- V ceníku, pokud ho přikládáte, je částka =B2*C2 a sazba ukotvená jako $F$1.
- SVYHLEDAT, pokud ho máte, končí na NEPRAVDA a oblast je ukotvená.
- Graf tržby je spojnicový, má název a není to koláč dvanácti měsíců.
- Kontingenční tabulka, pokud je v sešitu, stojí na vlastním listu a sčítá částky po třídách.
> Tip: Stačí žádost a známky. Ceník, graf a kontingence jsou navíc, ale když je přiložíte, musí sedět.
## Složka
*Dva hlavní soubory*
- Ve složce Skola\1-rocnik\word je zadost.docx a zadost.pdf.
- Ve složce Skola\1-rocnik\excel je znamky.xlsx.
- Na ploše tyto soubory nejsou. Přípony jsou vidět.
- Otevřete oba znovu. Datum, věc a aspoň jedna pětka se stavem neprospěl mají být vidět.
> Tip: Když PDF nejde otevřít, export nedoběhl. Udělejte ho z docx znovu.
# Kvíz
## Jaký je školní dopis z tohoto zadání?
- Tři strany se styly a obsahem
- [x] Jedna strana A4 s řádkem Věc a datem 12. 6. 2026
- Jen tabulka 4×3
- Prezentace
> Žádost je jeden list. Obsah a Nadpis 1 patří protokolu, ne tomuto dopisu.
## Který vzorec označí pětku jako neprospěl?
- [x] =KDYŽ(D2<=4;"prospěl";"neprospěl")
- =KDYŽ(D2>=4;"prospěl";"neprospěl")
- napsané slovo prospěl
- =SUMA(D2)
> Prochází známka 1 až 4. Pětka padne do druhé větve. V češtině jsou středníky.
## Co patří pod sloupec známek?
- Součet známek
- [x] Průměr
- Kontingenční součet peněz
- Nic, známky se mažou
> Součet známek nemá význam. PRŮMĚR ano.
## Které soubory se odevzdávají jako základ?
- Jen PDF bez docx
- [x] zadost.docx, zadost.pdf a znamky.xlsx
- Jen xlsx na ploše
- prezentace a video
> Word se odevzdává i jako zdroj, i jako PDF. Excel je xlsx, protože v PDF by nebyly vzorce.

View file

@ -0,0 +1,6 @@
---
nazev: A database
popis: A table, a record, a key. When a sheet is no longer enough.
nazev_cviceni: Quiz: databases
nadpis_kvizu: Name the key and the reason for a database
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-databaze
nazev: Databáze
popis: Tabulka, záznam, klíč. Kdy už nestačí Excel.
nazev_cviceni: Kvíz: databáze
nadpis_kvizu: Poznejte klíč a důvod databáze
---
# Výklad
## Excel nestačí
*Vztahy*
- Excel je výborný na jeden seznam. Jakmile se třída opakuje na každém řádku žáka, začne se název třídy rozcházet.
- Databáze drží věci v samostatných tabulkách a spojuje je klíčem.
- Tabulka tridy má název třídy jednou. Tabulka zaci se na ni jen odkáže.
- Access i MySQL umí totéž v principu. Access je soubor accdb, MySQL je server a příkazy SQL.
> Tip: Když opravujete 1.A na 1. A v padesáti řádcích Excelu, má to být tabulka tříd, ne opis.
## Řádek a sloupec
*Záznam a pole*
- Řádek je záznam, třeba jeden žák. Sloupec je pole, třeba prijmeni.
- Každá hodnota je atomická. Jméno a příjmení nepatří do jedné buňky.
- Primární klíč je hodnota, která se v tabulce neopakuje. U žáka je to id, ne příjmení.
- Cizí klíč je pole, které ukazuje na primární klíč jiné tabulky. trida_id v tabulce zaci ukazuje na id v tridy.
> Tip: Dva Nováci se smějí jmenovat stejně. Jejich id je různé. Proto příjmení klíč není.
## Typy
*Číslo, text, datum*
- id je číslo. Jméno je krátký text. Datum narození je datum, ne text 12.6.
- Ano/ne je samostatný typ, ne text ano.
- Do číselného pole nepatří jednotka. Počet žáků je 28, ne 28 žáků.
- Prázdné pole a nula nejsou totéž. Nula je známá hodnota, prázdno je nevíme.
> Tip: Text v číselném poli se nepodaří uložit, nebo se sečte špatně. Typ zvolte při založení sloupce.
## Zadání: návrh na papír
*Cvičení*
- Navrhněte dvě tabulky: tridy (id, nazev) a zaci (id, jmeno, prijmeni, trida_id).
- U každého pole napište typ. id v obou tabulkách je primární klíč.
- Napište dva řádky tříd, 1.A a 1.B, a tři žáky, z toho Annu Novákovou ve třídě 1.A.
- Soubor navrh.txt uložte k databázím. Access ani MySQL ještě neotevírejte, dokud návrh nesedí.
> Tip: Šipka vede od trida_id k id tabulky tridy. Opačně by žák byl klíčem třídy, což není.
# Kvíz
## Co je primární klíč žáka?
- Příjmení
- [x] id, které se neopakuje
- Název třídy
- První sloupec, ať je v něm cokoli
> Příjmení se opakuje. id jednoho žáka ne.
## Co je trida_id v tabulce zaci?
- Primární klíč třídy v téže tabulce
- [x] Cizí klíč na tabulku tridy
- Text 1.A opsaný do každého řádku
- Heslo
> Cizí klíč drží jen číslo třídy. Název třídy žije v tabulce tridy jednou.
## Kdy už je Excel na seznam žáků těsný?
- Jakmile má víc než jeden sloupec
- [x] Když se údaj, třeba název třídy, opakuje a musí zůstat stejný
- Excel nestačí nikdy
- Jakmile je soubor xlsx
> Opakovaný název se rozjede. Databáze ho má v jedné tabulce a ostatní se na ni odkážou.
## Čím se liší nula a prázdné pole?
- Ničím
- [x] Nula je hodnota, prázdné pole znamená, že hodnota chybí
- Prázdné pole je vždy nula
- Nula je text
> Průměr nulu počítá. Prázdnou buňku často ne. Typ i význam se liší.

View file

@ -0,0 +1,6 @@
---
nazev: Access: tables and a relationship
popis: An AutoNumber, a foreign key and a one-to-many link without a cascade.
nazev_cviceni: Quiz: Access
nadpis_kvizu: Pick the key type and the cascade
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-access-tabulky
nazev: Access: tabulky a vztah
popis: Automatické číslo, cizí klíč a vztah 1:N bez kaskády.
nazev_cviceni: Kvíz: Access
nadpis_kvizu: Vyberte typ klíče a kaskádu
---
# Výklad
## Soubor
*accdb*
- Databáze Accessu je jeden soubor accdb. Jmenuje se evidence.accdb.
- Tabulku založíte v návrhovém zobrazení, ne jen v datovém listu. V návrhu je vidět typ.
- Tabulka tridy má pole id a nazev. Tabulka zaci má id, jmeno, prijmeni a trida_id.
- Název pole je bez mezery a bez diakritiky: trida_id. Popisek pro lidi se dá nastavit zvlášť.
> Tip: Datový list je na zapisování řádků. Typ pole se mění v návrhu. Když už v tabulce data jsou, změna typu může selhat.
## Klíče
*Automatické číslo*
- id je typ Automatické číslo a je to primární klíč. Access ho doplňuje sám: 1, 2, 3.
- trida_id je typ Číslo, dlouhé celé číslo. Není to automatické číslo. Píšete ho vy, nebo ho vybere vztah.
- nazev, jmeno a prijmeni jsou Krátký text. Délka 50 stačí.
- Dva primární klíče v jedné tabulce školního cvičení nejsou. Stačí id.
> Tip: Když trida_id necháte jako text, vztah na číselné id třídy Access odmítne. Typy obou konců musí sedět.
## Vztah 1:N
*Bez kaskády*
- Jedna třída má víc žáků. Žák má jednu třídu. To je vztah 1:N.
- Ve vztazích přetáhnete tridy.id na zaci.trida_id.
- Zaškrtněte vynucení referenční integrity. Žák se nesmí odkázat na třídu, která neexistuje.
- Kaskádové odstranění nechte vypnuté. Smazání třídy by jinak smazalo i žáky.
> Tip: Na straně tridy je jednička, na straně zaci je znak nekonečna. Když je to obráceně, táhli jste vztah špatným směrem.
## Zadání: evidence.accdb
*Cvičení*
- Založte evidence.accdb s tabulkami tridy a zaci podle návrhu.
- Vložte třídy 1.A a 1.B. Vložte Annu Novákovou s trida_id třídy 1.A a ještě dva žáky.
- Vztah 1:N s referenční integritou, bez kaskádového odstranění.
- Zkuste uložit žáka s trida_id 99. Access ho má odmítnout. Pak to číslo vraťte na platnou třídu.
> Tip: Když jde uložit trida_id 99, integrita není zapnutá. Otevřete vztahy a vztah vytvořte znovu.
# Kvíz
## Jaký typ má id žáka?
- Krátký text, který píšete ručně
- [x] Automatické číslo a primární klíč
- Ano/ne
- Dlouhý text s celým jménem třídy
> Automatické číslo žák nedoplňuje. Access ho dá samo a v tabulce se neopakuje.
## Jaký typ má trida_id?
- Automatické číslo
- [x] Číslo, dlouhé celé číslo
- Datum
- Ano/ne
> Je to cizí klíč na id třídy, které je taky číslo. Automatické číslo by si vymýšlelo vlastní hodnoty.
## Co dělá referenční integrita?
- Smaže žáky při smazání třídy
- [x] Nedovolí žáka s třídou, která neexistuje
- Schová tabulku
- Převede accdb na xlsx
> Odkaz musí vést na skutečný řádek. Třída 99 bez řádku v tridy projít nemá.
## Proč nechat kaskádové odstranění vypnuté?
- Access ho neumí
- [x] Smazání třídy by smazalo i její žáky
- Jinak nejde uložit accdb
- Kvůli Excelu
> Třída a žáci jsou různá data. Smazat třídu omylem a přijít o žáky je špatná pojistka pro školní cvičení.

View file

@ -0,0 +1,6 @@
---
nazev: Access: queries
popis: A query that shows only class 1.A, and a criterion in quotes.
nazev_cviceni: Quiz: queries
nadpis_kvizu: Fill in the criterion
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-access-dotazy
nazev: Access: dotazy
popis: Dotaz, který ukáže jen třídu 1.A, a kritérium v uvozovkách.
nazev_cviceni: Kvíz: dotazy
nadpis_kvizu: Doplňte kritérium
---
# Výklad
## Dotaz není kopie
*Pohled*
- Dotaz data nekopíruje do nové tabulky. Přečte je a ukáže výsledek.
- Když ve třídě přibude žák, stejný dotaz ho příště ukáže taky.
- Dotaz se dělá v návrhovém zobrazení. Tabulky se přidají a pole se přetáhnou dolů.
- Uložený dotaz se jmenuje zaci_1A. Dotaz1 se neodevzdává.
> Tip: Když dotaz otevřete a data změníte, měníte zdrojovou tabulku. Na prohlížení to vadit nemusí, na omyl ano.
## Kritérium
*1.A*
- Pod pole nazev z tabulky tridy patří kritérium "1.A" včetně uvozovek.
- Bez uvozovek Access text nepozná a dotaz selže, nebo se zeptá na parametr.
- Číselné kritérium uvozovky nemá. id 1 je prostě 1.
- Chcete-li žáky obou tříd, kritérium 1.A tam nedávejte. Filtr, který tam zbyl z minula, výsledek ořeže.
> Tip: Řádek Kritéria je filtr. Řádek Zobrazit schová sloupec, který v dotazu být musí, ale ve výsledku ho nechcete.
## Spojení v dotazu
*Obě tabulky*
- Do dotazu přidejte tridy i zaci. Access použije vztah, který už máte.
- Ven dejte prijmeni, jmeno a nazev třídy. id ven dávat nemusíte.
- Řazení podle prijmeni je vzestupně. V návrhové mřížce je na to řádek Řadit.
- Žák bez třídy se při vnitřním spojení neukáže. Díky integritě takový řádek stejně nemá vzniknout.
> Tip: Když se každý žák ukáže dvakrát, tabulky nejsou spojené a Access udělal všechny kombinace. Vraťte vztah.
## Zadání: jen 1.A
*Cvičení*
- Dotaz zaci_1A ukáže jméno, příjmení a název třídy, jen pro 1.A, seřazené podle příjmení.
- Anna Nováková v něm je. Žák z 1.B v něm není.
- Uložte dotaz do evidence.accdb. Výsledek nekopírujte do Excelu jako jediný výstup.
- Změňte v tabulce příjmení Anny na Novák a dotaz otevřete znovu. Má ukázat Novák.
> Tip: Když se zeptá na parametr 1.A, kritérium nemá uvozovky a Access ho bere jako otázku.
# Kvíz
## Kam patří podmínka "1.A"?
- Do názvu souboru
- [x] Do řádku Kritéria pod polem nazev
- Do primárního klíče místo id
- Do kaskádového odstranění
> Kritéria filtrují řádky. Pole nazev drží text 1.A.
## Proč jsou u 1.A uvozovky?
- [x] Access jinak text pochopí jako parametr nebo chybu
- Protože 1.A je číslo
- Uvozovky se v Accessu nepoužívají
- Aby se zapnula kaskáda
> Textové kritérium se píše v uvozovkách. Číslo ne.
## Co se stane s dotazem, když do třídy 1.A přidáte žáka?
- Dotaz je stará kopie a žáka neukáže
- [x] Po novém otevření ho ukáže
- Access databázi zavře
- Musíte ho opsat do Excelu
> Dotaz čte tabulky. Není to zmrazený export.
## Proč se žák v dotazu objeví dvakrát u každé třídy?
- Má dva primární klíče
- [x] Tabulky v dotazu nejsou spojené vztahem
- Je seřazený podle příjmení
- Filtr je vypnutý
> Bez spojení Access zkombinuje každý řádek s každým. Vztah tomu zabrání.

View file

@ -0,0 +1,6 @@
---
nazev: Access: a form and a report
popis: Entry through a form and printing through a report. The datasheet is not for users.
nazev_cviceni: Quiz: forms
nadpis_kvizu: Pick what is for entry and what is for print
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-access-formulare
nazev: Access: formulář a sestava
popis: Zápis přes formulář a tisk přes sestavu. Datový list není pro uživatele.
nazev_cviceni: Kvíz: formulář
nadpis_kvizu: Vyberte, čím se data zadávají a čím tisknou
---
# Výklad
## Formulář
*Jeden žák*
- Formulář ukáže jeden záznam jako políčka. Datový list ukáže mřížku a tam se běžný uživatel snadno trefí do špatného řádku.
- Formulář Zaci se založí z tabulky zaci. Pole id ať je vidět, ale zamčené. Automatické číslo se nepíše.
- trida_id je lépe rozbalovací seznam, který ukazuje název třídy a ukládá id.
- Formulář se jmenuje frmZaci. Výchozí Formulář1 se neodevzdává.
> Tip: Rozbalovací seznam bere řádky z tabulky tridy. Viditelný sloupec je nazev, vázaný sloupec je id.
## Sestava
*Tisk*
- Sestava je na tisk a na PDF. Formulář je na zápis. Neslouží k tomu totéž.
- Sestava žáků je seskupená podle třídy a v rámci třídy seřazená podle příjmení.
- Záhlaví skupiny ukáže 1.A jednou, ne na každém řádku jako jediný nadpis celé sestavy.
- Do sestavy nepatří tlačítka formuláře. Patří do ní nadpis Evidence žáků a číslo stránky.
> Tip: Náhled sestavy je před tiskem povinný. Prázdná druhá stránka znamená velkou zápatí nebo prázdný oddíl.
## Kdo kam smí
*Ne do návrhu*
- Uživatel, který jen zapisuje žáky, dostane formulář. Návrhové zobrazení ne.
- Mazání záznamu na formuláři je vypnuté, dokud učitel neřekne jinak.
- Sestava se needituje. Když v ní přepíšete jméno, často přepisujete data, a to z sestavy dělat nechcete.
- Záloha je kopie accdb před mazáním. Jediný soubor na ploše záloha není.
> Tip: Soubor, Uložit jako, a datum v názvu: evidence-2026-06-12.accdb. Pak teprve mažete zkušební řádky.
## Zadání: formulář a sestava
*Cvičení*
- frmZaci zapíše jméno, příjmení a třídu. id nejde přepsat.
- Sestava seskupí žáky podle třídy. Anna Nováková je pod 1.A.
- Z formuláře přidejte jednoho žáka do 1.B a v sestavě ho najděte.
- Uložte vše do evidence.accdb. PDF sestavy je evidence-zaci.pdf vedle souboru.
> Tip: Když v rozbalovacím seznamu vidíte čísla místo 1.A, zobrazujete id. Přepněte šířku sloupců, ať je vidět nazev.
# Kvíz
## Čím se ve škole zadává nový žák?
- Přímo v návrhovém zobrazení tabulky
- [x] Formulářem frmZaci
- Přepsáním sestavy
- Excelem místo Accessu bez uložení accdb
> Formulář ukáže jeden záznam a umí seznam tříd. Návrh tabulky je pro autora databáze.
## K čemu je sestava?
- K mazání sloupců
- [x] K tisku a PDF, seskupenému podle třídy
- K nastavení automatického čísla
- K instalaci Accessu
> Sestava formátuje výstup. Zápis zůstává formuláři.
## Proč je id na formuláři zamčené?
- [x] Automatické číslo se nepíše ručně
- Access id neumí ukázat
- Jinak nejde sestava
- Protože je to text
> Číslo přidělí Access. Ruční přepsání by rozbilo klíč.
## Co uděláte před mazáním zkušebních řádků?
- Nic, accdb se sám verzuje
- [x] Kopie souboru s datem v názvu
- Smažete vztah
- Export jen do JPG
> Jedna kopie accdb je záloha. Mazání bez ní nejde vzít zpět tak snadno jako Ctrl+Z ve Wordu.

View file

@ -0,0 +1,6 @@
---
nazev: MySQL: SELECT
popis: Choosing columns, a WHERE condition and a sort. Text sits in single quotes.
nazev_cviceni: Quiz: SELECT
nadpis_kvizu: Pick the right statement
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-mysql-select
nazev: MySQL: SELECT
popis: Výběr sloupců, podmínka WHERE a řazení. Text je v jednoduchých uvozovkách.
nazev_cviceni: Kvíz: SELECT
nadpis_kvizu: Vyberte správný příkaz
---
# Výklad
## Databáze skola
*Dvě tabulky*
- Na serveru je databáze skola. Tabulka tridy má id a nazev. Tabulka zaci má id, jmeno, prijmeni a trida_id.
- Příkazy se píšou v MySQL, ne do Excelu. Středník příkaz ukončí.
- Nejdřív USE skola; ať další příkazy nemíří do jiné databáze.
- Heslo k serveru do sešitu nepatří. Patří učiteli a do klienta, který ho neukazuje v příkazu.
> Tip: Když klient hlásí, že tabulka neexistuje, jste v jiné databázi, nebo je v názvu překlep. SHOW TABLES; ukáže, co tam je.
## SELECT
*Jen to, co potřebujete*
- SELECT prijmeni, jmeno FROM zaci; vrátí dva sloupce všech žáků.
- Hvězdička SELECT * FROM zaci; je na průzkum. Do odevzdaného dotazu vyberte sloupce jménem.
- WHERE trida_id = 1 nechá jen jednu třídu. Číslo je bez uvozovek.
- Text se píše v jednoduchých uvozovkách: WHERE nazev = '1.A'.
> Tip: Dvojité uvozovky kolem 1.A záleží na režimu serveru. Ve škole pište jednoduché, ty platí spolehlivě.
## Pořadí
*ORDER BY*
- ORDER BY prijmeni; seřadí vzestupně, tedy A až Ž.
- ORDER BY prijmeni DESC; je sestupně.
- WHERE patří před ORDER BY. Obrácené pořadí příkazů server odmítne.
- LIMIT 5 vrátí nejvýš pět řádků. Na kontrolu ano, na úplný seznam třídy ne.
> Tip: Nejdřív FROM, pak WHERE, pak ORDER BY. SELECT je na začátku, i když se sloupce vybírají jako první v hlavě.
## Zadání: tři dotazy
*Cvičení*
- Do souboru dotazy.sql napište USE skola; a tři SELECT.
- První: příjmení a jméno všech žáků podle příjmení.
- Druhý: jen žáci s trida_id = 1.
- Třetí: název třídy 1.A z tabulky tridy. Text '1.A' je v jednoduchých uvozovkách.
> Tip: Každý příkaz ukončete středníkem. Bez něj klient čeká na pokračování.
# Kvíz
## Který příkaz vrátí příjmení žáků třídy s id 1?
- [x] SELECT prijmeni FROM zaci WHERE trida_id = 1;
- SELECT prijmeni WHERE trida_id = 1;
- SELECT * FROM tridy WHERE nazev = 1.A;
- WHERE trida_id = 1;
> SELECT říká sloupce, FROM tabulku, WHERE podmínku. Číslo je bez uvozovek.
## Jak se v podmínce zapíše název třídy?
- nazev = 1.A
- [x] nazev = '1.A'
- nazev = "bez uvozovek a bez čísla"
- nazev := 1.A
> Text patří do jednoduchých uvozovek. Bez nich to není řetězec.
## Kam patří ORDER BY?
- Před SELECT
- [x] Za WHERE
- Místo FROM
- Do názvu tabulky
> Pořadí je WHERE, potom ORDER BY. SELECT zůstává první.
## K čemu je ve škole SELECT * ?
- Na odevzdaný tisk všech osobních údajů
- [x] Na rychlý pohled, co v tabulce je
- Místo primárního klíče
- Na smazání řádků
> Hvězdička je průzkum. Odevzdaný dotaz jmenuje sloupce, které mají být vidět.

View file

@ -0,0 +1,6 @@
---
nazev: MySQL: INSERT, UPDATE and DELETE
popis: A new row, a change and a delete. An UPDATE or DELETE without WHERE is not written in class.
nazev_cviceni: Quiz: changing data
nadpis_kvizu: Recognise the safe statement
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-mysql-zmeny
nazev: MySQL: INSERT, UPDATE a DELETE
popis: Nový řádek, oprava a smazání. UPDATE a DELETE bez WHERE se ve škole nepíšou.
nazev_cviceni: Kvíz: změny dat
nadpis_kvizu: Poznejte bezpečný příkaz
---
# Výklad
## INSERT
*Nový žák*
- INSERT INTO zaci (jmeno, prijmeni, trida_id) VALUES ('Anna', 'Nováková', 1); přidá jeden řádek.
- Sloupce v závorce a hodnoty za VALUES musí být ve stejném pořadí a stejném počtu.
- id s automatickým číslem do výčtu nedávejte, server ho doplní.
- Jeden INSERT, jeden žák. Balit pět žáků do nepřehledného příkazu ve cvičení nemusíte.
> Tip: Když server hlásí neznámý sloupec, název nesedí s tabulkou. SHOW COLUMNS FROM zaci; ukáže pravdu.
## UPDATE
*Jen jeden řádek*
- UPDATE zaci SET trida_id = 2 WHERE id = 15; přepíše třídu jen žáku 15.
- Bez WHERE by stejný příkaz přepsat třídu všem. Ve škole se neodevzdává.
- Nejdřív SELECT s stejnou podmínkou WHERE. Až když vidíte jeden správný řádek, pusťte UPDATE.
- SET mění hodnoty. Není to SELECT a nic nevrací kromě počtu ovlivněných řádků.
> Tip: Klient ukáže, kolik řádků se změnilo. Když vidíte desítky a čekali jste jeden, zastavte se a volejte učitele. Záloha se hodí předtím, ne potom.
## DELETE
*Také s WHERE*
- DELETE FROM zaci WHERE id = 15; smaže jeden řádek.
- DELETE FROM zaci; bez WHERE smaže všechny žáky. To není čištění tabulky, to je ztráta dat.
- Smazaný řádek Ctrl+Z v MySQL nevrátí. Vrátí ho záloha, nebo ho vložíte znovu, když znáte hodnoty.
- Mazat třídu, na kterou ještě ukazují žáci, referenční pravidlo nemá dovolit. Nejdřív žáci, nebo třídu nemazat.
> Tip: Před DELETE udělejte SELECT se stejnou podmínkou. Počet řádků musí být ten, který čekáte, obvykle jeden.
## Zadání: tři změny na kopii
*Cvičení*
- Na cvičných datech vložte žáka Petr Svoboda do třídy 1, tedy trida_id 1.
- UPDATE mu změňte třídu na 2, ale jen přes jeho id, které jste předtím přečetli SELECTem.
- Téhož žáka DELETE smažte zase jen podle id. Ostatní žáci v tabulce zůstanou.
- Tři příkazy připojte do dotazy.sql pod komentář, který říká, že UPDATE a DELETE mají WHERE.
> Tip: Komentář v SQL začíná dvěma pomlčkami. Do příkazu se nepočítá, příštímu čtenáři řekne, proč tam WHERE je.
# Kvíz
## Který příkaz přidá Annu do třídy 1?
- [x] INSERT INTO zaci (jmeno, prijmeni, trida_id) VALUES ('Anna', 'Nováková', 1);
- SELECT Anna INTO zaci;
- UPDATE zaci SET Anna;
- DELETE FROM zaci WHERE jmeno = 'Anna';
> INSERT vkládá řádek. Sloupce a hodnoty drží pořadí.
## Jak se změní třída jen žáku s id 15?
- UPDATE zaci SET trida_id = 2;
- [x] UPDATE zaci SET trida_id = 2 WHERE id = 15;
- SELECT trida_id = 2;
- INSERT INTO zaci VALUES (15);
> Bez WHERE by se třída přepsala všem. WHERE id = 15 drží jeden řádek.
## Co udělá DELETE FROM zaci; bez WHERE?
- Nesmaže nic, WHERE je volitelné a server se zeptá
- [x] Smaže všechny řádky v zaci
- Smaže jen poslední řádek
- Jen vypíše žáky
> Bez podmínky je cílem celá tabulka. Ve školním cvičení takový příkaz nepište.
## Co uděláte těsně před UPDATE?
- DELETE bez WHERE
- [x] SELECT se stejnou podmínkou, ať vidíte ty řádky
- DROP tabulky
- Vypnete integritu
> SELECT ukáže, na koho UPDATE dopadne. Až pak má smysl stejné WHERE použít ke změně.

View file

@ -0,0 +1,6 @@
---
nazev: MySQL: joining tables
popis: An INNER JOIN on trida_id, and why the class name is not repeated on every row.
nazev_cviceni: Quiz: JOIN
nadpis_kvizu: Complete the join
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-mysql-join
nazev: MySQL: spojení tabulek
popis: INNER JOIN přes trida_id a proč se název třídy neopakuje v každém řádku.
nazev_cviceni: Kvíz: JOIN
nadpis_kvizu: Doplňte spojení
---
# Výklad
## Jedna pravda
*Název jen jednou*
- Název 1.A je v tabulce tridy jednou. V zaci je jen trida_id.
- Když by název ležel i u žáka, oprava překlepu znamená projít všechny žáky.
- To je důvod dvou tabulek. Excel to umí jen ručně, databáze vztahem.
- JOIN tabulky spojí ve výsledku dotazu. Nesloučí je do jedné natrvalo.
> Tip: Po JOIN pořád existují dvě tabulky. Výsledek dotazu je jen pohled pro tento příkaz.
## INNER JOIN
*Shoda klíčů*
- INNER JOIN vrátí řádky, kde se klíče sejdou. Žák a jeho třída.
- ON z.trida_id = t.id je podmínka spojení. Není to totéž co WHERE na název.
- Bez ON server buď příkaz odmítne, nebo spojí každý řádek s každým.
- Přezdívky z a t jsou v dotazu proto, aby bylo jasné, která tabulka je která.
> Tip: WHERE t.nazev = '1.A' přijde až po spojení. Nejdřív se tabulky potkají, pak se filtruje.
## Celý příkaz
*Jak má vypadat*
- SELECT z.prijmeni, z.jmeno, t.nazev FROM zaci AS z INNER JOIN tridy AS t ON z.trida_id = t.id;
- WHERE t.nazev = '1.A' z toho udělá jen jednu třídu.
- ORDER BY z.prijmeni výsledek seřadí.
- Sloupce pište s přezdívkou tabulky. Samotné id by bylo nejasné, mají ho obě tabulky.
> Tip: Když příkaz hlásí nejednoznačný sloupec id, napište z.id nebo t.id. Server nehádá.
## Zadání: jeden JOIN
*Cvičení*
- Do dotazy.sql přidejte dotaz, který vypíše příjmení, jméno a název třídy.
- Jen třída 1.A, seřazené podle příjmení.
- Anna Nováková v něm je včetně textu 1.A, ne jen čísla 1.
- Příkaz spusťte dvakrát. Výsledek má být stejný, JOIN data nemění.
> Tip: Když vidíte číslo místo 1.A, vybíráte trida_id a ne t.nazev. Doplňte sloupec z tabulky tridy.
# Kvíz
## Které spojení ukáže žáka i název jeho třídy?
- SELECT * FROM zaci;
- [x] SELECT z.prijmeni, t.nazev FROM zaci AS z INNER JOIN tridy AS t ON z.trida_id = t.id;
- DELETE FROM tridy;
- INSERT INTO tridy VALUES ('1.A');
> JOIN vezme příjmení z žáků a název z tříd tam, kde se id shoduje.
## Co patří do ON?
- [x] z.trida_id = t.id
- t.nazev = '1.A'
- ORDER BY z.prijmeni
- USE skola
> ON je shoda klíčů. Filtr na název 1.A je WHERE, ne spojení.
## Proč není název třídy uložený u každého žáka?
- MySQL to neumí
- [x] Aby se název měnil na jednom místě
- Protože text v MySQL nejde uložit
- Aby nešel JOIN
> Jedna pravda v tabulce tridy. Žáci drží jen číslo.
## Co JOIN udělá s uloženými tabulkami?
- Sloučí je natrvalo do jedné
- [x] Jen složí výsledek dotazu, tabulky zůstanou dvě
- Smaže cizí klíče
- Převede je na Excel
> Výsledek je odpověď na příkaz. tridy a zaci na serveru zůstávají.

View file

@ -0,0 +1,6 @@
---
nazev: Assignment: a student register
popis: Classes, students, a relationship and one query that shows 1.A by name.
nazev_cviceni: Quiz: the register
nadpis_kvizu: Walk the keys and the query
---

View file

@ -0,0 +1,79 @@
---
id: sw-3-zadani-databaze
nazev: Zadání: evidence žáků
popis: Třídy, žáci, vztah a jeden dotaz, který ukáže 1.A jménem.
nazev_cviceni: Kvíz: evidence
nadpis_kvizu: Projděte klíče i dotaz
---
# Výklad
## Struktura
*Dvě tabulky*
- tridy: id jako klíč, nazev. Řádky 1.A a 1.B.
- zaci: id jako klíč, jmeno, prijmeni, trida_id jako cizí klíč.
- Anna Nováková je ve třídě 1.A. Ve třídě 1.B je aspoň jeden jiný žák.
- Název 1.A není opsaný v tabulce žáků. Je jen v tridy.
> Tip: Ať děláte Access, nebo MySQL, tahle dvě pole a vztah jsou povinné. Nástroj je obal.
## Access
*Když odevzdáváte accdb*
- evidence.accdb má vztah 1:N, referenční integritu a vypnutou kaskádu.
- Dotaz zaci_1A a formulář frmZaci. Sestava je seskupená podle třídy.
- Žák s neexistující třídou nejde uložit. Vyzkoušeno na trida_id 99.
- PDF sestavy leží vedle accdb.
> Tip: Když učitel otevře jen accdb, formulář a dotaz v něm musí být. Samotné PDF bez souboru nestačí.
## MySQL
*Když odevzdáváte SQL*
- dotazy.sql obsahuje SELECT se WHERE, INSERT, UPDATE i DELETE, oba měnící příkazy s WHERE.
- JOIN vypíše příjmení a název 1.A, seřazené podle příjmení.
- V souboru není heslo k serveru a není DELETE bez WHERE.
- Příkazy jdou spustit znovu jen tam, kde to dává smysl. DELETE testovacího žáka v souboru má konkrétní id a komentář.
> Tip: Odevzdává se text příkazů, ne snímek obrazovky klienta. Snímek smí být navíc.
## Jedno odevzdání
*Ne obě poloviční*
- Stačí jeden nástroj, Access nebo MySQL, ale celý: struktura, data, dotaz na 1.A.
- V dotazu je Anna vidět jako 1.A, ne jako holé číslo, pokud je součástí této části zadání JOIN nebo dotaz s názvem.
- Záloha souboru má datum v názvu, třeba evidence-2026-06-12.accdb.
- Do textu úkolu nepište heslo a nepište, že jste kaskádu zapnuli, pokud jste ji zapnout neměli.
> Tip: Když umíte obojí, odevzdejte jedno pořádně. Dvě rozdělané databáze jsou horší než jedna hotová.
# Kvíz
## Kde leží text 1.A?
- V každém řádku žáka jako jediná pravda
- [x] V tabulce tridy, v poli nazev
- V názvu souboru jako jediném místě
- V hesle
> Žák má jen trida_id. Název je v tabulce tříd jednou.
## Jaký vztah mají třídy a žáci?
- [x] 1:N, jedna třída a víc žáků
- N:N bez třetí tabulky uprostřed školního cvičení
- Žádný, stačí Excel bez klíče
- 1:1, každý žák vlastní tabulku třídy
> Jedna třída, mnoho žáků. Na straně žáků je cizí klíč.
## Co musí mít UPDATE a DELETE v odevzdaném SQL?
- Žádnou podmínku, ať je příkaz krátký
- [x] WHERE, které trefí jen zamýšlené řádky
- Hvězdičku místo sloupců
- Kaskádu v příkazu SELECT
> Bez WHERE se mění nebo maže celá tabulka. Ve cvičení se to neodevzdává.
## Co Access odmítne, když je integrita zapnutá?
- Žáka se třídou 1.A
- [x] Žáka s trida_id 99, které v tridy není
- Formulář
- Sestavu podle příjmení
> Cizí klíč musí ukazovat na existující třídu. 99 v tabulce tříd není.

View file

@ -0,0 +1,6 @@
---
nazev: WordPress: pages and posts
popis: A school site, a static page and a dated news item. The system is not hand-written HTML for every sentence.
nazev_cviceni: Quiz: WordPress
nadpis_kvizu: Tell a page from a post
---

View file

@ -0,0 +1,79 @@
---
id: sw-4-wordpress
nazev: WordPress: stránky a příspěvky
popis: Web školy, statická stránka a datovaná zpráva. Systém není ručně psané HTML každé věty.
nazev_cviceni: Kvíz: WordPress
nadpis_kvizu: Rozlište stránku a příspěvek
---
# Výklad
## Co to je
*Správa obsahu*
- WordPress je systém pro web. Text se píše v administraci, ne do každé stránky jako do samostatného souboru ve Wordu.
- Školní web se jmenuje Školní den. Název se nastaví v Nastavení, Obecné.
- Administrace je cesta /wp-admin/ na adrese webu. Bez účtu tam nejste.
- Veřejná stránka a administrace jsou dva pohledy. Návštěvník administraci nevidí.
> Tip: Když se po uložení na webu nic nezměnilo, často jste jen uložili koncept. Zveřejnit je samostatný krok.
## Stránka a příspěvek
*Dva druhy*
- Stránka je trvalá: O škole, Kontakt. Nemá datum jako hlavní údaj.
- Příspěvek je zpráva: co se stalo 12. 6. 2026. Řadí se od nejnovějšího.
- Školní den má aspoň jednu stránku O škole a jeden příspěvek o dni otevřených dveří.
- Příspěvek není stránka s jiným názvem. V menu se s nimi pracuje jinak.
> Tip: V administraci jsou Příspěvky a Stránky dvě samostatné položky. Když novinku přidáte jako stránku, na výpisu zpráv nebude.
## Adresa
*Trvalý odkaz*
- Trvalý odkaz v Nastavení, Trvalé odkazy, ať je název příspěvku, ne ?p=123.
- Adresa pak nese slova, třeba /den-otevrenych-dveri/.
- Jednou zveřejněnou adresu neměňte jen kvůli stylu. Odkaz, který už někdo má, by se rozbil.
- Název webu a adresa příspěvku jsou dvě věci. Název je Školní den, adresa je konkrétní článek.
> Tip: Když škola už odkazy rozeslala, změnu trvalých odkazů nechte na učiteli. Cvičný web si klidně nastavte hned na začátku.
## Zadání: dvě věci na webu
*Cvičení*
- Na cvičném webu nastavte název Školní den.
- Zveřejněte stránku O škole, aspoň dvě věty, bez data jako hlavní osy.
- Zveřejněte příspěvek Den otevřených dveří s datem 12. 6. 2026.
- Do souboru web.txt napište adresu stránky a adresu příspěvku. Heslo do souboru nepište.
> Tip: Koncept se na veřejné stránce neukáže. U obou má být stav Publikováno.
# Kvíz
## Čím se liší stránka od příspěvku?
- Ničím, je to stejné tlačítko
- [x] Stránka je trvalá, příspěvek je datovaná zpráva
- Příspěvek nejde zveřejnit
- Stránka musí být v Excelu
> O škole je stránka. Novinka s datem je příspěvek.
## Kam se nastaví název webu Školní den?
- Do názvu počítače
- [x] Do Nastavení, Obecné
- Do buňky A1
- Do příkazu DELETE
> Název webu je nastavení WordPressu, ne název souboru Windows.
## Jaký trvalý odkaz ve cvičení chcete?
- ?p=123 natrvalo
- [x] Název příspěvku ve adrese
- Jen číslo id žáka
- Adresu z Accessu
> Adresa se slovy se čte a pamatuje. Číselný parametr ne.
## Co napsat do web.txt?
- Heslo správce
- [x] Adresy zveřejněné stránky a příspěvku
- Celou databázi MySQL
- Soubor accdb
> Úkol dokládá, že stránky jsou venku. Heslo do textového souboru nepatří.

View file

@ -0,0 +1,6 @@
---
nazev: WordPress: users and appearance
popis: An author writes their own news, an editor also edits others. There is one administrator.
nazev_cviceni: Quiz: roles
nadpis_kvizu: Match the role
---

View file

@ -0,0 +1,79 @@
---
id: sw-4-wordpress-role
nazev: WordPress: uživatelé a vzhled
popis: Autor píše své zprávy, šéfredaktor i cizí. Správce je jeden.
nazev_cviceni: Kvíz: role
nadpis_kvizu: Přiřaďte roli
---
# Výklad
## Role
*Nejmíň práv*
- Správce instaluje doplňky, mění šablonu a zakládá uživatele. Ve třídě je jeden, účet učitele.
- Šéfredaktor zveřejňuje a upravuje i cizí příspěvky a stránky. Správce to být nemusí.
- Autor zveřejňuje vlastní příspěvky. Cizí ne. Stránky O škole nezakládá.
- Spolužák, který jen přidává novinky, dostane roli Autor. Ne správce.
> Tip: Přihlášení každého člověka je vlastní účet. Heslo se nepůjčuje, ani když jde o školní cvičení.
## Šablona a doplňky
*Málo*
- Šablona je vzhled. Ve cvičení stačí jedna, třeba výchozí, kterou učitel určí.
- Doplněk přidává funkci. Každý doplněk je další věc, která se musí aktualizovat.
- Doplněk z neznámého webu se neinstaluje. Stačí jeden překlep a web běží s cizím kódem.
- Aktualizace WordPressu, šablony a doplňků se dělají v klidný den a po záloze, ne minutu před dnem otevřených dveří.
> Tip: Neaktivní doplněk, který nepoužíváte, smažte. Vypnutý pořád leží na disku a pořád se může hodit útočníkovi, když v něm je chyba.
## Menu
*Co návštěvník vidí*
- Menu má položku O škole na stránku, ne na koncept.
- Příspěvky se často vypisují samy na úvodu. Do menu se nemusí přidávat každý.
- Zkouškový příspěvek s textem test test do veřejného menu nepatří. Smažte ho, nebo ho nechte jako koncept.
- Název v menu a nadpis stránky ať říkají totéž. O škole a O nas jsou dvě stránky, ne jedna.
> Tip: Náhled v anonymním okně ukáže web bez vašeho přihlášení. To je pohled návštěvníka.
## Zadání: účet autora
*Cvičení*
- Založte uživatele redakce s rolí Autor. Heslo mu nastavte mimo sešit, do web.txt ho nepište.
- Ověřte, že tento účet neumí instalovat doplňky. Když umí, je to správce a roli změňte.
- Šablonu neměňte na náhodnou z internetu. Nechte tu, kterou web už má, nebo tu od učitele.
- Do web.txt dopište přihlašovací jméno autora a že role je Autor. Ne heslo.
> Tip: Uživatelé, Všichni uživatelé, sloupec Role. Autor tam musí být napsaný, nestačí, že to tak bylo v úmyslu.
# Kvíz
## Jakou roli dostane spolužák, který jen píše novinky?
- Správce
- [x] Autor
- Jediný účet s vaším heslem
- Roli MySQL
> Autor zveřejní vlastní příspěvek a nesahá na doplňky ani na cizí texty.
## Kdo smí instalovat doplňky?
- Každý návštěvník
- [x] Správce
- Autor
- Kdokoli s odkazem na článek
> Doplňky mění celý web. To je práce správce, ne autora zprávy.
## Proč se doplněk nestahuje z náhodného webu?
- WordPress doplňky neumí
- [x] Je to cizí kód, který běží na školním webu
- Protože pak nejde napsat stránku
- Doplňky jsou vždycky v Excelu
> Doplněk je program. Neznámý zdroj do školního webu nepatří.
## Co do web.txt o účtu redakce nepatří?
- Přihlašovací jméno
- Role Autor
- [x] Heslo
- To, že účet nezvládne instalovat doplňky
> Heslo do textového úkolu nepište. Jméno a role ano.

View file

@ -0,0 +1,6 @@
---
nazev: Power BI: data from Excel
popis: One workbook, one table, a chart by class. The same data is not loaded twice.
nazev_cviceni: Quiz: Power BI
nadpis_kvizu: Pick the source and the visual
---

View file

@ -0,0 +1,79 @@
---
id: sw-4-power-bi
nazev: Power BI: data z Excelu
popis: Jeden sešit, jedna tabulka, graf podle třídy. Stejná data se nenačítají dvakrát.
nazev_cviceni: Kvíz: Power BI
nadpis_kvizu: Vyberte zdroj a vizuál
---
# Výklad
## Soubor
*pbix*
- Power BI Desktop ukládá práci do pbix. Není to xlsx a není to obrázek grafu.
- Na odevzdání vedle pbix patří PDF stránky sestavy, ať ji otevře i člověk bez Power BI.
- Zdroj je prodej.xlsx, tabulka Prodej se sloupci Polozka, Trida, Castka.
- Načtení je Načíst data, Excel, a vybere se tabulka Prodej, ne celý sešit naslepo dvakrát.
> Tip: Když v modelu vidíte Prodej a Prodej (2), tabulka se načetla dvakrát. Jednu odeberte, než postavíte graf.
## Model
*Jedna řádka, jedna skutečnost*
- Každý řádek je jeden prodej: položka, třída, částka. Součet v tomtéž sloupci navíc řádek souhrnu být nemá.
- Řádek souhrnů z Excelu do Power BI nepatří. Součet si spočítá vizuál.
- Trida je text 1.A a 1.B. Castka je číslo bez Kč v buňce.
- Když Excel opravíte, v Power BI dejte Obnovit. Sám se o uložení xlsx nedozví.
> Tip: Sloupec, který Power BI bere jako text, se nesčítá. Často je v něm mezera nebo Kč. V Excelu ho opravte a obnovte.
## Vizuál
*Sloupec a karta*
- Sloupcový graf: osa Trida, hodnota součet Castka. Porovnání dvou tříd.
- Karta ukáže jedno číslo, celkový součet Castka.
- Koláč pro dvě třídy je zbytečný. Pro dvanáct měsíců byl špatně už v Excelu.
- Průřez, anglicky slicer, na pole Trida nechte na příští lekci. Teď ať graf ukáže obě třídy.
> Tip: Když graf ukáže počet řádků místo součtu korun, v hodnotách je Počet. Přepněte souhrn na Součet.
## Zadání: první pbix
*Cvičení*
- prodej.pbix načte tabulku Prodej jednou.
- Na stránce jsou sloupcový graf podle třídy a karta s celkovou částkou.
- Obnovte data potom, co v Excelu změníte jednu částku. Karta se musí pohnout.
- Uložte pbix do složky Skola\1-rocnik\excel a vedle něj prodej.pdf.
> Tip: PDF je snímek sestavy. pbix je práce, ve které jde vizuál opravit. Odevzdávají se oba.
# Kvíz
## Jaký soubor je pracovní v Power BI?
- xlsx jako jediný
- [x] pbix
- pdf jako jediný
- accdb
> pbix drží model a vizuály. Excel je zdroj. PDF je náhled na odevzdání.
## Jak se mají načíst data prodeje?
- [x] Tabulka Prodej jednou
- Tentýž list dvakrát
- Jako obrázek grafu z Excelu
- Přepisem do Wordu
> Jedna tabulka v modelu. Druhá kopie téhož zdroje mate součty.
## Jaký vizuál porovná částku tříd 1.A a 1.B?
- Koláč s dvanácti díly
- [x] Sloupcový graf, osa Trida, součet Castka
- Karta bez popisku a bez čísla
- Průřez místo grafu jako jediný prvek
> Dvě kategorie a jejich součet jsou sloupce. Karta je jen jedno číslo celkem.
## Co uděláte v Power BI potom, co změníte číslo v Excelu?
- Nic, pbix se mění sám v tu vteřinu
- [x] Obnovit
- Smazat pbix a začít ve Wordu
- Převést Castka na text
> Power BI si data při načtení vezme. Další změna Excelu se projeví až po obnovení.

View file

@ -0,0 +1,6 @@
---
nazev: Power BI: a slicer and a report
popis: A class slicer filters the whole page. A filter on one visual leaves the others.
nazev_cviceni: Quiz: the slicer
nadpis_kvizu: Say what the slicer affects
---

View file

@ -0,0 +1,79 @@
---
id: sw-4-power-bi-prurez
nazev: Power BI: průřez a sestava
popis: Průřez třídy přefiltruje celou stránku. Filtr jednoho vizuálu ostatní nechá.
nazev_cviceni: Kvíz: průřez
nadpis_kvizu: Řekněte, co průřez ovlivní
---
# Výklad
## Průřez
*Celá stránka*
- Průřez na pole Trida je ovládací prvek na plátně. Čtenář klikne na 1.A.
- Sloupcový graf i karta se mají změnit. Celková částka pak není celá škola, ale jen 1.A.
- Když se karta nehne, průřez na ni není napojený, nebo karta bere jinou tabulku.
- Výběr se zruší gumou na průřezu, nebo volbou všech tříd. Data se tím nesmažou.
> Tip: Průřez filtruje. Není to nový součet uložený do Excelu.
## Filtr vizuálu
*Jen jeden graf*
- Filtr v podokně konkrétního vizuálu ovlivní jen ten vizuál.
- Školní sestava pro porovnání tříd filtr vizuálu nepotřebuje. Má ukázat obě, dokud čtenář nezvolí průřez.
- Filtr stránky schová třídu všem vizuálům na stránce, i bez klikání. Na odevzdání ho nenechávejte zapnutý omylem.
- Než sestavu vyexportujete, zrušte výběr průřezu, pokud má PDF ukázat celou školu.
> Tip: PDF zachytí průřez tak, jak je zrovna vybraný. Vybraná 1.A v PDF už druhou třídu neukáže.
## Stránka
*Jedna otázka*
- Stránka se jmenuje Prodej. Název Stránka 1 se neodevzdává.
- Nadpis na plátně říká Prodej po třídách. Graf má popisky tříd.
- Na jedné stránce jsou nejvýš průřez, jeden graf a jedna karta. Druhý graf se stejným obsahem je navíc.
- Barvy nechte klidné. Červená a zelená těsně vedle sebe se špatně čte.
> Tip: Zobrazte sestavu na projektoru, nebo aspoň v celém okně. Drobný popisek, který na vašem monitoru ujde, vzadu ve třídě zanikne.
## Zadání: stránka s průřezem
*Cvičení*
- Na stránku Prodej přidejte průřez Trida.
- Klik na 1.A změní graf i kartu. Po zrušení výběru je zase vidět celý součet.
- PDF vyexportujte bez vybrané třídy, ať ukazuje 1.A i 1.B.
- pbix uložte znovu. V modelu je tabulka Prodej pořád jen jednou.
> Tip: Když průřez nabízí prázdný řádek, v Excelu je prázdný řádek tabulky. Smažte ho ve zdroji a obnovte.
# Kvíz
## Co má průřez na Trida změnit?
- Jen barvu pozadí
- [x] Graf i kartu na stránce
- Soubor xlsx na disku
- Heslo k WordPressu
> Průřez filtruje vizuály na stránce. Karta s celkovou částkou se musí změnit taky.
## Čím se liší filtr jednoho vizuálu od průřezu?
- Ničím
- [x] Filtr vizuálu platí jen pro něj, průřez je ovládání pro stránku
- Filtr vizuálu smaže Excel
- Průřez nejde zrušit
> Průřez je na plátně pro čtenáře. Filtr v podokně vizuálu ostatní grafy nechá.
## Jaké PDF se odevzdává, když mají být vidět obě třídy?
- S vybranou jen 1.A
- [x] Bez výběru v průřezu
- Prázdná stránka
- Jen karta bez grafu a bez tříd
> PDF drží aktuální výběr. Než ho uděláte, výběr zrušte.
## Jak se má stránka jmenovat?
- Stránka 1
- [x] Prodej
- pbix
- DELETE
> Název říká, co na stránce je. Výchozí Stránka 1 se neodevzdává.

View file

@ -0,0 +1,6 @@
---
nazev: Batch files
popis: A bat file that creates the school folders and deletes nothing.
nazev_cviceni: Quiz: batch
nadpis_kvizu: Pick the safe command
---

View file

@ -0,0 +1,79 @@
---
id: sw-4-batch
nazev: Dávkové soubory
popis: Soubor bat, který založí složky školy a nic nemaže.
nazev_cviceni: Kvíz: batch
nadpis_kvizu: Vyberte bezpečný příkaz
---
# Výklad
## Soubor bat
*Příkazy za sebou*
- Dávkový soubor je text s příponou bat. Příkazový řádek ho spustí řádek po řádku.
- První řádek cvičení je @echo off, ať se příkazy nevypisují podruhé do okna.
- rem je komentář. Do příkazu se nepočítá.
- Soubor se jmenuje slozky.bat a leží v Dokumentech, ne na cizím flash disku, kterému nerozumíte.
> Tip: Dvojklik spustí bat v té složce, kde soubor je. Neznámý bat z mailu se nespouští, stejně jako pdf.exe.
## Složky
*mkdir*
- mkdir založí složku. Když už existuje, příkaz ohlásí chybu a pokračuje se dál, složku nesmaže.
- set "ROOT=%USERPROFILE%\Documents\Skola" uloží cestu. %USERPROFILE% je složka účtu, u každého jiná.
- mkdir "%ROOT%\1-rocnik\word" založí i mezistupně, když je napíšete takto v nových Windows. Když ne, založte nejdřív 1-rocnik a pak word.
- Uvozovky kolem cesty jsou povinné v okamžiku, kdy v cestě je mezera. V Documents mezera není, v názvu účtu být může.
> Tip: echo Hotovo vypíše větu. pause nechá okno otevřené, ať výsledek přečtete. Bez pause dvojklik okno hned zavře.
## Co se nepouští
*del*
- del smaže soubor. Ve školním bat na založení složek žádný del není.
- Příkaz, který maže podle masky celý disk, se nepíše ani z legrace. Obnova není Ctrl+Z.
- cd /d přejde na jiný disk a složku. Než něco mažete, echo vypíše, kde jste. V tomto cvičení nemažete.
- Bat, kterému nerozumíte řádek po řádku, nespouštějte. Krátký soubor se čte celý.
> Tip: Když chcete zkusit del, zkuste ho na jeden soubor test.txt, který jste sami právě vytvořili. Ne na složku Windows.
## Zadání: slozky.bat
*Cvičení*
- slozky.bat nastaví ROOT na %USERPROFILE%\Documents\Skola a založí 1-rocnik\word, 1-rocnik\excel a 1-rocnik\system.
- Na konci je echo s cestou a pause. Není tam del.
- Spusťte ho jednou. Složky v Průzkumníku opravdu jsou.
- Spusťte ho podruhé. Smí ohlásit, že složka už existuje. Nemá nic smazat.
> Tip: Úprava bat je v Poznámkovém bloku, ne ve Wordu. Word do něj doplní formátování a příkazový řádek pak řádek nepochopí.
# Kvíz
## Co má být první řádek školního bat?
- del C:\
- [x] @echo off
- formát disku
- heslo účtu
> @echo off jen ztiší opisování příkazů. Nic nemaže.
## Co dělá mkdir?
- Smaže složku
- [x] Založí složku
- Otevře Word
- Změní heslo
> mkdir je make directory. Mazání je jiný příkaz a v tomto cvičení není.
## Kam ukazuje %USERPROFILE%?
- Na stejnou složku na všech účtech počítače
- [x] Na profil přihlášeného účtu
- Na web WordPressu
- Na tabulku tridy
> Každý účet má vlastní profil. Stejný bat tedy založí Skola v Dokumentech toho, kdo ho spustil.
## Který bat ve cvičení nespouštíte?
- Ten, který jen zakládá složky a na konci čeká
- [x] Neznámý soubor z mailu
- slozky.bat, který jste sami přečetli
- Soubor, který ohlásí, že složka už existuje
> Dávka je program. Z mailu se nespouští, stejně jako soubor s příponou exe.

View file

@ -0,0 +1,6 @@
---
nazev: Users and groups in Windows
popis: The zaci account is in Users. It is not in Administrators.
nazev_cviceni: Quiz: groups
nadpis_kvizu: Put the account in the right group
---

View file

@ -0,0 +1,79 @@
---
id: sw-4-uzivatele
nazev: Uživatelé a skupiny ve Windows
popis: Účet zaci je ve Users. Ve skupině Administrators není.
nazev_cviceni: Kvíz: skupiny
nadpis_kvizu: Zařaďte účet do skupiny
---
# Výklad
## Skupina
*Práva najednou*
- Skupina sdružuje účty, které mají mít stejná práva. Neměníte právo každému účtu zvlášť po jednom souboru.
- Users jsou běžní uživatelé. Administrators smí měnit systém a instalovat.
- Účet zaci patří do Users. Do Administrators ne.
- Nový účet je často v Users sám. Práce navíc je nestrkat ho mezi správce, ne dopisovat Users.
> Tip: Kdo je správce, vypíše net localgroup Administrators. Jméno zaci v tom seznamu být nemá.
## Příkazy
*Bez hesla v řádku*
- net user zaci * /add účet založí a na heslo se zeptá. Hvězdička znamená dotaz, ne heslo zapsané do bat.
- net user zaci vypíše účet. Je tam vidět, jestli je aktivní.
- net localgroup Users zaci /add ho přidá do Users, kdyby tam nebyl.
- net localgroup Administrators zaci /delete ho ze správců odebere, pokud tam omylem je. Příkaz chce spustit správce.
> Tip: lusrmgr.msc otevře stejné účty v okně, ale jen ve Windows Pro, Education a Enterprise. V edici Home toto okno není a zůstává net user.
## Kdo příkaz spouští
*Správce*
- Běžný uživatel účet nezaloží. Okno se musí spustit jako správce, nebo systém požádá o souhlas.
- Souhlas správce není důvod založit účet rovnou jako správce. zaci zůstává běžný.
- whoami na účtu zaci nesmí skončit na Administrators.
- Cvičný účet se po hodině dá odebrat: net user zaci /delete. Nejdřív si ověřte, že nemaže účet učitele.
> Tip: Jméno účtu zaci je cvičné. Účet, který se jmenuje jako učitel nebo správce, se nedeaktivuje a nemaže.
## Zadání: zápis, ne cizí účty
*Cvičení*
- Do ucty.txt napište příkaz, kterým se zaci založí, včetně hvězdičky místo hesla.
- Napište, v které skupině má být a ve které být nemá.
- Pokud učitel dovolí, účet opravdu založte a net localgroup Administrators opište. zaci v seznamu není.
- Heslo do ucty.txt nepište. Cizí účty na počítači neměňte.
> Tip: Když lusrmgr.msc hlásí, že neexistuje, máte edici Home. Použijte net user a do zápisu napište, že grafické okno v této edici není.
# Kvíz
## Do které skupiny patří zaci?
- Administrators
- [x] Users
- Do žádné, účet bez skupiny smí instalovat
- Do skupiny hesel
> Běžná práce je skupina Users. Správci jsou Administrators.
## Jak se účet založí, aniž by heslo zůstalo v příkazu?
- [x] net user zaci * /add
- net user zaci heslo123 /add
- mkdir zaci
- DELETE FROM zaci
> Hvězdička se zeptá. Heslo napsané v příkazu zůstane v historii.
## Kde lusrmgr.msc není?
- Ve Windows Pro
- [x] Ve Windows Home
- Ve Windows Education
- Ve Windows Enterprise
> Grafická správa účtů je v Pro, Education a Enterprise. Home ji nemá.
## Co whoami nesmí ukázat při denní práci na účtu zaci?
- Že jde o běžného uživatele
- [x] Že účet je ve skupině Administrators
- Název počítače
- To, že účet existuje
> Denní účet není správce. whoami to prozradí dřív, než něco nainstalujete.

View file

@ -0,0 +1,6 @@
---
nazev: Local policy
popis: A minimum password of 8 characters and a lock after 300 seconds. A school domain overrides the local policy.
nazev_cviceni: Quiz: policy
nadpis_kvizu: Fill in the value and the command
---

View file

@ -0,0 +1,79 @@
---
id: sw-4-zasady
nazev: Místní zásady
popis: Minimální heslo 8 znaků a zámek po 300 sekundách. Doména školy místní zásadu přebije.
nazev_cviceni: Kvíz: zásady
nadpis_kvizu: Doplňte hodnotu a příkaz
---
# Výklad
## Kde se zásady berou
*gpedit*
- Místní zásady otevře gpedit.msc. Je ve Windows Pro, Education a Enterprise, v edici Home není.
- Konfigurace počítače platí pro stroj. Konfigurace uživatele platí pro účty, které se přihlásí.
- Školní cvičení mění dvě věci: délku hesla a zámek při nečinnosti. Ostatní zásady nechte být.
- Když je počítač v doméně školy, doménová zásada vyhraje nad místní. Místní změna se pak jakoby ztratí a není to chyba klikání.
> Tip: Než něco změníte, napište si původní hodnotu. Vrátit Neznámé číslo zpět nejde, když jste si ho nezapsali.
## Heslo
*Osm znaků*
- Cesta vede přes Konfigurace počítače, Nastavení systému Windows, Nastavení zabezpečení, Zásady účtů, Zásady hesel.
- Minimální délka hesla se nastaví na 8.
- Nula znamená, že heslo smí být prázdné. To školní účet nechce.
- Zásada neopraví heslo, které už je krátké, dokud ho uživatel příště nemění. Platí pro nová hesla.
> Tip: Heslo v zásadě nenastavujete. Nastavujete pravidlo. Samotné heslo účtu zaci se zadává při net user, ne tady.
## Zámek
*300 sekund*
- Nečinnost: Konfigurace počítače, Nastavení systému Windows, Nastavení zabezpečení, Místní zásady, Možnosti zabezpečení.
- Položka Interaktivní přihlášení: limit nečinnosti počítače se nastaví na 300 sekund, tedy 5 minut.
- Nula nebo nenastaveno znamená, že tato zásada zámek nevynucuje.
- Po pěti minutách bez myši a klávesnice se má počítač zamknout, ne vypnout a ne smazat Dokumenty.
> Tip: Zámek je Win+L hned. Zásada totéž udělá sama, když odejdete od stroje a zapomenete.
## Zadání: dvě hodnoty
*Cvičení*
- Pokud gpedit.msc máte, nastavte minimální délku hesla na 8 a limit nečinnosti na 300 sekund. Původní hodnoty si zapište.
- gpupdate /force zásady načte hned, bez čekání na restart. Příkaz chce okno spuštěné jako správce.
- Do zasady.txt napište obě hodnoty a jestli je počítač v doméně. Heslo nepište.
- V edici Home napište, že gpedit.msc v ní není, a hodnoty jen popište. Nevymýšlejte, že jste je nastavili.
> Tip: Když po gpupdate hodnota v gpedit zůstane a systém se nechová podle ní, počítač je v doméně a doména místní číslo přebíjí.
# Kvíz
## Jaká je školní minimální délka hesla?
- 0
- [x] 8
- 300
- Prázdné heslo
> Osm znaků je pravidlo z první hodiny o účtech. Nula by prázdné heslo dovolila.
## Na kolik sekund se nastaví limit nečinnosti?
- 5
- [x] 300
- 8
- Na nulu, ať se počítač nezamyká
> 300 sekund je pět minut. Číslo 5 by bylo pět sekund, to v této položce není.
## Čím se místní zásady načtou hned?
- Smazáním účtu zaci
- [x] gpupdate /force
- mkdir
- SELECT * FROM zaci
> gpupdate zásady znovu načte. Bez něj si počítač může počkat na své vlastní obnovení.
## Co platí, když je počítač v doméně školy a místní heslo nastavíte jinak?
- Vždy vyhraje místní gpedit
- [x] Vyhraje doménová zásada
- Hesla se vypnou
- WordPress přestane běžet
> Doména je nad místním počítačem. Místní změna, která jí odporuje, se neuplatní.

View file

@ -0,0 +1,6 @@
---
nazev: Exam assignment
popis: Folders, a letter, grades, a register, a site, a report and an account with a password rule.
nazev_cviceni: Quiz: the whole assignment
nadpis_kvizu: Walk the hand-in
---

View file

@ -0,0 +1,79 @@
---
id: sw-4-maturita
nazev: Maturitní zadání
popis: Složky, dopis, známky, evidence, web, sestava a účet s zásadou hesla.
nazev_cviceni: Kvíz: celé zadání
nadpis_kvizu: Projdi odevzdání
---
# Výklad
## Systém
*Složky a účet*
- slozky.bat založí Skola\1-rocnik\word, excel a system v Dokumentech toho účtu, který ho spustí.
- V bat není del a není v něm heslo. Je v něm @echo off, mkdir a pause.
- Účet zaci je běžný uživatel ve skupině Users, není v Administrators.
- Minimální délka hesla je 8 znaků. Zámek po nečinnosti je 300 sekund, pokud edice Windows zásady má.
> Tip: Do textového souboru patří příkazy a hodnoty. Skutečné heslo ne.
## Office
*Dopis a známky*
- zadost.docx je jedna strana, datum 12. 6. 2026, řádek Věc, k tomu PDF.
- znamky.xlsx počítá stav vzorcem KDYŽ. Známka 5 je neprospěl, 1 až 4 prospěl.
- Pod známkami je průměr, ne součet.
- prodej.xlsx a prodej.pbix: tabulka načtená jednou, průřez třídy, PDF bez výběru, ať jsou vidět obě třídy.
> Tip: pbix bez xlsx zdroje učitel neobnoví. Xlsx vedle pbix nechte.
## Data a web
*Evidence a Školní den*
- Access nebo MySQL: tabulky tridy a zaci, vztah 1:N, Anna Nováková ve třídě 1.A.
- Dotaz ukáže název 1.A, ne jen číslo. UPDATE a DELETE, pokud jsou v SQL, mají WHERE.
- WordPress: název Školní den, stránka O škole, příspěvek s datem, účet autora. Správce je jeden.
- V textech o webu a účtech není heslo.
> Tip: Stačí jeden databázový nástroj, ale celý. Access s integritou, nebo SQL s JOINem.
## Složka odevzdání
*Pořádek*
- Všechno leží pod Skola, ne na ploše a ne v Stažených.
- Přípony jsou vidět. Názvy nemají final2.
- Na obhajobu otevřete nejdřív bat a složky, pak Excel a Power BI, pak databázi a nakonec web.
- U každé části umíte říct, kdo smí heslo, kdo smí instalovat a proč pětka není prospěl.
> Tip: Když se zeptají, proč zaci není správce, odpověď je: denní účet nemá právo měnit systém.
# Kvíz
## Co slozky.bat nesmí obsahovat?
- mkdir
- @echo off
- [x] del přes celý disk nebo cizí složky
- pause
> Cvičení složky zakládá. Mazání do něj nepatří a neznámé mazání už vůbec ne.
## Jaký je stav známky 5?
- prospěl
- [x] neprospěl
- průměr
- 1.A
> Prochází 1 až 4. Pětka je neprospěl. Rozhoduje vzorec KDYŽ, ne rukou psaný text.
## Jakou roli má účet, který ve WordPressu jen píše novinky?
- Správce
- [x] Autor
- Jediný sdílený účet učitele
- Administrators ve Windows
> Autor zveřejní vlastní příspěvek. Doplňky a uživatele spravuje jeden správce.
## Jaké jsou dvě hodnoty zásad?
- Heslo 0 znaků a zámek 8 sekund
- [x] Heslo aspoň 8 znaků a zámek po 300 sekundách
- Heslo v souboru bat a zámek vypnutý
- 300 znaků hesla a 8 sekund
> Osm znaků je délka hesla. 300 sekund je pět minut nečinnosti.

View file

@ -269,6 +269,26 @@ final class AppModel: ObservableObject {
refresh()
}
func markSw(_ id: Int) {
progress.markSw(id)
refresh()
}
func markSw2(_ id: Int) {
progress.markSw2(id)
refresh()
}
func markSw3(_ id: Int) {
progress.markSw3(id)
refresh()
}
func markSw4(_ id: Int) {
progress.markSw4(id)
refresh()
}
func markTg4(_ id: Int) {
progress.markTg4(id)
refresh()

View file

@ -67,6 +67,10 @@ final class Content {
let pg2: [J]
let pg3: [J]
let pg4: [J]
let sw: [J]
let sw2: [J]
let sw3: [J]
let sw4: [J]
let cs: [J]
let cs2: [J]
let cs3: [J]
@ -145,6 +149,10 @@ final class Content {
pg2 = raw.arr("pg2")
pg3 = raw.arr("pg3")
pg4 = raw.arr("pg4")
sw = raw.arr("sw")
sw2 = raw.arr("sw2")
sw3 = raw.arr("sw3")
sw4 = raw.arr("sw4")
cs = raw.arr("cs")
cs2 = raw.arr("cs2")
cs3 = raw.arr("cs3")
@ -219,6 +227,10 @@ final class Content {
func pg2Lesson(_ id: Int) -> J? { pg2.first { $0.int("id") == id } }
func pg3Lesson(_ id: Int) -> J? { pg3.first { $0.int("id") == id } }
func pg4Lesson(_ id: Int) -> J? { pg4.first { $0.int("id") == id } }
func swLesson(_ id: Int) -> J? { sw.first { $0.int("id") == id } }
func sw2Lesson(_ id: Int) -> J? { sw2.first { $0.int("id") == id } }
func sw3Lesson(_ id: Int) -> J? { sw3.first { $0.int("id") == id } }
func sw4Lesson(_ id: Int) -> J? { sw4.first { $0.int("id") == id } }
func csLesson(_ id: Int) -> J? { cs.first { $0.int("id") == id } }
func cs2Lesson(_ id: Int) -> J? { cs2.first { $0.int("id") == id } }
func cs3Lesson(_ id: Int) -> J? { cs3.first { $0.int("id") == id } }

View file

@ -110,6 +110,14 @@ final class ProgressStore {
func markPg3(_ id: Int) { mark("pg3.\(id)") }
func pg4Done(_ id: Int) -> Bool { done("pg4.\(id)") }
func markPg4(_ id: Int) { mark("pg4.\(id)") }
func swDone(_ id: Int) -> Bool { done("sw.\(id)") }
func markSw(_ id: Int) { mark("sw.\(id)") }
func sw2Done(_ id: Int) -> Bool { done("sw2.\(id)") }
func markSw2(_ id: Int) { mark("sw2.\(id)") }
func sw3Done(_ id: Int) -> Bool { done("sw3.\(id)") }
func markSw3(_ id: Int) { mark("sw3.\(id)") }
func sw4Done(_ id: Int) -> Bool { done("sw4.\(id)") }
func markSw4(_ id: Int) { mark("sw4.\(id)") }
func csDone(_ id: Int) -> Bool { done("cs.\(id)") }
func markCs(_ id: Int) { mark("cs.\(id)") }
func cs2Done(_ id: Int) -> Bool { done("cs2.\(id)") }
@ -376,6 +384,38 @@ func summarize(_ content: Content, _ p: ProgressStore) -> ProgressSum {
sum.doneUnits += 1
}
}
for l in content.sw {
sum.totalEx += 1
sum.openUnits += 1
if p.swDone(l.int("id")) {
sum.doneEx += 1
sum.doneUnits += 1
}
}
for l in content.sw2 {
sum.totalEx += 1
sum.openUnits += 1
if p.sw2Done(l.int("id")) {
sum.doneEx += 1
sum.doneUnits += 1
}
}
for l in content.sw3 {
sum.totalEx += 1
sum.openUnits += 1
if p.sw3Done(l.int("id")) {
sum.doneEx += 1
sum.doneUnits += 1
}
}
for l in content.sw4 {
sum.totalEx += 1
sum.openUnits += 1
if p.sw4Done(l.int("id")) {
sum.doneEx += 1
sum.doneUnits += 1
}
}
for l in content.cs {
sum.totalEx += 1
sum.openUnits += 1

View file

@ -137,6 +137,19 @@ enum Route: Hashable {
case pg4Map
case pg4Lesson(Int)
case pg4Ex(Int)
case swYears
case swMap
case swLesson(Int)
case swEx(Int)
case sw2Map
case sw2Lesson(Int)
case sw2Ex(Int)
case sw3Map
case sw3Lesson(Int)
case sw3Ex(Int)
case sw4Map
case sw4Lesson(Int)
case sw4Ex(Int)
case csYears
case csMap
case csLesson(Int)
@ -285,6 +298,19 @@ enum Route: Hashable {
case .pg4Map: return "pg4map"
case .pg4Lesson(let id): return "pg4unit\(id)"
case .pg4Ex(let id): return "pg4ex\(id)"
case .swYears: return "swyears"
case .swMap: return "swmap"
case .swLesson(let id): return "swunit\(id)"
case .swEx(let id): return "swex\(id)"
case .sw2Map: return "sw2map"
case .sw2Lesson(let id): return "sw2unit\(id)"
case .sw2Ex(let id): return "sw2ex\(id)"
case .sw3Map: return "sw3map"
case .sw3Lesson(let id): return "sw3unit\(id)"
case .sw3Ex(let id): return "sw3ex\(id)"
case .sw4Map: return "sw4map"
case .sw4Lesson(let id): return "sw4unit\(id)"
case .sw4Ex(let id): return "sw4ex\(id)"
case .csYears: return "csyears"
case .csMap: return "csmap"
case .csLesson(let id): return "csunit\(id)"
@ -570,6 +596,32 @@ enum Route: Hashable {
return [.pgYears, .pg4Map, .pg4Lesson(id)]
case .pg4Ex(let id):
return [.pgYears, .pg4Map, .pg4Lesson(id), .pg4Ex(id)]
case .swYears:
return [.swYears]
case .swMap:
return [.swYears, .swMap]
case .swLesson(let id):
return [.swYears, .swMap, .swLesson(id)]
case .swEx(let id):
return [.swYears, .swMap, .swLesson(id), .swEx(id)]
case .sw2Map:
return [.swYears, .sw2Map]
case .sw2Lesson(let id):
return [.swYears, .sw2Map, .sw2Lesson(id)]
case .sw2Ex(let id):
return [.swYears, .sw2Map, .sw2Lesson(id), .sw2Ex(id)]
case .sw3Map:
return [.swYears, .sw3Map]
case .sw3Lesson(let id):
return [.swYears, .sw3Map, .sw3Lesson(id)]
case .sw3Ex(let id):
return [.swYears, .sw3Map, .sw3Lesson(id), .sw3Ex(id)]
case .sw4Map:
return [.swYears, .sw4Map]
case .sw4Lesson(let id):
return [.swYears, .sw4Map, .sw4Lesson(id)]
case .sw4Ex(let id):
return [.swYears, .sw4Map, .sw4Lesson(id), .sw4Ex(id)]
case .csYears:
return [.csYears]
case .csMap:
@ -658,6 +710,11 @@ func routeFromPage(_ page: String) -> Route? {
case "pg2map": return .pg2Map
case "pg3map": return .pg3Map
case "pg4map": return .pg4Map
case "swyears": return .swYears
case "swmap": return .swMap
case "sw2map": return .sw2Map
case "sw3map": return .sw3Map
case "sw4map": return .sw4Map
case "csyears": return .csYears
case "csmap": return .csMap
case "cs2map": return .cs2Map
@ -772,6 +829,30 @@ func routeFromPage(_ page: String) -> Route? {
if let m = page.wholeMatch(of: /fyzex(\d+)/), let n = Int(m.1) {
return .fyzEx(n)
}
if let m = page.wholeMatch(of: /sw4unit(\d+)/), let n = Int(m.1) {
return .sw4Lesson(n)
}
if let m = page.wholeMatch(of: /sw4ex(\d+)/), let n = Int(m.1) {
return .sw4Ex(n)
}
if let m = page.wholeMatch(of: /sw3unit(\d+)/), let n = Int(m.1) {
return .sw3Lesson(n)
}
if let m = page.wholeMatch(of: /sw3ex(\d+)/), let n = Int(m.1) {
return .sw3Ex(n)
}
if let m = page.wholeMatch(of: /sw2unit(\d+)/), let n = Int(m.1) {
return .sw2Lesson(n)
}
if let m = page.wholeMatch(of: /sw2ex(\d+)/), let n = Int(m.1) {
return .sw2Ex(n)
}
if let m = page.wholeMatch(of: /swunit(\d+)/), let n = Int(m.1) {
return .swLesson(n)
}
if let m = page.wholeMatch(of: /swex(\d+)/), let n = Int(m.1) {
return .swEx(n)
}
if let m = page.wholeMatch(of: /pg4unit(\d+)/), let n = Int(m.1) {
return .pg4Lesson(n)
}

View file

@ -712,6 +712,7 @@ func subjectSymbol(_ icon: String) -> String {
case "ruler": return "ruler.fill"
case "code": return "chevron.left.forwardslash.chevron.right"
case "brush": return "paintbrush.fill"
case "apps": return "square.grid.2x2.fill"
default: return "lock.fill"
}
}

View file

@ -1018,6 +1018,39 @@ struct PgQuizScreen: View {
}
}
struct SwQuizScreen: View {
@ObservedObject var vm: AppModel
let year: Int
let id: Int
var body: some View {
let lesson: J? = {
switch year {
case 2: return vm.content.sw2Lesson(id)
case 3: return vm.content.sw3Lesson(id)
case 4: return vm.content.sw4Lesson(id)
default: return vm.content.swLesson(id)
}
}()
if let lesson {
let spec = J([
"type": "choice",
"title": vm.tr(lesson.str("exTitleKey")),
"sub": lesson.str("quizHeadKey"),
"questions": lesson.rawArray("quiz"),
])
DispatchExercise(vm: vm, spec: spec, titleFallback: vm.tr(lesson.str("exTitleKey"))) {
switch year {
case 2: vm.markSw2(id)
case 3: vm.markSw3(id)
case 4: vm.markSw4(id)
default: vm.markSw(id)
}
}
}
}
}
struct FyzQuizScreen: View {
@ObservedObject var vm: AppModel
let year: Int

View file

@ -751,6 +751,10 @@ func routeProgress(_ vm: AppModel, _ r: Route) -> (done: Int, total: Int)? {
case .pg2Map: return tally(c.pg2, p.pg2Done)
case .pg3Map: return tally(c.pg3, p.pg3Done)
case .pg4Map: return tally(c.pg4, p.pg4Done)
case .swMap: return tally(c.sw, p.swDone)
case .sw2Map: return tally(c.sw2, p.sw2Done)
case .sw3Map: return tally(c.sw3, p.sw3Done)
case .sw4Map: return tally(c.sw4, p.sw4Done)
case .csMap: return tally(c.cs, p.csDone)
case .cs2Map: return tally(c.cs2, p.cs2Done)
case .cs3Map: return tally(c.cs3, p.cs3Done)
@ -820,6 +824,12 @@ private func subjectSum(_ vm: AppModel, _ s: J) -> ProgressSum {
+ vm.content.pg2.filter { vm.progress.pg2Done($0.int("id")) }.count
+ vm.content.pg3.filter { vm.progress.pg3Done($0.int("id")) }.count
+ vm.content.pg4.filter { vm.progress.pg4Done($0.int("id")) }.count
case "swyears", "swmap", "sw2map", "sw3map", "sw4map":
sum.totalEx = vm.content.sw.count + vm.content.sw2.count + vm.content.sw3.count + vm.content.sw4.count
sum.doneEx = vm.content.sw.filter { vm.progress.swDone($0.int("id")) }.count
+ vm.content.sw2.filter { vm.progress.sw2Done($0.int("id")) }.count
+ vm.content.sw3.filter { vm.progress.sw3Done($0.int("id")) }.count
+ vm.content.sw4.filter { vm.progress.sw4Done($0.int("id")) }.count
case "tgyears", "tgmap", "tg2map", "tg3map", "tg4map":
sum.totalEx = vm.content.tg.count + vm.content.tg2.count + vm.content.tg3.count + vm.content.tg4.count
sum.doneEx = vm.content.tg.filter { vm.progress.tgDone($0.int("id")) }.count
@ -1129,6 +1139,27 @@ private func buildSearch(_ vm: AppModel) -> [Hit] {
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "fyz4unit\(l.int("id"))", extra: "fyzika")
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "fyz4ex\(l.int("id"))")
}
add(vm.tr("Programové vybavení"), vm.tr("search_lesson"), "swyears", extra: "office windows excel mysql")
add(vm.tr("sw_year1"), vm.tr("search_lesson"), "swmap", extra: "rocnik")
add(vm.tr("sw_year2"), vm.tr("search_lesson"), "sw2map", extra: "rocnik")
add(vm.tr("sw_year3"), vm.tr("search_lesson"), "sw3map", extra: "rocnik")
add(vm.tr("sw_year4"), vm.tr("search_lesson"), "sw4map", extra: "rocnik")
for l in vm.content.sw {
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "swunit\(l.int("id"))", extra: "windows")
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "swex\(l.int("id"))")
}
for l in vm.content.sw2 {
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw2unit\(l.int("id"))", extra: "word excel")
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw2ex\(l.int("id"))")
}
for l in vm.content.sw3 {
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw3unit\(l.int("id"))", extra: "access mysql")
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw3ex\(l.int("id"))")
}
for l in vm.content.sw4 {
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw4unit\(l.int("id"))", extra: "wordpress")
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw4ex\(l.int("id"))")
}
add(vm.tr("Prezentační grafika"), vm.tr("search_lesson"), "pgyears", extra: "photoshop premiere illustrator")
add(vm.tr("pg_year1"), vm.tr("search_lesson"), "pgmap", extra: "rocnik")
add(vm.tr("pg_year2"), vm.tr("search_lesson"), "pg2map", extra: "rocnik")
@ -1976,6 +2007,47 @@ struct CsYearsScreen: View {
}
}
struct SwYearsScreen: View {
@ObservedObject var vm: AppModel
var body: some View {
#if os(macOS)
let years: [(String, String, Route)] = [
("sw_year1", "sw_sub", .swMap),
("sw_year2", "sw2_sub", .sw2Map),
("sw_year3", "sw3_sub", .sw3Map),
("sw_year4", "sw4_sub", .sw4Map),
]
MacFillGrid(count: years.count, minWidth: 260, minHeight: 200) { i in
NavigationLink(value: years[i].2) {
MacLinkCard(title: vm.tr(years[i].0), subtitle: vm.tr(years[i].1), badge: "\(i + 1).", progress: routeProgress(vm, years[i].2))
}
.buttonStyle(PressScaleStyle())
}
.navigationTitle(vm.tr("Programové vybavení"))
.navigationSubtitle(vm.tr("sw_years_sub"))
#else
List {
NavigationLink(value: Route.swMap) {
ListRowLabel(title: vm.tr("sw_year1"), subtitle: vm.tr("sw_sub"), progress: routeProgress(vm, Route.swMap))
}
NavigationLink(value: Route.sw2Map) {
ListRowLabel(title: vm.tr("sw_year2"), subtitle: vm.tr("sw2_sub"), progress: routeProgress(vm, Route.sw2Map))
}
NavigationLink(value: Route.sw3Map) {
ListRowLabel(title: vm.tr("sw_year3"), subtitle: vm.tr("sw3_sub"), progress: routeProgress(vm, Route.sw3Map))
}
NavigationLink(value: Route.sw4Map) {
ListRowLabel(title: vm.tr("sw_year4"), subtitle: vm.tr("sw4_sub"), progress: routeProgress(vm, Route.sw4Map))
}
}
.navigationTitle(vm.tr("Programové vybavení"))
.navigationSubtitle(vm.tr("sw_years_sub"))
.appListStyle()
#endif
}
}
struct PgYearsScreen: View {
@ObservedObject var vm: AppModel
@ -3175,6 +3247,72 @@ struct RouteDestination: View {
if let l = vm.content.cs4Lesson(id) {
CodeLessonScreen(vm: vm, lesson: l, onSuccess: { vm.markCs4(id) })
}
case .swYears:
SwYearsScreen(vm: vm)
case .swMap:
LessonListScreen(
vm: vm,
title: vm.tr("sw_year1"),
subtitle: vm.tr("sw_sub"),
rows: vm.content.sw.map { l in
let id = l.int("id")
return LessonRow(id: "s\(id)", title: vm.tr(l.str("titleKey")), done: vm.progress.swDone(id), destination: .swLesson(id))
}
)
case .swLesson(let id):
if let l = vm.content.swLesson(id) {
SlidesScreen(vm: vm, title: vm.tr(l.str("titleKey")), subtitle: vm.tr(l.str("subKey")), slides: l.arr("slides"), next: .swEx(id))
}
case .swEx(let id):
SwQuizScreen(vm: vm, year: 1, id: id)
case .sw2Map:
LessonListScreen(
vm: vm,
title: vm.tr("sw_year2"),
subtitle: vm.tr("sw2_sub"),
rows: vm.content.sw2.map { l in
let id = l.int("id")
return LessonRow(id: "s2\(id)", title: vm.tr(l.str("titleKey")), done: vm.progress.sw2Done(id), destination: .sw2Lesson(id))
}
)
case .sw2Lesson(let id):
if let l = vm.content.sw2Lesson(id) {
SlidesScreen(vm: vm, title: vm.tr(l.str("titleKey")), subtitle: vm.tr(l.str("subKey")), slides: l.arr("slides"), next: .sw2Ex(id))
}
case .sw2Ex(let id):
SwQuizScreen(vm: vm, year: 2, id: id)
case .sw3Map:
LessonListScreen(
vm: vm,
title: vm.tr("sw_year3"),
subtitle: vm.tr("sw3_sub"),
rows: vm.content.sw3.map { l in
let id = l.int("id")
return LessonRow(id: "s3\(id)", title: vm.tr(l.str("titleKey")), done: vm.progress.sw3Done(id), destination: .sw3Lesson(id))
}
)
case .sw3Lesson(let id):
if let l = vm.content.sw3Lesson(id) {
SlidesScreen(vm: vm, title: vm.tr(l.str("titleKey")), subtitle: vm.tr(l.str("subKey")), slides: l.arr("slides"), next: .sw3Ex(id))
}
case .sw3Ex(let id):
SwQuizScreen(vm: vm, year: 3, id: id)
case .sw4Map:
LessonListScreen(
vm: vm,
title: vm.tr("sw_year4"),
subtitle: vm.tr("sw4_sub"),
rows: vm.content.sw4.map { l in
let id = l.int("id")
return LessonRow(id: "s4\(id)", title: vm.tr(l.str("titleKey")), done: vm.progress.sw4Done(id), destination: .sw4Lesson(id))
}
)
case .sw4Lesson(let id):
if let l = vm.content.sw4Lesson(id) {
SlidesScreen(vm: vm, title: vm.tr(l.str("titleKey")), subtitle: vm.tr(l.str("subKey")), slides: l.arr("slides"), next: .sw4Ex(id))
}
case .sw4Ex(let id):
SwQuizScreen(vm: vm, year: 4, id: id)
case .pgYears:
PgYearsScreen(vm: vm)
case .pgMap:

View file

@ -1110,6 +1110,8 @@ STD = [
("technicka-grafika/3-rocnik", "tg3"), ("technicka-grafika/4-rocnik", "tg4"),
("prezentacni-grafika/1-rocnik", "pg"), ("prezentacni-grafika/2-rocnik", "pg2"),
("prezentacni-grafika/3-rocnik", "pg3"), ("prezentacni-grafika/4-rocnik", "pg4"),
("programove-vybaveni/1-rocnik", "sw"), ("programove-vybaveni/2-rocnik", "sw2"),
("programove-vybaveni/3-rocnik", "sw3"), ("programove-vybaveni/4-rocnik", "sw4"),
]
CODE = [
("programovani/1-rocnik", "cs"), ("programovani/2-rocnik", "cs2"),