diff --git a/README.md b/README.md index 9ab13ae..8605cce 100644 --- a/README.md +++ b/README.md @@ -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`. diff --git a/android/shared/src/org/maturita/maturita/App.kt b/android/shared/src/org/maturita/maturita/App.kt index a814af3..27eef9d 100644 --- a/android/shared/src/org/maturita/maturita/App.kt +++ b/android/shared/src/org/maturita/maturita/App.kt @@ -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"), diff --git a/android/shared/src/org/maturita/maturita/AppViewModel.kt b/android/shared/src/org/maturita/maturita/AppViewModel.kt index 2eeca6a..4be6a80 100644 --- a/android/shared/src/org/maturita/maturita/AppViewModel.kt +++ b/android/shared/src/org/maturita/maturita/AppViewModel.kt @@ -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() diff --git a/android/shared/src/org/maturita/maturita/Route.kt b/android/shared/src/org/maturita/maturita/Route.kt index 705f15d..af79af8 100644 --- a/android/shared/src/org/maturita/maturita/Route.kt +++ b/android/shared/src/org/maturita/maturita/Route.kt @@ -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()) } diff --git a/android/shared/src/org/maturita/maturita/data/Content.kt b/android/shared/src/org/maturita/maturita/data/Content.kt index 802a9a3..ecb0c93 100644 --- a/android/shared/src/org/maturita/maturita/data/Content.kt +++ b/android/shared/src/org/maturita/maturita/data/Content.kt @@ -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 } diff --git a/android/shared/src/org/maturita/maturita/data/ProgressStore.kt b/android/shared/src/org/maturita/maturita/data/ProgressStore.kt index 7dd417c..f4e5607 100644 --- a/android/shared/src/org/maturita/maturita/data/ProgressStore.kt +++ b/android/shared/src/org/maturita/maturita/data/ProgressStore.kt @@ -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 diff --git a/android/shared/src/org/maturita/maturita/ui/Exercises.kt b/android/shared/src/org/maturita/maturita/ui/Exercises.kt index 8343011..4bf3a47 100644 --- a/android/shared/src/org/maturita/maturita/ui/Exercises.kt +++ b/android/shared/src/org/maturita/maturita/ui/Exercises.kt @@ -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) { diff --git a/android/shared/src/org/maturita/maturita/ui/Screens.kt b/android/shared/src/org/maturita/maturita/ui/Screens.kt index afd4624..1f57231 100644 --- a/android/shared/src/org/maturita/maturita/ui/Screens.kt +++ b/android/shared/src/org/maturita/maturita/ui/Screens.kt @@ -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? { 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 { 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 -> diff --git a/content/README.md b/content/README.md index dfa12a4..ed6dca9 100644 --- a/content/README.md +++ b/content/README.md @@ -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 --- diff --git a/content/aplikace/novinky.txt b/content/aplikace/novinky.txt index 280d4c3..e8365ba 100644 --- a/content/aplikace/novinky.txt +++ b/content/aplikace/novinky.txt @@ -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 diff --git a/content/aplikace/predmety.md b/content/aplikace/predmety.md index d55c8ec..37363dd 100644 --- a/content/aplikace/predmety.md +++ b/content/aplikace/predmety.md @@ -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 | diff --git a/content/aplikace/texty.md b/content/aplikace/texty.md index 5177ae8..fb62a94 100644 --- a/content/aplikace/texty.md +++ b/content/aplikace/texty.md @@ -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 | diff --git a/content/programove-vybaveni/1-rocnik/01-software-a-licence.en.md b/content/programove-vybaveni/1-rocnik/01-software-a-licence.en.md new file mode 100644 index 0000000..77b2182 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/01-software-a-licence.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/1-rocnik/01-software-a-licence.md b/content/programove-vybaveni/1-rocnik/01-software-a-licence.md new file mode 100644 index 0000000..e40dee4 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/01-software-a-licence.md @@ -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ěží. diff --git a/content/programove-vybaveni/1-rocnik/02-operacni-system.en.md b/content/programove-vybaveni/1-rocnik/02-operacni-system.en.md new file mode 100644 index 0000000..572309c --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/02-operacni-system.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/1-rocnik/02-operacni-system.md b/content/programove-vybaveni/1-rocnik/02-operacni-system.md new file mode 100644 index 0000000..352a114 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/02-operacni-system.md @@ -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í. diff --git a/content/programove-vybaveni/1-rocnik/03-soubory-a-slozky.en.md b/content/programove-vybaveni/1-rocnik/03-soubory-a-slozky.en.md new file mode 100644 index 0000000..be64b98 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/03-soubory-a-slozky.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/1-rocnik/03-soubory-a-slozky.md b/content/programove-vybaveni/1-rocnik/03-soubory-a-slozky.md new file mode 100644 index 0000000..8989f5a --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/03-soubory-a-slozky.md @@ -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. diff --git a/content/programove-vybaveni/1-rocnik/04-instalace-a-aktualizace.en.md b/content/programove-vybaveni/1-rocnik/04-instalace-a-aktualizace.en.md new file mode 100644 index 0000000..2408177 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/04-instalace-a-aktualizace.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/1-rocnik/04-instalace-a-aktualizace.md b/content/programove-vybaveni/1-rocnik/04-instalace-a-aktualizace.md new file mode 100644 index 0000000..4b787c9 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/04-instalace-a-aktualizace.md @@ -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á. diff --git a/content/programove-vybaveni/1-rocnik/05-ucty.en.md b/content/programove-vybaveni/1-rocnik/05-ucty.en.md new file mode 100644 index 0000000..b525df1 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/05-ucty.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/1-rocnik/05-ucty.md b/content/programove-vybaveni/1-rocnik/05-ucty.md new file mode 100644 index 0000000..fc41b33 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/05-ucty.md @@ -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. diff --git a/content/programove-vybaveni/1-rocnik/06-spravce-uloh.en.md b/content/programove-vybaveni/1-rocnik/06-spravce-uloh.en.md new file mode 100644 index 0000000..b9e7a54 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/06-spravce-uloh.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/1-rocnik/06-spravce-uloh.md b/content/programove-vybaveni/1-rocnik/06-spravce-uloh.md new file mode 100644 index 0000000..45405b1 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/06-spravce-uloh.md @@ -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. diff --git a/content/programove-vybaveni/1-rocnik/07-zabezpeceni.en.md b/content/programove-vybaveni/1-rocnik/07-zabezpeceni.en.md new file mode 100644 index 0000000..aaec038 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/07-zabezpeceni.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/1-rocnik/07-zabezpeceni.md b/content/programove-vybaveni/1-rocnik/07-zabezpeceni.md new file mode 100644 index 0000000..803fd77 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/07-zabezpeceni.md @@ -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. diff --git a/content/programove-vybaveni/1-rocnik/08-zadani-windows.en.md b/content/programove-vybaveni/1-rocnik/08-zadani-windows.en.md new file mode 100644 index 0000000..847262b --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/08-zadani-windows.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/1-rocnik/08-zadani-windows.md b/content/programove-vybaveni/1-rocnik/08-zadani-windows.md new file mode 100644 index 0000000..862c127 --- /dev/null +++ b/content/programove-vybaveni/1-rocnik/08-zadani-windows.md @@ -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. diff --git a/content/programove-vybaveni/2-rocnik/01-word-styly.en.md b/content/programove-vybaveni/2-rocnik/01-word-styly.en.md new file mode 100644 index 0000000..92c3344 --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/01-word-styly.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/2-rocnik/01-word-styly.md b/content/programove-vybaveni/2-rocnik/01-word-styly.md new file mode 100644 index 0000000..b0a2f8d --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/01-word-styly.md @@ -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í. diff --git a/content/programove-vybaveni/2-rocnik/02-word-tabulka-a-obsah.en.md b/content/programove-vybaveni/2-rocnik/02-word-tabulka-a-obsah.en.md new file mode 100644 index 0000000..9a94510 --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/02-word-tabulka-a-obsah.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/2-rocnik/02-word-tabulka-a-obsah.md b/content/programove-vybaveni/2-rocnik/02-word-tabulka-a-obsah.md new file mode 100644 index 0000000..ce559e7 --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/02-word-tabulka-a-obsah.md @@ -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. diff --git a/content/programove-vybaveni/2-rocnik/03-word-dopis.en.md b/content/programove-vybaveni/2-rocnik/03-word-dopis.en.md new file mode 100644 index 0000000..6a953ff --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/03-word-dopis.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/2-rocnik/03-word-dopis.md b/content/programove-vybaveni/2-rocnik/03-word-dopis.md new file mode 100644 index 0000000..288e40f --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/03-word-dopis.md @@ -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á. diff --git a/content/programove-vybaveni/2-rocnik/04-excel-bunky.en.md b/content/programove-vybaveni/2-rocnik/04-excel-bunky.en.md new file mode 100644 index 0000000..17e029c --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/04-excel-bunky.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/2-rocnik/04-excel-bunky.md b/content/programove-vybaveni/2-rocnik/04-excel-bunky.md new file mode 100644 index 0000000..9ac18a5 --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/04-excel-bunky.md @@ -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í. diff --git a/content/programove-vybaveni/2-rocnik/05-excel-funkce.en.md b/content/programove-vybaveni/2-rocnik/05-excel-funkce.en.md new file mode 100644 index 0000000..06d600d --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/05-excel-funkce.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/2-rocnik/05-excel-funkce.md b/content/programove-vybaveni/2-rocnik/05-excel-funkce.md new file mode 100644 index 0000000..67c6907 --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/05-excel-funkce.md @@ -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. diff --git a/content/programove-vybaveni/2-rocnik/06-excel-grafy.en.md b/content/programove-vybaveni/2-rocnik/06-excel-grafy.en.md new file mode 100644 index 0000000..a159302 --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/06-excel-grafy.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/2-rocnik/06-excel-grafy.md b/content/programove-vybaveni/2-rocnik/06-excel-grafy.md new file mode 100644 index 0000000..4eda9dd --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/06-excel-grafy.md @@ -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í. diff --git a/content/programove-vybaveni/2-rocnik/07-excel-kontingence.en.md b/content/programove-vybaveni/2-rocnik/07-excel-kontingence.en.md new file mode 100644 index 0000000..bb01bed --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/07-excel-kontingence.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/2-rocnik/07-excel-kontingence.md b/content/programove-vybaveni/2-rocnik/07-excel-kontingence.md new file mode 100644 index 0000000..8f91004 --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/07-excel-kontingence.md @@ -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í. diff --git a/content/programove-vybaveni/2-rocnik/08-zadani-office.en.md b/content/programove-vybaveni/2-rocnik/08-zadani-office.en.md new file mode 100644 index 0000000..04488f3 --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/08-zadani-office.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/2-rocnik/08-zadani-office.md b/content/programove-vybaveni/2-rocnik/08-zadani-office.md new file mode 100644 index 0000000..4c2a906 --- /dev/null +++ b/content/programove-vybaveni/2-rocnik/08-zadani-office.md @@ -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. diff --git a/content/programove-vybaveni/3-rocnik/01-databaze.en.md b/content/programove-vybaveni/3-rocnik/01-databaze.en.md new file mode 100644 index 0000000..e466ba7 --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/01-databaze.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/3-rocnik/01-databaze.md b/content/programove-vybaveni/3-rocnik/01-databaze.md new file mode 100644 index 0000000..bcda465 --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/01-databaze.md @@ -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ší. diff --git a/content/programove-vybaveni/3-rocnik/02-access-tabulky.en.md b/content/programove-vybaveni/3-rocnik/02-access-tabulky.en.md new file mode 100644 index 0000000..3ee054f --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/02-access-tabulky.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/3-rocnik/02-access-tabulky.md b/content/programove-vybaveni/3-rocnik/02-access-tabulky.md new file mode 100644 index 0000000..c92654e --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/02-access-tabulky.md @@ -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í. diff --git a/content/programove-vybaveni/3-rocnik/03-access-dotazy.en.md b/content/programove-vybaveni/3-rocnik/03-access-dotazy.en.md new file mode 100644 index 0000000..721c282 --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/03-access-dotazy.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/3-rocnik/03-access-dotazy.md b/content/programove-vybaveni/3-rocnik/03-access-dotazy.md new file mode 100644 index 0000000..679b605 --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/03-access-dotazy.md @@ -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í. diff --git a/content/programove-vybaveni/3-rocnik/04-access-formulare.en.md b/content/programove-vybaveni/3-rocnik/04-access-formulare.en.md new file mode 100644 index 0000000..b3cd488 --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/04-access-formulare.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/3-rocnik/04-access-formulare.md b/content/programove-vybaveni/3-rocnik/04-access-formulare.md new file mode 100644 index 0000000..37f9b48 --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/04-access-formulare.md @@ -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. diff --git a/content/programove-vybaveni/3-rocnik/05-mysql-select.en.md b/content/programove-vybaveni/3-rocnik/05-mysql-select.en.md new file mode 100644 index 0000000..4e04663 --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/05-mysql-select.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/3-rocnik/05-mysql-select.md b/content/programove-vybaveni/3-rocnik/05-mysql-select.md new file mode 100644 index 0000000..2595d1b --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/05-mysql-select.md @@ -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. diff --git a/content/programove-vybaveni/3-rocnik/06-mysql-zmeny.en.md b/content/programove-vybaveni/3-rocnik/06-mysql-zmeny.en.md new file mode 100644 index 0000000..a00bb9c --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/06-mysql-zmeny.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/3-rocnik/06-mysql-zmeny.md b/content/programove-vybaveni/3-rocnik/06-mysql-zmeny.md new file mode 100644 index 0000000..63fc270 --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/06-mysql-zmeny.md @@ -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ě. diff --git a/content/programove-vybaveni/3-rocnik/07-mysql-join.en.md b/content/programove-vybaveni/3-rocnik/07-mysql-join.en.md new file mode 100644 index 0000000..b97432f --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/07-mysql-join.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/3-rocnik/07-mysql-join.md b/content/programove-vybaveni/3-rocnik/07-mysql-join.md new file mode 100644 index 0000000..62e5a1b --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/07-mysql-join.md @@ -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í. diff --git a/content/programove-vybaveni/3-rocnik/08-zadani-databaze.en.md b/content/programove-vybaveni/3-rocnik/08-zadani-databaze.en.md new file mode 100644 index 0000000..b69e293 --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/08-zadani-databaze.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/3-rocnik/08-zadani-databaze.md b/content/programove-vybaveni/3-rocnik/08-zadani-databaze.md new file mode 100644 index 0000000..d3a812b --- /dev/null +++ b/content/programove-vybaveni/3-rocnik/08-zadani-databaze.md @@ -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í. diff --git a/content/programove-vybaveni/4-rocnik/01-wordpress.en.md b/content/programove-vybaveni/4-rocnik/01-wordpress.en.md new file mode 100644 index 0000000..d8adbc0 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/01-wordpress.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/4-rocnik/01-wordpress.md b/content/programove-vybaveni/4-rocnik/01-wordpress.md new file mode 100644 index 0000000..de527c6 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/01-wordpress.md @@ -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ří. diff --git a/content/programove-vybaveni/4-rocnik/02-wordpress-role.en.md b/content/programove-vybaveni/4-rocnik/02-wordpress-role.en.md new file mode 100644 index 0000000..bee86a9 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/02-wordpress-role.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/4-rocnik/02-wordpress-role.md b/content/programove-vybaveni/4-rocnik/02-wordpress-role.md new file mode 100644 index 0000000..a4d5f49 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/02-wordpress-role.md @@ -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. diff --git a/content/programove-vybaveni/4-rocnik/03-power-bi.en.md b/content/programove-vybaveni/4-rocnik/03-power-bi.en.md new file mode 100644 index 0000000..fb41b75 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/03-power-bi.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/4-rocnik/03-power-bi.md b/content/programove-vybaveni/4-rocnik/03-power-bi.md new file mode 100644 index 0000000..e3c9d21 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/03-power-bi.md @@ -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í. diff --git a/content/programove-vybaveni/4-rocnik/04-power-bi-prurez.en.md b/content/programove-vybaveni/4-rocnik/04-power-bi-prurez.en.md new file mode 100644 index 0000000..29027c6 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/04-power-bi-prurez.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/4-rocnik/04-power-bi-prurez.md b/content/programove-vybaveni/4-rocnik/04-power-bi-prurez.md new file mode 100644 index 0000000..c2e7f08 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/04-power-bi-prurez.md @@ -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á. diff --git a/content/programove-vybaveni/4-rocnik/05-batch.en.md b/content/programove-vybaveni/4-rocnik/05-batch.en.md new file mode 100644 index 0000000..bbfeb4d --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/05-batch.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/4-rocnik/05-batch.md b/content/programove-vybaveni/4-rocnik/05-batch.md new file mode 100644 index 0000000..b110c71 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/05-batch.md @@ -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. diff --git a/content/programove-vybaveni/4-rocnik/06-uzivatele-a-skupiny.en.md b/content/programove-vybaveni/4-rocnik/06-uzivatele-a-skupiny.en.md new file mode 100644 index 0000000..840ca87 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/06-uzivatele-a-skupiny.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/4-rocnik/06-uzivatele-a-skupiny.md b/content/programove-vybaveni/4-rocnik/06-uzivatele-a-skupiny.md new file mode 100644 index 0000000..75a3c74 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/06-uzivatele-a-skupiny.md @@ -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. diff --git a/content/programove-vybaveni/4-rocnik/07-zasady.en.md b/content/programove-vybaveni/4-rocnik/07-zasady.en.md new file mode 100644 index 0000000..a14b512 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/07-zasady.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/4-rocnik/07-zasady.md b/content/programove-vybaveni/4-rocnik/07-zasady.md new file mode 100644 index 0000000..f850445 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/07-zasady.md @@ -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í. diff --git a/content/programove-vybaveni/4-rocnik/08-maturitni-zadani.en.md b/content/programove-vybaveni/4-rocnik/08-maturitni-zadani.en.md new file mode 100644 index 0000000..fdca7fe --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/08-maturitni-zadani.en.md @@ -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 +--- diff --git a/content/programove-vybaveni/4-rocnik/08-maturitni-zadani.md b/content/programove-vybaveni/4-rocnik/08-maturitni-zadani.md new file mode 100644 index 0000000..ef404a3 --- /dev/null +++ b/content/programove-vybaveni/4-rocnik/08-maturitni-zadani.md @@ -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. diff --git a/ios/Graduately/AppModel.swift b/ios/Graduately/AppModel.swift index 5fad4f7..9d324ec 100644 --- a/ios/Graduately/AppModel.swift +++ b/ios/Graduately/AppModel.swift @@ -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() diff --git a/ios/Graduately/Data/Content.swift b/ios/Graduately/Data/Content.swift index ca8da2a..dafa975 100644 --- a/ios/Graduately/Data/Content.swift +++ b/ios/Graduately/Data/Content.swift @@ -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 } } diff --git a/ios/Graduately/Data/ProgressStore.swift b/ios/Graduately/Data/ProgressStore.swift index c9b8a64..f77c330 100644 --- a/ios/Graduately/Data/ProgressStore.swift +++ b/ios/Graduately/Data/ProgressStore.swift @@ -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 diff --git a/ios/Graduately/Route.swift b/ios/Graduately/Route.swift index 005c538..a85395c 100644 --- a/ios/Graduately/Route.swift +++ b/ios/Graduately/Route.swift @@ -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) } diff --git a/ios/Graduately/UI/Components.swift b/ios/Graduately/UI/Components.swift index d93afdc..e0aaf2a 100644 --- a/ios/Graduately/UI/Components.swift +++ b/ios/Graduately/UI/Components.swift @@ -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" } } diff --git a/ios/Graduately/UI/ExercisesMore.swift b/ios/Graduately/UI/ExercisesMore.swift index 3ae847b..783dd4d 100644 --- a/ios/Graduately/UI/ExercisesMore.swift +++ b/ios/Graduately/UI/ExercisesMore.swift @@ -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 diff --git a/ios/Graduately/UI/Screens.swift b/ios/Graduately/UI/Screens.swift index 54a6a28..d4535b2 100644 --- a/ios/Graduately/UI/Screens.swift +++ b/ios/Graduately/UI/Screens.swift @@ -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: diff --git a/scripts/build-content.py b/scripts/build-content.py index 12bf473..ca44c03 100644 --- a/scripts/build-content.py +++ b/scripts/build-content.py @@ -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"),