<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://mis.e-mis.cz/skins/common/feed.css?301"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
		<id>http://mis.e-mis.cz/index.php?feed=atom&amp;target=Spravce&amp;title=Speci%C3%A1ln%C3%AD%3AP%C5%99%C3%ADsp%C4%9Bvky%2FSpravce</id>
		<title>MiS - Příspěvky uživatele [cs]</title>
		<link rel="self" type="application/atom+xml" href="http://mis.e-mis.cz/index.php?feed=atom&amp;target=Spravce&amp;title=Speci%C3%A1ln%C3%AD%3AP%C5%99%C3%ADsp%C4%9Bvky%2FSpravce"/>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Speci%C3%A1ln%C3%AD:P%C5%99%C3%ADsp%C4%9Bvky/Spravce"/>
		<updated>2026-04-10T09:17:09Z</updated>
		<subtitle>Z MiS</subtitle>
		<generator>MediaWiki 1.17.0</generator>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Speci%C3%A1ln%C3%AD_typy_IP_adres</id>
		<title>Speciální typy IP adres</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Speci%C3%A1ln%C3%AD_typy_IP_adres"/>
				<updated>2026-03-26T09:59:52Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Adresa sítě a adresa broadcastová */ Oprava vzhledu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Sítě]][[Category:IP adresy]]&lt;br /&gt;
&lt;br /&gt;
== Localhost/loopback ==&lt;br /&gt;
* Označuje vlastní počítač bez ohledu na konkrétní IP adresu.&lt;br /&gt;
* Používá se také označení „místní smyčka“.&lt;br /&gt;
* Rosah adres IP v. 4: &amp;lt;code&amp;gt;127.0.0.0/8&amp;lt;/code&amp;gt;&lt;br /&gt;
** Běžně se používá jen adresa: &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rosah adres IP v. 6: &amp;lt;code&amp;gt;::1/128&amp;lt;/code&amp;gt;&lt;br /&gt;
* V&amp;amp;nbsp;prohlížečích lze obvykle nahradit textem &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Privátní IP adresy ==&lt;br /&gt;
* Může použít volně kdokoli.&lt;br /&gt;
* Platí jen v&amp;amp;nbsp;rámci sítě toho, kdo je použil. Ve veřejném internetu se nesměrují.&lt;br /&gt;
* Pokud chcete z&amp;amp;nbsp;těchto adres komunikovat mimo lokální síť, musíte použít NAT.&lt;br /&gt;
* Rozsahy IP v. 4:&lt;br /&gt;
** &amp;lt;code&amp;gt;10.0.0.0/8&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;172.16.0.0/12&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
** Pro speciální účely (sítě poskytovatelů připojení) i: &amp;lt;code&amp;gt;100.64.0.0/10&amp;lt;/code&amp;gt;&lt;br /&gt;
* V IP v. 6 žádný rozsah s&amp;amp;nbsp;tímto významem vyhrazený není.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Globální adresy (veřejné) ==&lt;br /&gt;
* Běžně používány pro označení zařízení &amp;amp;mdash; tedy ty adresy, které nemají jiný speciální význam.&lt;br /&gt;
* V IP v. 4 jsou to ty, které nemají jiný speciální význam.&lt;br /&gt;
* V IP v. 6 rozsah: &amp;lt;code&amp;gt;2000::/3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Link-local ==&lt;br /&gt;
* Pokud zařízení neobdrží adresu z&amp;amp;nbsp;DHCP a&amp;amp;nbsp;nemá přidělenu ručně. V&amp;amp;nbsp;IP v. 6 se používají pro autokonfiguraci (SLAAC).&lt;br /&gt;
* Rozsahy IP v. 4:&lt;br /&gt;
** &amp;lt;code&amp;gt;169.254.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rozsahy IP v. 6:&lt;br /&gt;
** &amp;lt;code&amp;gt;FE 80::/9&amp;lt;/code&amp;gt;&lt;br /&gt;
** Pro autokonfiguraci vyhrazen rozsah: &amp;lt;code&amp;gt;FE 80::/10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Skupinové &amp;amp;mdash; multicastové adresy ==&lt;br /&gt;
* Vysílání pro skupinu vybraných počítačů.&lt;br /&gt;
* Rozsah IP v. 4: &amp;lt;code&amp;gt;224.0.0.0/'''4'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rozsah IP v. 6: &amp;lt;code&amp;gt;FF00::/8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Skupinové &amp;amp;mdash; anycast ==&lt;br /&gt;
* Doručení libovolnému členu skupiny.&lt;br /&gt;
* Pouze v IP v. 6.&lt;br /&gt;
* Spadají do rozsahu globálních adres, nemají specifický prefix.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adresa sítě a adresa broadcastová ==&lt;br /&gt;
* Pouze v&amp;amp;nbsp;IP v.&amp;amp;nbsp;4.&lt;br /&gt;
* V&amp;amp;nbsp;IP v.&amp;amp;nbsp;6 se nedefinují, ale adresa zařízení se samými nulami se obvykle používá jako anycast adresa pro všechny routery dané sítě.&lt;br /&gt;
* Pro označení sítě se v IP v. 6 používá prefix sítě.&lt;br /&gt;
* Viz [[IP adresa a maska]].&lt;br /&gt;
&lt;br /&gt;
== Zdroje ==&lt;br /&gt;
* [https://www.tutorialspoint.com/ipv4/ipv4_reserved_addresses.htm TutorialsPoint.com &amp;amp;rarr; Rezervované rozsahy IP v. 4]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Speci%C3%A1ln%C3%AD_typy_IP_adres</id>
		<title>Speciální typy IP adres</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Speci%C3%A1ln%C3%AD_typy_IP_adres"/>
				<updated>2026-03-26T09:59:25Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Adresa sítě a adresa broadcastová */ V IP v. 6 se nedefinují.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Sítě]][[Category:IP adresy]]&lt;br /&gt;
&lt;br /&gt;
== Localhost/loopback ==&lt;br /&gt;
* Označuje vlastní počítač bez ohledu na konkrétní IP adresu.&lt;br /&gt;
* Používá se také označení „místní smyčka“.&lt;br /&gt;
* Rosah adres IP v. 4: &amp;lt;code&amp;gt;127.0.0.0/8&amp;lt;/code&amp;gt;&lt;br /&gt;
** Běžně se používá jen adresa: &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rosah adres IP v. 6: &amp;lt;code&amp;gt;::1/128&amp;lt;/code&amp;gt;&lt;br /&gt;
* V&amp;amp;nbsp;prohlížečích lze obvykle nahradit textem &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Privátní IP adresy ==&lt;br /&gt;
* Může použít volně kdokoli.&lt;br /&gt;
* Platí jen v&amp;amp;nbsp;rámci sítě toho, kdo je použil. Ve veřejném internetu se nesměrují.&lt;br /&gt;
* Pokud chcete z&amp;amp;nbsp;těchto adres komunikovat mimo lokální síť, musíte použít NAT.&lt;br /&gt;
* Rozsahy IP v. 4:&lt;br /&gt;
** &amp;lt;code&amp;gt;10.0.0.0/8&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;172.16.0.0/12&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
** Pro speciální účely (sítě poskytovatelů připojení) i: &amp;lt;code&amp;gt;100.64.0.0/10&amp;lt;/code&amp;gt;&lt;br /&gt;
* V IP v. 6 žádný rozsah s&amp;amp;nbsp;tímto významem vyhrazený není.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Globální adresy (veřejné) ==&lt;br /&gt;
* Běžně používány pro označení zařízení &amp;amp;mdash; tedy ty adresy, které nemají jiný speciální význam.&lt;br /&gt;
* V IP v. 4 jsou to ty, které nemají jiný speciální význam.&lt;br /&gt;
* V IP v. 6 rozsah: &amp;lt;code&amp;gt;2000::/3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Link-local ==&lt;br /&gt;
* Pokud zařízení neobdrží adresu z&amp;amp;nbsp;DHCP a&amp;amp;nbsp;nemá přidělenu ručně. V&amp;amp;nbsp;IP v. 6 se používají pro autokonfiguraci (SLAAC).&lt;br /&gt;
* Rozsahy IP v. 4:&lt;br /&gt;
** &amp;lt;code&amp;gt;169.254.0.0/16&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rozsahy IP v. 6:&lt;br /&gt;
** &amp;lt;code&amp;gt;FE 80::/9&amp;lt;/code&amp;gt;&lt;br /&gt;
** Pro autokonfiguraci vyhrazen rozsah: &amp;lt;code&amp;gt;FE 80::/10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Skupinové &amp;amp;mdash; multicastové adresy ==&lt;br /&gt;
* Vysílání pro skupinu vybraných počítačů.&lt;br /&gt;
* Rozsah IP v. 4: &amp;lt;code&amp;gt;224.0.0.0/'''4'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* Rozsah IP v. 6: &amp;lt;code&amp;gt;FF00::/8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Skupinové &amp;amp;mdash; anycast ==&lt;br /&gt;
* Doručení libovolnému členu skupiny.&lt;br /&gt;
* Pouze v IP v. 6.&lt;br /&gt;
* Spadají do rozsahu globálních adres, nemají specifický prefix.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adresa sítě a adresa broadcastová ==&lt;br /&gt;
* Pouze v&amp;amp;nbsp;IP v.&amp;amp;nbps;4.&lt;br /&gt;
* V&amp;amp;nbsp;IP v.&amp;amp;nbsp;6 se nedefinují, ale adresa zařízení se samými nulami se obvykle používá jako anycast adresa pro všechny routery dané sítě.&lt;br /&gt;
* Pro označení sítě se v IP v. 6 používá prefix sítě.&lt;br /&gt;
* Viz [[IP adresa a maska]].&lt;br /&gt;
&lt;br /&gt;
== Zdroje ==&lt;br /&gt;
* [https://www.tutorialspoint.com/ipv4/ipv4_reserved_addresses.htm TutorialsPoint.com &amp;amp;rarr; Rezervované rozsahy IP v. 4]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/P%C5%99%C3%ADklady_souborov%C3%BDch_syst%C3%A9m%C5%AF</id>
		<title>Příklady souborových systémů</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/P%C5%99%C3%ADklady_souborov%C3%BDch_syst%C3%A9m%C5%AF"/>
				<updated>2026-03-24T09:52:15Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* FAT/FAT32/exFAT */ Upřesnění FAT32 a limity.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:OSY]][[Category:Ukládání_dat]]&lt;br /&gt;
&lt;br /&gt;
== NTFS ==&lt;br /&gt;
* Zaveden ve Windows NT.&lt;br /&gt;
* Podpora šifrování, komprese.&lt;br /&gt;
* Obvykle menší clustery než u FAT32.&lt;br /&gt;
* Názvy souborů v UTF8.&lt;br /&gt;
* Existuje více verzí, aktuální verze NTFS v. 3.1 (od Windows 2000), navíc se liší i verze ovladače NTFS.sys (pro Windows Vista a vyšší verze 6.0).&lt;br /&gt;
* Problematická podpora mimo Windows.&lt;br /&gt;
* Problémy s fragmentací, nutná pravidelná [[Defragmentace|defragmentace]]. (Ve Windows 7 se spouští automaticky.)&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;&lt;br /&gt;
Verzi NTFS zjistíte příkazem: &lt;br /&gt;
 fsutil fsinfo ntfsinfo c:&lt;br /&gt;
&lt;br /&gt;
(Spusťte příkazový řádek jako správce: ''Start &amp;amp;rarr; cmd &amp;amp;rarr; pravé tlačítko &amp;amp;rarr; Spustit jako správce''!)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Zdroje&lt;br /&gt;
* [http://www.thomasmaurer.ch/2011/05/check-ntfs-version/ http://www.thomasmaurer.ch/2011/05/check-ntfs-version/]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/NTFS#Versions http://en.wikipedia.org/wiki/NTFS#Versions]&lt;br /&gt;
* [https://technet.microsoft.com/en-us/library/cc781134%28v=ws.10%29.aspx https://technet.microsoft.com/en-us/library/cc781134%28v=ws.10%29.aspx]&lt;br /&gt;
&lt;br /&gt;
== FAT/FAT32/exFAT ==&lt;br /&gt;
* Pochází z MS-DOSu resp. Windows 95.&lt;br /&gt;
* Dnes se používá obvykle jen na paměťových kartách a flash discích.&lt;br /&gt;
&lt;br /&gt;
; FAT(16)&lt;br /&gt;
* Dnes již historický (omezení velikosti oddílu).&lt;br /&gt;
* Názvy souborů 8+3 znaky, bez podpory diakritiky.&lt;br /&gt;
* Byl určený pro diskety, dnes se již nepoužívá.&lt;br /&gt;
&lt;br /&gt;
; FAT32&lt;br /&gt;
* Delší jména souborů než u FAT.&lt;br /&gt;
* Soubory velikosti max. 4&amp;amp;nbsp;GB na 64-bitových systémech (max. 2&amp;amp;nbsp;GB na 32-bitových systémech).&lt;br /&gt;
* Limit celkové velikosti souborového systému je teoreticky až 2&amp;amp;nbsp;TB při velikosti sektoru 512 B. Standardní nástroj pro formátování disků ve starších Windows limituje maximální velikost oddílu FAT32 na 32&amp;amp;nbsp;GB. V&amp;amp;nbsp;novějších verzích Windows 11 už je toto omezení odstraněno, ale stejně se pro disky přes 32&amp;amp;nbsp;GBdoporučuje použít raději exFAT.&lt;br /&gt;
* Zastaralý &amp;amp;mdash; princip zůstává stejný jako u FAT16.&lt;br /&gt;
* Náchylný k chybám, nemá žurnálování.&lt;br /&gt;
* Široká podpora (HW zařízení, operační systémy,...).&lt;br /&gt;
* Jednoduchý na implementaci.&lt;br /&gt;
&lt;br /&gt;
; exFAT&lt;br /&gt;
* Původně proprietární FS Microsoftu, v&amp;amp;nbsp;roce 2019 specifikace zveřejněna.&lt;br /&gt;
* Podpora se průběžně zlepšuje: &lt;br /&gt;
** Linux kernel od verze 5.4 (pro srovnání v&amp;amp;nbsp;2021 aktuální verze Debian 10 používá kernel 4.19, Ubuntu 20.04 LTS používá kernel 5.4.8), &lt;br /&gt;
** Mac OS X od verze 10.6.5 (uvolněno v&amp;amp;nbsp;roce 2010), &lt;br /&gt;
** v&amp;amp;nbsp;roce 2021 některá mobilní zařízení.&lt;br /&gt;
* Má sloužit jako náhrada FAT32 pro flash-disky.&lt;br /&gt;
* Rozšiřuje FAT32.&lt;br /&gt;
* Odstraňuje omezení velikosti souboru.&lt;br /&gt;
* Výchozí souborový systém po SDXC karty větší než 32&amp;amp;nbsp;GB.&lt;br /&gt;
* Může podporovat žurnálování, pokud to povolíme.&lt;br /&gt;
&lt;br /&gt;
== ReFS ==&lt;br /&gt;
* ''Resilient File System''&lt;br /&gt;
* Nový pokročilý souborový systém Microsoftu.&lt;br /&gt;
* Zatím používán pro Windows Server 2016 a 2022 (rok 2023).&lt;br /&gt;
* Důraz na spolehlivost a výkon&lt;br /&gt;
** Umí nahradit RAID &amp;amp;mdash; zrcadlení dat (mirroring): rychlejší přístup a možnost opravy při chybě HW.&lt;br /&gt;
** Automatická průběžná kontrola dat &amp;amp;mdash; nejen při čtení, ale i kontrola dat, se kterými se nepracuje (''scrubber'').&lt;br /&gt;
** Optimalizován pro vysoký výkon i u velikých disků (miliony terabyte apod.&lt;br /&gt;
* Podora pro virtuální stroje:&lt;br /&gt;
** Rychlé vytváření souborů obsahujících samé nuly (při vytváření virtuálních disků s&amp;amp;nbsp;fixní velikostí).&lt;br /&gt;
** Rychlé kopírování celých bloků (snímky virtuálních strojů)&lt;br /&gt;
* Limity: název souboru 255 znaků, délka cesty 32K znaků, velikost souboru i oddílu 35 PB (NTFS 256 TB)&lt;br /&gt;
* Podpora: BitLocker, Junctions (soft-links), hard-links, ACL, žurnál, trim&lt;br /&gt;
&lt;br /&gt;
== ext2/ext3/ext4 ==&lt;br /&gt;
* Rozšíření původního systému &amp;lt;tt&amp;gt;ext&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Implementovány v Unixových systémech, standardní volba pro většinu linuxových distribucí.&lt;br /&gt;
* Vzájemně kompatibilní.&lt;br /&gt;
; ext3&lt;br /&gt;
* Zpětně kompatibilní s ext2.&lt;br /&gt;
* Přidává žurnálování.&lt;br /&gt;
* Podporuje POSIX ACL (Access Control Lists).&lt;br /&gt;
* Není klasická defragmentace.&lt;br /&gt;
* Kontrola disku (&amp;lt;code&amp;gt;fsck&amp;lt;/code&amp;gt;) jen v režimu read-only (viz [[Nástroje_pro_práci_s_diskem#Kontrola_souborového_systému|Nástroje pro práci s diskem]]).&lt;br /&gt;
* Není transparentní komprese.&lt;br /&gt;
* Viz také [http://en.wikipedia.org/wiki/Ext3 Wikipedia.org &amp;gt; Ext3]&lt;br /&gt;
; ext4&lt;br /&gt;
* Dnes nativní pro běžné uživatelské distribuce Linuxu&lt;br /&gt;
* Žurnálování lze volitelně vypnout pomocí &amp;lt;code&amp;gt;tune4fs&amp;lt;/code&amp;gt;.&lt;br /&gt;
; Porovnání:&lt;br /&gt;
* [http://www.thegeekstuff.com/2011/05/ext2-ext3-ext4/ TheGeekStuff.com &amp;amp;rarr; ext2 &amp;amp;mdash; ext3 &amp;amp;mdash; ext4]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== btrfs ==&lt;br /&gt;
* Pokročilý souborový systém pro GNU/Linux, Solaris,...&lt;br /&gt;
* Subvoluming&lt;br /&gt;
** Jeden FS může být rozprostřen přes více fyzických zařízení.&lt;br /&gt;
** Prostor (raw storage) rozdělen na úseky (např. 1GB), které se pak spojují do subvolumes.&lt;br /&gt;
** Nahrazuje LVM (Logical Volume Manager) a ZFS.&lt;br /&gt;
* Snapshots (snímky disku)&lt;br /&gt;
** Ukládání současného stavu disku a změn oproti tomuto stavu.&lt;br /&gt;
* Copy on write&lt;br /&gt;
** Vytváření kopie svazku při současné práci se svazkem.&lt;br /&gt;
*&amp;lt;https://btrfs.wiki.kernel.org/index.php/Main_Page&amp;gt;&lt;br /&gt;
* Vyvinut firmou Oracle, dnes GPL.&lt;br /&gt;
* Teprve se chystá podpora kontroly a opravy (rok 2012).&lt;br /&gt;
; Vlastnosti:&lt;br /&gt;
*Velikost souboru až 2^64 B ~ 16 EiB&lt;br /&gt;
*Dynamic i-node allocation&lt;br /&gt;
*Podpora svazků (volumes) a RAID vestavěná ve FS&lt;br /&gt;
**RAID 0, 1 a 10&lt;br /&gt;
**chystá se RAID 5 a 6&lt;br /&gt;
*Kontrolní součty (checksumming)&lt;br /&gt;
*Body obnovení (snapshotting) &amp;amp;mdash; uchová stav systému před rizikovou operací.&lt;br /&gt;
*On-line defragmentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== APFS (HFS+) ==&lt;br /&gt;
* Apple File System (APFS)&lt;br /&gt;
* Souborový systém pro operační systém macOS&lt;br /&gt;
* Počítače Apple&lt;br /&gt;
* Starší verze macOS (před rokem 2017) používaly starší souborový systém HFS+.&lt;br /&gt;
* Proprietární Apple, částečná specifikace je zvěřejněna a umožňuje čtení z nešifrovaných úložišť.&lt;br /&gt;
* Pro uložení informací o rozdělení disku využívá GPT.&lt;br /&gt;
* Využívá ''firmlink'' &amp;amp;mdash; na rozdíl od hard linků z&amp;amp;nbsp;Linuxu může odkazovat na jiné disky.&lt;br /&gt;
* Umožňuje klonování souborů místo klasické kopie (data zůstávají na disku jen jednou, systém sleduje pouze změny v jednotlivých souborech. Klonování se automaticky použije ve Finderu, u příkazu &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt; je třeba použít přepínač &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Podporuje šifrování celého disku i jednotlivých souborů, kompresy a sdílení volného místa mezi jednotlivými oddíly (volumes).&lt;br /&gt;
* Místo žurnálování používá ''redirect-on-write'' &amp;amp;mdash; při zápisu do souboru se vytvoří nová metadata v&amp;amp;nbsp;novém inode a posléze se upraví odkaz. Původní metadata se označí jako nevyužitá.&lt;br /&gt;
* Nedoporučuje se pro používání na klasických HDD (plotnových).&lt;br /&gt;
* Existují ovladače třetích stran pro Windows (placené) a Linux (svobodné) s&amp;amp;nbsp;částečně omezenou podporou.&lt;br /&gt;
&lt;br /&gt;
== swap ==&lt;br /&gt;
*Pro odkládání nepotřebných paměťových bloků na disk.&lt;br /&gt;
*Pod Windows se řeší speciálním souborem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== proc ==&lt;br /&gt;
*Pouze virtuální FS.&lt;br /&gt;
*Slouží k práci s procesy.&lt;br /&gt;
&lt;br /&gt;
== Zdroje ==&lt;br /&gt;
* Resilient File System (ReFS) overview. Microsoft Learn [online]. Microsoft, 15.2.2023 [cit. 2023-05-07]. Dostupné z: [https://learn.microsoft.com/en-us/windows-server/storage/refs/refs-overview https://learn.microsoft.com/en-us/windows-server/storage/refs/refs-overview]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/P%C5%99%C3%ADklady_souborov%C3%BDch_syst%C3%A9m%C5%AF</id>
		<title>Příklady souborových systémů</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/P%C5%99%C3%ADklady_souborov%C3%BDch_syst%C3%A9m%C5%AF"/>
				<updated>2026-03-24T09:22:59Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* APFS (HFS+) */ Upřesnění informací o APFS.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:OSY]][[Category:Ukládání_dat]]&lt;br /&gt;
&lt;br /&gt;
== NTFS ==&lt;br /&gt;
* Zaveden ve Windows NT.&lt;br /&gt;
* Podpora šifrování, komprese.&lt;br /&gt;
* Obvykle menší clustery než u FAT32.&lt;br /&gt;
* Názvy souborů v UTF8.&lt;br /&gt;
* Existuje více verzí, aktuální verze NTFS v. 3.1 (od Windows 2000), navíc se liší i verze ovladače NTFS.sys (pro Windows Vista a vyšší verze 6.0).&lt;br /&gt;
* Problematická podpora mimo Windows.&lt;br /&gt;
* Problémy s fragmentací, nutná pravidelná [[Defragmentace|defragmentace]]. (Ve Windows 7 se spouští automaticky.)&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;&lt;br /&gt;
Verzi NTFS zjistíte příkazem: &lt;br /&gt;
 fsutil fsinfo ntfsinfo c:&lt;br /&gt;
&lt;br /&gt;
(Spusťte příkazový řádek jako správce: ''Start &amp;amp;rarr; cmd &amp;amp;rarr; pravé tlačítko &amp;amp;rarr; Spustit jako správce''!)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Zdroje&lt;br /&gt;
* [http://www.thomasmaurer.ch/2011/05/check-ntfs-version/ http://www.thomasmaurer.ch/2011/05/check-ntfs-version/]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/NTFS#Versions http://en.wikipedia.org/wiki/NTFS#Versions]&lt;br /&gt;
* [https://technet.microsoft.com/en-us/library/cc781134%28v=ws.10%29.aspx https://technet.microsoft.com/en-us/library/cc781134%28v=ws.10%29.aspx]&lt;br /&gt;
&lt;br /&gt;
== FAT/FAT32/exFAT ==&lt;br /&gt;
* Pochází z MS-DOSu resp. Windows 95.&lt;br /&gt;
* Dnes se používá obvykle jen na paměťových kartách a flash discích.&lt;br /&gt;
&lt;br /&gt;
; FAT(16)&lt;br /&gt;
* Dnes již historický (omezení velikosti oddílu).&lt;br /&gt;
* Názvy souborů 8+3 znaky, bez podpory diakritiky.&lt;br /&gt;
* Byl určený pro diskety, dnes se již nepoužívá.&lt;br /&gt;
&lt;br /&gt;
; FAT32&lt;br /&gt;
* Delší jména souborů než u FAT.&lt;br /&gt;
* Soubory velikosti max. 2&amp;amp;nbsp;GB (resp. 4&amp;amp;nbsp;GB podle konfigurace).&lt;br /&gt;
* Limit celkové velikosti souborového systému je teoreticky až 2&amp;amp;nbsp;TB, ale pouze za cenu zvětšení clusterů. Navíc podle standardů by maximální velikost oddílu FAT32 měla být 32&amp;amp;nbsp;GB a Windows tedy dodržují limit maximální velikosti oddílu 32&amp;amp;nbsp;GB.&lt;br /&gt;
* Zastaralý &amp;amp;mdash; princip zůstává stejný jako u FAT16.&lt;br /&gt;
* Náchylný k chybám, nemá žurnálování.&lt;br /&gt;
* Široká podpora (HW zařízení, operační systémy,...).&lt;br /&gt;
* Jednoduchý na implementaci.&lt;br /&gt;
&lt;br /&gt;
; exFAT&lt;br /&gt;
* Původně proprietární FS Microsoftu, v&amp;amp;nbsp;roce 2019 specifikace zveřejněna.&lt;br /&gt;
* Podpora se průběžně zlepšuje: &lt;br /&gt;
** Linux kernel od verze 5.4 (pro srovnání v&amp;amp;nbsp;2021 aktuální verze Debian 10 používá kernel 4.19, Ubuntu 20.04 LTS používá kernel 5.4.8), &lt;br /&gt;
** Mac OS X od verze 10.6.5 (uvolněno v&amp;amp;nbsp;roce 2010), &lt;br /&gt;
** v&amp;amp;nbsp;roce 2021 některá mobilní zařízení.&lt;br /&gt;
* Má sloužit jako náhrada FAT32 pro flash-disky.&lt;br /&gt;
* Rozšiřuje FAT32.&lt;br /&gt;
* Odstraňuje omezení velikosti souboru.&lt;br /&gt;
* Výchozí souborový systém po SDXC karty větší než 32&amp;amp;nbsp;GB.&lt;br /&gt;
* Může podporovat žurnálování, pokud to povolíme.&lt;br /&gt;
&lt;br /&gt;
== ReFS ==&lt;br /&gt;
* ''Resilient File System''&lt;br /&gt;
* Nový pokročilý souborový systém Microsoftu.&lt;br /&gt;
* Zatím používán pro Windows Server 2016 a 2022 (rok 2023).&lt;br /&gt;
* Důraz na spolehlivost a výkon&lt;br /&gt;
** Umí nahradit RAID &amp;amp;mdash; zrcadlení dat (mirroring): rychlejší přístup a možnost opravy při chybě HW.&lt;br /&gt;
** Automatická průběžná kontrola dat &amp;amp;mdash; nejen při čtení, ale i kontrola dat, se kterými se nepracuje (''scrubber'').&lt;br /&gt;
** Optimalizován pro vysoký výkon i u velikých disků (miliony terabyte apod.&lt;br /&gt;
* Podora pro virtuální stroje:&lt;br /&gt;
** Rychlé vytváření souborů obsahujících samé nuly (při vytváření virtuálních disků s&amp;amp;nbsp;fixní velikostí).&lt;br /&gt;
** Rychlé kopírování celých bloků (snímky virtuálních strojů)&lt;br /&gt;
* Limity: název souboru 255 znaků, délka cesty 32K znaků, velikost souboru i oddílu 35 PB (NTFS 256 TB)&lt;br /&gt;
* Podpora: BitLocker, Junctions (soft-links), hard-links, ACL, žurnál, trim&lt;br /&gt;
&lt;br /&gt;
== ext2/ext3/ext4 ==&lt;br /&gt;
* Rozšíření původního systému &amp;lt;tt&amp;gt;ext&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Implementovány v Unixových systémech, standardní volba pro většinu linuxových distribucí.&lt;br /&gt;
* Vzájemně kompatibilní.&lt;br /&gt;
; ext3&lt;br /&gt;
* Zpětně kompatibilní s ext2.&lt;br /&gt;
* Přidává žurnálování.&lt;br /&gt;
* Podporuje POSIX ACL (Access Control Lists).&lt;br /&gt;
* Není klasická defragmentace.&lt;br /&gt;
* Kontrola disku (&amp;lt;code&amp;gt;fsck&amp;lt;/code&amp;gt;) jen v režimu read-only (viz [[Nástroje_pro_práci_s_diskem#Kontrola_souborového_systému|Nástroje pro práci s diskem]]).&lt;br /&gt;
* Není transparentní komprese.&lt;br /&gt;
* Viz také [http://en.wikipedia.org/wiki/Ext3 Wikipedia.org &amp;gt; Ext3]&lt;br /&gt;
; ext4&lt;br /&gt;
* Dnes nativní pro běžné uživatelské distribuce Linuxu&lt;br /&gt;
* Žurnálování lze volitelně vypnout pomocí &amp;lt;code&amp;gt;tune4fs&amp;lt;/code&amp;gt;.&lt;br /&gt;
; Porovnání:&lt;br /&gt;
* [http://www.thegeekstuff.com/2011/05/ext2-ext3-ext4/ TheGeekStuff.com &amp;amp;rarr; ext2 &amp;amp;mdash; ext3 &amp;amp;mdash; ext4]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== btrfs ==&lt;br /&gt;
* Pokročilý souborový systém pro GNU/Linux, Solaris,...&lt;br /&gt;
* Subvoluming&lt;br /&gt;
** Jeden FS může být rozprostřen přes více fyzických zařízení.&lt;br /&gt;
** Prostor (raw storage) rozdělen na úseky (např. 1GB), které se pak spojují do subvolumes.&lt;br /&gt;
** Nahrazuje LVM (Logical Volume Manager) a ZFS.&lt;br /&gt;
* Snapshots (snímky disku)&lt;br /&gt;
** Ukládání současného stavu disku a změn oproti tomuto stavu.&lt;br /&gt;
* Copy on write&lt;br /&gt;
** Vytváření kopie svazku při současné práci se svazkem.&lt;br /&gt;
*&amp;lt;https://btrfs.wiki.kernel.org/index.php/Main_Page&amp;gt;&lt;br /&gt;
* Vyvinut firmou Oracle, dnes GPL.&lt;br /&gt;
* Teprve se chystá podpora kontroly a opravy (rok 2012).&lt;br /&gt;
; Vlastnosti:&lt;br /&gt;
*Velikost souboru až 2^64 B ~ 16 EiB&lt;br /&gt;
*Dynamic i-node allocation&lt;br /&gt;
*Podpora svazků (volumes) a RAID vestavěná ve FS&lt;br /&gt;
**RAID 0, 1 a 10&lt;br /&gt;
**chystá se RAID 5 a 6&lt;br /&gt;
*Kontrolní součty (checksumming)&lt;br /&gt;
*Body obnovení (snapshotting) &amp;amp;mdash; uchová stav systému před rizikovou operací.&lt;br /&gt;
*On-line defragmentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== APFS (HFS+) ==&lt;br /&gt;
* Apple File System (APFS)&lt;br /&gt;
* Souborový systém pro operační systém macOS&lt;br /&gt;
* Počítače Apple&lt;br /&gt;
* Starší verze macOS (před rokem 2017) používaly starší souborový systém HFS+.&lt;br /&gt;
* Proprietární Apple, částečná specifikace je zvěřejněna a umožňuje čtení z nešifrovaných úložišť.&lt;br /&gt;
* Pro uložení informací o rozdělení disku využívá GPT.&lt;br /&gt;
* Využívá ''firmlink'' &amp;amp;mdash; na rozdíl od hard linků z&amp;amp;nbsp;Linuxu může odkazovat na jiné disky.&lt;br /&gt;
* Umožňuje klonování souborů místo klasické kopie (data zůstávají na disku jen jednou, systém sleduje pouze změny v jednotlivých souborech. Klonování se automaticky použije ve Finderu, u příkazu &amp;lt;code&amp;gt;cp&amp;lt;/code&amp;gt; je třeba použít přepínač &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Podporuje šifrování celého disku i jednotlivých souborů, kompresy a sdílení volného místa mezi jednotlivými oddíly (volumes).&lt;br /&gt;
* Místo žurnálování používá ''redirect-on-write'' &amp;amp;mdash; při zápisu do souboru se vytvoří nová metadata v&amp;amp;nbsp;novém inode a posléze se upraví odkaz. Původní metadata se označí jako nevyužitá.&lt;br /&gt;
* Nedoporučuje se pro používání na klasických HDD (plotnových).&lt;br /&gt;
* Existují ovladače třetích stran pro Windows (placené) a Linux (svobodné) s&amp;amp;nbsp;částečně omezenou podporou.&lt;br /&gt;
&lt;br /&gt;
== swap ==&lt;br /&gt;
*Pro odkládání nepotřebných paměťových bloků na disk.&lt;br /&gt;
*Pod Windows se řeší speciálním souborem.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== proc ==&lt;br /&gt;
*Pouze virtuální FS.&lt;br /&gt;
*Slouží k práci s procesy.&lt;br /&gt;
&lt;br /&gt;
== Zdroje ==&lt;br /&gt;
* Resilient File System (ReFS) overview. Microsoft Learn [online]. Microsoft, 15.2.2023 [cit. 2023-05-07]. Dostupné z: [https://learn.microsoft.com/en-us/windows-server/storage/refs/refs-overview https://learn.microsoft.com/en-us/windows-server/storage/refs/refs-overview]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Konverze_form%C3%A1t%C5%AF_p%C5%99i_p%C5%99enosu</id>
		<title>Konverze formátů při přenosu</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Konverze_form%C3%A1t%C5%AF_p%C5%99i_p%C5%99enosu"/>
				<updated>2026-02-25T12:19:31Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Kódování textů */ Doplněno UTF-32, přeformulována role ISO8859-2.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Sítě]][[Category:Informatika]][[Category:Prezentační vrstva]]&lt;br /&gt;
&lt;br /&gt;
== Co je „konverze formátů“? ==&lt;br /&gt;
Jedním z úkolů prezentační vrstvy je převádět formát zápisu (způsob kódování) složitějších datových struktur při přenosu mezi dvěma počítači. Může se jednat o&amp;amp;nbsp;čísla delší než 1 byte, ale také o obrázky a&amp;amp;nbsp;další datové struktury.&lt;br /&gt;
&lt;br /&gt;
Pokud komunikující počítače používají odlišnou reprezentaci těchto dat, je třeba data při přenosu zkonvertovat.&lt;br /&gt;
* V modelu ISO/OSI to má na starosti prezentační vrstva.&lt;br /&gt;
* Reálně používaný model TCP/IP prezentační vrstvu nemá, konverzi si musí provést aplikace sama.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
; Příklad &amp;amp;ndash; desetinná čísla&lt;br /&gt;
Jako příklad uveďme desetinná čísla. Pokud chceme desetinné číslo uložit v&amp;amp;nbsp;počítači, musíme ho převést na posloupnost nul a jedniček. Existují různé způsoby, jak toto provést. Pokud v&amp;amp;nbsp;síti komunikují dva počítače a&amp;amp;nbsp;každý z&amp;amp;nbsp;nich používá jiný způsob, nemohou prostě poslat odpovídající posloupnost bitů přes síť, protože na druhém počítači by stejná posloupnost znamenala jiné číslo. Je třeba provést konverzi.&lt;br /&gt;
&lt;br /&gt;
; Představme si následující situaci&lt;br /&gt;
Odesílatel a příjemce ukládají desetinná čísla tak, že číslo &amp;lt;code&amp;gt;0,083&amp;lt;/code&amp;gt; převedou na &amp;lt;code&amp;gt;83*10&amp;lt;sup&amp;gt;-3&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt;. Číslu &amp;lt;code&amp;gt;83&amp;lt;/code&amp;gt; se říká ''mantisa'' a &amp;lt;code&amp;gt;-3&amp;lt;/code&amp;gt; je ''exponent''.&lt;br /&gt;
&lt;br /&gt;
Odesilatel i&amp;amp;nbsp;příjemce použijí&amp;amp;nbsp;16 bitů. Dále ale postupují různě: &lt;br /&gt;
* Odesilatel:&lt;br /&gt;
*# mantisu (číslo &amp;lt;code&amp;gt;83&amp;lt;/code&amp;gt;) ukládá na 8&amp;amp;nbsp;bitů: &amp;lt;code&amp;gt;0101 0011&amp;lt;/code&amp;gt;&lt;br /&gt;
*# posléze využije další byte tak, že 1.&amp;amp;nbsp;bit bude reprezentovat znaménko (0..plus, 1..mínus) a dalších 7 bitů exponent &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;000 0011&amp;lt;/code&amp;gt;&lt;br /&gt;
*: &amp;lt;code&amp;gt;0,083&amp;lt;/code&amp;gt; =&amp;gt; číslo &amp;lt;code&amp;gt;83&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;0101 0011&amp;lt;/code&amp;gt; + znaménko: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (mínus) + exponent &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;000 0011&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;0101 0011 1000 0011&amp;lt;/code&amp;gt; &lt;br /&gt;
* Příjemce reprezentuje desetinná čísla jinak. Číslo &amp;lt;code&amp;gt;0,083&amp;lt;/code&amp;gt; uloží tak, že:&lt;br /&gt;
*# nejprve uvede znaménko exponentu (1 bit): &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (mínus)&lt;br /&gt;
*# poté exponent na 3 bity (to obvykle stačí): &amp;lt;code&amp;gt;011&amp;lt;/code&amp;gt;&lt;br /&gt;
*# a posléze využije 12 bitů na zápis mantisy (číselné části).&lt;br /&gt;
*: &amp;lt;code&amp;gt;0,083&amp;lt;/code&amp;gt; =&amp;gt; znaménko: &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (mínus) + exponent &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;011&amp;lt;/code&amp;gt; + číslo &amp;lt;code&amp;gt;83&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;0000 0101 0011&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;1011 0000 0101 0011&amp;lt;/code&amp;gt;) &lt;br /&gt;
&lt;br /&gt;
Pokud by odesilatel prostě vzal 16 bitů, které reprezentují číslo a poslal je příjemci, ten by místo čísla &amp;lt;code&amp;gt;0,083&amp;lt;/code&amp;gt; přečetl:&lt;br /&gt;
*: &amp;lt;code&amp;gt;0101 0011 1000 0011&amp;lt;/code&amp;gt; =&amp;gt; znaménko: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (plus) + exponent &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;101&amp;lt;/code&amp;gt; + číslo &amp;lt;code&amp;gt;899&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;0011 1000 0011&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;899*10&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt;&amp;lt;/code&amp;gt; =&amp;gt; &amp;lt;code&amp;gt;89&amp;amp;nbsp;900&amp;amp;nbsp;000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby se nedorozumění předešlo, musí buď odesilatel nebo příjemce data převést do formátu, který používá příjemce. To označujeme jako provedení konverze.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Další běžné konverze dat ==&lt;br /&gt;
V&amp;amp;nbsp;dnešních sítích se naprosto běžně setkáme s následujícími variantami konverze dat:&lt;br /&gt;
* Převod různých způsobů kódování textů (národní abecedy)&lt;br /&gt;
* Převod různých formátů pro ukládání obrázků&lt;br /&gt;
* Převod různého způsobu zápisu delších čísel (Little a Big Endian)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Kódování textů ===&lt;br /&gt;
* Veškerá data jsou v&amp;amp;nbsp;počítači ukládána a přenášena jako posloupnosti 0 a 1.&lt;br /&gt;
* Pro ukládání a&amp;amp;nbsp;přenášení textů je tedy nutno texty převést (zakódovat) na čísla.&lt;br /&gt;
&lt;br /&gt;
; ASCII, UTF-8 a kódové stránky&lt;br /&gt;
* Pro kódování textů (ukládání textů v&amp;amp;nbsp;paměti počítače ve tvaru posloupností byte) se dnes běžně používá kódování ASCII či z&amp;amp;nbsp;něj odvozená kódování UTF-8 či (výjimečně) UTF-16.&lt;br /&gt;
* Problém s&amp;amp;nbsp;ASCII je v tom, že znaky ukládá na 8&amp;amp;nbsp;bitů.&lt;br /&gt;
* 8&amp;amp;nbsp;bitů ale umožňuje pouze 256&amp;amp;nbsp;různých kombinací, což sice dostačuje pro základní latinskou abecedu, ale neumožňuje ukládat rozšířené národní abecedy (azbuka, české znaky s&amp;amp;nbsp;diakritikou, čínská abeceda,...)&lt;br /&gt;
&lt;br /&gt;
* Rozšířené národní abecedy (například znaky s&amp;amp;nbsp;diakritikou v&amp;amp;nbsp;češtině a&amp;amp;nbsp;dalších jazycích) používají různé tzv.&amp;amp;nbsp;„kódové stránky“, které přiřazují znakům ze 2.&amp;amp;nbsp;poloviny ASCII tabulky speciální významy.&lt;br /&gt;
* Například pro češtinu se běžně používají kódové stránky:&lt;br /&gt;
*# Windows-1250 (kódová stránka 1250)... navržena a používána Microsoftem v&amp;amp;nbsp;grafickém prostředí Windows&lt;br /&gt;
*# Latin II (kódová stránka 852)... starší standard, používá Microsoft při zápisu názvů souborů (je třeba používat při psaní skriptů pro Windows).&lt;br /&gt;
*# ISO-8859-2... standard organizace ISO. Dříve používán většinou ostatních operačních systémů kromě Windows. Dnes je již obvykle nahrazen kódováním UTF-8 a jeho význam postupně upadá.&lt;br /&gt;
&lt;br /&gt;
* Pokud tvůrce webové stránky vytvoří web s&amp;amp;nbsp;kódováním Windows-1250 a&amp;amp;nbsp;čtenář používá Linux, některé české znaky se čtenáři nezobrazí správně. A&amp;amp;nbsp;samozřejmě podobně naopak.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;&lt;br /&gt;
Pokud komunikují počítače, které používají odlišné způsoby kódování znaků, je třeba je převádět (konvertovat). Dnes se to řeší tak, že prohlížeče běžně znají všechny běžně používané způsoby kódování a tvůrce stránky do kódu HTML zapíše, jaký způsob kódování používá (viz HTML element &amp;lt;code&amp;gt;&amp;amp;lt;meta charset=&amp;quot;windows-1250&amp;quot; /&amp;amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
; UTF-8&lt;br /&gt;
* Vzhledem k problémům s&amp;amp;nbsp;detekcí a&amp;amp;nbsp;konverzemi kódových stránek se kódování ASCII postupně nahrazuje univerzálním kódováním [https://cs.wikipedia.org/wiki/UTF-8 UTF-8], které je s&amp;amp;nbsp;ASCII částečně kompatibilní (reprezentace prvních 128 znaků ASCII je stejná). &lt;br /&gt;
* Například ve většině linuxových distribucí je již UTF-8 standardem. Stejně tak je doporučenou volbou pro psaní webových stránek.&lt;br /&gt;
* Nevýhodou UTF-8 je, že jeden znak je reprezentován kódem dlouhým 8-32 bitů. Nelze tedy jednoduše najít pozici znaku v&amp;amp;nbsp;textu podle jeho indexu.&lt;br /&gt;
&lt;br /&gt;
; UTF-16 a UTF-32&lt;br /&gt;
* Tyto kódování ukládají všechny znaky na stejně dlouhé posloupnosti bitů (16 bitů/znak u UTF-16 a 32 bitů/znak u UTF-32).&lt;br /&gt;
* To je paměťově méně efektivní, ale umožňuje snáze zpracovávat texty na základě pozice jednotlivých znaků.&lt;br /&gt;
* Tato kódování se dnes obvykle nepoužívají pro výměnu dat, ale pro zpracování textů v&amp;amp;nbsp;knihovnách programovacích jazyků.&lt;br /&gt;
&lt;br /&gt;
; ASCII &amp;amp;times; EBCDIC apod.&lt;br /&gt;
* V&amp;amp;nbsp;době vzniku architektury ISO/OSI byla situace složitější v&amp;amp;nbsp;tom, že se běžně používaly pro ukládání znaků i&amp;amp;nbsp;zcela odlišné způsoby kódování znaků. Kromě ASCII třeba kód EBCDIC na sálových počítačích IBM v&amp;amp;nbsp;70. letech.&lt;br /&gt;
&lt;br /&gt;
=== Obrázky ===&lt;br /&gt;
* Z&amp;amp;nbsp;grafiky samozřejmě víte, že existují různé formáty obrázků.&lt;br /&gt;
* Dnešní sítě se s&amp;amp;nbsp;problémem převodu obrázků vyrovnaly tak, že existuje skupina „běžně podporovaných“ formátů (PNG, JPG, GIF,...) a&amp;amp;nbsp;jiné formáty se v&amp;amp;nbsp;sítích běžně nepoužívají.&lt;br /&gt;
* Pokud by byl ale model ISO/OSI implementován běžně v&amp;amp;nbsp;počítačích, byl by převod formátů obrázků starostí síťového rozhraní. Například prohlížeč by si řekl, v&amp;amp;nbsp;jakém formátu obrázky umí zobrazit, a&amp;amp;nbsp;prezentační vrstva by měla za úkol obrázky převést. (Asi by s&amp;amp;nbsp;tím bylo dost těžkostí, ale to ponechme stranou.) &lt;br /&gt;
&lt;br /&gt;
=== Little × Big Endian ===&lt;br /&gt;
* K&amp;amp;nbsp;problémům s&amp;amp;nbsp;konverzí dat ale dochází i&amp;amp;nbsp;v&amp;amp;nbsp;mnohem jednodušších situacích.&lt;br /&gt;
* Představme si, že chceme přes síť přenést 32bitové číslo. Například číslo &amp;lt;code&amp;gt;1158&amp;lt;/code&amp;gt; &amp;amp;rarr; &amp;lt;code&amp;gt;00000000 00000000 00000100 10000110&amp;lt;/code&amp;gt; binárně resp. &amp;lt;code&amp;gt;00 00 04 86&amp;lt;/code&amp;gt; hexadecimálně.&lt;br /&gt;
&lt;br /&gt;
; Big Endian&lt;br /&gt;
* Jsme zvyklí v&amp;amp;nbsp;číslech zapisovat nejprve nejvýznamnější číslice: číslo &amp;lt;code&amp;gt;1158&amp;lt;/code&amp;gt; píšeme jako &amp;lt;code&amp;gt;1&amp;amp;rarr;1&amp;amp;rarr;5&amp;amp;rarr;8&amp;lt;/code&amp;gt;, nikoli jako: &amp;lt;code&amp;gt;8&amp;amp;rarr;5&amp;amp;rarr;1&amp;amp;rarr;1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Proto nám připadá logické, že uložíme číslo &amp;lt;code&amp;gt;1158&amp;lt;/code&amp;gt; do paměti počítače takto:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Adresa v paměti !! Hodnota&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0000 0000 (00 hex)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0000 0000 (00 hex)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0000 0100 (04 hex)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1000 0110 (86 hex)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
* Tento způsob zápisu se označuje jako ''Big Endian''.&lt;br /&gt;
* Big Endian:&lt;br /&gt;
** Je snáze čitelný pro lidi (například při sledování obsahu datagramů,...)&lt;br /&gt;
** Používá se v&amp;amp;nbsp;hlavičkách síťových protokolů.&lt;br /&gt;
&lt;br /&gt;
; Little Endian&lt;br /&gt;
* Na druhou stranu například pro matematické operace s&amp;amp;nbsp;dvojkovými čísly je praktičtější, když jsou čísla uložena v&amp;amp;nbsp;opačném pořadí. Například pokud čísla sčítáme, bereme nejprve součet nejméně významných číslic.&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
Například když sčítáme &amp;lt;code&amp;gt;1158+507&amp;lt;/code&amp;gt;, budeme nejprve potřebovat zjistit součet  &amp;lt;code&amp;gt;8+8&amp;lt;/code&amp;gt;, pak budeme sčítat &amp;lt;code&amp;gt;5+0+1&amp;lt;/code&amp;gt; atd. (Potřebujeme tak postupovat kvůli přenosu z&amp;amp;nbsp;nižších řádů.)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* Například procesory Intel v&amp;amp;nbsp;paměti používají zápis, označovaný jako ''Little Endian'':&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Adresa v paměti !! Hodnota&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1000 0110 (86 hex)&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 0000 0100 (04 hex)&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0000 0000 (00 hex)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 0000 0000 (00 hex)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
* Při zápisu Little Endian jsou v&amp;amp;nbsp;paměti nejprve méně významné byte a&amp;amp;nbsp;až poté ty významnější (nejprve „jednotky“, pak „desítky“, pak „stovky“,... tedy, pokud to takto můžeme označit při zápisu ve dvojkové soustavě po bytech).&lt;br /&gt;
* Little Endian&lt;br /&gt;
** Je o&amp;amp;nbsp;něco praktičtější při matematických operacích s&amp;amp;nbsp;čísly.&lt;br /&gt;
** Používají jej procesory architektury Intel x86 a&amp;amp;nbsp;kompatibilní (tedy samozřejmě i&amp;amp;nbsp;AMD a&amp;amp;nbsp;obecně dnes většina procesorů stolních počítačů.)&lt;br /&gt;
&lt;br /&gt;
; Je lepší Little nebo Big Endian?&lt;br /&gt;
* To je asi zcela zbytečná otázka. V&amp;amp;nbsp;dnešním světě se používá obojí a&amp;amp;nbsp;ještě dlouho nejspíš bude. &lt;br /&gt;
* Každopádně je důležité vědět:&lt;br /&gt;
** co toto označení znamená,&lt;br /&gt;
** že při přenosu dat mezi zařízeními je třeba řešit, zda není potřeba data převést z&amp;amp;nbsp;jednoho způsobu ukládání na druhý,&lt;br /&gt;
** při programování nástrojů pro sítě a&amp;amp;nbsp;obecně komunikaci řešit, zda se používá Little nebo Big Endian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;&lt;br /&gt;
; Odkud se vzalo označení „Little/Big Endian“?&lt;br /&gt;
* V&amp;amp;nbsp;knize Jonathana Swifta [https://www.databazeknih.cz/knihy/gulliverovy-cesty-35047 Gulliverovy cesty (Gulliver's Travels, 1726)] se objevují dva národy trpaslíků, které mezi sebou vedou letitou a&amp;amp;nbsp;krvavou válku o&amp;amp;nbsp;to, zda je správné vařené vejce rozbíjet na širším či užším konci (little × big end).&lt;br /&gt;
&lt;br /&gt;
* Autor knihy tím mimo jiné nejspíš poukazoval na nesmyslnost válek mezi katolíky a&amp;amp;nbsp;protestanty, které zmítaly Evropou většinu raného novověku a&amp;amp;nbsp;hlavním „tématem sporu“ bylo, zda věřící při přijímání mohou s&amp;amp;nbsp;knězem pít mešní víno, nebo smí pozřít pouze hostie (reprezentující krev a&amp;amp;nbsp;tělo Krista). &lt;br /&gt;
* Samozřejmě z&amp;amp;nbsp;dějepisu víte, že ve skutečnosti šlo spíše o&amp;amp;nbsp;to, zda má církev shromaždovat majetek a politický vliv, či zda se má starat pouze o&amp;amp;nbsp;duše věřících.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASN.1 ==&lt;br /&gt;
* Pokud bychom chtěli implementovat plně model ISO/OSI, museli bychom se vyrovnat s&amp;amp;nbsp;existencí velkého množství různých formátů dat.&lt;br /&gt;
* V&amp;amp;nbsp;80. letech proto vznikla myšlenka, že by bylo jednodušší navrhnout univerzální, všemi podporovaný formát dat. Pak by stačilo, aby každý počítač uměl převádět data do tohoto univerzálního formátu a&amp;amp;nbsp;zpět.&lt;br /&gt;
* Takovým formátem měl být formát ASN.1.&lt;br /&gt;
* My ale víme, že svět sítí se nakonec vydal jinou cestou &amp;amp;rarr; využitím jednoduššího modelu TCP/IP a&amp;amp;nbsp;přenecháním starostí s&amp;amp;nbsp;převodem formátů na tvůrce jednotlivých aplikací.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje ==&lt;br /&gt;
* PETERKA, Jiří. ''Prezentační vrstva.'' eArchiv.cz [online]. 1996 [cit. 2017-06-26]. Dostupné z: [http://www.earchiv.cz/a92/a226c110.php3 http://www.earchiv.cz/a92/a226c110.php3]&lt;br /&gt;
* ASCII. In: ''Wikipedia: the free encyclopedia [online].'' San Francisco (CA): Wikimedia Foundation, 2016 [cit. 2017-06-26]. Dostupné z: [https://cs.wikipedia.org/wiki/ASCII https://cs.wikipedia.org/wiki/ASCII]&lt;br /&gt;
* UTF-8. In: ''Wikipedia: the free encyclopedia [online].'' San Francisco (CA): Wikimedia Foundation, 2016 [cit. 2017-06-26]. Dostupné z: [https://cs.wikipedia.org/wiki/UTF-8 https://cs.wikipedia.org/wiki/UTF-8]&lt;br /&gt;
* Abstract Syntax Notation One. In: ''Wikipedia: the free encyclopedia [online].'' San Francisco (CA): Wikimedia Foundation, 2016 [cit. 2020-03-16].[https://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One https://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-23T06:14:03Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Nastavení projektu pro Firebase */ Doplněno ověření přihlášení do firebase.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
* Data ukládá binárně, ale stále na lokální zařízení.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
* Cloud Firestore je cloudová NoSQL databáze od Google, která je součástí platformy Google Firebase. &lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti Cloud Firestore ===&lt;br /&gt;
&lt;br /&gt;
; Výhody a nevýhody&lt;br /&gt;
* Firebase je dobře integrovaná do frameworku Flutter (Flutter také vyvíjí Google)&lt;br /&gt;
* Data se ukládají do cloudu – data může sdílet mobilní i webová aplikace&lt;br /&gt;
* Synchronizace dat v reálném čase&lt;br /&gt;
* Pro přístup k&amp;amp;nbsp;datům je potřeba připojení k&amp;amp;nbsp;internetu&lt;br /&gt;
* Pro malé projekty stačí varianta zdarma (pro větší bude třeba platit)&lt;br /&gt;
&lt;br /&gt;
; Struktura dat ve Firestore&lt;br /&gt;
* Data se neukládají do entit jako u ER databází – spíše jako několik seznamů objektů.&lt;br /&gt;
&lt;br /&gt;
Pojmy&lt;br /&gt;
* Dokument (Document) ... konkrétní záznam (jako jeden řádek v databázi) – například údaje o jednom uživateli.&lt;br /&gt;
* Pole (Field) ... konkrétní hodnota (atribut) – například jméno uživatele&lt;br /&gt;
* Kolekce (Collection) ... odpovídá entitě v ER databázích – je to vlastně seznam dokumentů&lt;br /&gt;
* Databáze (Database) ... skupina souvisejících kolekcí&lt;br /&gt;
* Projekt (Project) ... jeden projekt obvykle odpovídá jednomu softwarovému produktu. Může zahrnovat různé podoby jedné aplikace:&lt;br /&gt;
** IOS&lt;br /&gt;
** Android&lt;br /&gt;
** webová aplikace&lt;br /&gt;
** Unity&lt;br /&gt;
** Flutter multiplatformní aplikace&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
 users (kolekce)&lt;br /&gt;
    └── user1 (dokument)&lt;br /&gt;
          ├── name: &amp;quot;Jan&amp;quot;&lt;br /&gt;
          ├── age: 18&lt;br /&gt;
          └── email: &amp;quot;jan@email.cz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Nastavení projektu pro Firebase===&lt;br /&gt;
&lt;br /&gt;
; Založení projektu na webu Firebase&lt;br /&gt;
#Jdi na: [https://console.firebase.google.com Console.firebase.google.com]&lt;br /&gt;
#Klikni na Vytvořit projekt a zadej název projektu&lt;br /&gt;
#Po vytvoření přidej aplikaci (Android / iOS / Web)&lt;br /&gt;
&lt;br /&gt;
; Instalace FlutterFire CLI&lt;br /&gt;
# Nainstaluj Firebase CLI podle [https://firebase.google.com/docs/cli návodu z&amp;amp;nbsp; Firebase.google.com &amp;gt; CLI]&lt;br /&gt;
#* Bude nejspíš vyžadovate heslo správce počítače.&lt;br /&gt;
# Přihlaš se: &amp;lt;code&amp;gt;firebase login&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Musíš rozhodnout, jestli budeš využívat Google Gemini v rámci Firebase a jestli může Google využívat statistická data.&lt;br /&gt;
#* Zvolíš účet Google, pod kterým budeš pracovat&lt;br /&gt;
#* Ověř funkčnost pomocí: &amp;lt;code&amp;gt;firebase projects:list&amp;lt;/code&amp;gt; – mělo by vypsat seznam založených projektů&lt;br /&gt;
# Založ projekt ve Flutteru jako obvykle&lt;br /&gt;
# Ve složce projektu spusť aktivaci FlutterFire CLI:&lt;br /&gt;
#: &amp;lt;code&amp;gt;dart pub global activate flutterfire_cli&amp;lt;/code&amp;gt;&lt;br /&gt;
#: &amp;lt;code&amp;gt;flutterfire configure --project='''nazev-projektu'''&amp;lt;/code&amp;gt;&lt;br /&gt;
#: Do projektu tím přibude konfigurační soubor: &amp;lt;code&amp;gt;lib/firebase_options.dart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Podle ChatGPT – ale neodpovídá návodu na Firebase:&lt;br /&gt;
Ve Flutter projektu spusť:&lt;br /&gt;
&lt;br /&gt;
 flutter pub add firebase_core&lt;br /&gt;
 flutter pub add cloud_firestore&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Inicializuj Firebase v main.dart:&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'firebase_options.dart';&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 &lt;br /&gt;
 await Firebase.initializeApp(&lt;br /&gt;
     options: DefaultFirebaseOptions.currentPlatform,&lt;br /&gt;
 );&lt;br /&gt;
&amp;lt;!-- Původní podle ChatGPT&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 &lt;br /&gt;
 void main() async {&lt;br /&gt;
   WidgetsFlutterBinding.ensureInitialized();&lt;br /&gt;
   await Firebase.initializeApp();&lt;br /&gt;
   runApp(MyApp());&lt;br /&gt;
 }&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Další plug-iny importuj dle potřeby viz dále&lt;br /&gt;
&lt;br /&gt;
=== Import Firestore ===&lt;br /&gt;
&lt;br /&gt;
Import:&lt;br /&gt;
&lt;br /&gt;
 import 'package:cloud_firestore/cloud_firestore.dart';&lt;br /&gt;
&lt;br /&gt;
Vytvoření instance pro přístup k databázi:&lt;br /&gt;
&lt;br /&gt;
 final FirebaseFirestore db = FirebaseFirestore.instance;&lt;br /&gt;
&lt;br /&gt;
=== Přidání nového dokumentu ===&lt;br /&gt;
 await db.collection('users').add({&lt;br /&gt;
   'name': 'Jan',&lt;br /&gt;
   'age': 18,&lt;br /&gt;
   'email': 'jan@email.cz',&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Tím se:&lt;br /&gt;
# vytvoří kolekce users (pokud neexistuje)&lt;br /&gt;
# přidá nový dokument s automatickým ID&lt;br /&gt;
&lt;br /&gt;
; Uložení dokumentu s vlastním ID&lt;br /&gt;
 await db.collection('users').doc('student1').set({&lt;br /&gt;
   'name': 'Petra',&lt;br /&gt;
   'age': 17,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Čtení dat z Firestore jednorázově===&lt;br /&gt;
&lt;br /&gt;
 var snapshot = await db.collection('users').get();&lt;br /&gt;
 &lt;br /&gt;
 for (var doc in snapshot.docs) {&lt;br /&gt;
   print(doc.data());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Čtení v reálném čase ===&lt;br /&gt;
&lt;br /&gt;
Firestore umožňuje poslouchat změny. Data se pak automaticky aktualizují, pokud proběhne změna v databázi (například z jiného zařízení připojeného ke stejnému projektu):&lt;br /&gt;
&lt;br /&gt;
 StreamBuilder(&lt;br /&gt;
   stream: db.collection('users').snapshots(),&lt;br /&gt;
   builder: (context, snapshot) {&lt;br /&gt;
     if (!snapshot.hasData) {&lt;br /&gt;
       return CircularProgressIndicator();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     var docs = snapshot.data!.docs;&lt;br /&gt;
 &lt;br /&gt;
     return ListView(&lt;br /&gt;
       children: docs.map((doc) {&lt;br /&gt;
         return ListTile(&lt;br /&gt;
           title: Text(doc['name']),&lt;br /&gt;
         );&lt;br /&gt;
       }).toList(),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
=== Aktualizace dat===&lt;br /&gt;
 await db.collection('users').doc('student1').update({&lt;br /&gt;
   'age': 18,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Smazání dat===&lt;br /&gt;
&lt;br /&gt;
; Smazání dokumentu&lt;br /&gt;
 await db.collection('users').doc('student1').delete();&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnostní pravidla (Rules) ===&lt;br /&gt;
&lt;br /&gt;
Ve Firebase konzoli nastav pravidla přístupu.&lt;br /&gt;
&lt;br /&gt;
Například pouze pro přihlášené uživatele:&lt;br /&gt;
&lt;br /&gt;
 rules_version = '2';&lt;br /&gt;
 service cloud.firestore {&lt;br /&gt;
   match /databases/{database}/documents {&lt;br /&gt;
     match /{document=**} {&lt;br /&gt;
       allow read, write: if request.auth != null;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* Základ sekce o Firebase byl vytvořen pomocí služby [https://www.chatgpt.com ChatGPT].&lt;br /&gt;
* [https://console.firebase.google.com/ Console.firebase.google.com &amp;gt; Postup nastavení projektu]&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLl-K7zZEsYLluG5MCVEzXAQ7ACZBCuZgZ YouTube.com &amp;gt; Get to know Cloud Firebase] (seriál videí)&lt;br /&gt;
* [https://cloud.google.com/firestore/pricing Google Cloud &amp;gt; Firestore Pricing]&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;br /&gt;
&lt;br /&gt;
* Framework, který umožňuje vytvořit projekt Flutteru se dvěma částmi: backendem a frontendem.&lt;br /&gt;
* Backend je následně možné spustit na svém serveru.&lt;br /&gt;
* Frontend běží na desktopu.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-23T06:11:08Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Nastavení projektu pro Firebase */ Oprava velkého písmene v příkazu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
* Data ukládá binárně, ale stále na lokální zařízení.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
* Cloud Firestore je cloudová NoSQL databáze od Google, která je součástí platformy Google Firebase. &lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti Cloud Firestore ===&lt;br /&gt;
&lt;br /&gt;
; Výhody a nevýhody&lt;br /&gt;
* Firebase je dobře integrovaná do frameworku Flutter (Flutter také vyvíjí Google)&lt;br /&gt;
* Data se ukládají do cloudu – data může sdílet mobilní i webová aplikace&lt;br /&gt;
* Synchronizace dat v reálném čase&lt;br /&gt;
* Pro přístup k&amp;amp;nbsp;datům je potřeba připojení k&amp;amp;nbsp;internetu&lt;br /&gt;
* Pro malé projekty stačí varianta zdarma (pro větší bude třeba platit)&lt;br /&gt;
&lt;br /&gt;
; Struktura dat ve Firestore&lt;br /&gt;
* Data se neukládají do entit jako u ER databází – spíše jako několik seznamů objektů.&lt;br /&gt;
&lt;br /&gt;
Pojmy&lt;br /&gt;
* Dokument (Document) ... konkrétní záznam (jako jeden řádek v databázi) – například údaje o jednom uživateli.&lt;br /&gt;
* Pole (Field) ... konkrétní hodnota (atribut) – například jméno uživatele&lt;br /&gt;
* Kolekce (Collection) ... odpovídá entitě v ER databázích – je to vlastně seznam dokumentů&lt;br /&gt;
* Databáze (Database) ... skupina souvisejících kolekcí&lt;br /&gt;
* Projekt (Project) ... jeden projekt obvykle odpovídá jednomu softwarovému produktu. Může zahrnovat různé podoby jedné aplikace:&lt;br /&gt;
** IOS&lt;br /&gt;
** Android&lt;br /&gt;
** webová aplikace&lt;br /&gt;
** Unity&lt;br /&gt;
** Flutter multiplatformní aplikace&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
 users (kolekce)&lt;br /&gt;
    └── user1 (dokument)&lt;br /&gt;
          ├── name: &amp;quot;Jan&amp;quot;&lt;br /&gt;
          ├── age: 18&lt;br /&gt;
          └── email: &amp;quot;jan@email.cz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Nastavení projektu pro Firebase===&lt;br /&gt;
&lt;br /&gt;
; Založení projektu na webu Firebase&lt;br /&gt;
#Jdi na: [https://console.firebase.google.com Console.firebase.google.com]&lt;br /&gt;
#Klikni na Vytvořit projekt a zadej název projektu&lt;br /&gt;
#Po vytvoření přidej aplikaci (Android / iOS / Web)&lt;br /&gt;
&lt;br /&gt;
; Instalace FlutterFire CLI&lt;br /&gt;
# Nainstaluj Firebase CLI podle [https://firebase.google.com/docs/cli návodu z&amp;amp;nbsp; Firebase.google.com &amp;gt; CLI]&lt;br /&gt;
#* Bude nejspíš vyžadovate heslo správce počítače.&lt;br /&gt;
# Přihlaš se: &amp;lt;code&amp;gt;firebase login&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Musíš rozhodnout, jestli budeš využívat Google Gemini v rámci Firebase a jestli může Google využívat statistická data.&lt;br /&gt;
#* Zvolíš účet Google, pod kterým budeš pracovat&lt;br /&gt;
# Založ projekt ve Flutteru jako obvykle&lt;br /&gt;
# Ve složce projektu spusť aktivaci FlutterFire CLI:&lt;br /&gt;
#: &amp;lt;code&amp;gt;dart pub global activate flutterfire_cli&amp;lt;/code&amp;gt;&lt;br /&gt;
#: &amp;lt;code&amp;gt;flutterfire configure --project='''nazev-projektu'''&amp;lt;/code&amp;gt;&lt;br /&gt;
#: Do projektu tím přibude konfigurační soubor: &amp;lt;code&amp;gt;lib/firebase_options.dart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Podle ChatGPT – ale neodpovídá návodu na Firebase:&lt;br /&gt;
Ve Flutter projektu spusť:&lt;br /&gt;
&lt;br /&gt;
 flutter pub add firebase_core&lt;br /&gt;
 flutter pub add cloud_firestore&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Inicializuj Firebase v main.dart:&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'firebase_options.dart';&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 &lt;br /&gt;
 await Firebase.initializeApp(&lt;br /&gt;
     options: DefaultFirebaseOptions.currentPlatform,&lt;br /&gt;
 );&lt;br /&gt;
&amp;lt;!-- Původní podle ChatGPT&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 &lt;br /&gt;
 void main() async {&lt;br /&gt;
   WidgetsFlutterBinding.ensureInitialized();&lt;br /&gt;
   await Firebase.initializeApp();&lt;br /&gt;
   runApp(MyApp());&lt;br /&gt;
 }&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Další plug-iny importuj dle potřeby viz dále&lt;br /&gt;
&lt;br /&gt;
=== Import Firestore ===&lt;br /&gt;
&lt;br /&gt;
Import:&lt;br /&gt;
&lt;br /&gt;
 import 'package:cloud_firestore/cloud_firestore.dart';&lt;br /&gt;
&lt;br /&gt;
Vytvoření instance pro přístup k databázi:&lt;br /&gt;
&lt;br /&gt;
 final FirebaseFirestore db = FirebaseFirestore.instance;&lt;br /&gt;
&lt;br /&gt;
=== Přidání nového dokumentu ===&lt;br /&gt;
 await db.collection('users').add({&lt;br /&gt;
   'name': 'Jan',&lt;br /&gt;
   'age': 18,&lt;br /&gt;
   'email': 'jan@email.cz',&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Tím se:&lt;br /&gt;
# vytvoří kolekce users (pokud neexistuje)&lt;br /&gt;
# přidá nový dokument s automatickým ID&lt;br /&gt;
&lt;br /&gt;
; Uložení dokumentu s vlastním ID&lt;br /&gt;
 await db.collection('users').doc('student1').set({&lt;br /&gt;
   'name': 'Petra',&lt;br /&gt;
   'age': 17,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Čtení dat z Firestore jednorázově===&lt;br /&gt;
&lt;br /&gt;
 var snapshot = await db.collection('users').get();&lt;br /&gt;
 &lt;br /&gt;
 for (var doc in snapshot.docs) {&lt;br /&gt;
   print(doc.data());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Čtení v reálném čase ===&lt;br /&gt;
&lt;br /&gt;
Firestore umožňuje poslouchat změny. Data se pak automaticky aktualizují, pokud proběhne změna v databázi (například z jiného zařízení připojeného ke stejnému projektu):&lt;br /&gt;
&lt;br /&gt;
 StreamBuilder(&lt;br /&gt;
   stream: db.collection('users').snapshots(),&lt;br /&gt;
   builder: (context, snapshot) {&lt;br /&gt;
     if (!snapshot.hasData) {&lt;br /&gt;
       return CircularProgressIndicator();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     var docs = snapshot.data!.docs;&lt;br /&gt;
 &lt;br /&gt;
     return ListView(&lt;br /&gt;
       children: docs.map((doc) {&lt;br /&gt;
         return ListTile(&lt;br /&gt;
           title: Text(doc['name']),&lt;br /&gt;
         );&lt;br /&gt;
       }).toList(),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
=== Aktualizace dat===&lt;br /&gt;
 await db.collection('users').doc('student1').update({&lt;br /&gt;
   'age': 18,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Smazání dat===&lt;br /&gt;
&lt;br /&gt;
; Smazání dokumentu&lt;br /&gt;
 await db.collection('users').doc('student1').delete();&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnostní pravidla (Rules) ===&lt;br /&gt;
&lt;br /&gt;
Ve Firebase konzoli nastav pravidla přístupu.&lt;br /&gt;
&lt;br /&gt;
Například pouze pro přihlášené uživatele:&lt;br /&gt;
&lt;br /&gt;
 rules_version = '2';&lt;br /&gt;
 service cloud.firestore {&lt;br /&gt;
   match /databases/{database}/documents {&lt;br /&gt;
     match /{document=**} {&lt;br /&gt;
       allow read, write: if request.auth != null;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* Základ sekce o Firebase byl vytvořen pomocí služby [https://www.chatgpt.com ChatGPT].&lt;br /&gt;
* [https://console.firebase.google.com/ Console.firebase.google.com &amp;gt; Postup nastavení projektu]&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLl-K7zZEsYLluG5MCVEzXAQ7ACZBCuZgZ YouTube.com &amp;gt; Get to know Cloud Firebase] (seriál videí)&lt;br /&gt;
* [https://cloud.google.com/firestore/pricing Google Cloud &amp;gt; Firestore Pricing]&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;br /&gt;
&lt;br /&gt;
* Framework, který umožňuje vytvořit projekt Flutteru se dvěma částmi: backendem a frontendem.&lt;br /&gt;
* Backend je následně možné spustit na svém serveru.&lt;br /&gt;
* Frontend běží na desktopu.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-23T06:10:19Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Nastavení projektu pro Firebase */ Doplnění zkušeností z instalace.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
* Data ukládá binárně, ale stále na lokální zařízení.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
* Cloud Firestore je cloudová NoSQL databáze od Google, která je součástí platformy Google Firebase. &lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti Cloud Firestore ===&lt;br /&gt;
&lt;br /&gt;
; Výhody a nevýhody&lt;br /&gt;
* Firebase je dobře integrovaná do frameworku Flutter (Flutter také vyvíjí Google)&lt;br /&gt;
* Data se ukládají do cloudu – data může sdílet mobilní i webová aplikace&lt;br /&gt;
* Synchronizace dat v reálném čase&lt;br /&gt;
* Pro přístup k&amp;amp;nbsp;datům je potřeba připojení k&amp;amp;nbsp;internetu&lt;br /&gt;
* Pro malé projekty stačí varianta zdarma (pro větší bude třeba platit)&lt;br /&gt;
&lt;br /&gt;
; Struktura dat ve Firestore&lt;br /&gt;
* Data se neukládají do entit jako u ER databází – spíše jako několik seznamů objektů.&lt;br /&gt;
&lt;br /&gt;
Pojmy&lt;br /&gt;
* Dokument (Document) ... konkrétní záznam (jako jeden řádek v databázi) – například údaje o jednom uživateli.&lt;br /&gt;
* Pole (Field) ... konkrétní hodnota (atribut) – například jméno uživatele&lt;br /&gt;
* Kolekce (Collection) ... odpovídá entitě v ER databázích – je to vlastně seznam dokumentů&lt;br /&gt;
* Databáze (Database) ... skupina souvisejících kolekcí&lt;br /&gt;
* Projekt (Project) ... jeden projekt obvykle odpovídá jednomu softwarovému produktu. Může zahrnovat různé podoby jedné aplikace:&lt;br /&gt;
** IOS&lt;br /&gt;
** Android&lt;br /&gt;
** webová aplikace&lt;br /&gt;
** Unity&lt;br /&gt;
** Flutter multiplatformní aplikace&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
 users (kolekce)&lt;br /&gt;
    └── user1 (dokument)&lt;br /&gt;
          ├── name: &amp;quot;Jan&amp;quot;&lt;br /&gt;
          ├── age: 18&lt;br /&gt;
          └── email: &amp;quot;jan@email.cz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Nastavení projektu pro Firebase===&lt;br /&gt;
&lt;br /&gt;
; Založení projektu na webu Firebase&lt;br /&gt;
#Jdi na: [https://console.firebase.google.com Console.firebase.google.com]&lt;br /&gt;
#Klikni na Vytvořit projekt a zadej název projektu&lt;br /&gt;
#Po vytvoření přidej aplikaci (Android / iOS / Web)&lt;br /&gt;
&lt;br /&gt;
; Instalace FlutterFire CLI&lt;br /&gt;
# Nainstaluj Firebase CLI podle [https://firebase.google.com/docs/cli návodu z&amp;amp;nbsp; Firebase.google.com &amp;gt; CLI]&lt;br /&gt;
#* Bude nejspíš vyžadovate heslo správce počítače.&lt;br /&gt;
# Přihlaš se: &amp;lt;code&amp;gt;Firebase login&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Musíš rozhodnout, jestli budeš využívat Google Gemini v rámci Firebase a jestli může Google využívat statistická data.&lt;br /&gt;
#* Zvolíš účet Google, pod kterým budeš pracovat&lt;br /&gt;
# Založ projekt ve Flutteru jako obvykle&lt;br /&gt;
# Ve složce projektu spusť aktivaci FlutterFire CLI:&lt;br /&gt;
#: &amp;lt;code&amp;gt;dart pub global activate flutterfire_cli&amp;lt;/code&amp;gt;&lt;br /&gt;
#: &amp;lt;code&amp;gt;flutterfire configure --project='''nazev-projektu'''&amp;lt;/code&amp;gt;&lt;br /&gt;
#: Do projektu tím přibude konfigurační soubor: &amp;lt;code&amp;gt;lib/firebase_options.dart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Podle ChatGPT – ale neodpovídá návodu na Firebase:&lt;br /&gt;
Ve Flutter projektu spusť:&lt;br /&gt;
&lt;br /&gt;
 flutter pub add firebase_core&lt;br /&gt;
 flutter pub add cloud_firestore&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Inicializuj Firebase v main.dart:&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'firebase_options.dart';&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 &lt;br /&gt;
 await Firebase.initializeApp(&lt;br /&gt;
     options: DefaultFirebaseOptions.currentPlatform,&lt;br /&gt;
 );&lt;br /&gt;
&amp;lt;!-- Původní podle ChatGPT&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 &lt;br /&gt;
 void main() async {&lt;br /&gt;
   WidgetsFlutterBinding.ensureInitialized();&lt;br /&gt;
   await Firebase.initializeApp();&lt;br /&gt;
   runApp(MyApp());&lt;br /&gt;
 }&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Další plug-iny importuj dle potřeby viz dále&lt;br /&gt;
&lt;br /&gt;
=== Import Firestore ===&lt;br /&gt;
&lt;br /&gt;
Import:&lt;br /&gt;
&lt;br /&gt;
 import 'package:cloud_firestore/cloud_firestore.dart';&lt;br /&gt;
&lt;br /&gt;
Vytvoření instance pro přístup k databázi:&lt;br /&gt;
&lt;br /&gt;
 final FirebaseFirestore db = FirebaseFirestore.instance;&lt;br /&gt;
&lt;br /&gt;
=== Přidání nového dokumentu ===&lt;br /&gt;
 await db.collection('users').add({&lt;br /&gt;
   'name': 'Jan',&lt;br /&gt;
   'age': 18,&lt;br /&gt;
   'email': 'jan@email.cz',&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Tím se:&lt;br /&gt;
# vytvoří kolekce users (pokud neexistuje)&lt;br /&gt;
# přidá nový dokument s automatickým ID&lt;br /&gt;
&lt;br /&gt;
; Uložení dokumentu s vlastním ID&lt;br /&gt;
 await db.collection('users').doc('student1').set({&lt;br /&gt;
   'name': 'Petra',&lt;br /&gt;
   'age': 17,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Čtení dat z Firestore jednorázově===&lt;br /&gt;
&lt;br /&gt;
 var snapshot = await db.collection('users').get();&lt;br /&gt;
 &lt;br /&gt;
 for (var doc in snapshot.docs) {&lt;br /&gt;
   print(doc.data());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Čtení v reálném čase ===&lt;br /&gt;
&lt;br /&gt;
Firestore umožňuje poslouchat změny. Data se pak automaticky aktualizují, pokud proběhne změna v databázi (například z jiného zařízení připojeného ke stejnému projektu):&lt;br /&gt;
&lt;br /&gt;
 StreamBuilder(&lt;br /&gt;
   stream: db.collection('users').snapshots(),&lt;br /&gt;
   builder: (context, snapshot) {&lt;br /&gt;
     if (!snapshot.hasData) {&lt;br /&gt;
       return CircularProgressIndicator();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     var docs = snapshot.data!.docs;&lt;br /&gt;
 &lt;br /&gt;
     return ListView(&lt;br /&gt;
       children: docs.map((doc) {&lt;br /&gt;
         return ListTile(&lt;br /&gt;
           title: Text(doc['name']),&lt;br /&gt;
         );&lt;br /&gt;
       }).toList(),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
=== Aktualizace dat===&lt;br /&gt;
 await db.collection('users').doc('student1').update({&lt;br /&gt;
   'age': 18,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Smazání dat===&lt;br /&gt;
&lt;br /&gt;
; Smazání dokumentu&lt;br /&gt;
 await db.collection('users').doc('student1').delete();&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnostní pravidla (Rules) ===&lt;br /&gt;
&lt;br /&gt;
Ve Firebase konzoli nastav pravidla přístupu.&lt;br /&gt;
&lt;br /&gt;
Například pouze pro přihlášené uživatele:&lt;br /&gt;
&lt;br /&gt;
 rules_version = '2';&lt;br /&gt;
 service cloud.firestore {&lt;br /&gt;
   match /databases/{database}/documents {&lt;br /&gt;
     match /{document=**} {&lt;br /&gt;
       allow read, write: if request.auth != null;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* Základ sekce o Firebase byl vytvořen pomocí služby [https://www.chatgpt.com ChatGPT].&lt;br /&gt;
* [https://console.firebase.google.com/ Console.firebase.google.com &amp;gt; Postup nastavení projektu]&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLl-K7zZEsYLluG5MCVEzXAQ7ACZBCuZgZ YouTube.com &amp;gt; Get to know Cloud Firebase] (seriál videí)&lt;br /&gt;
* [https://cloud.google.com/firestore/pricing Google Cloud &amp;gt; Firestore Pricing]&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;br /&gt;
&lt;br /&gt;
* Framework, který umožňuje vytvořit projekt Flutteru se dvěma částmi: backendem a frontendem.&lt;br /&gt;
* Backend je následně možné spustit na svém serveru.&lt;br /&gt;
* Frontend běží na desktopu.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-23T06:00:18Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Google Firestore */ Lepší popis instalace podle stránek Firebase.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
* Data ukládá binárně, ale stále na lokální zařízení.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
* Cloud Firestore je cloudová NoSQL databáze od Google, která je součástí platformy Google Firebase. &lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti Cloud Firestore ===&lt;br /&gt;
&lt;br /&gt;
; Výhody a nevýhody&lt;br /&gt;
* Firebase je dobře integrovaná do frameworku Flutter (Flutter také vyvíjí Google)&lt;br /&gt;
* Data se ukládají do cloudu – data může sdílet mobilní i webová aplikace&lt;br /&gt;
* Synchronizace dat v reálném čase&lt;br /&gt;
* Pro přístup k&amp;amp;nbsp;datům je potřeba připojení k&amp;amp;nbsp;internetu&lt;br /&gt;
* Pro malé projekty stačí varianta zdarma (pro větší bude třeba platit)&lt;br /&gt;
&lt;br /&gt;
; Struktura dat ve Firestore&lt;br /&gt;
* Data se neukládají do entit jako u ER databází – spíše jako několik seznamů objektů.&lt;br /&gt;
&lt;br /&gt;
Pojmy&lt;br /&gt;
* Dokument (Document) ... konkrétní záznam (jako jeden řádek v databázi) – například údaje o jednom uživateli.&lt;br /&gt;
* Pole (Field) ... konkrétní hodnota (atribut) – například jméno uživatele&lt;br /&gt;
* Kolekce (Collection) ... odpovídá entitě v ER databázích – je to vlastně seznam dokumentů&lt;br /&gt;
* Databáze (Database) ... skupina souvisejících kolekcí&lt;br /&gt;
* Projekt (Project) ... jeden projekt obvykle odpovídá jednomu softwarovému produktu. Může zahrnovat různé podoby jedné aplikace:&lt;br /&gt;
** IOS&lt;br /&gt;
** Android&lt;br /&gt;
** webová aplikace&lt;br /&gt;
** Unity&lt;br /&gt;
** Flutter multiplatformní aplikace&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
 users (kolekce)&lt;br /&gt;
    └── user1 (dokument)&lt;br /&gt;
          ├── name: &amp;quot;Jan&amp;quot;&lt;br /&gt;
          ├── age: 18&lt;br /&gt;
          └── email: &amp;quot;jan@email.cz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Nastavení projektu pro Firebase===&lt;br /&gt;
&lt;br /&gt;
; Založení projektu na webu Firebase&lt;br /&gt;
#Jdi na: [https://console.firebase.google.com Console.firebase.google.com]&lt;br /&gt;
#Klikni na Vytvořit projekt a zadej název projektu&lt;br /&gt;
#Po vytvoření přidej aplikaci (Android / iOS / Web)&lt;br /&gt;
&lt;br /&gt;
; Instalace FlutterFire CLI&lt;br /&gt;
# Nainstaluj Firebase CLI podle [https://firebase.google.com/docs/cli návodu z&amp;amp;nbsp; Firebase.google.com &amp;gt; CLI]&lt;br /&gt;
# Přihlaš se: &amp;lt;code&amp;gt;Firebase login&amp;lt;/code&amp;gt;&lt;br /&gt;
# Založ projekt ve Flutteru&lt;br /&gt;
# Ve složce projektu spusť aktivaci FlutterFire CLI:&lt;br /&gt;
#: &amp;lt;code&amp;gt;dart pub global activate flutterfire_cli&amp;lt;/code&amp;gt;&lt;br /&gt;
#: &amp;lt;code&amp;gt;flutterfire configure --project='''nazev-projektu'''&amp;lt;/code&amp;gt;&lt;br /&gt;
#: Do projektu tím přibude konfigurační soubor: &amp;lt;code&amp;gt;lib/firebase_options.dart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Podle ChatGPT – ale neodpovídá návodu na Firebase:&lt;br /&gt;
Ve Flutter projektu spusť:&lt;br /&gt;
&lt;br /&gt;
 flutter pub add firebase_core&lt;br /&gt;
 flutter pub add cloud_firestore&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Inicializuj Firebase v main.dart:&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'firebase_options.dart';&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 &lt;br /&gt;
 await Firebase.initializeApp(&lt;br /&gt;
     options: DefaultFirebaseOptions.currentPlatform,&lt;br /&gt;
 );&lt;br /&gt;
&amp;lt;!-- Původní podle ChatGPT&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 &lt;br /&gt;
 void main() async {&lt;br /&gt;
   WidgetsFlutterBinding.ensureInitialized();&lt;br /&gt;
   await Firebase.initializeApp();&lt;br /&gt;
   runApp(MyApp());&lt;br /&gt;
 }&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Další plug-iny importuj dle potřeby viz dále&lt;br /&gt;
&lt;br /&gt;
=== Import Firestore ===&lt;br /&gt;
&lt;br /&gt;
Import:&lt;br /&gt;
&lt;br /&gt;
 import 'package:cloud_firestore/cloud_firestore.dart';&lt;br /&gt;
&lt;br /&gt;
Vytvoření instance pro přístup k databázi:&lt;br /&gt;
&lt;br /&gt;
 final FirebaseFirestore db = FirebaseFirestore.instance;&lt;br /&gt;
&lt;br /&gt;
=== Přidání nového dokumentu ===&lt;br /&gt;
 await db.collection('users').add({&lt;br /&gt;
   'name': 'Jan',&lt;br /&gt;
   'age': 18,&lt;br /&gt;
   'email': 'jan@email.cz',&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Tím se:&lt;br /&gt;
# vytvoří kolekce users (pokud neexistuje)&lt;br /&gt;
# přidá nový dokument s automatickým ID&lt;br /&gt;
&lt;br /&gt;
; Uložení dokumentu s vlastním ID&lt;br /&gt;
 await db.collection('users').doc('student1').set({&lt;br /&gt;
   'name': 'Petra',&lt;br /&gt;
   'age': 17,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Čtení dat z Firestore jednorázově===&lt;br /&gt;
&lt;br /&gt;
 var snapshot = await db.collection('users').get();&lt;br /&gt;
 &lt;br /&gt;
 for (var doc in snapshot.docs) {&lt;br /&gt;
   print(doc.data());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Čtení v reálném čase ===&lt;br /&gt;
&lt;br /&gt;
Firestore umožňuje poslouchat změny. Data se pak automaticky aktualizují, pokud proběhne změna v databázi (například z jiného zařízení připojeného ke stejnému projektu):&lt;br /&gt;
&lt;br /&gt;
 StreamBuilder(&lt;br /&gt;
   stream: db.collection('users').snapshots(),&lt;br /&gt;
   builder: (context, snapshot) {&lt;br /&gt;
     if (!snapshot.hasData) {&lt;br /&gt;
       return CircularProgressIndicator();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     var docs = snapshot.data!.docs;&lt;br /&gt;
 &lt;br /&gt;
     return ListView(&lt;br /&gt;
       children: docs.map((doc) {&lt;br /&gt;
         return ListTile(&lt;br /&gt;
           title: Text(doc['name']),&lt;br /&gt;
         );&lt;br /&gt;
       }).toList(),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
=== Aktualizace dat===&lt;br /&gt;
 await db.collection('users').doc('student1').update({&lt;br /&gt;
   'age': 18,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Smazání dat===&lt;br /&gt;
&lt;br /&gt;
; Smazání dokumentu&lt;br /&gt;
 await db.collection('users').doc('student1').delete();&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnostní pravidla (Rules) ===&lt;br /&gt;
&lt;br /&gt;
Ve Firebase konzoli nastav pravidla přístupu.&lt;br /&gt;
&lt;br /&gt;
Například pouze pro přihlášené uživatele:&lt;br /&gt;
&lt;br /&gt;
 rules_version = '2';&lt;br /&gt;
 service cloud.firestore {&lt;br /&gt;
   match /databases/{database}/documents {&lt;br /&gt;
     match /{document=**} {&lt;br /&gt;
       allow read, write: if request.auth != null;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* Základ sekce o Firebase byl vytvořen pomocí služby [https://www.chatgpt.com ChatGPT].&lt;br /&gt;
* [https://console.firebase.google.com/ Console.firebase.google.com &amp;gt; Postup nastavení projektu]&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLl-K7zZEsYLluG5MCVEzXAQ7ACZBCuZgZ YouTube.com &amp;gt; Get to know Cloud Firebase] (seriál videí)&lt;br /&gt;
* [https://cloud.google.com/firestore/pricing Google Cloud &amp;gt; Firestore Pricing]&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;br /&gt;
&lt;br /&gt;
* Framework, který umožňuje vytvořit projekt Flutteru se dvěma částmi: backendem a frontendem.&lt;br /&gt;
* Backend je následně možné spustit na svém serveru.&lt;br /&gt;
* Frontend běží na desktopu.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-22T02:29:22Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Google Firestore */ Opraven název na Cloud Firestore.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
* Data ukládá binárně, ale stále na lokální zařízení.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
* Cloud Firestore je cloudová NoSQL databáze od Google, která je součástí platformy Google Firebase. &lt;br /&gt;
&lt;br /&gt;
; Vlastnosti&lt;br /&gt;
* Firebase je dobře integrovaná do frameworku Flutter (Flutter také vyvíjí Google)&lt;br /&gt;
* Data se ukládají do cloudu – data může sdílet mobilní i webová aplikace&lt;br /&gt;
* Synchronizace dat v reálném čase&lt;br /&gt;
* Pro malé projekty stačí varianta zdarma (pro větší bude třeba platit)&lt;br /&gt;
&lt;br /&gt;
=== Struktura dat ve Firestore ===&lt;br /&gt;
* Data se neukládají do entit jako u ER databází – spíše jako několik seznamů objektů.&lt;br /&gt;
&lt;br /&gt;
; Pojmy:&lt;br /&gt;
* Dokument (Document) ... konkrétní záznam (jako jeden řádek v databázi) – například údaje o jednom uživateli.&lt;br /&gt;
* Pole (Field) ... konkrétní hodnota (atribut) – například jméno uživatele&lt;br /&gt;
* Kolekce (Collection) ... odpovídá entitě v ER databázích – je to vlastně seznam dokumentů&lt;br /&gt;
* Databáze (Database) ... skupina souvisejících kolekcí&lt;br /&gt;
* Projekt (Project) ... jeden projekt obvykle odpovídá jednomu softwarovému produktu. Může zahrnovat různé podoby jedné aplikace:&lt;br /&gt;
** IOS&lt;br /&gt;
** Android&lt;br /&gt;
** webová aplikace&lt;br /&gt;
** Unity&lt;br /&gt;
** Flutter multiplatformní aplikace&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
 users (kolekce)&lt;br /&gt;
    └── user1 (dokument)&lt;br /&gt;
          ├── name: &amp;quot;Jan&amp;quot;&lt;br /&gt;
          ├── age: 18&lt;br /&gt;
          └── email: &amp;quot;jan@email.cz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Vytvoření projektu ve Firebase===&lt;br /&gt;
&lt;br /&gt;
#Jdi na: [https://console.firebase.google.com Console.firebase.google.com]&lt;br /&gt;
#Klikni na Vytvořit projekt&lt;br /&gt;
#Zadej název projektu&lt;br /&gt;
#Po vytvoření přidej aplikaci (Android / iOS / Web)&lt;br /&gt;
&lt;br /&gt;
===Propojení Flutter aplikace s Firebase===&lt;br /&gt;
&lt;br /&gt;
Ve Flutter projektu spusť:&lt;br /&gt;
&lt;br /&gt;
 flutter pub add firebase_core&lt;br /&gt;
 flutter pub add cloud_firestore&lt;br /&gt;
&lt;br /&gt;
Poté inicializuj Firebase v main.dart:&lt;br /&gt;
&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 &lt;br /&gt;
 void main() async {&lt;br /&gt;
   WidgetsFlutterBinding.ensureInitialized();&lt;br /&gt;
   await Firebase.initializeApp();&lt;br /&gt;
   runApp(MyApp());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Ukládání dat do Firestore===&lt;br /&gt;
&lt;br /&gt;
; Importuj Firestore:&lt;br /&gt;
&lt;br /&gt;
 import 'package:cloud_firestore/cloud_firestore.dart';&lt;br /&gt;
&lt;br /&gt;
; Vytvoření instance pro přístup k databázi:&lt;br /&gt;
&lt;br /&gt;
 final FirebaseFirestore db = FirebaseFirestore.instance;&lt;br /&gt;
&lt;br /&gt;
; Přidání nového dokumentu&lt;br /&gt;
 await db.collection('users').add({&lt;br /&gt;
   'name': 'Jan',&lt;br /&gt;
   'age': 18,&lt;br /&gt;
   'email': 'jan@email.cz',&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Tím se:&lt;br /&gt;
# vytvoří kolekce users (pokud neexistuje)&lt;br /&gt;
# přidá nový dokument s automatickým ID&lt;br /&gt;
&lt;br /&gt;
; Uložení dokumentu s vlastním ID&lt;br /&gt;
 await db.collection('users').doc('student1').set({&lt;br /&gt;
   'name': 'Petra',&lt;br /&gt;
   'age': 17,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Čtení dat z Firestore jednorázově===&lt;br /&gt;
&lt;br /&gt;
 var snapshot = await db.collection('users').get();&lt;br /&gt;
 &lt;br /&gt;
 for (var doc in snapshot.docs) {&lt;br /&gt;
   print(doc.data());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Načtení v reálném čase ===&lt;br /&gt;
&lt;br /&gt;
Firestore umožňuje poslouchat změny. Data se pak automaticky aktualizují, pokud proběhne změna v databázi (například z jiného zařízení připojeného ke stejnému projektu):&lt;br /&gt;
&lt;br /&gt;
 StreamBuilder(&lt;br /&gt;
   stream: db.collection('users').snapshots(),&lt;br /&gt;
   builder: (context, snapshot) {&lt;br /&gt;
     if (!snapshot.hasData) {&lt;br /&gt;
       return CircularProgressIndicator();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     var docs = snapshot.data!.docs;&lt;br /&gt;
 &lt;br /&gt;
     return ListView(&lt;br /&gt;
       children: docs.map((doc) {&lt;br /&gt;
         return ListTile(&lt;br /&gt;
           title: Text(doc['name']),&lt;br /&gt;
         );&lt;br /&gt;
       }).toList(),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
=== Aktualizace dat===&lt;br /&gt;
 await db.collection('users').doc('student1').update({&lt;br /&gt;
   'age': 18,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Smazání dat===&lt;br /&gt;
&lt;br /&gt;
; Smazání dokumentu&lt;br /&gt;
 await db.collection('users').doc('student1').delete();&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnostní pravidla (Rules) ===&lt;br /&gt;
&lt;br /&gt;
Ve Firebase konzoli nastav pravidla přístupu.&lt;br /&gt;
&lt;br /&gt;
Například pouze pro přihlášené uživatele:&lt;br /&gt;
&lt;br /&gt;
 rules_version = '2';&lt;br /&gt;
 service cloud.firestore {&lt;br /&gt;
   match /databases/{database}/documents {&lt;br /&gt;
     match /{document=**} {&lt;br /&gt;
       allow read, write: if request.auth != null;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* Základ sekce o Firebase byl vytvořen pomocí služby [https://www.chatgpt.com ChatGPT].&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLl-K7zZEsYLluG5MCVEzXAQ7ACZBCuZgZ YouTube.com &amp;gt; Get to know Cloud Firebase] (seriál videí)&lt;br /&gt;
* [https://cloud.google.com/firestore/pricing Google Cloud &amp;gt; Firestore Pricing]&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;br /&gt;
&lt;br /&gt;
* Framework, který umožňuje vytvořit projekt Flutteru se dvěma částmi: backendem a frontendem.&lt;br /&gt;
* Backend je následně možné spustit na svém serveru.&lt;br /&gt;
* Frontend běží na desktopu.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-22T02:28:13Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Zdroje */ Přidán seriál videí Get to know Cloud Firebase.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
* Data ukládá binárně, ale stále na lokální zařízení.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
* Google Firestore je cloudová NoSQL databáze od Google, která je součástí platformy Firebase. &lt;br /&gt;
&lt;br /&gt;
; Vlastnosti&lt;br /&gt;
* Firebase je dobře integrovaná do frameworku Flutter (Flutter také vyvíjí Google)&lt;br /&gt;
* Data se ukládají do cloudu – data může sdílet mobilní i webová aplikace&lt;br /&gt;
* Synchronizace dat v reálném čase&lt;br /&gt;
* Pro malé projekty stačí varianta zdarma (pro větší bude třeba platit)&lt;br /&gt;
&lt;br /&gt;
=== Struktura dat ve Firestore ===&lt;br /&gt;
* Data se neukládají do entit jako u ER databází – spíše jako několik seznamů objektů.&lt;br /&gt;
&lt;br /&gt;
; Pojmy:&lt;br /&gt;
* Dokument (Document) ... konkrétní záznam (jako jeden řádek v databázi) – například údaje o jednom uživateli.&lt;br /&gt;
* Pole (Field) ... konkrétní hodnota (atribut) – například jméno uživatele&lt;br /&gt;
* Kolekce (Collection) ... odpovídá entitě v ER databázích – je to vlastně seznam dokumentů&lt;br /&gt;
* Databáze (Database) ... skupina souvisejících kolekcí&lt;br /&gt;
* Projekt (Project) ... jeden projekt obvykle odpovídá jednomu softwarovému produktu. Může zahrnovat různé podoby jedné aplikace:&lt;br /&gt;
** IOS&lt;br /&gt;
** Android&lt;br /&gt;
** webová aplikace&lt;br /&gt;
** Unity&lt;br /&gt;
** Flutter multiplatformní aplikace&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
 users (kolekce)&lt;br /&gt;
    └── user1 (dokument)&lt;br /&gt;
          ├── name: &amp;quot;Jan&amp;quot;&lt;br /&gt;
          ├── age: 18&lt;br /&gt;
          └── email: &amp;quot;jan@email.cz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Vytvoření projektu ve Firebase===&lt;br /&gt;
&lt;br /&gt;
#Jdi na: [https://console.firebase.google.com Console.firebase.google.com]&lt;br /&gt;
#Klikni na Vytvořit projekt&lt;br /&gt;
#Zadej název projektu&lt;br /&gt;
#Po vytvoření přidej aplikaci (Android / iOS / Web)&lt;br /&gt;
&lt;br /&gt;
===Propojení Flutter aplikace s Firebase===&lt;br /&gt;
&lt;br /&gt;
Ve Flutter projektu spusť:&lt;br /&gt;
&lt;br /&gt;
 flutter pub add firebase_core&lt;br /&gt;
 flutter pub add cloud_firestore&lt;br /&gt;
&lt;br /&gt;
Poté inicializuj Firebase v main.dart:&lt;br /&gt;
&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 &lt;br /&gt;
 void main() async {&lt;br /&gt;
   WidgetsFlutterBinding.ensureInitialized();&lt;br /&gt;
   await Firebase.initializeApp();&lt;br /&gt;
   runApp(MyApp());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Ukládání dat do Firestore===&lt;br /&gt;
&lt;br /&gt;
; Importuj Firestore:&lt;br /&gt;
&lt;br /&gt;
 import 'package:cloud_firestore/cloud_firestore.dart';&lt;br /&gt;
&lt;br /&gt;
; Vytvoření instance pro přístup k databázi:&lt;br /&gt;
&lt;br /&gt;
 final FirebaseFirestore db = FirebaseFirestore.instance;&lt;br /&gt;
&lt;br /&gt;
; Přidání nového dokumentu&lt;br /&gt;
 await db.collection('users').add({&lt;br /&gt;
   'name': 'Jan',&lt;br /&gt;
   'age': 18,&lt;br /&gt;
   'email': 'jan@email.cz',&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Tím se:&lt;br /&gt;
# vytvoří kolekce users (pokud neexistuje)&lt;br /&gt;
# přidá nový dokument s automatickým ID&lt;br /&gt;
&lt;br /&gt;
; Uložení dokumentu s vlastním ID&lt;br /&gt;
 await db.collection('users').doc('student1').set({&lt;br /&gt;
   'name': 'Petra',&lt;br /&gt;
   'age': 17,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Čtení dat z Firestore jednorázově===&lt;br /&gt;
&lt;br /&gt;
 var snapshot = await db.collection('users').get();&lt;br /&gt;
 &lt;br /&gt;
 for (var doc in snapshot.docs) {&lt;br /&gt;
   print(doc.data());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Načtení v reálném čase ===&lt;br /&gt;
&lt;br /&gt;
Firestore umožňuje poslouchat změny. Data se pak automaticky aktualizují, pokud proběhne změna v databázi (například z jiného zařízení připojeného ke stejnému projektu):&lt;br /&gt;
&lt;br /&gt;
 StreamBuilder(&lt;br /&gt;
   stream: db.collection('users').snapshots(),&lt;br /&gt;
   builder: (context, snapshot) {&lt;br /&gt;
     if (!snapshot.hasData) {&lt;br /&gt;
       return CircularProgressIndicator();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     var docs = snapshot.data!.docs;&lt;br /&gt;
 &lt;br /&gt;
     return ListView(&lt;br /&gt;
       children: docs.map((doc) {&lt;br /&gt;
         return ListTile(&lt;br /&gt;
           title: Text(doc['name']),&lt;br /&gt;
         );&lt;br /&gt;
       }).toList(),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
=== Aktualizace dat===&lt;br /&gt;
 await db.collection('users').doc('student1').update({&lt;br /&gt;
   'age': 18,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Smazání dat===&lt;br /&gt;
&lt;br /&gt;
; Smazání dokumentu&lt;br /&gt;
 await db.collection('users').doc('student1').delete();&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnostní pravidla (Rules) ===&lt;br /&gt;
&lt;br /&gt;
Ve Firebase konzoli nastav pravidla přístupu.&lt;br /&gt;
&lt;br /&gt;
Například pouze pro přihlášené uživatele:&lt;br /&gt;
&lt;br /&gt;
 rules_version = '2';&lt;br /&gt;
 service cloud.firestore {&lt;br /&gt;
   match /databases/{database}/documents {&lt;br /&gt;
     match /{document=**} {&lt;br /&gt;
       allow read, write: if request.auth != null;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* Základ sekce o Firebase byl vytvořen pomocí služby [https://www.chatgpt.com ChatGPT].&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLl-K7zZEsYLluG5MCVEzXAQ7ACZBCuZgZ YouTube.com &amp;gt; Get to know Cloud Firebase] (seriál videí)&lt;br /&gt;
* [https://cloud.google.com/firestore/pricing Google Cloud &amp;gt; Firestore Pricing]&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;br /&gt;
&lt;br /&gt;
* Framework, který umožňuje vytvořit projekt Flutteru se dvěma částmi: backendem a frontendem.&lt;br /&gt;
* Backend je následně možné spustit na svém serveru.&lt;br /&gt;
* Frontend běží na desktopu.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-22T02:05:48Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Smazání dat */ Oprava formátování&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
* Data ukládá binárně, ale stále na lokální zařízení.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
* Google Firestore je cloudová NoSQL databáze od Google, která je součástí platformy Firebase. &lt;br /&gt;
&lt;br /&gt;
; Vlastnosti&lt;br /&gt;
* Firebase je dobře integrovaná do frameworku Flutter (Flutter také vyvíjí Google)&lt;br /&gt;
* Data se ukládají do cloudu – data může sdílet mobilní i webová aplikace&lt;br /&gt;
* Synchronizace dat v reálném čase&lt;br /&gt;
* Pro malé projekty stačí varianta zdarma (pro větší bude třeba platit)&lt;br /&gt;
&lt;br /&gt;
=== Struktura dat ve Firestore ===&lt;br /&gt;
* Data se neukládají do entit jako u ER databází – spíše jako několik seznamů objektů.&lt;br /&gt;
&lt;br /&gt;
; Pojmy:&lt;br /&gt;
* Dokument (Document) ... konkrétní záznam (jako jeden řádek v databázi) – například údaje o jednom uživateli.&lt;br /&gt;
* Pole (Field) ... konkrétní hodnota (atribut) – například jméno uživatele&lt;br /&gt;
* Kolekce (Collection) ... odpovídá entitě v ER databázích – je to vlastně seznam dokumentů&lt;br /&gt;
* Databáze (Database) ... skupina souvisejících kolekcí&lt;br /&gt;
* Projekt (Project) ... jeden projekt obvykle odpovídá jednomu softwarovému produktu. Může zahrnovat různé podoby jedné aplikace:&lt;br /&gt;
** IOS&lt;br /&gt;
** Android&lt;br /&gt;
** webová aplikace&lt;br /&gt;
** Unity&lt;br /&gt;
** Flutter multiplatformní aplikace&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
 users (kolekce)&lt;br /&gt;
    └── user1 (dokument)&lt;br /&gt;
          ├── name: &amp;quot;Jan&amp;quot;&lt;br /&gt;
          ├── age: 18&lt;br /&gt;
          └── email: &amp;quot;jan@email.cz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Vytvoření projektu ve Firebase===&lt;br /&gt;
&lt;br /&gt;
#Jdi na: [https://console.firebase.google.com Console.firebase.google.com]&lt;br /&gt;
#Klikni na Vytvořit projekt&lt;br /&gt;
#Zadej název projektu&lt;br /&gt;
#Po vytvoření přidej aplikaci (Android / iOS / Web)&lt;br /&gt;
&lt;br /&gt;
===Propojení Flutter aplikace s Firebase===&lt;br /&gt;
&lt;br /&gt;
Ve Flutter projektu spusť:&lt;br /&gt;
&lt;br /&gt;
 flutter pub add firebase_core&lt;br /&gt;
 flutter pub add cloud_firestore&lt;br /&gt;
&lt;br /&gt;
Poté inicializuj Firebase v main.dart:&lt;br /&gt;
&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 &lt;br /&gt;
 void main() async {&lt;br /&gt;
   WidgetsFlutterBinding.ensureInitialized();&lt;br /&gt;
   await Firebase.initializeApp();&lt;br /&gt;
   runApp(MyApp());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Ukládání dat do Firestore===&lt;br /&gt;
&lt;br /&gt;
; Importuj Firestore:&lt;br /&gt;
&lt;br /&gt;
 import 'package:cloud_firestore/cloud_firestore.dart';&lt;br /&gt;
&lt;br /&gt;
; Vytvoření instance pro přístup k databázi:&lt;br /&gt;
&lt;br /&gt;
 final FirebaseFirestore db = FirebaseFirestore.instance;&lt;br /&gt;
&lt;br /&gt;
; Přidání nového dokumentu&lt;br /&gt;
 await db.collection('users').add({&lt;br /&gt;
   'name': 'Jan',&lt;br /&gt;
   'age': 18,&lt;br /&gt;
   'email': 'jan@email.cz',&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Tím se:&lt;br /&gt;
# vytvoří kolekce users (pokud neexistuje)&lt;br /&gt;
# přidá nový dokument s automatickým ID&lt;br /&gt;
&lt;br /&gt;
; Uložení dokumentu s vlastním ID&lt;br /&gt;
 await db.collection('users').doc('student1').set({&lt;br /&gt;
   'name': 'Petra',&lt;br /&gt;
   'age': 17,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Čtení dat z Firestore jednorázově===&lt;br /&gt;
&lt;br /&gt;
 var snapshot = await db.collection('users').get();&lt;br /&gt;
 &lt;br /&gt;
 for (var doc in snapshot.docs) {&lt;br /&gt;
   print(doc.data());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Načtení v reálném čase ===&lt;br /&gt;
&lt;br /&gt;
Firestore umožňuje poslouchat změny. Data se pak automaticky aktualizují, pokud proběhne změna v databázi (například z jiného zařízení připojeného ke stejnému projektu):&lt;br /&gt;
&lt;br /&gt;
 StreamBuilder(&lt;br /&gt;
   stream: db.collection('users').snapshots(),&lt;br /&gt;
   builder: (context, snapshot) {&lt;br /&gt;
     if (!snapshot.hasData) {&lt;br /&gt;
       return CircularProgressIndicator();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     var docs = snapshot.data!.docs;&lt;br /&gt;
 &lt;br /&gt;
     return ListView(&lt;br /&gt;
       children: docs.map((doc) {&lt;br /&gt;
         return ListTile(&lt;br /&gt;
           title: Text(doc['name']),&lt;br /&gt;
         );&lt;br /&gt;
       }).toList(),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
=== Aktualizace dat===&lt;br /&gt;
 await db.collection('users').doc('student1').update({&lt;br /&gt;
   'age': 18,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Smazání dat===&lt;br /&gt;
&lt;br /&gt;
; Smazání dokumentu&lt;br /&gt;
 await db.collection('users').doc('student1').delete();&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnostní pravidla (Rules) ===&lt;br /&gt;
&lt;br /&gt;
Ve Firebase konzoli nastav pravidla přístupu.&lt;br /&gt;
&lt;br /&gt;
Například pouze pro přihlášené uživatele:&lt;br /&gt;
&lt;br /&gt;
 rules_version = '2';&lt;br /&gt;
 service cloud.firestore {&lt;br /&gt;
   match /databases/{database}/documents {&lt;br /&gt;
     match /{document=**} {&lt;br /&gt;
       allow read, write: if request.auth != null;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* Sekce o Firebase byla vytvořena pomocí služby [https://www.chatgpt.com ChatGPT].&lt;br /&gt;
* [https://cloud.google.com/firestore/pricing Google Cloud &amp;gt; Firestore Pricing]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;br /&gt;
&lt;br /&gt;
* Framework, který umožňuje vytvořit projekt Flutteru se dvěma částmi: backendem a frontendem.&lt;br /&gt;
* Backend je následně možné spustit na svém serveru.&lt;br /&gt;
* Frontend běží na desktopu.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-22T02:00:09Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Struktura dat ve Firestore */ Doplněny možné podoby – aplikace.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
* Data ukládá binárně, ale stále na lokální zařízení.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
* Google Firestore je cloudová NoSQL databáze od Google, která je součástí platformy Firebase. &lt;br /&gt;
&lt;br /&gt;
; Vlastnosti&lt;br /&gt;
* Firebase je dobře integrovaná do frameworku Flutter (Flutter také vyvíjí Google)&lt;br /&gt;
* Data se ukládají do cloudu – data může sdílet mobilní i webová aplikace&lt;br /&gt;
* Synchronizace dat v reálném čase&lt;br /&gt;
* Pro malé projekty stačí varianta zdarma (pro větší bude třeba platit)&lt;br /&gt;
&lt;br /&gt;
=== Struktura dat ve Firestore ===&lt;br /&gt;
* Data se neukládají do entit jako u ER databází – spíše jako několik seznamů objektů.&lt;br /&gt;
&lt;br /&gt;
; Pojmy:&lt;br /&gt;
* Dokument (Document) ... konkrétní záznam (jako jeden řádek v databázi) – například údaje o jednom uživateli.&lt;br /&gt;
* Pole (Field) ... konkrétní hodnota (atribut) – například jméno uživatele&lt;br /&gt;
* Kolekce (Collection) ... odpovídá entitě v ER databázích – je to vlastně seznam dokumentů&lt;br /&gt;
* Databáze (Database) ... skupina souvisejících kolekcí&lt;br /&gt;
* Projekt (Project) ... jeden projekt obvykle odpovídá jednomu softwarovému produktu. Může zahrnovat různé podoby jedné aplikace:&lt;br /&gt;
** IOS&lt;br /&gt;
** Android&lt;br /&gt;
** webová aplikace&lt;br /&gt;
** Unity&lt;br /&gt;
** Flutter multiplatformní aplikace&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
 users (kolekce)&lt;br /&gt;
    └── user1 (dokument)&lt;br /&gt;
          ├── name: &amp;quot;Jan&amp;quot;&lt;br /&gt;
          ├── age: 18&lt;br /&gt;
          └── email: &amp;quot;jan@email.cz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Vytvoření projektu ve Firebase===&lt;br /&gt;
&lt;br /&gt;
#Jdi na: [https://console.firebase.google.com Console.firebase.google.com]&lt;br /&gt;
#Klikni na Vytvořit projekt&lt;br /&gt;
#Zadej název projektu&lt;br /&gt;
#Po vytvoření přidej aplikaci (Android / iOS / Web)&lt;br /&gt;
&lt;br /&gt;
===Propojení Flutter aplikace s Firebase===&lt;br /&gt;
&lt;br /&gt;
Ve Flutter projektu spusť:&lt;br /&gt;
&lt;br /&gt;
 flutter pub add firebase_core&lt;br /&gt;
 flutter pub add cloud_firestore&lt;br /&gt;
&lt;br /&gt;
Poté inicializuj Firebase v main.dart:&lt;br /&gt;
&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 &lt;br /&gt;
 void main() async {&lt;br /&gt;
   WidgetsFlutterBinding.ensureInitialized();&lt;br /&gt;
   await Firebase.initializeApp();&lt;br /&gt;
   runApp(MyApp());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Ukládání dat do Firestore===&lt;br /&gt;
&lt;br /&gt;
; Importuj Firestore:&lt;br /&gt;
&lt;br /&gt;
 import 'package:cloud_firestore/cloud_firestore.dart';&lt;br /&gt;
&lt;br /&gt;
; Vytvoření instance pro přístup k databázi:&lt;br /&gt;
&lt;br /&gt;
 final FirebaseFirestore db = FirebaseFirestore.instance;&lt;br /&gt;
&lt;br /&gt;
; Přidání nového dokumentu&lt;br /&gt;
 await db.collection('users').add({&lt;br /&gt;
   'name': 'Jan',&lt;br /&gt;
   'age': 18,&lt;br /&gt;
   'email': 'jan@email.cz',&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Tím se:&lt;br /&gt;
# vytvoří kolekce users (pokud neexistuje)&lt;br /&gt;
# přidá nový dokument s automatickým ID&lt;br /&gt;
&lt;br /&gt;
; Uložení dokumentu s vlastním ID&lt;br /&gt;
 await db.collection('users').doc('student1').set({&lt;br /&gt;
   'name': 'Petra',&lt;br /&gt;
   'age': 17,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Čtení dat z Firestore jednorázově===&lt;br /&gt;
&lt;br /&gt;
 var snapshot = await db.collection('users').get();&lt;br /&gt;
 &lt;br /&gt;
 for (var doc in snapshot.docs) {&lt;br /&gt;
   print(doc.data());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Načtení v reálném čase ===&lt;br /&gt;
&lt;br /&gt;
Firestore umožňuje poslouchat změny. Data se pak automaticky aktualizují, pokud proběhne změna v databázi (například z jiného zařízení připojeného ke stejnému projektu):&lt;br /&gt;
&lt;br /&gt;
 StreamBuilder(&lt;br /&gt;
   stream: db.collection('users').snapshots(),&lt;br /&gt;
   builder: (context, snapshot) {&lt;br /&gt;
     if (!snapshot.hasData) {&lt;br /&gt;
       return CircularProgressIndicator();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     var docs = snapshot.data!.docs;&lt;br /&gt;
 &lt;br /&gt;
     return ListView(&lt;br /&gt;
       children: docs.map((doc) {&lt;br /&gt;
         return ListTile(&lt;br /&gt;
           title: Text(doc['name']),&lt;br /&gt;
         );&lt;br /&gt;
       }).toList(),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
=== Aktualizace dat===&lt;br /&gt;
 await db.collection('users').doc('student1').update({&lt;br /&gt;
   'age': 18,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Smazání dat===&lt;br /&gt;
&lt;br /&gt;
; Smazání dokumentu&lt;br /&gt;
await db.collection('users').doc('student1').delete();&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnostní pravidla (Rules) ===&lt;br /&gt;
&lt;br /&gt;
Ve Firebase konzoli nastav pravidla přístupu.&lt;br /&gt;
&lt;br /&gt;
Například pouze pro přihlášené uživatele:&lt;br /&gt;
&lt;br /&gt;
 rules_version = '2';&lt;br /&gt;
 service cloud.firestore {&lt;br /&gt;
   match /databases/{database}/documents {&lt;br /&gt;
     match /{document=**} {&lt;br /&gt;
       allow read, write: if request.auth != null;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* Sekce o Firebase byla vytvořena pomocí služby [https://www.chatgpt.com ChatGPT].&lt;br /&gt;
* [https://cloud.google.com/firestore/pricing Google Cloud &amp;gt; Firestore Pricing]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;br /&gt;
&lt;br /&gt;
* Framework, který umožňuje vytvořit projekt Flutteru se dvěma částmi: backendem a frontendem.&lt;br /&gt;
* Backend je následně možné spustit na svém serveru.&lt;br /&gt;
* Frontend běží na desktopu.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-22T01:55:28Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Vytvořená sekce o Firebase – zatím pomocí ChatGPT.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
* Data ukládá binárně, ale stále na lokální zařízení.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
* Google Firestore je cloudová NoSQL databáze od Google, která je součástí platformy Firebase. &lt;br /&gt;
&lt;br /&gt;
; Vlastnosti&lt;br /&gt;
* Firebase je dobře integrovaná do frameworku Flutter (Flutter také vyvíjí Google)&lt;br /&gt;
* Data se ukládají do cloudu – data může sdílet mobilní i webová aplikace&lt;br /&gt;
* Synchronizace dat v reálném čase&lt;br /&gt;
* Pro malé projekty stačí varianta zdarma (pro větší bude třeba platit)&lt;br /&gt;
&lt;br /&gt;
=== Struktura dat ve Firestore ===&lt;br /&gt;
* Data se neukládají do entit jako u ER databází – spíše jako několik seznamů objektů.&lt;br /&gt;
&lt;br /&gt;
; Pojmy:&lt;br /&gt;
* Dokument (Document) ... konkrétní záznam (jako jeden řádek v databázi) – například údaje o jednom uživateli.&lt;br /&gt;
* Pole (Field) ... konkrétní hodnota (atribut) – například jméno uživatele&lt;br /&gt;
* Kolekce (Collection) ... odpovídá entitě v ER databázích – je to vlastně seznam dokumentů&lt;br /&gt;
* Databáze (Database) ... skupina souvisejících kolekcí&lt;br /&gt;
* Projekt (Project) ... jeden projekt obvykle odpovídá jednomu projektu ve Flutteru (jedné aplikaci, která může mít více podob – Android, IOS, web, ...)&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
 users (kolekce)&lt;br /&gt;
    └── user1 (dokument)&lt;br /&gt;
          ├── name: &amp;quot;Jan&amp;quot;&lt;br /&gt;
          ├── age: 18&lt;br /&gt;
          └── email: &amp;quot;jan@email.cz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Vytvoření projektu ve Firebase===&lt;br /&gt;
&lt;br /&gt;
#Jdi na: [https://console.firebase.google.com Console.firebase.google.com]&lt;br /&gt;
#Klikni na Vytvořit projekt&lt;br /&gt;
#Zadej název projektu&lt;br /&gt;
#Po vytvoření přidej aplikaci (Android / iOS / Web)&lt;br /&gt;
&lt;br /&gt;
===Propojení Flutter aplikace s Firebase===&lt;br /&gt;
&lt;br /&gt;
Ve Flutter projektu spusť:&lt;br /&gt;
&lt;br /&gt;
 flutter pub add firebase_core&lt;br /&gt;
 flutter pub add cloud_firestore&lt;br /&gt;
&lt;br /&gt;
Poté inicializuj Firebase v main.dart:&lt;br /&gt;
&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 &lt;br /&gt;
 void main() async {&lt;br /&gt;
   WidgetsFlutterBinding.ensureInitialized();&lt;br /&gt;
   await Firebase.initializeApp();&lt;br /&gt;
   runApp(MyApp());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Ukládání dat do Firestore===&lt;br /&gt;
&lt;br /&gt;
; Importuj Firestore:&lt;br /&gt;
&lt;br /&gt;
 import 'package:cloud_firestore/cloud_firestore.dart';&lt;br /&gt;
&lt;br /&gt;
; Vytvoření instance pro přístup k databázi:&lt;br /&gt;
&lt;br /&gt;
 final FirebaseFirestore db = FirebaseFirestore.instance;&lt;br /&gt;
&lt;br /&gt;
; Přidání nového dokumentu&lt;br /&gt;
 await db.collection('users').add({&lt;br /&gt;
   'name': 'Jan',&lt;br /&gt;
   'age': 18,&lt;br /&gt;
   'email': 'jan@email.cz',&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Tím se:&lt;br /&gt;
# vytvoří kolekce users (pokud neexistuje)&lt;br /&gt;
# přidá nový dokument s automatickým ID&lt;br /&gt;
&lt;br /&gt;
; Uložení dokumentu s vlastním ID&lt;br /&gt;
 await db.collection('users').doc('student1').set({&lt;br /&gt;
   'name': 'Petra',&lt;br /&gt;
   'age': 17,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Čtení dat z Firestore jednorázově===&lt;br /&gt;
&lt;br /&gt;
 var snapshot = await db.collection('users').get();&lt;br /&gt;
 &lt;br /&gt;
 for (var doc in snapshot.docs) {&lt;br /&gt;
   print(doc.data());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Načtení v reálném čase ===&lt;br /&gt;
&lt;br /&gt;
Firestore umožňuje poslouchat změny. Data se pak automaticky aktualizují, pokud proběhne změna v databázi (například z jiného zařízení připojeného ke stejnému projektu):&lt;br /&gt;
&lt;br /&gt;
 StreamBuilder(&lt;br /&gt;
   stream: db.collection('users').snapshots(),&lt;br /&gt;
   builder: (context, snapshot) {&lt;br /&gt;
     if (!snapshot.hasData) {&lt;br /&gt;
       return CircularProgressIndicator();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     var docs = snapshot.data!.docs;&lt;br /&gt;
 &lt;br /&gt;
     return ListView(&lt;br /&gt;
       children: docs.map((doc) {&lt;br /&gt;
         return ListTile(&lt;br /&gt;
           title: Text(doc['name']),&lt;br /&gt;
         );&lt;br /&gt;
       }).toList(),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
=== Aktualizace dat===&lt;br /&gt;
 await db.collection('users').doc('student1').update({&lt;br /&gt;
   'age': 18,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Smazání dat===&lt;br /&gt;
&lt;br /&gt;
; Smazání dokumentu&lt;br /&gt;
await db.collection('users').doc('student1').delete();&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnostní pravidla (Rules) ===&lt;br /&gt;
&lt;br /&gt;
Ve Firebase konzoli nastav pravidla přístupu.&lt;br /&gt;
&lt;br /&gt;
Například pouze pro přihlášené uživatele:&lt;br /&gt;
&lt;br /&gt;
 rules_version = '2';&lt;br /&gt;
 service cloud.firestore {&lt;br /&gt;
   match /databases/{database}/documents {&lt;br /&gt;
     match /{document=**} {&lt;br /&gt;
       allow read, write: if request.auth != null;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* Sekce o Firebase byla vytvořena pomocí služby [https://www.chatgpt.com ChatGPT].&lt;br /&gt;
* [https://cloud.google.com/firestore/pricing Google Cloud &amp;gt; Firestore Pricing]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;br /&gt;
&lt;br /&gt;
* Framework, který umožňuje vytvořit projekt Flutteru se dvěma částmi: backendem a frontendem.&lt;br /&gt;
* Backend je následně možné spustit na svém serveru.&lt;br /&gt;
* Frontend běží na desktopu.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-22T01:04:57Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Lokální export do JSON pomocí jsonEncode/Decode().&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/S%C3%AD%C5%A5ov%C3%A9_%C3%BAtoky</id>
		<title>Síťové útoky</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/S%C3%AD%C5%A5ov%C3%A9_%C3%BAtoky"/>
				<updated>2026-02-20T10:59:59Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* 6. Malware šířený sítí */ Oprava nadpisu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DoS / DDoS útok (Denial of Service) ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Způsobit nedostupnost síťového prostředku (typicky webového serveru či připojení k&amp;amp;nbsp;internetu).&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Útočník si vytvoří nebo pronajme botnet (síť napadených počítačů).&lt;br /&gt;
#* Každé zařízení je schopné odesílat síťové požadavky na pokyn útočníka.&lt;br /&gt;
# Zahájení útoku&lt;br /&gt;
#* Botnet začne současně posílat obrovské množství datagramů nebo požadavků na server.&lt;br /&gt;
#* Protože se jedná o legitimní požadavky (například zobrazení webové stránky ze serveru) z&amp;amp;nbsp;různých počítačů, není jednoduché útok filtrovat na základě běžných firewallů.&lt;br /&gt;
#* Server má omezené prostředky a nestíhá zpracovat všechny požadavky.&lt;br /&gt;
# Výsledek&lt;br /&gt;
#* Legitimní uživatelé se nedostanou ke službě.&lt;br /&gt;
#* Server může úplně spadnout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Phishing ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Získat citlivé informace o uživateli.&lt;br /&gt;
* Typickým cílem jsou přihlašovací údaje do elektronického bankovnictví nebo čísla kreditních karet.&lt;br /&gt;
&lt;br /&gt;
; Průběh útoku&lt;br /&gt;
# Příprava falešného prostředí&lt;br /&gt;
#* Útočník vytvoří kopii webu (např. banky).&lt;br /&gt;
#* Vypadá téměř identicky jako originál.&lt;br /&gt;
# Distribuce&lt;br /&gt;
#* Pošle e-mail nebo SMS s odkazem.&lt;br /&gt;
#* Často používá psychologický nátlak:&lt;br /&gt;
#** „Účet bude zablokován“&lt;br /&gt;
#** „Potvrďte ihned platbu“&lt;br /&gt;
# Získání údajů&lt;br /&gt;
#* Oběť zadá:&lt;br /&gt;
#** login&lt;br /&gt;
#** heslo&lt;br /&gt;
#** číslo karty&lt;br /&gt;
# Zneužití&lt;br /&gt;
#* Útočník se přihlásí do skutečného účtu.&lt;br /&gt;
#* Může převést peníze nebo ukrást data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Man-in-the-Middle (MITM) ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Odposlechnout údaje spojení, které měly zůstat důvěrné.&lt;br /&gt;
* Narušit šifrovanou komunikaci.&lt;br /&gt;
&lt;br /&gt;
; Průběh útoku&lt;br /&gt;
# Získání pozice mezi komunikujícími&lt;br /&gt;
#* Útočník vytvoří falešnou Wi-Fi síť nebo provede ARP spoofing.&lt;br /&gt;
# Přesměrování komunikace&lt;br /&gt;
#* Oběť si myslí, že komunikuje přímo se serverem.&lt;br /&gt;
#* Ve skutečnosti data prochází přes útočníka.&lt;br /&gt;
# Odposlech / manipulace&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** číst přenášená data&lt;br /&gt;
#** měnit obsah&lt;br /&gt;
#** vkládat škodlivý kód&lt;br /&gt;
# Nenápadnost&lt;br /&gt;
#* Komunikace často pokračuje bez přerušení.&lt;br /&gt;
#* Oběť si útoku nevšimne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spoofing (podvržení identity) ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Falšování identity&lt;br /&gt;
#* Útočník změní identifikační údaje:&lt;br /&gt;
#** IP adresu&lt;br /&gt;
#** e-mailovou hlavičku&lt;br /&gt;
#** DNS záznam&lt;br /&gt;
# Navázání důvěry&lt;br /&gt;
#* Systém nebo uživatel věří, že komunikace je legitimní.&lt;br /&gt;
# Zneužití&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** získat přístup&lt;br /&gt;
#** přesměrovat komunikaci&lt;br /&gt;
#** spustit další útok.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brute-Force útok ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Získání cíle&lt;br /&gt;
#* Útočník zná přihlašovací stránku nebo účet.&lt;br /&gt;
# Automatizované pokusy&lt;br /&gt;
#* Program zkouší tisíce hesel za sekundu.&lt;br /&gt;
#* Používají se slovníky běžných hesel.&lt;br /&gt;
#* Pokud je heslo slabé, je nalezeno velmi rychle.&lt;br /&gt;
# Převzetí účtu&lt;br /&gt;
#* Útočník získá plnou kontrolu nad účtem a může ho dále zneužít.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Malware šířený sítí ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Distribuce&lt;br /&gt;
#* E-mailová příloha&lt;br /&gt;
#* stažení z webu&lt;br /&gt;
#* exploit zranitelnosti&lt;br /&gt;
# Spuštění&lt;br /&gt;
#* Uživatel otevře soubor nebo klikne na odkaz.&lt;br /&gt;
#* Malware se nainstaluje.&lt;br /&gt;
# Skrytá činnost&lt;br /&gt;
#* Běží na pozadí:&lt;br /&gt;
#** krade data&lt;br /&gt;
#** zaznamenává stisky kláves&lt;br /&gt;
#** šifruje soubory&lt;br /&gt;
# Další šíření&lt;br /&gt;
#* Může napadat další zařízení v síti.&lt;br /&gt;
&lt;br /&gt;
== SQL Injection ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Nalezení zranitelného formuláře&lt;br /&gt;
* Například přihlašovací pole.&lt;br /&gt;
# Vložení škodlivého kódu&lt;br /&gt;
#* Útočník zadá SQL příkaz místo běžného textu.&lt;br /&gt;
# Spuštění databázového dotazu&lt;br /&gt;
#* Server příkaz vykoná, protože není správně ošetřen vstup.&lt;br /&gt;
# Získání dat&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** zobrazit databázi&lt;br /&gt;
#** upravovat záznamy&lt;br /&gt;
#** mazat data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Společný průběh většiny útoků ==&lt;br /&gt;
&lt;br /&gt;
Typický útok má tyto fáze:&lt;br /&gt;
&lt;br /&gt;
# Průzkum (reconnaissance) – hledání zranitelností&lt;br /&gt;
# Proniknutí (exploitation) – využití slabiny&lt;br /&gt;
# Udržení přístupu – skrytá přítomnost v systému&lt;br /&gt;
# Zneužití – krádež dat nebo narušení služby&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/S%C3%AD%C5%A5ov%C3%A9_%C3%BAtoky</id>
		<title>Síťové útoky</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/S%C3%AD%C5%A5ov%C3%A9_%C3%BAtoky"/>
				<updated>2026-02-20T10:54:59Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Úprava vzhledu a upřesnění.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DoS / DDoS útok (Denial of Service) ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Způsobit nedostupnost síťového prostředku (typicky webového serveru či připojení k&amp;amp;nbsp;internetu).&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Útočník si vytvoří nebo pronajme botnet (síť napadených počítačů).&lt;br /&gt;
#* Každé zařízení je schopné odesílat síťové požadavky na pokyn útočníka.&lt;br /&gt;
# Zahájení útoku&lt;br /&gt;
#* Botnet začne současně posílat obrovské množství datagramů nebo požadavků na server.&lt;br /&gt;
#* Protože se jedná o legitimní požadavky (například zobrazení webové stránky ze serveru) z&amp;amp;nbsp;různých počítačů, není jednoduché útok filtrovat na základě běžných firewallů.&lt;br /&gt;
#* Server má omezené prostředky a nestíhá zpracovat všechny požadavky.&lt;br /&gt;
# Výsledek&lt;br /&gt;
#* Legitimní uživatelé se nedostanou ke službě.&lt;br /&gt;
#* Server může úplně spadnout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Phishing ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Získat citlivé informace o uživateli.&lt;br /&gt;
* Typickým cílem jsou přihlašovací údaje do elektronického bankovnictví nebo čísla kreditních karet.&lt;br /&gt;
&lt;br /&gt;
; Průběh útoku&lt;br /&gt;
# Příprava falešného prostředí&lt;br /&gt;
#* Útočník vytvoří kopii webu (např. banky).&lt;br /&gt;
#* Vypadá téměř identicky jako originál.&lt;br /&gt;
# Distribuce&lt;br /&gt;
#* Pošle e-mail nebo SMS s odkazem.&lt;br /&gt;
#* Často používá psychologický nátlak:&lt;br /&gt;
#** „Účet bude zablokován“&lt;br /&gt;
#** „Potvrďte ihned platbu“&lt;br /&gt;
# Získání údajů&lt;br /&gt;
#* Oběť zadá:&lt;br /&gt;
#** login&lt;br /&gt;
#** heslo&lt;br /&gt;
#** číslo karty&lt;br /&gt;
# Zneužití&lt;br /&gt;
#* Útočník se přihlásí do skutečného účtu.&lt;br /&gt;
#* Může převést peníze nebo ukrást data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Man-in-the-Middle (MITM) ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Odposlechnout údaje spojení, které měly zůstat důvěrné.&lt;br /&gt;
* Narušit šifrovanou komunikaci.&lt;br /&gt;
&lt;br /&gt;
; Průběh útoku&lt;br /&gt;
# Získání pozice mezi komunikujícími&lt;br /&gt;
#* Útočník vytvoří falešnou Wi-Fi síť nebo provede ARP spoofing.&lt;br /&gt;
# Přesměrování komunikace&lt;br /&gt;
#* Oběť si myslí, že komunikuje přímo se serverem.&lt;br /&gt;
#* Ve skutečnosti data prochází přes útočníka.&lt;br /&gt;
# Odposlech / manipulace&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** číst přenášená data&lt;br /&gt;
#** měnit obsah&lt;br /&gt;
#** vkládat škodlivý kód&lt;br /&gt;
# Nenápadnost&lt;br /&gt;
#* Komunikace často pokračuje bez přerušení.&lt;br /&gt;
#* Oběť si útoku nevšimne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spoofing (podvržení identity) ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Falšování identity&lt;br /&gt;
#* Útočník změní identifikační údaje:&lt;br /&gt;
#** IP adresu&lt;br /&gt;
#** e-mailovou hlavičku&lt;br /&gt;
#** DNS záznam&lt;br /&gt;
# Navázání důvěry&lt;br /&gt;
#* Systém nebo uživatel věří, že komunikace je legitimní.&lt;br /&gt;
# Zneužití&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** získat přístup&lt;br /&gt;
#** přesměrovat komunikaci&lt;br /&gt;
#** spustit další útok.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brute-Force útok ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Získání cíle&lt;br /&gt;
#* Útočník zná přihlašovací stránku nebo účet.&lt;br /&gt;
# Automatizované pokusy&lt;br /&gt;
#* Program zkouší tisíce hesel za sekundu.&lt;br /&gt;
#* Používají se slovníky běžných hesel.&lt;br /&gt;
#* Pokud je heslo slabé, je nalezeno velmi rychle.&lt;br /&gt;
# Převzetí účtu&lt;br /&gt;
#* Útočník získá plnou kontrolu nad účtem a může ho dále zneužít.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 6. Malware šířený sítí ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Distribuce&lt;br /&gt;
#* E-mailová příloha&lt;br /&gt;
#* stažení z webu&lt;br /&gt;
#* exploit zranitelnosti&lt;br /&gt;
# Spuštění&lt;br /&gt;
#* Uživatel otevře soubor nebo klikne na odkaz.&lt;br /&gt;
#* Malware se nainstaluje.&lt;br /&gt;
# Skrytá činnost&lt;br /&gt;
#* Běží na pozadí:&lt;br /&gt;
#** krade data&lt;br /&gt;
#** zaznamenává stisky kláves&lt;br /&gt;
#** šifruje soubory&lt;br /&gt;
# Další šíření&lt;br /&gt;
#* Může napadat další zařízení v síti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SQL Injection ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Nalezení zranitelného formuláře&lt;br /&gt;
* Například přihlašovací pole.&lt;br /&gt;
# Vložení škodlivého kódu&lt;br /&gt;
#* Útočník zadá SQL příkaz místo běžného textu.&lt;br /&gt;
# Spuštění databázového dotazu&lt;br /&gt;
#* Server příkaz vykoná, protože není správně ošetřen vstup.&lt;br /&gt;
# Získání dat&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** zobrazit databázi&lt;br /&gt;
#** upravovat záznamy&lt;br /&gt;
#** mazat data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Společný průběh většiny útoků ==&lt;br /&gt;
&lt;br /&gt;
Typický útok má tyto fáze:&lt;br /&gt;
&lt;br /&gt;
# Průzkum (reconnaissance) – hledání zranitelností&lt;br /&gt;
# Proniknutí (exploitation) – využití slabiny&lt;br /&gt;
# Udržení přístupu – skrytá přítomnost v systému&lt;br /&gt;
# Zneužití – krádež dat nebo narušení služby&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/S%C3%AD%C5%A5ov%C3%A9_%C3%BAtoky</id>
		<title>Síťové útoky</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/S%C3%AD%C5%A5ov%C3%A9_%C3%BAtoky"/>
				<updated>2026-02-20T10:43:37Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Vytvoření základní kostry stránky&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DoS / DDoS útok (Denial of Service) ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Způsobit nedostupnost síťového prostředku (typicky webového serveru či připojení k&amp;amp;nbsp;internetu).&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
&lt;br /&gt;
# '''Příprava'''&lt;br /&gt;
#* Útočník si vytvoří nebo pronajme botnet (síť napadených počítačů).&lt;br /&gt;
#* Každé zařízení je schopné odesílat síťové požadavky.&lt;br /&gt;
&lt;br /&gt;
# '''Zahájení útoku'''&lt;br /&gt;
#* Botnet začne současně posílat obrovské množství datagramů nebo požadavků na server.&lt;br /&gt;
&lt;br /&gt;
# '''Vyčerpání zdrojů'''&lt;br /&gt;
#* Server má omezené nestíhá zpracovat všechny požadavky.&lt;br /&gt;
&lt;br /&gt;
# '''Výsledek'''&lt;br /&gt;
#* Legitimní uživatelé se nedostanou ke službě.&lt;br /&gt;
#* Server může úplně spadnout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Phishing ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Získat citlivé informace o uživateli.&lt;br /&gt;
* Typickým cílem jsou přihlašovací údaje do elektronického bankovnictví nebo čísla kreditních karet.&lt;br /&gt;
&lt;br /&gt;
; Průběh útoku&lt;br /&gt;
&lt;br /&gt;
# '''Příprava falešného prostředí'''&lt;br /&gt;
#* Útočník vytvoří kopii webu (např. banky).&lt;br /&gt;
#* Vypadá téměř identicky jako originál.&lt;br /&gt;
&lt;br /&gt;
# '''Distribuce'''&lt;br /&gt;
#* Pošle e-mail nebo SMS s odkazem.&lt;br /&gt;
#* Často používá psychologický nátlak:&lt;br /&gt;
#** „Účet bude zablokován“&lt;br /&gt;
#** „Potvrďte ihned platbu“&lt;br /&gt;
&lt;br /&gt;
# '''Získání údajů'''&lt;br /&gt;
#* Oběť zadá:&lt;br /&gt;
#** login&lt;br /&gt;
#** heslo&lt;br /&gt;
#** číslo karty&lt;br /&gt;
&lt;br /&gt;
# '''Zneužití'''&lt;br /&gt;
#* Útočník se přihlásí do skutečného účtu.&lt;br /&gt;
#* Může převést peníze nebo ukrást data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Man-in-the-Middle (MITM) ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Odposlechnout údaje spojení, které měly zůstat důvěrné.&lt;br /&gt;
* Narušit šifrovanou komunikaci.&lt;br /&gt;
&lt;br /&gt;
; Průběh útoku&lt;br /&gt;
&lt;br /&gt;
# '''Získání pozice mezi komunikujícími'''&lt;br /&gt;
#* Útočník vytvoří falešnou Wi-Fi síť nebo provede ARP spoofing.&lt;br /&gt;
&lt;br /&gt;
# '''Přesměrování komunikace'''&lt;br /&gt;
#* Oběť si myslí, že komunikuje přímo se serverem.&lt;br /&gt;
#* Ve skutečnosti data prochází přes útočníka.&lt;br /&gt;
&lt;br /&gt;
# '''Odposlech / manipulace'''&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** číst přenášená data&lt;br /&gt;
#** měnit obsah&lt;br /&gt;
#** vkládat škodlivý kód&lt;br /&gt;
&lt;br /&gt;
# '''Nenápadnost'''&lt;br /&gt;
#* Komunikace často pokračuje bez přerušení.&lt;br /&gt;
#* Oběť si útoku nevšimne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4. Spoofing (podvržení identity) ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
&lt;br /&gt;
# '''Falšování identity'''&lt;br /&gt;
#* Útočník změní identifikační údaje:&lt;br /&gt;
#** IP adresu&lt;br /&gt;
#** e-mailovou hlavičku&lt;br /&gt;
#** DNS záznam&lt;br /&gt;
&lt;br /&gt;
# '''Navázání důvěry'''&lt;br /&gt;
#* Systém nebo uživatel věří, že komunikace je legitimní.&lt;br /&gt;
# '''Zneužití'''&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** získat přístup&lt;br /&gt;
#** přesměrovat komunikaci&lt;br /&gt;
#** spustit další útok.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brute-Force útok ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
&lt;br /&gt;
# '''Získání cíle'''&lt;br /&gt;
#* Útočník zná přihlašovací stránku nebo účet.&lt;br /&gt;
&lt;br /&gt;
# '''Automatizované pokusy'''&lt;br /&gt;
#* Program zkouší tisíce hesel za sekundu.&lt;br /&gt;
#* Používají se slovníky běžných hesel.&lt;br /&gt;
#* Pokud je heslo slabé, je nalezeno velmi rychle.&lt;br /&gt;
&lt;br /&gt;
# '''Převzetí účtu'''&lt;br /&gt;
#* Útočník získá plnou kontrolu nad účtem a může ho dále zneužít.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 6. Malware šířený sítí ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
&lt;br /&gt;
# '''Distribuce'''&lt;br /&gt;
#* E-mailová příloha&lt;br /&gt;
#* stažení z webu&lt;br /&gt;
#* exploit zranitelnosti&lt;br /&gt;
# '''Spuštění'''&lt;br /&gt;
#* Uživatel otevře soubor nebo klikne na odkaz.&lt;br /&gt;
#* Malware se nainstaluje.&lt;br /&gt;
# '''Skrytá činnost'''&lt;br /&gt;
#* Běží na pozadí:&lt;br /&gt;
#** krade data&lt;br /&gt;
#** zaznamenává stisky kláves&lt;br /&gt;
#** šifruje soubory&lt;br /&gt;
# '''Další šíření'''&lt;br /&gt;
#* Může napadat další zařízení v síti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SQL Injection ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
&lt;br /&gt;
# '''Nalezení zranitelného formuláře'''&lt;br /&gt;
* Například přihlašovací pole.&lt;br /&gt;
# '''Vložení škodlivého kódu'''&lt;br /&gt;
#* Útočník zadá SQL příkaz místo běžného textu.&lt;br /&gt;
# '''Spuštění databázového dotazu'''&lt;br /&gt;
#* Server příkaz vykoná, protože není správně ošetřen vstup.&lt;br /&gt;
&lt;br /&gt;
# '''Získání dat'''&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** zobrazit databázi&lt;br /&gt;
#** upravovat záznamy&lt;br /&gt;
#** mazat data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Společný průběh většiny útoků ==&lt;br /&gt;
&lt;br /&gt;
Typický útok má tyto fáze:&lt;br /&gt;
&lt;br /&gt;
# '''Průzkum (reconnaissance)''' – hledání zranitelností&lt;br /&gt;
# '''Proniknutí (exploitation)''' – využití slabiny&lt;br /&gt;
# '''Udržení přístupu''' – skrytá přítomnost v systému&lt;br /&gt;
# '''Zneužití''' – krádež dat nebo narušení služby&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Informatika</id>
		<title>Informatika</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Informatika"/>
				<updated>2026-02-20T10:30:25Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Osamostatnění kategorie kybernetické bezpečnosti.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Historie_IT|Historie IT]] ==&lt;br /&gt;
* [[Generace počítačů]], [[Von Neumannova architektura]], &lt;br /&gt;
* [[Historie Internetu]], [[Vývoj modelů IT]]&lt;br /&gt;
* [[Historie Windows]], [[Projekt GNU a GNU/Linux]], [[Unix]], [[Svobodný software]]&lt;br /&gt;
* [[:Category:Historie_IT|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Řízení projektů|Řízení IT projektů]] ==&lt;br /&gt;
* [[Tvorba_software]]&lt;br /&gt;
* [[Git]]: [[Git: Instalace|Instalace]], [[Git: Versioning|Správa verzí]], [[Git: Repository|Vzdálený repozitář]], [[Git: Branch|Větvení]], [[Markdown]], [[Git: FAQ|FAQ]]&lt;br /&gt;
* Další nástroje: [[Slack]], [[Toggl Track]], [[Asana]]&lt;br /&gt;
* [[:Category:Dokumentace projektu|Dokumentace]]: [[Zápis zadání]], [[Uživatelská dokumentace]]&lt;br /&gt;
; Sofwarové inženýrství&lt;br /&gt;
* [[Jazyk UML|UML]]: [[UML: Use Case|Use case]], [[UML: Class|Class]], [[UML: Sequence|Sequence]], [[UML: State|State]] diagramy&lt;br /&gt;
* UI, UX: [[Návrh UI]], [[Wireframe]], [[Persony]], [[Scénáře použití]], [[Testování UI]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Programování|Programování]] ==&lt;br /&gt;
; Teorie&lt;br /&gt;
* [[Algoritmus]], [[Složitost algoritmu]]&lt;br /&gt;
* [[Programovací jazyky]]&lt;br /&gt;
* [[Řadící algoritmy]] &lt;br /&gt;
* [[Objektově orientované programování]]&lt;br /&gt;
* [[Návrhové vzory]]&lt;br /&gt;
* [[Vytvořte hezkou hru]]&lt;br /&gt;
; Zápis kódu:&lt;br /&gt;
* [[Řídící struktury programu]]: [[Cykly|cykly]], [[Větvení|větvení]]), [[Ošetření vstupních proměnných]], [[Podmíněný výraz]]&lt;br /&gt;
; [[Java]]: &lt;br /&gt;
* [[Slovníček pojmů pro programování]], [[Konvence|Konvence pro zápis kódu]], [[Vývoj aplikací v Javě]]&lt;br /&gt;
* [[Java: Zápis tříd|Zápis tříd]], [[Java: Datové typy|Datové typy]], [[Java: Modifikátory přístupu|Modifikátory přístupu]], [[Platnost proměnných]], [[Java: Abstraktní třídy, dědičnost a rozhraní|Rozhraní]], [[Java: Enum|Výčtový typ]]&lt;br /&gt;
* [[Java]]: [[Java| Další knihovní třídy]], [[Java: Práce s texty|Práce s texty]], [[Java: Kontejnery| Kontejnery]], [[Java: Práce s poli|Práce s poli]], [[Java: Řazení|Řazení kontejnerů]], [[Datum a čas v Javě|Datum a čas]]&lt;br /&gt;
* Java &amp;amp;mdash; spouštění: [[Java: Export balíčku JAR|Export balíčku JAR]], [[Spouštění appletů]]&lt;br /&gt;
* GUI: [[JavaFX v kostce]] .:. [[GUI v Javě|Základy grafického uživatelského rozhraní]], [[Java: Checkbox a RadioButton|Checkbox a RadioButton]], [[Dialogy_a_vyskakovací_okna]], [[Menu v Javě]], [[Tabulky v Javě]], [[Layout v Javě]], [[Myš v Javě]], [[Myš a obrázky v Javě &amp;amp;mdash; cvičení]], [[Java: 2D malování]]&lt;br /&gt;
* [[Práce se soubory v Javě]], [[Java: Textový vstup a výstup]], [[Serializace]], [[Databáze v Javě]]&lt;br /&gt;
* [[Výjimky v Javě]]&lt;br /&gt;
; [[:Category:Android|Programování pro Android]]: &lt;br /&gt;
* [[Android: Instalace SDK]], [[Android: Projekt|Projekt Android Studia]], [[Android: Tvorba GUI| Tvorba GUI]], [[Android: Ladění aplikace|Ladění aplikace]],[[Android: Spuštění aplikace| Spuštění aplikace]]&lt;br /&gt;
; [[Greenfoot]]&lt;br /&gt;
* [[Greenfoot]], [[Greenfoot: Řešení častých úloh]]&lt;br /&gt;
; [[:Category:Flutter|Flutter+Dart]]&lt;br /&gt;
* [[Dart vs. Java]], [[Dart: Užitečné tipy]]&lt;br /&gt;
* [[Flutter: Kostra aplikace]], [[Flutter: Základní widgety]], [[Flutter: ListView]]&lt;br /&gt;
* [[Flutter: Ukládání dat]]&lt;br /&gt;
; Podpůrné nástroje&lt;br /&gt;
* [[GIT]]&lt;br /&gt;
; Výměna dat&lt;br /&gt;
* [[JSON]]&lt;br /&gt;
; [[:Category:Programování|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:HTML| Webové stránky]] ==&lt;br /&gt;
* HTML: [[HTML]], [[HTML: Položky v hlavičce stránky|Hlavička stránky]], [[HTML: Struktura webové stránky|Struktura stránky]]&lt;br /&gt;
* [[CSS|Kaskádové styly (CSS)]], &lt;br /&gt;
* [[Cvičení HTML]], [[Cvičení HTML 2]], [[Cvičení HTML 3]], [[Cvičení HTML 4]], [[Cvičení HTML 5]]&lt;br /&gt;
* [[Formuláře v PHP]], [[Ošetření vstupních proměnných]], [[HTTP přesměrování v PHP|HTTP přesměrování]]&lt;br /&gt;
* [[Testování webových stránek]], [[Publikování stránky]]&lt;br /&gt;
* JavaScript: [[Skrytí mailové adresy na webu]]&lt;br /&gt;
* [[:Category:HTML|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Principy IT| Principy IT, hardware, log. obvody]] ==&lt;br /&gt;
* [[Číselné soustavy]]&lt;br /&gt;
* [[Karnaughova mapa]], [[Booleova algebra]]&lt;br /&gt;
* [[Obvody elektrického proudu]]&lt;br /&gt;
* [[Konečný automat]], [[Regulární výrazy]]&lt;br /&gt;
* Hardware: [[HW: Skříně a chlazení| Skříně a chlazení]], [[LCD]], [[CPU]], [[Základní deska]], [[Grafická karta]]&lt;br /&gt;
* [[Pevný disk]]: [[SSD|SSD disk]], [[Klasický pevný disk|HDD]], [[Rozdělení disku]]&lt;br /&gt;
* IoT: [[ESP: Nastavení IDE]], [[ESP: Princip programování]], [[ESP: Sériový vstup a výstup]], [[ESP: GPIO]]&lt;br /&gt;
* Letní kurz IoT: [[Letní IoT: Den 1|Den 1]], [[Letní IoT: Den 2|Den 2]], [[Letní IoT: Den 3|Den 3]], [[Letní IoT: Den 4|Den 4]]&lt;br /&gt;
* Aktuální: [[Umělá inteligence]]&lt;br /&gt;
* [[:Category:Principy IT|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Admin|Operační systémy, správa počítače]] ==&lt;br /&gt;
* [[Operační systém|Co je operační systém?]], [[Zavádění operačního systému]], [[Rozdělení disku]], [[Operační_systémy#O konkrétních OS|O konkrétních OS]]&lt;br /&gt;
* [[:Category:Příkazový řádek|Příkazový řádek (kategorie)]], [[Práce v shellu]]&lt;br /&gt;
* [[Operační systémy#Uživatelská práva|Uživatelské účty a nastavení práv]], [[Operační_systémy#Souborový systém|Souborový systém]], [[Operační_systémy#Procesy a správa paměti|Procesy a správa paměti]], [[Komunikace mezi procesy]], [[Nástroje pro práci s procesy]], [[Služby a démoni]]&lt;br /&gt;
* [[Vzdálené připojení k počítači]], [[Správa síťového rozhraní počítače|Správa sítě]],  Správa HW (ve Windows)&lt;br /&gt;
* [[Operační systémy#Uživatelská práva|Uživatelské účty a oprávnění]]: [[Uživatelský účet]] &lt;br /&gt;
* [[Skript]]&lt;br /&gt;
* [[Správa síťového rozhraní počítače|Správa sítě v CLI]]&lt;br /&gt;
* [[Bootovací USB]]&lt;br /&gt;
; GNU/Linux&lt;br /&gt;
* Souhrn: [[Debian: návod pro uživatele]]&lt;br /&gt;
* [[Základní pojmy Linuxu]], [[Distribuce GNU/Linuxu]], [[Software pro GNU/Linux]] .:. [[Instalace software v GNU/Linuxu]]&lt;br /&gt;
* [[Konfigurační soubory|Konfigurační soubory GNU/Linuxu]]&lt;br /&gt;
* [[Základy CLI]], [[Získávání nápovědy v CLI]], [[Vstup a výstup procesů, přesměrování]], [[Proměnné prostředí]], [[Vyhodnocení příkazů]]&lt;br /&gt;
* [[Správa uživatelských účtů v Linuxu]], [[Nastavování práv|Nastavování oprávnění]], [[Speciální bity]]&lt;br /&gt;
* [[Plánování úloh]], [[Sdílení souborů pomocí Samby]], [[Samba - konfigurace]]&lt;br /&gt;
* [[Významné složky GNU/Linuxu]], [[Významné adresáře Linuxu]]&lt;br /&gt;
; Windows&lt;br /&gt;
* [[Historie Windows]], [[Verze a edice Windows]]&lt;br /&gt;
* [[Významné složky Windows]], [[Konzole MMC]]&lt;br /&gt;
* [[Sdílení souborů a tiskáren]]&lt;br /&gt;
* [[Správa uživatelských účtů ve Windows]], [[Uživatelské účty ve Windows — úkoly]]&lt;br /&gt;
* Powershell: [[Powershell: Základy]], [[Powershell: Nápověda]], [[Powershell: Cmdlets]], [[Powershell: Pipelining]]&lt;br /&gt;
* Active Directory: [[Základní pojmy Active Directory]], [[Typy účtů Active Directory]]&lt;br /&gt;
* [[:Category:Admin|A další: správa počítače ...]]&lt;br /&gt;
* [[Operační systémy|A další: operační systémy ...]]&lt;br /&gt;
&lt;br /&gt;
== [[Virtualizace počítače]] ==&lt;br /&gt;
* [[Virtualizace]]&lt;br /&gt;
* [[Nástroje pro virtualizaci]]&lt;br /&gt;
* VirtualBox: [[VirtualBox — základy ovládání]], [[Virtualizace_ukoly]]&lt;br /&gt;
&lt;br /&gt;
* [[Virtualizace počítače|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Sítě|Sítě a přenos dat]] ==&lt;br /&gt;
* Teorie informace: [[Základní pojmy teorie informace]], [[Kódování-šifrování-hashování]], [[Jednotky množství informace]], [[Měření množství informace]]&lt;br /&gt;
* [[:Category:Přenos dat|Přenos dat]]: [[Varianty přenosu dat]], [[Analogový a digitální přenos]], [[Digitalizace analogového signálu]], [[Zabezpečení proti chybám]]&lt;br /&gt;
* [[Správa síťového rozhraní počítače|Správa sítě v CLI]], [[Sdílení souborů a tiskáren]]&lt;br /&gt;
* [[:Category:Internet|Internet]]: [[Netiketa]], [[Cloud|Cloud computing]], [[Topologie Internetu|Architektura Internetu]], [[Připojení k&amp;amp;nbsp;Internetu]], [[Stažení webové stránky]]&lt;br /&gt;
* Telefonie: [[IP telefonie]], [[PSTN]], [[Mobilní telefonní síť]]&lt;br /&gt;
* Adresace a směrování: [[Adresace| Adresace IP]], [[IP adresa a maska|Výpočty s IP adresou a maskou]], [[Speciální typy IP adres]], [[Návrh IP adres| Návrh IP adres: příklady]] .:. [[Směrování]], [[Směrovací protokoly]], [[Protokol RIP]]&lt;br /&gt;
* Princip komunikace: [[Model ISO/OSI]], [[Úkoly vrstev ISO/OSI]], [[Datagramová komunikace]], [[Předávání dat]], [[Trendy počítačových sítí]]&lt;br /&gt;
* [[Strukturovaná kabeláž]], [[Konfigurace bezdrátového routeru]], [[Standardy WLAN]], [[Média počítačových sítí]]&lt;br /&gt;
* Transportní vrstva: [[TCP a UDP]], [[Navazování spojení]], [[Socket a číslo portu]]&lt;br /&gt;
* Šifrování a podpis: [[Princip šifrování]], [[Hashovací funkce]], [[Elektronický podpis]], [[Šifrování prakticky]], [[Certifikát elektronického podpisu]]&lt;br /&gt;
* Relační a prezentační vrstva: [[Úkoly relační vrstvy]], [[Komprese]], [[Konverze formátů při přenosu]]&lt;br /&gt;
* Model ISO/OSI a&amp;amp;nbsp;úkoly vrstev: [[Úkoly vrstev ISO/OSI]], [[Úkoly fyzické vrstvy ISO/OSI|fyzická]], [[Úkoly linkové vrstvy ISO/OSI|linková]], [[Úkoly síťové vrstvy ISO/OSI|síťová]], [[Úkoly transportní vrstvy ISO/OSI|transportní]], [[Úkoly relační vrstvy|relační]], [[Úkoly prezentační vrstvy|prezentační]], [[Protokoly aplikační vrstvy|aplikační]].&lt;br /&gt;
* Konfigurace routeru a&amp;amp;nbsp;propojení sítí: [[Propojování sítí: Časté chyby|Časté chyby]], [[Propojování sítí: Troubleshooting|Troubleshooting]]&lt;br /&gt;
* [[:Category:Sítě|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Bezpečnost|Kybernetická bezpečnost]] ==&lt;br /&gt;
* [[Rizika při práci s daty]], &lt;br /&gt;
* [[Malware]], [[Ochrana proti malware]],...&lt;br /&gt;
* [[Síťové útoky]]&lt;br /&gt;
* [[Zálohování]]&lt;br /&gt;
* [[Úkoly k zabezpečení počítače]]&lt;br /&gt;
&lt;br /&gt;
== Aplikační software, [[Kancelářský software]] ==&lt;br /&gt;
* [[Licence na SW]]&lt;br /&gt;
; [[Kancelářský software]]&lt;br /&gt;
* Zpracování textů, [[Tabulkový procesor]], [[Prezentace]], [[Nástroje pro tvorbu prezentací]]&lt;br /&gt;
* [[Rejstřík]]&lt;br /&gt;
* Příklady z hodin, [[Šikovné vzorce pro Calc]]&lt;br /&gt;
* [[Kancelářský software|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Grafika a 3D tisk|Grafika a 3D tisk]] ==&lt;br /&gt;
* [[Modelování pro 3D tisk]], [[3D tisk]]&lt;br /&gt;
* [[:Category:Grafika a 3D tisk|A další...]]&lt;br /&gt;
&lt;br /&gt;
== Související ==&lt;br /&gt;
* [[Ergonomie pracoviště]]&lt;br /&gt;
* [[Blockchain a kryptoměny]]&lt;br /&gt;
* [[Profesní prezentace]]&lt;br /&gt;
&lt;br /&gt;
== Zábava, různé ==&lt;br /&gt;
* [[Kalendář hackera]] ([http://stallman.org/articles/on-hacking.html Kdo je hacker? By RMS in english])&lt;br /&gt;
* [[Život s programátorem ;)]]&lt;br /&gt;
&lt;br /&gt;
== Postupně zrušit ==&lt;br /&gt;
* [[:Category:Zrušit|Stránky ke zrušení]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- --------------------------------------------------------------------------------------------------------------&lt;br /&gt;
------------------Starší stručnější verze, která byla vložena na hlavní stránce -----------------------------------&lt;br /&gt;
== Informatika ==&lt;br /&gt;
&lt;br /&gt;
* Historie počítačů&lt;br /&gt;
** [[Generace počítačů]]&lt;br /&gt;
** [[Von Neumannova architektura]]&lt;br /&gt;
** [[Historie Internetu]]&lt;br /&gt;
** [[Historie Windows]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Programování|Programování]]&lt;br /&gt;
** [[Řídící struktury programu]]&lt;br /&gt;
** [[Konvence|Dohodnuté konvence pro psaní kódu]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:OSY|Operační systémy]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Admin|Správa počítače]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Sítě|Sítě]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Office|SW pro kancelář]]&lt;br /&gt;
** [[Prezentace]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Kategorie:Bezpe%C4%8Dnost</id>
		<title>Kategorie:Bezpečnost</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Kategorie:Bezpe%C4%8Dnost"/>
				<updated>2026-02-20T10:29:06Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Vyřazen odkaz na neexistující stránku Zabezpečení počítače.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Ochrana_proti_malware</id>
		<title>Ochrana proti malware</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Ochrana_proti_malware"/>
				<updated>2026-02-18T11:02:02Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Firewall */ Doplnění a upřesnění rozdělení firewallů podle vrstvy, na které pracují.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:CRI]][[Category:Bezpečnost]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Způsoby ochrany ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Opatrnost ===&lt;br /&gt;
* Obezřetnost v prostředí Internetu (e-mail, web, Facebook,...).&lt;br /&gt;
* Nezadávat své osobní údaje (e-mailovou adresu, čísla účtu, už vůbec ne hesla apod.), není-li to nezbytné.&lt;br /&gt;
* Být opatrný v tom, jaké stránky navštěvuji.&lt;br /&gt;
* Prověřit si pravost došlé zprávy, než kliknu na odkaz v ní.&lt;br /&gt;
* Nestahovat a nespouštět nelegální software.&lt;br /&gt;
* Nejsme-li si jistí korektností stránky či programu, raději se jí/mu vyhneme.&lt;br /&gt;
&lt;br /&gt;
=== 2. Technické zabezpečení ===&lt;br /&gt;
; Nezbytný základ:&lt;br /&gt;
* Trvale spuštěný antivirový program (i pro mobilní zařízení!)&lt;br /&gt;
* Trvale spuštěný firewall.&lt;br /&gt;
* Automatická instalace aktualizací (minimálně bezpečnostní aktualizace).&lt;br /&gt;
&lt;br /&gt;
; Lze i další:&lt;br /&gt;
* Antispyware.&lt;br /&gt;
** Programy svým principem a funkcí velmi podobné antivirovým programům, ale specializující se na spyware.&lt;br /&gt;
** Příklady: SpyBot, AdAware&lt;br /&gt;
* Ochrana proti modifikacím DNS záznamů (pharmingu)&lt;br /&gt;
** Existují doplňky do prohlížečů, které kontrolují IP adresy &lt;br /&gt;
** Například: [http://toolbar.netcraft.com/ toolbar.netcraft.com] &amp;amp;mdash; neověřeno!&lt;br /&gt;
&lt;br /&gt;
=== 3. Zálohování dat ===&lt;br /&gt;
* Jako obrana proti útoku ransomware šifrujícího data.&lt;br /&gt;
&lt;br /&gt;
=== 4. Prevence proti spamu ===&lt;br /&gt;
* Nepublikujte svoji adresu veřejně &amp;amp;mdash; nelze u&amp;amp;nbsp;pracovních adres, kde je komunikace veřejně součástí práce.&lt;br /&gt;
** Pokud musí být adresa vystavena na webu, [[Skrytí mailové adresy na webu|skryjte ji před roboty]].&lt;br /&gt;
* Neposílejte řetězové maily!&lt;br /&gt;
* Pokud musíte posílat zprávy více adresátům, VŽDY adresy pište do kolonky Skrytá kopie!&lt;br /&gt;
** Příjemce tak uvidí jen vaši adresu (odesilatele) a svoji, nikoli adresy ostatních adresátů.&lt;br /&gt;
** Je neslušné vystavovat adresy všech příjemců všem příjemcům, navíc pokud má některý příjemce prolomené zabezpečení schránky, útočník se nedozví adresy ostatních adresátů.&lt;br /&gt;
* Měňte si pravidelně heslo k mailové schránce!&lt;br /&gt;
* Neregistrujte svůj mail na všelikých stránkách!&lt;br /&gt;
** Mějte speciální adresu pro registraci na e-shopech a jiných méně důvěryhodných stránkách.&lt;br /&gt;
** Mějte jinou adresu pro pracovní a jinou pro osobní komunikaci.&lt;br /&gt;
* Zákaz automatických náhledů mailu v&amp;amp;nbsp;klientech elektronické pošty a&amp;amp;nbsp;zákaz automatického zobrazování obrázků v poštovních zprávách&lt;br /&gt;
** Čteme jen hlavičky zpráv (subject/předmět), otevíráme jen to, co je vpořádku.&lt;br /&gt;
** V nevyžádaném mailu může být vložen miniaturní neviditelný obrázek. Prohlížeč při zobrazení mailu stáhne obrázek ze serveru útočníka a&amp;amp;nbsp;útočník tak ví, že spam došel příjemci a e-mailová adresa je funkční (vlastně slouží jako potvrzení o přečtení nevyžádané zprávy). Navíc útočník ví i&amp;amp;nbsp;IP adresu a rychlost přečtení mailu.&lt;br /&gt;
** Zákaz zobrazování obrázků se projeví chybějícími obrázky v mailu, jednotlivě lze zobrazování ručně povolit ve zprávách, u&amp;amp;nbsp;kterých jsem si jisti, že je bezpečná.&lt;br /&gt;
** Pokud čtete zprávy přes webové rozhraní a&amp;amp;nbsp;zobrazování obrázků nelze vypnout, zvažte používání mailového klienta (třeba Thunderbird).&lt;br /&gt;
* Nemějte mailovou schránku na špatně zabezpečených mailových serverech!&lt;br /&gt;
** Třeba jeden z&amp;amp;nbsp;nejpopulárnějších českých mailových serverů je kromě jiných neduhů nechvalně známý tím, že z&amp;amp;nbsp;jeho adres běžně chodí spam...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Antivirové programy ==&lt;br /&gt;
&lt;br /&gt;
=== Jak hledají malware? ===&lt;br /&gt;
* Databáze signatur&lt;br /&gt;
** hledá v programech na disku posloupnosti instrukcí, o kterých se ví, že je obsahuje jen virus&lt;br /&gt;
** závislé na aktuálnosti databáze (co není v databázi, to nenajdeme)&lt;br /&gt;
** přesné, rychlé&lt;br /&gt;
** malé riziko falešného hlášení&lt;br /&gt;
* Heuristická analýza&lt;br /&gt;
** analyzuje kód programu a hledá potenciálně podezdřelé instrukce&lt;br /&gt;
** riziko falešného hlášení &amp;amp;mdash; zdravý program může být občas prohlášen za virus&lt;br /&gt;
** výrazně náročnější na čas procesoru&lt;br /&gt;
** najde i škodlivé programy, které jsou úplně nové&lt;br /&gt;
&lt;br /&gt;
=== Kdy se spouští test ===&lt;br /&gt;
* Rezidentní ochrana&lt;br /&gt;
** Antivir běží stále na pozadí.&lt;br /&gt;
** Zpomaluje počítač (významné u starších počítačů)&lt;br /&gt;
** Kdykoli otevíráme soubor, je obsah souboru nejprve zkontrolován na přítomnost viru.&lt;br /&gt;
* Ruční spuštění testu&lt;br /&gt;
&lt;br /&gt;
=== Příklady antivirů ===&lt;br /&gt;
; Svobodné antiviry (zdarma pro libovolné použití + dostupný zdrojový kód)&lt;br /&gt;
*[http://www.clamav.net/lang/en/ ClamAV/Immunet]&lt;br /&gt;
** Licence GPL.&lt;br /&gt;
** Verze pro Linux i Windows (Immunet).&lt;br /&gt;
; Antiviry zdarma&lt;br /&gt;
*[http://www.comodo.com/ Comodo]&lt;br /&gt;
**Internet Security = Antivirus + Firewall&lt;br /&gt;
**placené verze i verze zdarma (není uživatelská podpora)&lt;br /&gt;
**přesměrovává DNS server (obrana proti pharmingu)&lt;br /&gt;
*[http://www.free-av.com/ Avira]&lt;br /&gt;
** Platformy Windows, Mac, Android a iOS &lt;br /&gt;
** Existuje placená verze&lt;br /&gt;
; Antiviry zdarma pouze pro nekomerční použití&lt;br /&gt;
* AVG&lt;br /&gt;
** Existuje placená i „free“ verze v angličtině (česká ne).&lt;br /&gt;
** AVG nabízí i anti-spyware, tam česká „free“ verze, ale nemá rezidentní štít.&lt;br /&gt;
* Avast&lt;br /&gt;
** zdarma pro nekomerční použití, ale je třeba jednou za rok registrovat.&lt;br /&gt;
; Placené antiviry&lt;br /&gt;
* Cena obvykle cca 1000&amp;amp;ndash;1500 Kč/rok&lt;br /&gt;
* Obvykle výborně hodnocené (spolehlivost detekce, spektrum služeb (i firewall atd.), rychlost testování,...)&lt;br /&gt;
* Uživatelská podpora.&lt;br /&gt;
* Často další služby: zálohování dat on-line atd.&lt;br /&gt;
* NOD32&lt;br /&gt;
* Kasperski Antivirus&lt;br /&gt;
* [http://www.symantec.com/cs/cz/ Produkty řady Norton (Symantec).]&lt;br /&gt;
&lt;br /&gt;
; Porovnání antivirů&lt;br /&gt;
* [http://www.av-comparatives.org av-comparatives.org]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Firewall ==&lt;br /&gt;
* Kontroluje tok dat mezi počítačem/počítačovou sítí a okolním světem (okolními sítěmi).&lt;br /&gt;
* Nerozlišuje škodlivost aplikace, pouze řeší, jestli tato aplikace má povoleno komunikovat do sítě pomocí daného síťového protokolu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;Příkad:&lt;br /&gt;
* Smí program VLC komunikovat prostřednictvím portu 80 (protokol HTTP)?&lt;br /&gt;
* Smí FreeCommander komunikovat prostřednictvím portu 21 (protokol FTP)?&lt;br /&gt;
* Máme povolit spojení z cizího počítače na port 22 (protokol SSH) našeho počítače?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Rozdělení podle toho, kde běží&lt;br /&gt;
* Osobní firewall &amp;amp;mdash; běží v počítači, který chrání.&lt;br /&gt;
* Síťový firewall&lt;br /&gt;
** Chrání přístup do celé sítě, veškerý provoz do sítě musí jít přes něj.&lt;br /&gt;
** Běží na routeru nebo se jedná o samostatné zařízení, přes které prochází veškerý provoz z/do sítě.&lt;br /&gt;
&lt;br /&gt;
; Rozdělení podle vrstvy, na které pracují&lt;br /&gt;
Na nižších vrstvách architektury ISO/OSI rychlejší, ale neumí tak dobře rozlišit datové toky.&lt;br /&gt;
&lt;br /&gt;
''Paketový filtr'' (síťová vrstva)&lt;br /&gt;
* běží na router-u&lt;br /&gt;
* komunikace probíhá přímo mezi chráněnou stanicí a vnějším partnerem,&lt;br /&gt;
* může být vybráno několik stanic ''bastion hosts'', které mohou komunikovat (nebo dále zprostředkovat komunikaci) přímo. (''DMZ &amp;amp;mdash; demilitarized zone'' &amp;amp;mdash; mezi firewallem a těmito stanicemi.)&lt;br /&gt;
* povolení nebo zákaz podle kombinace IP adresy a portu.&lt;br /&gt;
&lt;br /&gt;
''Aplikační brána'' (aplikační vrstva)&lt;br /&gt;
* někdy také nazýváno „proxy“&lt;br /&gt;
* komunikace probíhá mezi vnějším partnerem a firewallem, ten případně komunikuje s chráněnými stroji,&lt;br /&gt;
* chráněné stanice jsou z vnější sítě nedostupné (např. mají privátní IP adresy),&lt;br /&gt;
* aplikační brána musí rozumět danému síťovému protokolu.&lt;br /&gt;
&lt;br /&gt;
''Stavový paketový filtr''&lt;br /&gt;
* Při filtrování provozu zohledňuje předchozí provoz.&lt;br /&gt;
* Například odpověď je vpuštěna pouze pokud jsme předtím zaslali dotaz.&lt;br /&gt;
&lt;br /&gt;
; Vstupní × výstupní provoz (in- nebo out-)&lt;br /&gt;
* Zabezpečení sítě proti útoku napadení z okolí&lt;br /&gt;
** Snažší k zajištění. &lt;br /&gt;
** Útočník vždy musí projít přes firewall, chce-li síť napadnout.&lt;br /&gt;
&lt;br /&gt;
* Zabezpečení proti úniku dat&lt;br /&gt;
** Například v důsledku napadení malwarem, který odesílá citlivá data.&lt;br /&gt;
** Je složitější rozlišit korektní provoz od škodlivého (používají stejné programy).&lt;br /&gt;
** Nebezpečí zneužití klientů protokolů HTTP, POP3, IRC, které standardně podporujeme.&lt;br /&gt;
&lt;br /&gt;
* Vždy existuje riziko úniku dat jinými cestami:&lt;br /&gt;
** paměťová média odnesená zaměstnanci,&lt;br /&gt;
** modemové spojení,&lt;br /&gt;
** telefonní hovory: social engineering.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Strategie zabezepečení&lt;br /&gt;
* „Prevence“&lt;br /&gt;
** ''„Zakážeme vše a povolíme jen ten provoz a ty programy, které jsou určitě v pořádku.“''&lt;br /&gt;
** Jednodušší, častější.&lt;br /&gt;
** Vyjmenujeme programy či služby, které povolíme, zbytek zůstane zakázán.&lt;br /&gt;
** Může dojít k blokování toků, které jsou v pořádku, ale nebyly uvedeny mezi povolenými.&lt;br /&gt;
&lt;br /&gt;
* „Presumpce neviny“&lt;br /&gt;
** ''„Povolíme vše a zakážeme provoz, který je určitě špatně.“''&lt;br /&gt;
** Problém s novými programy, se kterými se nepočítalo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Zdroje&lt;br /&gt;
*interhack.net &amp;gt; Pubs &amp;gt; Fwfaq &amp;lt;http://www.interhack.net/pubs/fwfaq/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Příklady&lt;br /&gt;
* Vestavěný firewall operačního systému&lt;br /&gt;
* Comodo Firewall &amp;amp;mdash; zdarma&lt;br /&gt;
** povolování komunikace pro jednotlivé aplikace&lt;br /&gt;
* Firewally zdarma ke stažení: [http://www.thefreecountry.com/security/firewalls.shtml TheFreeCountry.com &amp;amp;gt; Security &amp;amp;gt; Firewalls]&lt;br /&gt;
&lt;br /&gt;
== Související stránky a zdroje ==&lt;br /&gt;
* [[Malware]], [[Skrytí mailové adresy na webu]]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Spr%C3%A1va_u%C5%BEivatelsk%C3%BDch_%C3%BA%C4%8Dt%C5%AF_v_Linuxu</id>
		<title>Správa uživatelských účtů v Linuxu</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Spr%C3%A1va_u%C5%BEivatelsk%C3%BDch_%C3%BA%C4%8Dt%C5%AF_v_Linuxu"/>
				<updated>2026-02-17T10:38:34Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Zjištění informací o uživateli */ Lépe okomentován příkaz id.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:OSY]][[Category:Linux]][[Category:Uživatelské účty]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;Všechny probírané akce lze samozřejmě provést i v grafickém rozhraní. Přesné provedení se ale liší.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Co se máte naučit ==&lt;br /&gt;
* Vytvořit uživatelský účet v příkazovém řádku GNU/Linuxu&lt;br /&gt;
* Vytvořit skupinu uživatelů a &lt;br /&gt;
* Znát strukturu konfiguračních souborů &amp;lt;tt&amp;gt;/etc/passwd&amp;lt;/tt&amp;gt; a &amp;lt;tt&amp;gt;/etc/group&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Vytvoření uživatelského účtu == &lt;br /&gt;
&amp;lt;div class=&amp;quot;Upozorneni&amp;quot;&amp;gt;Tyto příkazy smí provádět pouze správce počítače!&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Příkaz adduser ===&lt;br /&gt;
* intuitivní, „user-friendly“ — vhodný pro ruční vytváření uživatelských účtů&lt;br /&gt;
** zeptá se na všechny potřebné údaje&lt;br /&gt;
** volá příkazy &amp;lt;code&amp;gt;useradd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;groupadd&amp;lt;/code&amp;gt; a další&lt;br /&gt;
* bývá v&amp;amp;nbsp;distribucích založených na Debianu, v&amp;amp;nbsp;ostatních distribucích to bývá jen alias pro příkaz &amp;lt;code&amp;gt;useradd&amp;lt;/code&amp;gt;&lt;br /&gt;
 adduser karel&lt;br /&gt;
&lt;br /&gt;
=== Příkaz useradd ===&lt;br /&gt;
* Na rozdíl od &amp;lt;code&amp;gt;adduser&amp;lt;/code&amp;gt; je třeba pomocí parametrů nastavit parametry uživatelského účtu.&lt;br /&gt;
*Parametry:&lt;br /&gt;
**-m&lt;br /&gt;
***vytvoří uživatelskou složku v /home&lt;br /&gt;
**-g&lt;br /&gt;
***přiřadí uživateli primární skupinu&lt;br /&gt;
**-N&lt;br /&gt;
***Nevytvoří zároveň skupinu se stejným jménem (standardně se vytváří)&lt;br /&gt;
**-s&lt;br /&gt;
***nastaví default-ní shell&lt;br /&gt;
**-p&lt;br /&gt;
***nastaví úvodní heslo&lt;br /&gt;
*** musíme ale zadat heslo zašifrované funkcí crypt()&lt;br /&gt;
*** praktičtější je nastavit heslo dodatečně příkazem &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt; nebo použít &amp;lt;code&amp;gt;adduser&amp;lt;/code&amp;gt;&lt;br /&gt;
 useradd -m -s /bin/bash bittnerova_pavlina&amp;lt;br /&amp;gt;passwd bittnerova_pavlina&lt;br /&gt;
&lt;br /&gt;
=== Příkaz &amp;lt;code&amp;gt;newusers&amp;lt;/code&amp;gt; ===&lt;br /&gt;
* Příkazu předáme soubor s účty a hesly:&lt;br /&gt;
 newusers seznam_uctu.txt&lt;br /&gt;
* Bohužel musíme zadávat ručně i UID.&lt;br /&gt;
* Obsah souboru &amp;lt;tt&amp;gt;seznam_uctu.txt&amp;lt;/tt&amp;gt; může vypadat například takto:&lt;br /&gt;
 franta:password:1001:1001:Vedouci:/home/franta:/bin/bash&lt;br /&gt;
 josef:password:1002:1002:Manager:/home/josef:/bin/bash&lt;br /&gt;
 alice:password:1050:uctari:Ucetni:/home/alice:/bin/bash&lt;br /&gt;
* Bezpečnostní doporučení:&lt;br /&gt;
** Soubor vytvořte v domovském adresáři uživatele &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt;,&lt;br /&gt;
** nastavte práva na &amp;lt;code&amp;gt;0600&amp;lt;/code&amp;gt;,&lt;br /&gt;
** soubor po použití smažte.&lt;br /&gt;
&lt;br /&gt;
Více viz: [http://www.cyberciti.biz/tips/linux-how-to-create-multiple-users-accounts-in-batch.html cyberciti.biz &amp;gt; Tips &amp;gt; Linux-how-to-create-multiple-users-accounts-in-batch] nebo &amp;lt;code&amp;gt;man newusers&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Změna vlastností a zrušení uživatele ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Upozorneni&amp;quot;&amp;gt;Tyto příkazy smí provádět pouze správce počítače!&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Příkaz usermod ===&lt;br /&gt;
* Například zařazení uživatele do skupiny: &lt;br /&gt;
 usermod -aG ''skupina'' ''uzivatel''&lt;br /&gt;
&amp;lt;div class=&amp;quot;Varovani&amp;quot;&amp;gt;POZOR! Změna se projeví až po dalším přihlášení! Nebo ji můžete aktivovat příkazem:&lt;br /&gt;
 newgrp ''skupina''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
; Příklad: &lt;br /&gt;
Povolte uživateli volat příkaz sudo (nastavte uživateli oprávnění správce)&lt;br /&gt;
* Využívá toho, že všichni správci jsou zařazeni v&amp;amp;nbsp;specifické skupině. Název skupiny se liší v&amp;amp;nbsp;různých distribucích, příkladem může být &amp;lt;tt&amp;gt;sudo&amp;lt;/tt&amp;gt; (Debian) či &amp;lt;tt&amp;gt;wheel&amp;lt;/tt&amp;gt; (Red Hat).&lt;br /&gt;
* Viz také [[Oprávnění pro přístup k souborům]].&lt;br /&gt;
 usermod -a -G sudo ''novyadmin''&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Příkaz chage ===&lt;br /&gt;
* Omezení platnosti uživatelského účtu a&amp;amp;nbsp;nutnost změnit heslo.&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
; Příklad:&lt;br /&gt;
Uživatel &amp;lt;code&amp;gt;karel&amp;lt;/code&amp;gt; si vždy po 60 dnech musí změnit heslo:&lt;br /&gt;
 chage -M 60 karel&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Příkaz userdel ===&lt;br /&gt;
* Smaže uživatelský účet.&lt;br /&gt;
&lt;br /&gt;
== Zjištění informací o uživateli ==&lt;br /&gt;
&lt;br /&gt;
Příkaz &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vypíše informace o uživatelském účtu či skupině.&lt;br /&gt;
* Standardně musíme zadat UID resp. GID. &lt;br /&gt;
* Přepínač &amp;lt;code&amp;gt;-n&amp;lt;/code&amp;gt; umožní používat název uživatelského účtu/skupiny místo UID/GID.&lt;br /&gt;
* Další přepínače zjišťují doplňující informace.&lt;br /&gt;
* Př: Do kterých skupin uživatel patří?&lt;br /&gt;
 id -Gn student&lt;br /&gt;
* Neuvedeme-li uživatele/skupinu, zobrazí se informace o aktuálně přihlášeném uživateli.&lt;br /&gt;
&lt;br /&gt;
Alternativy:&lt;br /&gt;
 echo $USER&lt;br /&gt;
 whoami&lt;br /&gt;
 who&lt;br /&gt;
&lt;br /&gt;
== Vytvoření skupiny, přiřazení uživatelů do skupiny ==&lt;br /&gt;
* Uživatel může být ve více skupinách, ve skupině může být více uživatelů.&lt;br /&gt;
* Jedna skupina je ale pro uživatele „primární“, obvykle má název stejný jako je jeho uživatelské jméno.&lt;br /&gt;
&lt;br /&gt;
=== Vytvoření, zrušení skupiny ===&lt;br /&gt;
* &amp;lt;code&amp;gt;groupadd&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;groupdel&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Přiřazení uživatelů ===&lt;br /&gt;
* &amp;lt;code&amp;gt;groupmod&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;usermod&amp;lt;/code&amp;gt;: viz [[Správa_uživatelských_účtů#Příkaz_usermod|výše]].&lt;br /&gt;
&lt;br /&gt;
=== Výpis uživatelů ve skupině ===&lt;br /&gt;
* Seznam uživatelů je v souboru &amp;lt;tt&amp;gt;/etc/group&amp;lt;/tt&amp;gt;. &lt;br /&gt;
* Viz také [[Konfigurační soubory GNU/Linuxu - Uživatelské účty]].&lt;br /&gt;
 grep ^''skupina'': /etc/group&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
Pro zajímavost: &lt;br /&gt;
* Co vlastně příkaz &amp;lt;code&amp;gt;grep ^''skupina'': /etc/group&amp;lt;/code&amp;gt; přesně dělá? &lt;br /&gt;
* Šel by upravit, aby vypsal JEN jména uživatelů ve skupině??? ;)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfigurační soubory ==&lt;br /&gt;
&lt;br /&gt;
Informace o uživatelských účtech jsou uloženy v [[Konfigurační_soubory|konfiguračních souborech]]. Konkrétně se jedná o soubory:&lt;br /&gt;
 /etc/passwd&lt;br /&gt;
 /etc/group&lt;br /&gt;
 /etc/shadow&lt;br /&gt;
 /etc/sudoers&lt;br /&gt;
Více viz [[Konfigurační soubory GNU/Linuxu - Uživatelské účty]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zjištění informací o uživatelích a skupinách ==&lt;br /&gt;
&lt;br /&gt;
; Poslední přihlášení&lt;br /&gt;
 last&lt;br /&gt;
* Poslední přihlášení&lt;br /&gt;
 lastb&lt;br /&gt;
* Poslední nezdařené přihlášení&lt;br /&gt;
&lt;br /&gt;
; Informace o uživateli&lt;br /&gt;
Tyto informace lze získat i z&amp;amp;nbsp;konfiguračních souborů.&lt;br /&gt;
 id&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Úkoly ==&lt;br /&gt;
* Jak zjistit uživatelská jména uživatelů, kteří mají účet na tomto počítači?&lt;br /&gt;
* Co udělá příkaz: &lt;br /&gt;
 cat /etc/passwd | cut -d : -f 1 | sort&lt;br /&gt;
* Vytvořte na svém počítači uživatelské účty pro sebe a svého kolegu. Nastavte účtům heslo.&lt;br /&gt;
* Vytvořte uživatelskou skupinu &amp;lt;tt&amp;gt;treti_b&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Zařaďte vytvořené účty do skupiny &amp;lt;tt&amp;gt;treti_b&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Zkontrolujte v konfiguračních souborech, že vytváření proběhlo v pořádku.&lt;br /&gt;
* Vyzkoušejte připojení ze sousedního počítače (řekněte kolegovi jeho heslo a login a nechte ho, ať se přihlásí ze sousedního počítače). (Viz také [[Vzdálené připojení k počítači]].)&lt;br /&gt;
* Jak se liší „administrátorský“ účet od běžného?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje ==&lt;br /&gt;
* [http://www.abclinuxu.cz/clanky/navody/unixove-nastroje-5-opravneni-chmod-chown-chgrp AbcLinuxu.cz &amp;gt; Unixové nástroje, oprávnění, chmod-chown-chgrp]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Speci%C3%A1ln%C3%AD_bity</id>
		<title>Speciální bity</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Speci%C3%A1ln%C3%AD_bity"/>
				<updated>2026-02-17T10:34:15Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Přidány příklady výpisu ls -l pro sticky a pro SGID bit.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:OSY]][[Category:Uživatelské účty]][[Category:Linux]]&lt;br /&gt;
&lt;br /&gt;
== Úvod ==&lt;br /&gt;
* V systému Unix a systémech z něj vycházejících (Linux,...) se tradičně oprávnění pro přístup k souborům ukládala pomocí devíti bitů viz [[Nastavování práv]].&lt;br /&gt;
* Dále se ovšem ukládaly a ukládají další tři speciální bity, které upravují chování programů a složek v některých specifických případech.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set UID (SUID) ==&lt;br /&gt;
* Používá se pro spustitelné soubory (programy).&lt;br /&gt;
* Program je spouštěn s právy vlastníka programu (jako by ho spustil vlastník).&lt;br /&gt;
* (Standardně se program spustí s právy toho, kdo program spustil.)&lt;br /&gt;
; Nastavení SUID&lt;br /&gt;
 chmod u+s program&lt;br /&gt;
; Ověření SUID&lt;br /&gt;
* Ve výpisu &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Místo písmene &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; ve výpisu práv vlastníka se objeví:&lt;br /&gt;
** &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt;... SUID + nastavené právo spouštět (&amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;)&lt;br /&gt;
** &amp;lt;tt&amp;gt;S&amp;lt;/tt&amp;gt;... SUID bez práva spouštět&lt;br /&gt;
* Například:&lt;br /&gt;
 ''$'' ls -l `which passwd`&lt;br /&gt;
 ''-rw&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;s&amp;lt;/span&amp;gt;r-xr-x 1 root root 45396 kvě 25  2012 /usr/bin/passwd''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;Příklad použití: &lt;br /&gt;
Například program &amp;lt;tt&amp;gt;/usr/bin/passwd&amp;lt;/tt&amp;gt; (příkaz &amp;lt;tt&amp;gt;passwd&amp;lt;/tt&amp;gt;) &amp;amp;mdash; pro nastavení hesla potřebuje právo zapisovat do souboru &amp;lt;tt&amp;gt;/etc/shadow&amp;lt;/tt&amp;gt;, smí ale zapisovat jen hesla aktuálního uživatele!&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;Varovani&amp;quot;&amp;gt;POZOR!!!&lt;br /&gt;
Nebezpečné, používá se výjimečně pouze pro velmi důvěryhodné a prověřené programy.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;Upozornění!&lt;br /&gt;
Pro skripty a další interpretované programy (bash, Python, PHP,...) se SUID bit ve většině operačních systémů ignoruje!&lt;br /&gt;
&lt;br /&gt;
(V&amp;amp;nbsp;Linuxu se SUID u&amp;amp;nbsp;skriptů ignoruje od verze jádra Linux 3.x.)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set GID (SGID) ==&lt;br /&gt;
* Pro spustitelné soubory (programy):&lt;br /&gt;
** Význam analogický jako SUID &amp;amp;mdash; program bude spouštěn s právy skupiny, která program vlastní. (Dnes ne moc používané.)&lt;br /&gt;
* Pro složky:&lt;br /&gt;
** Pokud ve složce vytvořím soubor či složku, pak se vlastnická skupina převezme z nastavení složky. (Vlastník budu já.)&lt;br /&gt;
** (Standardně bych vlastník byl také já, ale vlastnická skupina by byla moje primární skupina.)&lt;br /&gt;
** Pokud vytvářím složku, zdědí vytvářená složka i SGID bit.&lt;br /&gt;
; Nastavení&lt;br /&gt;
 chmod g+s slozka&lt;br /&gt;
; Výpis &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Místo &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; v právech ''skupiny'':&lt;br /&gt;
**&amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt;... SGID + právo spouštět pro skupinu&lt;br /&gt;
**&amp;lt;tt&amp;gt;S&amp;lt;/tt&amp;gt;... SGID - právo spouštět pro skupinu&lt;br /&gt;
&lt;br /&gt;
* Například:&lt;br /&gt;
 ''$'' ls -ld share&lt;br /&gt;
 ''drwxrw&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;s&amp;lt;/span&amp;gt;r-x 2 student skupina 4096 17. úno 11.31 share''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
Používá se u sdílených složek, kde má právo vytvářet soubory skupina uživatelů. Nově vytvořené soubory tak budou opět vlastněny skupinou.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sticky-bit ==&lt;br /&gt;
* Dnes obvykle používán pouze pro adresáře. &lt;br /&gt;
* (Původně zamýšlená složitější funkčnost, i pro soubory.)&lt;br /&gt;
* Pokud je u&amp;amp;nbsp;adresáře nastaven bit sticky, pak může v&amp;amp;nbsp;adresáři uživatel mazat ty soubory, jejichž je vlastníkem. &lt;br /&gt;
* (Standardně buď má uživatel právo zápisu do adresáře (&amp;lt;tt&amp;gt;w&amp;lt;/tt&amp;gt;) a pak může mazat všechny soubory bez ohledu na vlastnictví, nebo nemá právo zápisu a nemůže mazat žádné soubory (ani svoje).)&lt;br /&gt;
; Nastavení&lt;br /&gt;
 chmod o+t adresar&lt;br /&gt;
; Výpis &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Místo &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; v právech ''ostatních uživatelů'':&lt;br /&gt;
** &amp;lt;tt&amp;gt;t&amp;lt;/tt&amp;gt;... „sticky“ + právo spouštět pro všechny uživatele&lt;br /&gt;
** &amp;lt;tt&amp;gt;T&amp;lt;/tt&amp;gt;... „sticky“ bez právo &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; pro všechny uživatele&lt;br /&gt;
&lt;br /&gt;
* Například:&lt;br /&gt;
 ''$'' ls -ld /tmp&lt;br /&gt;
 ''drwxrwxrw&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;t&amp;lt;/span&amp;gt; 10 root root 200 17. úno 11.09 /tmp''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
Příklad použití: &lt;br /&gt;
* Je nastaven na složce &amp;lt;tt&amp;gt;/tmp&amp;lt;/tt&amp;gt; (do ní si aplikace odkládají dočasné soubory).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== umask ==&lt;br /&gt;
* Nastavuje, jaká práva má mít nově vytvořený soubor.&lt;br /&gt;
* Pokud vytvoříme soubor, pak:&lt;br /&gt;
** Vlastník: bude ten uživatel, který soubor vytvořil.&lt;br /&gt;
** Vlastnická skupina: primární skupina uživatele, který soubor vytvořil.&lt;br /&gt;
* Práva získáme tak, že bity nastavené příkazem &amp;lt;tt&amp;gt;umask&amp;lt;/tt&amp;gt; odečteme od základní masky:&lt;br /&gt;
** základní maska pro soubory &amp;lt;tt&amp;gt;666&amp;lt;/tt&amp;gt; (reprezentuje kombinaci &amp;lt;tt&amp;gt;rw-rw-rw-&amp;lt;/tt&amp;gt;)&lt;br /&gt;
** základní maska pro adresáře &amp;lt;tt&amp;gt;777&amp;lt;/tt&amp;gt; (reprezentuje kombinaci &amp;lt;tt&amp;gt;rwxrwxrwx&amp;lt;/tt&amp;gt;)&lt;br /&gt;
* Standardní nastavení &amp;lt;tt&amp;gt;umask&amp;lt;/tt&amp;gt; je &amp;lt;tt&amp;gt;022&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
; Příklad:&lt;br /&gt;
 umask 007&lt;br /&gt;
* Výpočet&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| ||Soubory ||Adresáře&lt;br /&gt;
|-&lt;br /&gt;
|Základ ||666 ||777&lt;br /&gt;
|-&lt;br /&gt;
|Umask ||007 ||007&lt;br /&gt;
|-&lt;br /&gt;
|Výsledek ||660 ||770 &lt;br /&gt;
|}&lt;br /&gt;
* Podrobněji po bitech:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| ||Soubory ||Adresáře&lt;br /&gt;
|-&lt;br /&gt;
|Základ||110 110 110||111 111 111&lt;br /&gt;
|-&lt;br /&gt;
|Umask||000 000 111||000 000 111&lt;br /&gt;
|-&lt;br /&gt;
|Výsledek||110 110 000||111 111 000 &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
; Symbolický zápis:&lt;br /&gt;
 &amp;lt;code&amp;gt;práva = základ AND NOT(umask)&amp;lt;/code&amp;gt;&lt;br /&gt;
* (Předpokládáme, že logické operace se provádí na každý bit zvlášť.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Ukol&amp;quot;&amp;gt;&lt;br /&gt;
; Úkol&lt;br /&gt;
* Jaká práva bude mít soubor/adresář vytvoření se standardním nastavením &amp;lt;tt&amp;gt;umask&amp;lt;/tt&amp;gt;?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* [[Oprávnění pro přístup k souborům]], [[Nastavování práv|Nastavování oprávnění]]&lt;br /&gt;
&lt;br /&gt;
== Další zdroje ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Setuid Wikipedia &amp;amp;rarr; Set UID]&lt;br /&gt;
* [http://www.library.yale.edu/wsg/docs/permissions/sgid.htm Yale.edu &amp;amp;rarr; SGID pro sdílené složky]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Speci%C3%A1ln%C3%AD_bity</id>
		<title>Speciální bity</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Speci%C3%A1ln%C3%AD_bity"/>
				<updated>2026-02-17T10:22:22Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Související stránky */ Úprava odkazu na stránku: Nastavení oprávnění místo práv.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:OSY]][[Category:Uživatelské účty]][[Category:Linux]]&lt;br /&gt;
&lt;br /&gt;
== Úvod ==&lt;br /&gt;
* V systému Unix a systémech z něj vycházejících (Linux,...) se tradičně oprávnění pro přístup k souborům ukládala pomocí devíti bitů viz [[Nastavování práv]].&lt;br /&gt;
* Dále se ovšem ukládaly a ukládají další tři speciální bity, které upravují chování programů a složek v některých specifických případech.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set UID (SUID) ==&lt;br /&gt;
* Používá se pro spustitelné soubory (programy).&lt;br /&gt;
* Program je spouštěn s právy vlastníka programu (jako by ho spustil vlastník).&lt;br /&gt;
* (Standardně se program spustí s právy toho, kdo program spustil.)&lt;br /&gt;
; Nastavení SUID&lt;br /&gt;
 chmod u+s program&lt;br /&gt;
; Ověření SUID&lt;br /&gt;
* Ve výpisu &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Místo písmene &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; ve výpisu práv vlastníka se objeví:&lt;br /&gt;
** &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt;... SUID + nastavené právo spouštět (&amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;)&lt;br /&gt;
** &amp;lt;tt&amp;gt;S&amp;lt;/tt&amp;gt;... SUID bez práva spouštět&lt;br /&gt;
* Například:&lt;br /&gt;
 ''$'' ls -l `which passwd`&lt;br /&gt;
 ''-rw&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;s&amp;lt;/span&amp;gt;r-xr-x 1 root root 45396 kvě 25  2012 /usr/bin/passwd''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;Příklad použití: &lt;br /&gt;
Například program &amp;lt;tt&amp;gt;/usr/bin/passwd&amp;lt;/tt&amp;gt; (příkaz &amp;lt;tt&amp;gt;passwd&amp;lt;/tt&amp;gt;) &amp;amp;mdash; pro nastavení hesla potřebuje právo zapisovat do souboru &amp;lt;tt&amp;gt;/etc/shadow&amp;lt;/tt&amp;gt;, smí ale zapisovat jen hesla aktuálního uživatele!&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;Varovani&amp;quot;&amp;gt;POZOR!!!&lt;br /&gt;
Nebezpečné, používá se výjimečně pouze pro velmi důvěryhodné a prověřené programy.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;Upozornění!&lt;br /&gt;
Pro skripty a další interpretované programy (bash, Python, PHP,...) se SUID bit ve většině operačních systémů ignoruje!&lt;br /&gt;
&lt;br /&gt;
(V&amp;amp;nbsp;Linuxu se SUID u&amp;amp;nbsp;skriptů ignoruje od verze jádra Linux 3.x.)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Set GID (SGID) ==&lt;br /&gt;
* Pro spustitelné soubory (programy):&lt;br /&gt;
** Význam analogický jako SUID &amp;amp;mdash; program bude spouštěn s právy skupiny, která program vlastní. (Dnes ne moc používané.)&lt;br /&gt;
* Pro složky:&lt;br /&gt;
** Pokud ve složce vytvořím soubor či složku, pak se vlastnická skupina převezme z nastavení složky. (Vlastník budu já.)&lt;br /&gt;
** (Standardně bych vlastník byl také já, ale vlastnická skupina by byla moje primární skupina.)&lt;br /&gt;
** Pokud vytvářím složku, zdědí vytvářená složka i SGID bit.&lt;br /&gt;
; Nastavení&lt;br /&gt;
 chmod g+s slozka&lt;br /&gt;
; Výpis &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Místo &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; v právech ''skupiny'':&lt;br /&gt;
**&amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt;... SGID + právo spouštět pro skupinu&lt;br /&gt;
**&amp;lt;tt&amp;gt;S&amp;lt;/tt&amp;gt;... SGID - právo spouštět pro skupinu&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
Používá se u sdílených složek, kde má právo vytvářet soubory skupina uživatelů. Nově vytvořené soubory tak budou opět vlastněny skupinou.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sticky-bit ==&lt;br /&gt;
* Dnes obvykle používán pouze pro adresáře. &lt;br /&gt;
* (Původně zamýšlená složitější funkčnost, i pro soubory.)&lt;br /&gt;
* Pokud je u&amp;amp;nbsp;adresáře nastaven bit sticky, pak může v&amp;amp;nbsp;adresáři uživatel mazat ty soubory, jejichž je vlastníkem. &lt;br /&gt;
* (Standardně buď má uživatel právo zápisu do adresáře (&amp;lt;tt&amp;gt;w&amp;lt;/tt&amp;gt;) a pak může mazat všechny soubory bez ohledu na vlastnictví, nebo nemá právo zápisu a nemůže mazat žádné soubory (ani svoje).)&lt;br /&gt;
; Nastavení&lt;br /&gt;
 chmod o+t adresar&lt;br /&gt;
; Výpis &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Místo &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; v právech ''ostatních uživatelů'':&lt;br /&gt;
** &amp;lt;tt&amp;gt;t&amp;lt;/tt&amp;gt;... „sticky“ + právo spouštět pro všechny uživatele&lt;br /&gt;
** &amp;lt;tt&amp;gt;T&amp;lt;/tt&amp;gt;... „sticky“ bez právo &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; pro všechny uživatele&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
Příklad použití: &lt;br /&gt;
* Je nastaven na složce &amp;lt;tt&amp;gt;/tmp&amp;lt;/tt&amp;gt; (do ní si aplikace odkládají dočasné soubory).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== umask ==&lt;br /&gt;
* Nastavuje, jaká práva má mít nově vytvořený soubor.&lt;br /&gt;
* Pokud vytvoříme soubor, pak:&lt;br /&gt;
** Vlastník: bude ten uživatel, který soubor vytvořil.&lt;br /&gt;
** Vlastnická skupina: primární skupina uživatele, který soubor vytvořil.&lt;br /&gt;
* Práva získáme tak, že bity nastavené příkazem &amp;lt;tt&amp;gt;umask&amp;lt;/tt&amp;gt; odečteme od základní masky:&lt;br /&gt;
** základní maska pro soubory &amp;lt;tt&amp;gt;666&amp;lt;/tt&amp;gt; (reprezentuje kombinaci &amp;lt;tt&amp;gt;rw-rw-rw-&amp;lt;/tt&amp;gt;)&lt;br /&gt;
** základní maska pro adresáře &amp;lt;tt&amp;gt;777&amp;lt;/tt&amp;gt; (reprezentuje kombinaci &amp;lt;tt&amp;gt;rwxrwxrwx&amp;lt;/tt&amp;gt;)&lt;br /&gt;
* Standardní nastavení &amp;lt;tt&amp;gt;umask&amp;lt;/tt&amp;gt; je &amp;lt;tt&amp;gt;022&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
; Příklad:&lt;br /&gt;
 umask 007&lt;br /&gt;
* Výpočet&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| ||Soubory ||Adresáře&lt;br /&gt;
|-&lt;br /&gt;
|Základ ||666 ||777&lt;br /&gt;
|-&lt;br /&gt;
|Umask ||007 ||007&lt;br /&gt;
|-&lt;br /&gt;
|Výsledek ||660 ||770 &lt;br /&gt;
|}&lt;br /&gt;
* Podrobněji po bitech:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| ||Soubory ||Adresáře&lt;br /&gt;
|-&lt;br /&gt;
|Základ||110 110 110||111 111 111&lt;br /&gt;
|-&lt;br /&gt;
|Umask||000 000 111||000 000 111&lt;br /&gt;
|-&lt;br /&gt;
|Výsledek||110 110 000||111 111 000 &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
; Symbolický zápis:&lt;br /&gt;
 &amp;lt;code&amp;gt;práva = základ AND NOT(umask)&amp;lt;/code&amp;gt;&lt;br /&gt;
* (Předpokládáme, že logické operace se provádí na každý bit zvlášť.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Ukol&amp;quot;&amp;gt;&lt;br /&gt;
; Úkol&lt;br /&gt;
* Jaká práva bude mít soubor/adresář vytvoření se standardním nastavením &amp;lt;tt&amp;gt;umask&amp;lt;/tt&amp;gt;?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* [[Oprávnění pro přístup k souborům]], [[Nastavování práv|Nastavování oprávnění]]&lt;br /&gt;
&lt;br /&gt;
== Další zdroje ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Setuid Wikipedia &amp;amp;rarr; Set UID]&lt;br /&gt;
* [http://www.library.yale.edu/wsg/docs/permissions/sgid.htm Yale.edu &amp;amp;rarr; SGID pro sdílené složky]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-16T11:36:00Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Vytvoření kostry stránky&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Ukládání dat lokálně: JSON ==&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety</id>
		<title>Flutter: Základní widgety</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety"/>
				<updated>2026-02-16T09:55:37Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Jednoduchý dialog */ Lépe struktorováno, přidány příklady dialogů, připraveno na budoucí osamostatnění.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Uspořádání stránky ==&lt;br /&gt;
&lt;br /&gt;
 Center( child: ... )&lt;br /&gt;
* Vycentruje obsah uvnitř widgetu.&lt;br /&gt;
&lt;br /&gt;
 Column(&lt;br /&gt;
   mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
   children: &amp;lt;Widget&amp;gt;[ ... ]&lt;br /&gt;
 )&lt;br /&gt;
* Vloží blok více prvků poskládaných pod sebe.&lt;br /&gt;
&lt;br /&gt;
 Padding(&lt;br /&gt;
   padding: EdgeInsetsGeometry.all(20),&lt;br /&gt;
   child: ...&lt;br /&gt;
 )&lt;br /&gt;
* Všechny prvky budou odsazeny navzájem o 20 pixelů.&lt;br /&gt;
&lt;br /&gt;
 Expanded( child: ... )&lt;br /&gt;
* Tato část okna se bude roztahovat při zvětšování okna.&lt;br /&gt;
&lt;br /&gt;
== Textová pole ==&lt;br /&gt;
 TextField(&lt;br /&gt;
   controller: _abcController,&lt;br /&gt;
   decoration: const InputDecoration(&lt;br /&gt;
     labelText: 'Nadpis pole – viditelný popisek:',&lt;br /&gt;
   ),&lt;br /&gt;
   keyboardType: TextInputType.number, // Pokud chceme omezit vstup na číselné hodnoty&lt;br /&gt;
 ),&lt;br /&gt;
&lt;br /&gt;
; Parametry widgetu&lt;br /&gt;
&lt;br /&gt;
 enabled:  &lt;br /&gt;
* Aktivní/zakázané textové pole.&lt;br /&gt;
* Zakázané textové pole je šedivé a nejde do něj umístit kurzor.&lt;br /&gt;
&lt;br /&gt;
 readOnly:  &lt;br /&gt;
* Textové pole pouze pro čtení – ale není šedivé a lze do něj umístit kurzor&lt;br /&gt;
&lt;br /&gt;
 onChanged: (text) { ... }&lt;br /&gt;
* Metoda, která se zavolá při změně obsahu tlačítka. &lt;br /&gt;
* Metoda musí přijímat jako parametr text.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Kontroler textového pole&lt;br /&gt;
 final TextEditingController _abcController = TextEditingController();&lt;br /&gt;
* Pro práci s obsahem textového pole slouží &amp;lt;code&amp;gt;TextEditingController&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 final double totalPrice = double.parse(parsedValue = _abcController.text.trim());&lt;br /&gt;
* Přístup k obsahu textového pole zprostředkovává atribut &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Obdobně lze &amp;lt;code&amp;gt;int.parse(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 _abcController.dispose()&lt;br /&gt;
* Při uvolňování paměti by měly být řádně uvolněny i kontrolery metodou &amp;lt;code&amp;gt;dispose()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; Nastavení vzhledu &amp;lt;code&amp;gt;InputDecoration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 contentPadding: EdgeInsets.all(20.0),&lt;br /&gt;
* Odsazení obsahu&lt;br /&gt;
&lt;br /&gt;
 border: OutlineInputBorder(),&lt;br /&gt;
* Ohraničení textového pole&lt;br /&gt;
&lt;br /&gt;
 labelText: 'text'&lt;br /&gt;
* Popiska textového pole.&lt;br /&gt;
* Když je pole prázdné, text je v poli.&lt;br /&gt;
* Jakmile uživatel pole vyplní, popiska se přesune do rámečku textového pole.&lt;br /&gt;
&lt;br /&gt;
 hintText: 'Text'&lt;br /&gt;
* Nápověda – co má uživatel zadat do pole.&lt;br /&gt;
* Po zadání textu do pole text zmizí.&lt;br /&gt;
&lt;br /&gt;
== Tlačítka ==&lt;br /&gt;
  ElevatedButton(&lt;br /&gt;
    onPressed: _nazevMetodyReakce,&lt;br /&gt;
    child: const Text('Popis tlačítka'),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
; Vlastnosti:&lt;br /&gt;
&lt;br /&gt;
 onPressed:   &lt;br /&gt;
* Název metody, která se vyvolá při stisknutí tlačítka.&lt;br /&gt;
* Obecně může být vložena akce i přímo&lt;br /&gt;
&lt;br /&gt;
 child:  &lt;br /&gt;
* Obsah tlačítka – popis, ikona, obrázek, ...&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* Pro zobrazení dynamického seznamu prvků.&lt;br /&gt;
* Více viz samostatná stránka [[Flutter: ListView]].&lt;br /&gt;
&lt;br /&gt;
== Odsazení ==&lt;br /&gt;
 SizedBox(height: 10),&lt;br /&gt;
&lt;br /&gt;
Příklad použití:&lt;br /&gt;
 Column(&lt;br /&gt;
   const Text('Hello'),&lt;br /&gt;
   const Sizedbox(height: 10),&lt;br /&gt;
   const Text('World!'),&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== Textová popiska ==&lt;br /&gt;
 const Text('Záznamy o tankování:',),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyskakovací bublina (Toast) ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;mobilních aplikacích se pro stručná oznámení používá spíše vyskakovací bublina, než vyskakovací okno.&lt;br /&gt;
&lt;br /&gt;
  setState(() {&lt;br /&gt;
    ScaffoldMessenger.of(context).showSnackBar(&lt;br /&gt;
      SnackBar(&lt;br /&gt;
          content: Text('Informace pro uživatele')&lt;br /&gt;
      ),&lt;br /&gt;
    );&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jednoduchý dialog ==&lt;br /&gt;
&lt;br /&gt;
Pro vytvoření jednoduchého dialogu slouží třída &amp;lt;code&amp;gt;AlertDialog&amp;lt;/code&amp;gt;.&lt;br /&gt;
; Parametry konstruktoru &amp;lt;code&amp;gt;AlertDialog&amp;lt;/code&amp;gt;&lt;br /&gt;
 title: const Text('Titulek dialogu')&lt;br /&gt;
 content: const Text('Zpráva dialogu...')&lt;br /&gt;
 actions: [ ''seznam akcí/tlačítek'' ]&lt;br /&gt;
&lt;br /&gt;
; Příklad – Jednoduchý dialog s jedním tlačítkem&lt;br /&gt;
 AlertDialog(&lt;br /&gt;
   title: const Text('Skutečně smazat položku'),&lt;br /&gt;
   content: const Text('Soubor neobsahuje platná data!'),&lt;br /&gt;
   actions: [&lt;br /&gt;
     TextButton(&lt;br /&gt;
       onPressed: () =&amp;gt; Navigator.pop(context),&lt;br /&gt;
       child: const Text('OK'),&lt;br /&gt;
     ),&lt;br /&gt;
   ]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
; Příklad – Potvrzovací dialog se dvěma tlačítky&lt;br /&gt;
 AlertDialog(&lt;br /&gt;
   title: const Text('Upozornění'),&lt;br /&gt;
   content: const Text('Skutečně chcete smazat položku XYZ?'),&lt;br /&gt;
   actions: [&lt;br /&gt;
     '''TextButton('''&lt;br /&gt;
       onPressed: () =&amp;gt; {&lt;br /&gt;
         setState(() { ''_akceSmazSkutecne();'' };);&lt;br /&gt;
         _akceUloz();&lt;br /&gt;
         Navigator.pop(context);&lt;br /&gt;
       },&lt;br /&gt;
       child: const '''Text('Smaž'),'''&lt;br /&gt;
     '''),'''&lt;br /&gt;
     '''TextButton('''&lt;br /&gt;
       onPressed: () =&amp;gt; Navigator.pop(context),&lt;br /&gt;
       child: const '''Text('Zrušit'),'''&lt;br /&gt;
     '''),'''&lt;br /&gt;
   ]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
=== Vyvolání dialogu ===&lt;br /&gt;
&lt;br /&gt;
; Metoda pro různá hlášení&lt;br /&gt;
&lt;br /&gt;
Můžeme připravit metodu pro vyvolání obecného dialogu:&lt;br /&gt;
  Future&amp;lt;void&amp;gt; ukazHlaseni(String messageText) =&amp;gt; showDialog&amp;lt;void&amp;gt;(&lt;br /&gt;
    context: context,&lt;br /&gt;
    builder: (context) {&lt;br /&gt;
      return AlertDialog( ''...'' );&lt;br /&gt;
    },&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
Metodu následně voláme:&lt;br /&gt;
 ukazHlaseni('Text');&lt;br /&gt;
&lt;br /&gt;
; Volání přímo v kódu&lt;br /&gt;
&lt;br /&gt;
Můžeme také dialog vytvořit a rovnou ho zavolat:&lt;br /&gt;
 showDialog(&lt;br /&gt;
   context: context,&lt;br /&gt;
   builder: (context) =&amp;gt; AlertDialog( ''...'' ),&lt;br /&gt;
 )&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Informatika</id>
		<title>Informatika</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Informatika"/>
				<updated>2026-02-16T09:29:43Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Programování */ Přidáno Flutter: Ukládání dat a upravena struktura Category: Flutter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Historie_IT|Historie IT]] ==&lt;br /&gt;
* [[Generace počítačů]], [[Von Neumannova architektura]], &lt;br /&gt;
* [[Historie Internetu]], [[Vývoj modelů IT]]&lt;br /&gt;
* [[Historie Windows]], [[Projekt GNU a GNU/Linux]], [[Unix]], [[Svobodný software]]&lt;br /&gt;
* [[:Category:Historie_IT|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Řízení projektů|Řízení IT projektů]] ==&lt;br /&gt;
* [[Tvorba_software]]&lt;br /&gt;
* [[Git]]: [[Git: Instalace|Instalace]], [[Git: Versioning|Správa verzí]], [[Git: Repository|Vzdálený repozitář]], [[Git: Branch|Větvení]], [[Markdown]], [[Git: FAQ|FAQ]]&lt;br /&gt;
* Další nástroje: [[Slack]], [[Toggl Track]], [[Asana]]&lt;br /&gt;
* [[:Category:Dokumentace projektu|Dokumentace]]: [[Zápis zadání]], [[Uživatelská dokumentace]]&lt;br /&gt;
; Sofwarové inženýrství&lt;br /&gt;
* [[Jazyk UML|UML]]: [[UML: Use Case|Use case]], [[UML: Class|Class]], [[UML: Sequence|Sequence]], [[UML: State|State]] diagramy&lt;br /&gt;
* UI, UX: [[Návrh UI]], [[Wireframe]], [[Persony]], [[Scénáře použití]], [[Testování UI]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Programování|Programování]] ==&lt;br /&gt;
; Teorie&lt;br /&gt;
* [[Algoritmus]], [[Složitost algoritmu]]&lt;br /&gt;
* [[Programovací jazyky]]&lt;br /&gt;
* [[Řadící algoritmy]] &lt;br /&gt;
* [[Objektově orientované programování]]&lt;br /&gt;
* [[Návrhové vzory]]&lt;br /&gt;
* [[Vytvořte hezkou hru]]&lt;br /&gt;
; Zápis kódu:&lt;br /&gt;
* [[Řídící struktury programu]]: [[Cykly|cykly]], [[Větvení|větvení]]), [[Ošetření vstupních proměnných]], [[Podmíněný výraz]]&lt;br /&gt;
; [[Java]]: &lt;br /&gt;
* [[Slovníček pojmů pro programování]], [[Konvence|Konvence pro zápis kódu]], [[Vývoj aplikací v Javě]]&lt;br /&gt;
* [[Java: Zápis tříd|Zápis tříd]], [[Java: Datové typy|Datové typy]], [[Java: Modifikátory přístupu|Modifikátory přístupu]], [[Platnost proměnných]], [[Java: Abstraktní třídy, dědičnost a rozhraní|Rozhraní]], [[Java: Enum|Výčtový typ]]&lt;br /&gt;
* [[Java]]: [[Java| Další knihovní třídy]], [[Java: Práce s texty|Práce s texty]], [[Java: Kontejnery| Kontejnery]], [[Java: Práce s poli|Práce s poli]], [[Java: Řazení|Řazení kontejnerů]], [[Datum a čas v Javě|Datum a čas]]&lt;br /&gt;
* Java &amp;amp;mdash; spouštění: [[Java: Export balíčku JAR|Export balíčku JAR]], [[Spouštění appletů]]&lt;br /&gt;
* GUI: [[JavaFX v kostce]] .:. [[GUI v Javě|Základy grafického uživatelského rozhraní]], [[Java: Checkbox a RadioButton|Checkbox a RadioButton]], [[Dialogy_a_vyskakovací_okna]], [[Menu v Javě]], [[Tabulky v Javě]], [[Layout v Javě]], [[Myš v Javě]], [[Myš a obrázky v Javě &amp;amp;mdash; cvičení]], [[Java: 2D malování]]&lt;br /&gt;
* [[Práce se soubory v Javě]], [[Java: Textový vstup a výstup]], [[Serializace]], [[Databáze v Javě]]&lt;br /&gt;
* [[Výjimky v Javě]]&lt;br /&gt;
; [[:Category:Android|Programování pro Android]]: &lt;br /&gt;
* [[Android: Instalace SDK]], [[Android: Projekt|Projekt Android Studia]], [[Android: Tvorba GUI| Tvorba GUI]], [[Android: Ladění aplikace|Ladění aplikace]],[[Android: Spuštění aplikace| Spuštění aplikace]]&lt;br /&gt;
; [[Greenfoot]]&lt;br /&gt;
* [[Greenfoot]], [[Greenfoot: Řešení častých úloh]]&lt;br /&gt;
; [[:Category:Flutter|Flutter+Dart]]&lt;br /&gt;
* [[Dart vs. Java]], [[Dart: Užitečné tipy]]&lt;br /&gt;
* [[Flutter: Kostra aplikace]], [[Flutter: Základní widgety]], [[Flutter: ListView]]&lt;br /&gt;
* [[Flutter: Ukládání dat]]&lt;br /&gt;
; Podpůrné nástroje&lt;br /&gt;
* [[GIT]]&lt;br /&gt;
; Výměna dat&lt;br /&gt;
* [[JSON]]&lt;br /&gt;
; [[:Category:Programování|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:HTML| Webové stránky]] ==&lt;br /&gt;
* HTML: [[HTML]], [[HTML: Položky v hlavičce stránky|Hlavička stránky]], [[HTML: Struktura webové stránky|Struktura stránky]]&lt;br /&gt;
* [[CSS|Kaskádové styly (CSS)]], &lt;br /&gt;
* [[Cvičení HTML]], [[Cvičení HTML 2]], [[Cvičení HTML 3]], [[Cvičení HTML 4]], [[Cvičení HTML 5]]&lt;br /&gt;
* [[Formuláře v PHP]], [[Ošetření vstupních proměnných]], [[HTTP přesměrování v PHP|HTTP přesměrování]]&lt;br /&gt;
* [[Testování webových stránek]], [[Publikování stránky]]&lt;br /&gt;
* JavaScript: [[Skrytí mailové adresy na webu]]&lt;br /&gt;
* [[:Category:HTML|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Principy IT| Principy IT, hardware, log. obvody]] ==&lt;br /&gt;
* [[Číselné soustavy]]&lt;br /&gt;
* [[Karnaughova mapa]], [[Booleova algebra]]&lt;br /&gt;
* [[Obvody elektrického proudu]]&lt;br /&gt;
* [[Konečný automat]], [[Regulární výrazy]]&lt;br /&gt;
* Hardware: [[HW: Skříně a chlazení| Skříně a chlazení]], [[LCD]], [[CPU]], [[Základní deska]], [[Grafická karta]]&lt;br /&gt;
* [[Pevný disk]]: [[SSD|SSD disk]], [[Klasický pevný disk|HDD]], [[Rozdělení disku]]&lt;br /&gt;
* IoT: [[ESP: Nastavení IDE]], [[ESP: Princip programování]], [[ESP: Sériový vstup a výstup]], [[ESP: GPIO]]&lt;br /&gt;
* Letní kurz IoT: [[Letní IoT: Den 1|Den 1]], [[Letní IoT: Den 2|Den 2]], [[Letní IoT: Den 3|Den 3]], [[Letní IoT: Den 4|Den 4]]&lt;br /&gt;
* Aktuální: [[Umělá inteligence]]&lt;br /&gt;
* [[:Category:Principy IT|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Admin|Operační systémy, správa počítače]] ==&lt;br /&gt;
* [[Operační systém|Co je operační systém?]], [[Zavádění operačního systému]], [[Rozdělení disku]], [[Operační_systémy#O konkrétních OS|O konkrétních OS]]&lt;br /&gt;
* [[:Category:Příkazový řádek|Příkazový řádek (kategorie)]], [[Práce v shellu]]&lt;br /&gt;
* [[Operační systémy#Uživatelská práva|Uživatelské účty a nastavení práv]], [[Operační_systémy#Souborový systém|Souborový systém]], [[Operační_systémy#Procesy a správa paměti|Procesy a správa paměti]], [[Komunikace mezi procesy]], [[Nástroje pro práci s procesy]], [[Služby a démoni]]&lt;br /&gt;
* [[Vzdálené připojení k počítači]], [[Správa síťového rozhraní počítače|Správa sítě]],  Správa HW (ve Windows)&lt;br /&gt;
* [[Zabezpečení počítače]], [[Úkoly k zabezpečení počítače]], [[Zálohování]]&lt;br /&gt;
* [[Operační systémy#Uživatelská práva|Uživatelské účty a oprávnění]]: [[Uživatelský účet]] &lt;br /&gt;
* [[Skript]]&lt;br /&gt;
* [[Správa síťového rozhraní počítače|Správa sítě v CLI]]&lt;br /&gt;
* [[Bootovací USB]]&lt;br /&gt;
; GNU/Linux&lt;br /&gt;
* Souhrn: [[Debian: návod pro uživatele]]&lt;br /&gt;
* [[Základní pojmy Linuxu]], [[Distribuce GNU/Linuxu]], [[Software pro GNU/Linux]] .:. [[Instalace software v GNU/Linuxu]]&lt;br /&gt;
* [[Konfigurační soubory|Konfigurační soubory GNU/Linuxu]]&lt;br /&gt;
* [[Základy CLI]], [[Získávání nápovědy v CLI]], [[Vstup a výstup procesů, přesměrování]], [[Proměnné prostředí]], [[Vyhodnocení příkazů]]&lt;br /&gt;
* [[Správa uživatelských účtů v Linuxu]], [[Nastavování práv|Nastavování oprávnění]], [[Speciální bity]]&lt;br /&gt;
* [[Plánování úloh]], [[Sdílení souborů pomocí Samby]], [[Samba - konfigurace]]&lt;br /&gt;
* [[Významné složky GNU/Linuxu]], [[Významné adresáře Linuxu]]&lt;br /&gt;
; Windows&lt;br /&gt;
* [[Historie Windows]], [[Verze a edice Windows]]&lt;br /&gt;
* [[Významné složky Windows]], [[Konzole MMC]]&lt;br /&gt;
* [[Sdílení souborů a tiskáren]]&lt;br /&gt;
* [[Správa uživatelských účtů ve Windows]], [[Uživatelské účty ve Windows — úkoly]]&lt;br /&gt;
* Powershell: [[Powershell: Základy]], [[Powershell: Nápověda]], [[Powershell: Cmdlets]], [[Powershell: Pipelining]]&lt;br /&gt;
* Active Directory: [[Základní pojmy Active Directory]], [[Typy účtů Active Directory]]&lt;br /&gt;
* [[:Category:Admin|A další: správa počítače ...]]&lt;br /&gt;
* [[Operační systémy|A další: operační systémy ...]]&lt;br /&gt;
&lt;br /&gt;
== [[Virtualizace počítače]] ==&lt;br /&gt;
* [[Virtualizace]]&lt;br /&gt;
* [[Nástroje pro virtualizaci]]&lt;br /&gt;
* VirtualBox: [[VirtualBox — základy ovládání]], [[Virtualizace_ukoly]]&lt;br /&gt;
&lt;br /&gt;
* [[Virtualizace počítače|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Sítě|Sítě a přenos dat]] ==&lt;br /&gt;
* Teorie informace: [[Základní pojmy teorie informace]], [[Kódování-šifrování-hashování]], [[Jednotky množství informace]], [[Měření množství informace]]&lt;br /&gt;
* [[:Category:Přenos dat|Přenos dat]]: [[Varianty přenosu dat]], [[Analogový a digitální přenos]], [[Digitalizace analogového signálu]], [[Zabezpečení proti chybám]]&lt;br /&gt;
* [[Správa síťového rozhraní počítače|Správa sítě v CLI]], [[Sdílení souborů a tiskáren]]&lt;br /&gt;
* [[:Category:Internet|Internet]]: [[Netiketa]], [[Cloud|Cloud computing]], [[Topologie Internetu|Architektura Internetu]], [[Připojení k&amp;amp;nbsp;Internetu]], [[Stažení webové stránky]]&lt;br /&gt;
* Telefonie: [[IP telefonie]], [[PSTN]], [[Mobilní telefonní síť]]&lt;br /&gt;
* Adresace a směrování: [[Adresace| Adresace IP]], [[IP adresa a maska|Výpočty s IP adresou a maskou]], [[Speciální typy IP adres]], [[Návrh IP adres| Návrh IP adres: příklady]] .:. [[Směrování]], [[Směrovací protokoly]], [[Protokol RIP]]&lt;br /&gt;
* Princip komunikace: [[Model ISO/OSI]], [[Úkoly vrstev ISO/OSI]], [[Datagramová komunikace]], [[Předávání dat]], [[Trendy počítačových sítí]]&lt;br /&gt;
* [[Strukturovaná kabeláž]], [[Konfigurace bezdrátového routeru]], [[Standardy WLAN]], [[Média počítačových sítí]]&lt;br /&gt;
* [[:Category:Bezpečnost| Bezpečnost]]: [[Rizika při práci s daty]], [[Malware]], [[Ochrana proti malware]],...&lt;br /&gt;
* Transportní vrstva: [[TCP a UDP]], [[Navazování spojení]], [[Socket a číslo portu]]&lt;br /&gt;
* Šifrování a podpis: [[Princip šifrování]], [[Hashovací funkce]], [[Elektronický podpis]], [[Šifrování prakticky]], [[Certifikát elektronického podpisu]]&lt;br /&gt;
* Relační a prezentační vrstva: [[Úkoly relační vrstvy]], [[Komprese]], [[Konverze formátů při přenosu]]&lt;br /&gt;
* Model ISO/OSI a&amp;amp;nbsp;úkoly vrstev: [[Úkoly vrstev ISO/OSI]], [[Úkoly fyzické vrstvy ISO/OSI|fyzická]], [[Úkoly linkové vrstvy ISO/OSI|linková]], [[Úkoly síťové vrstvy ISO/OSI|síťová]], [[Úkoly transportní vrstvy ISO/OSI|transportní]], [[Úkoly relační vrstvy|relační]], [[Úkoly prezentační vrstvy|prezentační]], [[Protokoly aplikační vrstvy|aplikační]].&lt;br /&gt;
* Konfigurace routeru a&amp;amp;nbsp;propojení sítí: [[Propojování sítí: Časté chyby|Časté chyby]], [[Propojování sítí: Troubleshooting|Troubleshooting]]&lt;br /&gt;
* [[:Category:Sítě|A další...]]&lt;br /&gt;
&lt;br /&gt;
== Aplikační software, [[Kancelářský software]] ==&lt;br /&gt;
* [[Licence na SW]]&lt;br /&gt;
; [[Kancelářský software]]&lt;br /&gt;
* Zpracování textů, [[Tabulkový procesor]], [[Prezentace]], [[Nástroje pro tvorbu prezentací]]&lt;br /&gt;
* [[Rejstřík]]&lt;br /&gt;
* Příklady z hodin, [[Šikovné vzorce pro Calc]]&lt;br /&gt;
* [[Kancelářský software|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Grafika a 3D tisk|Grafika a 3D tisk]] ==&lt;br /&gt;
* [[Modelování pro 3D tisk]], [[3D tisk]]&lt;br /&gt;
* [[:Category:Grafika a 3D tisk|A další...]]&lt;br /&gt;
&lt;br /&gt;
== Související ==&lt;br /&gt;
* [[Ergonomie pracoviště]]&lt;br /&gt;
* [[Blockchain a kryptoměny]]&lt;br /&gt;
* [[Profesní prezentace]]&lt;br /&gt;
&lt;br /&gt;
== Zábava, různé ==&lt;br /&gt;
* [[Kalendář hackera]] ([http://stallman.org/articles/on-hacking.html Kdo je hacker? By RMS in english])&lt;br /&gt;
* [[Život s programátorem ;)]]&lt;br /&gt;
&lt;br /&gt;
== Postupně zrušit ==&lt;br /&gt;
* [[:Category:Zrušit|Stránky ke zrušení]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- --------------------------------------------------------------------------------------------------------------&lt;br /&gt;
------------------Starší stručnější verze, která byla vložena na hlavní stránce -----------------------------------&lt;br /&gt;
== Informatika ==&lt;br /&gt;
&lt;br /&gt;
* Historie počítačů&lt;br /&gt;
** [[Generace počítačů]]&lt;br /&gt;
** [[Von Neumannova architektura]]&lt;br /&gt;
** [[Historie Internetu]]&lt;br /&gt;
** [[Historie Windows]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Programování|Programování]]&lt;br /&gt;
** [[Řídící struktury programu]]&lt;br /&gt;
** [[Konvence|Dohodnuté konvence pro psaní kódu]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:OSY|Operační systémy]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Admin|Správa počítače]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Sítě|Sítě]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Office|SW pro kancelář]]&lt;br /&gt;
** [[Prezentace]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Moodle_GIFT</id>
		<title>Moodle GIFT</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Moodle_GIFT"/>
				<updated>2026-02-16T05:35:18Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Vytvoření kostry stránky a multichoice otázka.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Jiné]]&lt;br /&gt;
&lt;br /&gt;
GIFT je otevřený formát Moodle pro popis testových otázek.&lt;br /&gt;
&lt;br /&gt;
== Multichoice ==&lt;br /&gt;
&lt;br /&gt;
 //TODO!!!&lt;br /&gt;
 ::oblast_nazev0XY::&lt;br /&gt;
 Vyberte správná tvrzení o ...: &lt;br /&gt;
 [Vyber všechny správné odpovědi. Za nesprávné odpovědi dostáváš záporné body]&lt;br /&gt;
 {&lt;br /&gt;
 ~%20%Správná A&lt;br /&gt;
 ~%40%Správná B&lt;br /&gt;
 ~%40%Správná C.#Komentář k odpovědi k zobrazení ve výsledcích&lt;br /&gt;
 ~%-20%Špatně X&lt;br /&gt;
 ~%-20%Špatně Y&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje ==&lt;br /&gt;
* [https://docs.moodle.org/501/en/GIFT_format Moodle.org &amp;gt; GIFT format]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Siln%C3%A9_heslo</id>
		<title>Silné heslo</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Siln%C3%A9_heslo"/>
				<updated>2026-02-06T09:08:24Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Požadavky na silné heslo */ Upřesnění: nepište heslo na obrazovku.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category: CRI]][[Category: Informatika]][[Category:Bezpečnost]]&lt;br /&gt;
&lt;br /&gt;
Pro zabezepčení počítače je často potřeba silné heslo (pro zabezpečení přístupu ke klíči, pro symetrické šifry,...).&lt;br /&gt;
&lt;br /&gt;
Jaké heslo je ale ''silné'' a jak ho získat?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Úvod do bezpečnosti hesel ==&lt;br /&gt;
* Prohlédněte si video:&amp;lt;br /&amp;gt;[http://www.jaknainternet.cz/page/1178/pocitacova-hesla/ JakNaInternet.cz &amp;amp;rarr; Počítačová hesla].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Požadavky na silné heslo ==&lt;br /&gt;
&lt;br /&gt;
; Složitost hesla&lt;br /&gt;
* Dostatečná délka (alespoň 12 znaků)&lt;br /&gt;
* Různé kategorie znaků&lt;br /&gt;
** písmena (malá i velká)&lt;br /&gt;
** čísla&lt;br /&gt;
** ne-alfanumerické znaky (tečka, vykřičník,...)&lt;br /&gt;
* '''Ne'''používat jako heslo slova ze slovníku: &lt;br /&gt;
** Vymyslete si nesmyslnou kombinaci písmen&lt;br /&gt;
** Nebo zkracujte slova z věty – například berte vždy jen první (lépe prostřední) tři písmena ze slova&lt;br /&gt;
** Nebo použijte větší množství nenavazujících slov – ale pak počítejte do „délky hesla“ každé slovo spíše jako jeden až tři znaky.&lt;br /&gt;
* '''Ne'''používejte slova, která jde spojit s vámi:&lt;br /&gt;
** jména dětí, partnerů, domácích mazlíčků&lt;br /&gt;
** data narození vás či blízkých osob&lt;br /&gt;
** SPZ auta&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
; Nakládání s heslem&lt;br /&gt;
* Četnost změny &amp;amp;mdash; měňte heslo minimálně každého půl roku.&lt;br /&gt;
* Nesdělujte heslo (ani partnerovi, ani do telefonu, ani administrátorovi)!&lt;br /&gt;
* Nezapisujte si hesla na papír k&amp;amp;nbsp;počítači, na lísteček na monitoru, ...&lt;br /&gt;
* Nepoužívejte stejné heslo na více služeb &amp;amp;mdash; kdyby někdo heslo získal, získá tak přístup ke všem službám!&lt;br /&gt;
* Neukládejte heslo v počítači nebo u počítače!&lt;br /&gt;
&amp;lt;div class=&amp;quot;Varovani&amp;quot;&amp;gt;&lt;br /&gt;
Minimálně mějte jiné heslo pro služby méně citlivé (pošta, registrace na herním serveru,...) &lt;br /&gt;
a služby citlivé (elektronické bankovnictví, firemní síť,...)!&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Dvoufaktorové ověřování&lt;br /&gt;
* Kromě hesla ještě další mechanizmus.&lt;br /&gt;
* Příklady: &lt;br /&gt;
** SMS &lt;br /&gt;
** Authenticator pomocí číselných kódů&lt;br /&gt;
** Mobilní aplikace a potvrzení v ní&lt;br /&gt;
&lt;br /&gt;
== Generování hesel ==&lt;br /&gt;
&lt;br /&gt;
=== Vymyslete si heslo ===&lt;br /&gt;
Obvykle se doporučuje třeba následující postup:&lt;br /&gt;
* Vezměte větu cca o 10 slovech, kterou si snadno zapamatujete.&lt;br /&gt;
* Zapište jako heslo první (druhá/třetí/...) písmena slov ve větě.&lt;br /&gt;
* Ponechejte velká a malá písmena (je dobré, když je ve větě třeba jméno, název ulice atd., aby obsahovala velké písmena).&lt;br /&gt;
* Je dobré, když je ve větě číslovka, kterou zapíšete jako číslo.&lt;br /&gt;
* Zapište i interpunkci.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
Věta: ''Každé ráno chodím v 7:15 do školy Nádražní ulicí a zpívám si písně Beatles.''&lt;br /&gt;
&lt;br /&gt;
Heslo: Krcv7:dšNuazspB&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generování hesla na webu ===&lt;br /&gt;
* Například stránky: [https://secure.msdservices.com/apg/index.php APG]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;Vyzkoušejte si vygenerování hesla.&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Siln%C3%A9_heslo</id>
		<title>Silné heslo</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Siln%C3%A9_heslo"/>
				<updated>2026-02-04T10:30:30Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Upřesnění problému se slovy ve slovníku a postupy.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category: CRI]][[Category: Informatika]][[Category:Bezpečnost]]&lt;br /&gt;
&lt;br /&gt;
Pro zabezepčení počítače je často potřeba silné heslo (pro zabezpečení přístupu ke klíči, pro symetrické šifry,...).&lt;br /&gt;
&lt;br /&gt;
Jaké heslo je ale ''silné'' a jak ho získat?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Úvod do bezpečnosti hesel ==&lt;br /&gt;
* Prohlédněte si video:&amp;lt;br /&amp;gt;[http://www.jaknainternet.cz/page/1178/pocitacova-hesla/ JakNaInternet.cz &amp;amp;rarr; Počítačová hesla].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Požadavky na silné heslo ==&lt;br /&gt;
&lt;br /&gt;
; Složitost hesla&lt;br /&gt;
* Dostatečná délka (alespoň 12 znaků)&lt;br /&gt;
* Různé kategorie znaků&lt;br /&gt;
** písmena (malá i velká)&lt;br /&gt;
** čísla&lt;br /&gt;
** ne-alfanumerické znaky (tečka, vykřičník,...)&lt;br /&gt;
* '''Ne'''používat jako heslo slova ze slovníku: &lt;br /&gt;
** Vymyslete si nesmyslnou kombinaci písmen&lt;br /&gt;
** Nebo zkracujte slova z věty – například berte vždy jen první (lépe prostřední) tři písmena ze slova&lt;br /&gt;
** Nebo použijte větší množství nenavazujících slov – ale pak počítejte do „délky hesla“ každé slovo spíše jako jeden až tři znaky.&lt;br /&gt;
* '''Ne'''používejte slova, která jde spojit s vámi:&lt;br /&gt;
** jména dětí, partnerů, domácích mazlíčků&lt;br /&gt;
** data narození vás či blízkých osob&lt;br /&gt;
** SPZ auta&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
; Nakládání s heslem&lt;br /&gt;
* Četnost změny &amp;amp;mdash; měňte heslo minimálně každého půl roku.&lt;br /&gt;
* Nesdělujte heslo (ani partnerovi, ani do telefonu, ani administrátorovi)!&lt;br /&gt;
* Nepište na obrazovku,...&lt;br /&gt;
* Nepoužívejte stejné heslo na více služeb!&amp;lt;br /&amp;gt;Kdyby někdo heslo získal, získá tak přístup ke všem službám!&lt;br /&gt;
* Neukládejte heslo v počítači nebo u počítače!&lt;br /&gt;
&amp;lt;div class=&amp;quot;Varovani&amp;quot;&amp;gt;&lt;br /&gt;
Minimálně mějte jiné heslo pro služby méně citlivé (pošta, registrace na herním serveru,...) &lt;br /&gt;
a služby citlivé (elektronické bankovnictví, firemní síť,...)!&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Dvoufaktorové ověřování&lt;br /&gt;
* Kromě hesla ještě další mechanizmus.&lt;br /&gt;
* Příklady: &lt;br /&gt;
** SMS &lt;br /&gt;
** Authenticator pomocí číselných kódů&lt;br /&gt;
** Mobilní aplikace a potvrzení v ní&lt;br /&gt;
&lt;br /&gt;
== Generování hesel ==&lt;br /&gt;
&lt;br /&gt;
=== Vymyslete si heslo ===&lt;br /&gt;
Obvykle se doporučuje třeba následující postup:&lt;br /&gt;
* Vezměte větu cca o 10 slovech, kterou si snadno zapamatujete.&lt;br /&gt;
* Zapište jako heslo první (druhá/třetí/...) písmena slov ve větě.&lt;br /&gt;
* Ponechejte velká a malá písmena (je dobré, když je ve větě třeba jméno, název ulice atd., aby obsahovala velké písmena).&lt;br /&gt;
* Je dobré, když je ve větě číslovka, kterou zapíšete jako číslo.&lt;br /&gt;
* Zapište i interpunkci.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
Věta: ''Každé ráno chodím v 7:15 do školy Nádražní ulicí a zpívám si písně Beatles.''&lt;br /&gt;
&lt;br /&gt;
Heslo: Krcv7:dšNuazspB&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Generování hesla na webu ===&lt;br /&gt;
* Například stránky: [https://secure.msdservices.com/apg/index.php APG]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;Vyzkoušejte si vygenerování hesla.&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety</id>
		<title>Flutter: Základní widgety</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety"/>
				<updated>2026-01-26T17:35:29Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Textová pole */ Přidáno enable/readOnly/labelText&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Uspořádání stránky ==&lt;br /&gt;
&lt;br /&gt;
 Center( child: ... )&lt;br /&gt;
* Vycentruje obsah uvnitř widgetu.&lt;br /&gt;
&lt;br /&gt;
 Column(&lt;br /&gt;
   mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
   children: &amp;lt;Widget&amp;gt;[ ... ]&lt;br /&gt;
 )&lt;br /&gt;
* Vloží blok více prvků poskládaných pod sebe.&lt;br /&gt;
&lt;br /&gt;
 Padding(&lt;br /&gt;
   padding: EdgeInsetsGeometry.all(20),&lt;br /&gt;
   child: ...&lt;br /&gt;
 )&lt;br /&gt;
* Všechny prvky budou odsazeny navzájem o 20 pixelů.&lt;br /&gt;
&lt;br /&gt;
 Expanded( child: ... )&lt;br /&gt;
* Tato část okna se bude roztahovat při zvětšování okna.&lt;br /&gt;
&lt;br /&gt;
== Textová pole ==&lt;br /&gt;
 TextField(&lt;br /&gt;
   controller: _abcController,&lt;br /&gt;
   decoration: const InputDecoration(&lt;br /&gt;
     labelText: 'Nadpis pole – viditelný popisek:',&lt;br /&gt;
   ),&lt;br /&gt;
   keyboardType: TextInputType.number, // Pokud chceme omezit vstup na číselné hodnoty&lt;br /&gt;
 ),&lt;br /&gt;
&lt;br /&gt;
; Parametry widgetu&lt;br /&gt;
&lt;br /&gt;
 enabled:  &lt;br /&gt;
* Aktivní/zakázané textové pole.&lt;br /&gt;
* Zakázané textové pole je šedivé a nejde do něj umístit kurzor.&lt;br /&gt;
&lt;br /&gt;
 readOnly:  &lt;br /&gt;
* Textové pole pouze pro čtení – ale není šedivé a lze do něj umístit kurzor&lt;br /&gt;
&lt;br /&gt;
 onChanged: (text) { ... }&lt;br /&gt;
* Metoda, která se zavolá při změně obsahu tlačítka. &lt;br /&gt;
* Metoda musí přijímat jako parametr text.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Kontroler textového pole&lt;br /&gt;
 final TextEditingController _abcController = TextEditingController();&lt;br /&gt;
* Pro práci s obsahem textového pole slouží &amp;lt;code&amp;gt;TextEditingController&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 final double totalPrice = double.parse(parsedValue = _abcController.text.trim());&lt;br /&gt;
* Přístup k obsahu textového pole zprostředkovává atribut &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Obdobně lze &amp;lt;code&amp;gt;int.parse(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 _abcController.dispose()&lt;br /&gt;
* Při uvolňování paměti by měly být řádně uvolněny i kontrolery metodou &amp;lt;code&amp;gt;dispose()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; Nastavení vzhledu &amp;lt;code&amp;gt;InputDecoration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 contentPadding: EdgeInsets.all(20.0),&lt;br /&gt;
* Odsazení obsahu&lt;br /&gt;
&lt;br /&gt;
 border: OutlineInputBorder(),&lt;br /&gt;
* Ohraničení textového pole&lt;br /&gt;
&lt;br /&gt;
 labelText: 'text'&lt;br /&gt;
* Popiska textového pole.&lt;br /&gt;
* Když je pole prázdné, text je v poli.&lt;br /&gt;
* Jakmile uživatel pole vyplní, popiska se přesune do rámečku textového pole.&lt;br /&gt;
&lt;br /&gt;
 hintText: 'Text'&lt;br /&gt;
* Nápověda – co má uživatel zadat do pole.&lt;br /&gt;
* Po zadání textu do pole text zmizí.&lt;br /&gt;
&lt;br /&gt;
== Tlačítka ==&lt;br /&gt;
  ElevatedButton(&lt;br /&gt;
    onPressed: _nazevMetodyReakce,&lt;br /&gt;
    child: const Text('Popis tlačítka'),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
; Vlastnosti:&lt;br /&gt;
&lt;br /&gt;
 onPressed:   &lt;br /&gt;
* Název metody, která se vyvolá při stisknutí tlačítka.&lt;br /&gt;
* Obecně může být vložena akce i přímo&lt;br /&gt;
&lt;br /&gt;
 child:  &lt;br /&gt;
* Obsah tlačítka – popis, ikona, obrázek, ...&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* Pro zobrazení dynamického seznamu prvků.&lt;br /&gt;
* Více viz samostatná stránka [[Flutter: ListView]].&lt;br /&gt;
&lt;br /&gt;
== Odsazení ==&lt;br /&gt;
 SizedBox(height: 10),&lt;br /&gt;
&lt;br /&gt;
Příklad použití:&lt;br /&gt;
 Column(&lt;br /&gt;
   const Text('Hello'),&lt;br /&gt;
   const Sizedbox(height: 10),&lt;br /&gt;
   const Text('World!'),&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== Textová popiska ==&lt;br /&gt;
 const Text('Záznamy o tankování:',),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyskakovací bublina (Toast) ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;mobilních aplikacích se pro stručná oznámení používá spíše vyskakovací bublina, než vyskakovací okno.&lt;br /&gt;
&lt;br /&gt;
  setState(() {&lt;br /&gt;
    ScaffoldMessenger.of(context).showSnackBar(&lt;br /&gt;
      SnackBar(&lt;br /&gt;
          content: Text('Informace pro uživatele')&lt;br /&gt;
      ),&lt;br /&gt;
    );&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jednoduchý dialog ==&lt;br /&gt;
Pro zobrazení dialogu si můžeme vytvořit metodu:&lt;br /&gt;
  Future&amp;lt;void&amp;gt; displayDialog(String messageText) =&amp;gt; showDialog&amp;lt;void&amp;gt;(&lt;br /&gt;
    context: context,&lt;br /&gt;
    builder: (context) {&lt;br /&gt;
      return AlertDialog(&lt;br /&gt;
        title: const Text('Chybně zadaná data:'),&lt;br /&gt;
        content: Text(messageText),&lt;br /&gt;
        actions: &amp;lt;Widget&amp;gt;[&lt;br /&gt;
          TextButton(&lt;br /&gt;
            onPressed: () {&lt;br /&gt;
              Navigator.of(context).pop();&lt;br /&gt;
            },&lt;br /&gt;
            child: const Text('OK'),&lt;br /&gt;
          ),&lt;br /&gt;
        ],&lt;br /&gt;
      );&lt;br /&gt;
    },&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
Metodu následně voláme:&lt;br /&gt;
 displayDialog('Text');&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety</id>
		<title>Flutter: Základní widgety</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety"/>
				<updated>2026-01-26T17:31:07Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Tlačítka */ Rozepsány podrobněji vlastnosti.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Uspořádání stránky ==&lt;br /&gt;
&lt;br /&gt;
 Center( child: ... )&lt;br /&gt;
* Vycentruje obsah uvnitř widgetu.&lt;br /&gt;
&lt;br /&gt;
 Column(&lt;br /&gt;
   mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
   children: &amp;lt;Widget&amp;gt;[ ... ]&lt;br /&gt;
 )&lt;br /&gt;
* Vloží blok více prvků poskládaných pod sebe.&lt;br /&gt;
&lt;br /&gt;
 Padding(&lt;br /&gt;
   padding: EdgeInsetsGeometry.all(20),&lt;br /&gt;
   child: ...&lt;br /&gt;
 )&lt;br /&gt;
* Všechny prvky budou odsazeny navzájem o 20 pixelů.&lt;br /&gt;
&lt;br /&gt;
 Expanded( child: ... )&lt;br /&gt;
* Tato část okna se bude roztahovat při zvětšování okna.&lt;br /&gt;
&lt;br /&gt;
== Textová pole ==&lt;br /&gt;
 TextField(&lt;br /&gt;
   controller: _abcController,&lt;br /&gt;
   readOnly: true, // Pokud chcete pole pouze pro čtení&lt;br /&gt;
   decoration: const InputDecoration(&lt;br /&gt;
     labelText: 'Nadpis pole – viditelný popisek:',&lt;br /&gt;
   ),&lt;br /&gt;
   keyboardType: TextInputType.number, // Pokud chceme omezit vstup na číselné hodnoty&lt;br /&gt;
 ),&lt;br /&gt;
&lt;br /&gt;
; Kontroler textového pole&lt;br /&gt;
 final TextEditingController _abcController = TextEditingController();&lt;br /&gt;
* Pro práci s obsahem textového pole slouží &amp;lt;code&amp;gt;TextEditingController&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 final double totalPrice = double.parse(parsedValue = _abcController.text.trim());&lt;br /&gt;
* Přístup k obsahu textového pole zprostředkovává atribut &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Obdobně lze &amp;lt;code&amp;gt;int.parse(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 _abcController.dispose()&lt;br /&gt;
* Při uvolňování paměti by měly být řádně uvolněny i kontrolery metodou &amp;lt;code&amp;gt;dispose()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; Nastavení vzhledu &amp;lt;code&amp;gt;InputDecoration&amp;lt;/code&amp;gt;&lt;br /&gt;
 contentPadding: EdgeInsets.all(20.0),&lt;br /&gt;
* Odsazení obsahu&lt;br /&gt;
 border: OutlineInputBorder(),&lt;br /&gt;
* Ohraničení textového pole&lt;br /&gt;
 hintText: 'Text'&lt;br /&gt;
* Nápověda – co má uživatel zadat do pole.&lt;br /&gt;
* Po zadání textu do pole text zmizí.&lt;br /&gt;
&lt;br /&gt;
== Tlačítka ==&lt;br /&gt;
  ElevatedButton(&lt;br /&gt;
    onPressed: _nazevMetodyReakce,&lt;br /&gt;
    child: const Text('Popis tlačítka'),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
; Vlastnosti:&lt;br /&gt;
&lt;br /&gt;
 onPressed:   &lt;br /&gt;
* Název metody, která se vyvolá při stisknutí tlačítka.&lt;br /&gt;
* Obecně může být vložena akce i přímo&lt;br /&gt;
&lt;br /&gt;
 child:  &lt;br /&gt;
* Obsah tlačítka – popis, ikona, obrázek, ...&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* Pro zobrazení dynamického seznamu prvků.&lt;br /&gt;
* Více viz samostatná stránka [[Flutter: ListView]].&lt;br /&gt;
&lt;br /&gt;
== Odsazení ==&lt;br /&gt;
 SizedBox(height: 10),&lt;br /&gt;
&lt;br /&gt;
Příklad použití:&lt;br /&gt;
 Column(&lt;br /&gt;
   const Text('Hello'),&lt;br /&gt;
   const Sizedbox(height: 10),&lt;br /&gt;
   const Text('World!'),&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== Textová popiska ==&lt;br /&gt;
 const Text('Záznamy o tankování:',),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyskakovací bublina (Toast) ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;mobilních aplikacích se pro stručná oznámení používá spíše vyskakovací bublina, než vyskakovací okno.&lt;br /&gt;
&lt;br /&gt;
  setState(() {&lt;br /&gt;
    ScaffoldMessenger.of(context).showSnackBar(&lt;br /&gt;
      SnackBar(&lt;br /&gt;
          content: Text('Informace pro uživatele')&lt;br /&gt;
      ),&lt;br /&gt;
    );&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jednoduchý dialog ==&lt;br /&gt;
Pro zobrazení dialogu si můžeme vytvořit metodu:&lt;br /&gt;
  Future&amp;lt;void&amp;gt; displayDialog(String messageText) =&amp;gt; showDialog&amp;lt;void&amp;gt;(&lt;br /&gt;
    context: context,&lt;br /&gt;
    builder: (context) {&lt;br /&gt;
      return AlertDialog(&lt;br /&gt;
        title: const Text('Chybně zadaná data:'),&lt;br /&gt;
        content: Text(messageText),&lt;br /&gt;
        actions: &amp;lt;Widget&amp;gt;[&lt;br /&gt;
          TextButton(&lt;br /&gt;
            onPressed: () {&lt;br /&gt;
              Navigator.of(context).pop();&lt;br /&gt;
            },&lt;br /&gt;
            child: const Text('OK'),&lt;br /&gt;
          ),&lt;br /&gt;
        ],&lt;br /&gt;
      );&lt;br /&gt;
    },&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
Metodu následně voláme:&lt;br /&gt;
 displayDialog('Text');&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety</id>
		<title>Flutter: Základní widgety</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety"/>
				<updated>2026-01-26T17:21:08Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Odsazení */ Přidáno `const` před prvky, které se nemění.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Uspořádání stránky ==&lt;br /&gt;
&lt;br /&gt;
 Center( child: ... )&lt;br /&gt;
* Vycentruje obsah uvnitř widgetu.&lt;br /&gt;
&lt;br /&gt;
 Column(&lt;br /&gt;
   mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
   children: &amp;lt;Widget&amp;gt;[ ... ]&lt;br /&gt;
 )&lt;br /&gt;
* Vloží blok více prvků poskládaných pod sebe.&lt;br /&gt;
&lt;br /&gt;
 Padding(&lt;br /&gt;
   padding: EdgeInsetsGeometry.all(20),&lt;br /&gt;
   child: ...&lt;br /&gt;
 )&lt;br /&gt;
* Všechny prvky budou odsazeny navzájem o 20 pixelů.&lt;br /&gt;
&lt;br /&gt;
 Expanded( child: ... )&lt;br /&gt;
* Tato část okna se bude roztahovat při zvětšování okna.&lt;br /&gt;
&lt;br /&gt;
== Textová pole ==&lt;br /&gt;
 TextField(&lt;br /&gt;
   controller: _abcController,&lt;br /&gt;
   readOnly: true, // Pokud chcete pole pouze pro čtení&lt;br /&gt;
   decoration: const InputDecoration(&lt;br /&gt;
     labelText: 'Nadpis pole – viditelný popisek:',&lt;br /&gt;
   ),&lt;br /&gt;
   keyboardType: TextInputType.number, // Pokud chceme omezit vstup na číselné hodnoty&lt;br /&gt;
 ),&lt;br /&gt;
&lt;br /&gt;
; Kontroler textového pole&lt;br /&gt;
 final TextEditingController _abcController = TextEditingController();&lt;br /&gt;
* Pro práci s obsahem textového pole slouží &amp;lt;code&amp;gt;TextEditingController&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 final double totalPrice = double.parse(parsedValue = _abcController.text.trim());&lt;br /&gt;
* Přístup k obsahu textového pole zprostředkovává atribut &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Obdobně lze &amp;lt;code&amp;gt;int.parse(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 _abcController.dispose()&lt;br /&gt;
* Při uvolňování paměti by měly být řádně uvolněny i kontrolery metodou &amp;lt;code&amp;gt;dispose()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; Nastavení vzhledu &amp;lt;code&amp;gt;InputDecoration&amp;lt;/code&amp;gt;&lt;br /&gt;
 contentPadding: EdgeInsets.all(20.0),&lt;br /&gt;
* Odsazení obsahu&lt;br /&gt;
 border: OutlineInputBorder(),&lt;br /&gt;
* Ohraničení textového pole&lt;br /&gt;
 hintText: 'Text'&lt;br /&gt;
* Nápověda – co má uživatel zadat do pole.&lt;br /&gt;
* Po zadání textu do pole text zmizí.&lt;br /&gt;
&lt;br /&gt;
== Tlačítka ==&lt;br /&gt;
  ElevatedButton(&lt;br /&gt;
    onPressed: _nazevMetodyReakce,&lt;br /&gt;
    child: const Text('Popis tlačítka'),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* Pro zobrazení dynamického seznamu prvků.&lt;br /&gt;
* Více viz samostatná stránka [[Flutter: ListView]].&lt;br /&gt;
&lt;br /&gt;
== Odsazení ==&lt;br /&gt;
 SizedBox(height: 10),&lt;br /&gt;
&lt;br /&gt;
Příklad použití:&lt;br /&gt;
 Column(&lt;br /&gt;
   const Text('Hello'),&lt;br /&gt;
   const Sizedbox(height: 10),&lt;br /&gt;
   const Text('World!'),&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== Textová popiska ==&lt;br /&gt;
 const Text('Záznamy o tankování:',),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyskakovací bublina (Toast) ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;mobilních aplikacích se pro stručná oznámení používá spíše vyskakovací bublina, než vyskakovací okno.&lt;br /&gt;
&lt;br /&gt;
  setState(() {&lt;br /&gt;
    ScaffoldMessenger.of(context).showSnackBar(&lt;br /&gt;
      SnackBar(&lt;br /&gt;
          content: Text('Informace pro uživatele')&lt;br /&gt;
      ),&lt;br /&gt;
    );&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jednoduchý dialog ==&lt;br /&gt;
Pro zobrazení dialogu si můžeme vytvořit metodu:&lt;br /&gt;
  Future&amp;lt;void&amp;gt; displayDialog(String messageText) =&amp;gt; showDialog&amp;lt;void&amp;gt;(&lt;br /&gt;
    context: context,&lt;br /&gt;
    builder: (context) {&lt;br /&gt;
      return AlertDialog(&lt;br /&gt;
        title: const Text('Chybně zadaná data:'),&lt;br /&gt;
        content: Text(messageText),&lt;br /&gt;
        actions: &amp;lt;Widget&amp;gt;[&lt;br /&gt;
          TextButton(&lt;br /&gt;
            onPressed: () {&lt;br /&gt;
              Navigator.of(context).pop();&lt;br /&gt;
            },&lt;br /&gt;
            child: const Text('OK'),&lt;br /&gt;
          ),&lt;br /&gt;
        ],&lt;br /&gt;
      );&lt;br /&gt;
    },&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
Metodu následně voláme:&lt;br /&gt;
 displayDialog('Text');&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_ListView</id>
		<title>Flutter: ListView</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_ListView"/>
				<updated>2026-01-26T11:16:59Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Formátování, upřesnění title a subtitle&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* &amp;lt;code&amp;gt;ListView&amp;lt;/code&amp;gt; slouží pro zobrazení dynamického seznamu položek, kterým lze skrolovat.&lt;br /&gt;
* Lze ho využít například pro zobrazení položek ze seznamu či pro položky, které přidáváme postupně.&lt;br /&gt;
&lt;br /&gt;
== Příklad zobrazení seznamu ==&lt;br /&gt;
* Pro zobrazení seznamu &amp;lt;code&amp;gt;seznam&amp;lt;/code&amp;gt; můžeme použít ListView:&lt;br /&gt;
  List&amp;lt;Element&amp;gt; seznam = ...;&lt;br /&gt;
&lt;br /&gt;
  Expanded(&lt;br /&gt;
    child: ListView.builder(&lt;br /&gt;
      itemCount: _seznam.length,&lt;br /&gt;
      itemBuilder: (context, index) {&lt;br /&gt;
        return ListTile(&lt;br /&gt;
            title: Text('${_seznam[index].nazev}'),&lt;br /&gt;
            subtitle: Text('${_seznam[index].popis}'),&lt;br /&gt;
        );&lt;br /&gt;
      },&lt;br /&gt;
    ),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vytvoření ListView ==&lt;br /&gt;
&lt;br /&gt;
=== ListView.builder() ===&lt;br /&gt;
* Používá se pro delší nebo dynamické seznamy (nejčastější varianta).&lt;br /&gt;
* Vytváří položky až když jsou potřeba (lepší výkon)&lt;br /&gt;
&lt;br /&gt;
 ListView.builder(&lt;br /&gt;
   itemCount: 10,&lt;br /&gt;
   itemBuilder: (context, index) {&lt;br /&gt;
     return ListTile(&lt;br /&gt;
       title: Text('Položka $index'),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
=== ListView(children: []) ===&lt;br /&gt;
* Vhodné pro krátké statické seznamy &amp;amp;mdash; nelze přidávat položky.&lt;br /&gt;
&lt;br /&gt;
 ListView(&lt;br /&gt;
   children: [&lt;br /&gt;
     ListTile(title: Text('Položka 1')),&lt;br /&gt;
     ListTile(title: Text('Položka 2')),&lt;br /&gt;
     ListTile(title: Text('Položka 3')),&lt;br /&gt;
   ],&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ListTile: položka seznamu ==&lt;br /&gt;
&lt;br /&gt;
* Jednu položku dynamického seznamu reprezentuje widget &amp;lt;code&amp;gt;ListTile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Vlastnosti &amp;lt;code&amp;gt;ListTile&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; – hlavní text (nadpis položky)&lt;br /&gt;
* &amp;lt;code&amp;gt;subtitle&amp;lt;/code&amp;gt; – doplňující popis položky&lt;br /&gt;
* &amp;lt;code&amp;gt;leading&amp;lt;/code&amp;gt; – ikona vlevo&lt;br /&gt;
* &amp;lt;code&amp;gt;trailing&amp;lt;/code&amp;gt; – ikona vpravo&lt;br /&gt;
* &amp;lt;code&amp;gt;onTap&amp;lt;/code&amp;gt; – reakce na kliknutí&lt;br /&gt;
&lt;br /&gt;
; Příklad použití:&lt;br /&gt;
&lt;br /&gt;
 ListTile(&lt;br /&gt;
   leading: Icon(Icons.person),&lt;br /&gt;
   title: Text('Karel Dvořák'),&lt;br /&gt;
   subtitle: Text('místnost: 33'),&lt;br /&gt;
   trailing: Icon(Icons.arrow_forward),&lt;br /&gt;
   onTap: () {&lt;br /&gt;
     _reakceNaKlik;&lt;br /&gt;
   },&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* [[Flutter: Základní widgety]]&lt;br /&gt;
* [[Flutter: Kostra aplikace]]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Informatika</id>
		<title>Informatika</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Informatika"/>
				<updated>2026-01-26T09:39:36Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Programování */ Přidána stránka Flutter: ListView.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Historie_IT|Historie IT]] ==&lt;br /&gt;
* [[Generace počítačů]], [[Von Neumannova architektura]], &lt;br /&gt;
* [[Historie Internetu]], [[Vývoj modelů IT]]&lt;br /&gt;
* [[Historie Windows]], [[Projekt GNU a GNU/Linux]], [[Unix]], [[Svobodný software]]&lt;br /&gt;
* [[:Category:Historie_IT|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Řízení projektů|Řízení IT projektů]] ==&lt;br /&gt;
* [[Tvorba_software]]&lt;br /&gt;
* [[Git]]: [[Git: Instalace|Instalace]], [[Git: Versioning|Správa verzí]], [[Git: Repository|Vzdálený repozitář]], [[Git: Branch|Větvení]], [[Markdown]], [[Git: FAQ|FAQ]]&lt;br /&gt;
* Další nástroje: [[Slack]], [[Toggl Track]], [[Asana]]&lt;br /&gt;
* [[:Category:Dokumentace projektu|Dokumentace]]: [[Zápis zadání]], [[Uživatelská dokumentace]]&lt;br /&gt;
; Sofwarové inženýrství&lt;br /&gt;
* [[Jazyk UML|UML]]: [[UML: Use Case|Use case]], [[UML: Class|Class]], [[UML: Sequence|Sequence]], [[UML: State|State]] diagramy&lt;br /&gt;
* UI, UX: [[Návrh UI]], [[Wireframe]], [[Persony]], [[Scénáře použití]], [[Testování UI]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Programování|Programování]] ==&lt;br /&gt;
; Teorie&lt;br /&gt;
* [[Algoritmus]], [[Složitost algoritmu]]&lt;br /&gt;
* [[Programovací jazyky]]&lt;br /&gt;
* [[Řadící algoritmy]] &lt;br /&gt;
* [[Objektově orientované programování]]&lt;br /&gt;
* [[Návrhové vzory]]&lt;br /&gt;
* [[Vytvořte hezkou hru]]&lt;br /&gt;
; Zápis kódu:&lt;br /&gt;
* [[Řídící struktury programu]]: [[Cykly|cykly]], [[Větvení|větvení]]), [[Ošetření vstupních proměnných]], [[Podmíněný výraz]]&lt;br /&gt;
; [[Java]]: &lt;br /&gt;
* [[Slovníček pojmů pro programování]], [[Konvence|Konvence pro zápis kódu]], [[Vývoj aplikací v Javě]]&lt;br /&gt;
* [[Java: Zápis tříd|Zápis tříd]], [[Java: Datové typy|Datové typy]], [[Java: Modifikátory přístupu|Modifikátory přístupu]], [[Platnost proměnných]], [[Java: Abstraktní třídy, dědičnost a rozhraní|Rozhraní]], [[Java: Enum|Výčtový typ]]&lt;br /&gt;
* [[Java]]: [[Java| Další knihovní třídy]], [[Java: Práce s texty|Práce s texty]], [[Java: Kontejnery| Kontejnery]], [[Java: Práce s poli|Práce s poli]], [[Java: Řazení|Řazení kontejnerů]], [[Datum a čas v Javě|Datum a čas]]&lt;br /&gt;
* Java &amp;amp;mdash; spouštění: [[Java: Export balíčku JAR|Export balíčku JAR]], [[Spouštění appletů]]&lt;br /&gt;
* GUI: [[JavaFX v kostce]] .:. [[GUI v Javě|Základy grafického uživatelského rozhraní]], [[Java: Checkbox a RadioButton|Checkbox a RadioButton]], [[Dialogy_a_vyskakovací_okna]], [[Menu v Javě]], [[Tabulky v Javě]], [[Layout v Javě]], [[Myš v Javě]], [[Myš a obrázky v Javě &amp;amp;mdash; cvičení]], [[Java: 2D malování]]&lt;br /&gt;
* [[Práce se soubory v Javě]], [[Java: Textový vstup a výstup]], [[Serializace]], [[Databáze v Javě]]&lt;br /&gt;
* [[Výjimky v Javě]]&lt;br /&gt;
; [[:Category:Android|Programování pro Android]]: &lt;br /&gt;
* [[Android: Instalace SDK]], [[Android: Projekt|Projekt Android Studia]], [[Android: Tvorba GUI| Tvorba GUI]], [[Android: Ladění aplikace|Ladění aplikace]],[[Android: Spuštění aplikace| Spuštění aplikace]]&lt;br /&gt;
; [[Greenfoot]]&lt;br /&gt;
* [[Greenfoot]], [[Greenfoot: Řešení častých úloh]]&lt;br /&gt;
; Flutter+Dart&lt;br /&gt;
* [[Dart vs. Java]], [[Flutter: Kostra aplikace]], [[Flutter: Základní widgety]], [[Dart: Užitečné tipy]], [[Flutter: ListView]]&lt;br /&gt;
; Podpůrné nástroje&lt;br /&gt;
* [[GIT]]&lt;br /&gt;
; Výměna dat&lt;br /&gt;
* [[JSON]]&lt;br /&gt;
; [[:Category:Programování|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:HTML| Webové stránky]] ==&lt;br /&gt;
* HTML: [[HTML]], [[HTML: Položky v hlavičce stránky|Hlavička stránky]], [[HTML: Struktura webové stránky|Struktura stránky]]&lt;br /&gt;
* [[CSS|Kaskádové styly (CSS)]], &lt;br /&gt;
* [[Cvičení HTML]], [[Cvičení HTML 2]], [[Cvičení HTML 3]], [[Cvičení HTML 4]], [[Cvičení HTML 5]]&lt;br /&gt;
* [[Formuláře v PHP]], [[Ošetření vstupních proměnných]], [[HTTP přesměrování v PHP|HTTP přesměrování]]&lt;br /&gt;
* [[Testování webových stránek]], [[Publikování stránky]]&lt;br /&gt;
* JavaScript: [[Skrytí mailové adresy na webu]]&lt;br /&gt;
* [[:Category:HTML|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Principy IT| Principy IT, hardware, log. obvody]] ==&lt;br /&gt;
* [[Číselné soustavy]]&lt;br /&gt;
* [[Karnaughova mapa]], [[Booleova algebra]]&lt;br /&gt;
* [[Obvody elektrického proudu]]&lt;br /&gt;
* [[Konečný automat]], [[Regulární výrazy]]&lt;br /&gt;
* Hardware: [[HW: Skříně a chlazení| Skříně a chlazení]], [[LCD]], [[CPU]], [[Základní deska]], [[Grafická karta]]&lt;br /&gt;
* [[Pevný disk]]: [[SSD|SSD disk]], [[Klasický pevný disk|HDD]], [[Rozdělení disku]]&lt;br /&gt;
* IoT: [[ESP: Nastavení IDE]], [[ESP: Princip programování]], [[ESP: Sériový vstup a výstup]], [[ESP: GPIO]]&lt;br /&gt;
* Letní kurz IoT: [[Letní IoT: Den 1|Den 1]], [[Letní IoT: Den 2|Den 2]], [[Letní IoT: Den 3|Den 3]], [[Letní IoT: Den 4|Den 4]]&lt;br /&gt;
* Aktuální: [[Umělá inteligence]]&lt;br /&gt;
* [[:Category:Principy IT|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Admin|Operační systémy, správa počítače]] ==&lt;br /&gt;
* [[Operační systém|Co je operační systém?]], [[Zavádění operačního systému]], [[Rozdělení disku]], [[Operační_systémy#O konkrétních OS|O konkrétních OS]]&lt;br /&gt;
* [[:Category:Příkazový řádek|Příkazový řádek (kategorie)]], [[Práce v shellu]]&lt;br /&gt;
* [[Operační systémy#Uživatelská práva|Uživatelské účty a nastavení práv]], [[Operační_systémy#Souborový systém|Souborový systém]], [[Operační_systémy#Procesy a správa paměti|Procesy a správa paměti]], [[Komunikace mezi procesy]], [[Nástroje pro práci s procesy]], [[Služby a démoni]]&lt;br /&gt;
* [[Vzdálené připojení k počítači]], [[Správa síťového rozhraní počítače|Správa sítě]],  Správa HW (ve Windows)&lt;br /&gt;
* [[Zabezpečení počítače]], [[Úkoly k zabezpečení počítače]], [[Zálohování]]&lt;br /&gt;
* [[Operační systémy#Uživatelská práva|Uživatelské účty a oprávnění]]: [[Uživatelský účet]] &lt;br /&gt;
* [[Skript]]&lt;br /&gt;
* [[Správa síťového rozhraní počítače|Správa sítě v CLI]]&lt;br /&gt;
* [[Bootovací USB]]&lt;br /&gt;
; GNU/Linux&lt;br /&gt;
* Souhrn: [[Debian: návod pro uživatele]]&lt;br /&gt;
* [[Základní pojmy Linuxu]], [[Distribuce GNU/Linuxu]], [[Software pro GNU/Linux]] .:. [[Instalace software v GNU/Linuxu]]&lt;br /&gt;
* [[Konfigurační soubory|Konfigurační soubory GNU/Linuxu]]&lt;br /&gt;
* [[Základy CLI]], [[Získávání nápovědy v CLI]], [[Vstup a výstup procesů, přesměrování]], [[Proměnné prostředí]], [[Vyhodnocení příkazů]]&lt;br /&gt;
* [[Správa uživatelských účtů v Linuxu]], [[Nastavování práv|Nastavování oprávnění]], [[Speciální bity]]&lt;br /&gt;
* [[Plánování úloh]], [[Sdílení souborů pomocí Samby]], [[Samba - konfigurace]]&lt;br /&gt;
* [[Významné složky GNU/Linuxu]], [[Významné adresáře Linuxu]]&lt;br /&gt;
; Windows&lt;br /&gt;
* [[Historie Windows]], [[Verze a edice Windows]]&lt;br /&gt;
* [[Významné složky Windows]], [[Konzole MMC]]&lt;br /&gt;
* [[Sdílení souborů a tiskáren]]&lt;br /&gt;
* [[Správa uživatelských účtů ve Windows]], [[Uživatelské účty ve Windows — úkoly]]&lt;br /&gt;
* Powershell: [[Powershell: Základy]], [[Powershell: Nápověda]], [[Powershell: Cmdlets]], [[Powershell: Pipelining]]&lt;br /&gt;
* Active Directory: [[Základní pojmy Active Directory]], [[Typy účtů Active Directory]]&lt;br /&gt;
* [[:Category:Admin|A další: správa počítače ...]]&lt;br /&gt;
* [[Operační systémy|A další: operační systémy ...]]&lt;br /&gt;
&lt;br /&gt;
== [[Virtualizace počítače]] ==&lt;br /&gt;
* [[Virtualizace]]&lt;br /&gt;
* [[Nástroje pro virtualizaci]]&lt;br /&gt;
* VirtualBox: [[VirtualBox — základy ovládání]], [[Virtualizace_ukoly]]&lt;br /&gt;
&lt;br /&gt;
* [[Virtualizace počítače|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Sítě|Sítě a přenos dat]] ==&lt;br /&gt;
* Teorie informace: [[Základní pojmy teorie informace]], [[Kódování-šifrování-hashování]], [[Jednotky množství informace]], [[Měření množství informace]]&lt;br /&gt;
* [[:Category:Přenos dat|Přenos dat]]: [[Varianty přenosu dat]], [[Analogový a digitální přenos]], [[Digitalizace analogového signálu]], [[Zabezpečení proti chybám]]&lt;br /&gt;
* [[Správa síťového rozhraní počítače|Správa sítě v CLI]], [[Sdílení souborů a tiskáren]]&lt;br /&gt;
* [[:Category:Internet|Internet]]: [[Netiketa]], [[Cloud|Cloud computing]], [[Topologie Internetu|Architektura Internetu]], [[Připojení k&amp;amp;nbsp;Internetu]], [[Stažení webové stránky]]&lt;br /&gt;
* Telefonie: [[IP telefonie]], [[PSTN]], [[Mobilní telefonní síť]]&lt;br /&gt;
* Adresace a směrování: [[Adresace| Adresace IP]], [[IP adresa a maska|Výpočty s IP adresou a maskou]], [[Speciální typy IP adres]], [[Návrh IP adres| Návrh IP adres: příklady]] .:. [[Směrování]], [[Směrovací protokoly]], [[Protokol RIP]]&lt;br /&gt;
* Princip komunikace: [[Model ISO/OSI]], [[Úkoly vrstev ISO/OSI]], [[Datagramová komunikace]], [[Předávání dat]], [[Trendy počítačových sítí]]&lt;br /&gt;
* [[Strukturovaná kabeláž]], [[Konfigurace bezdrátového routeru]], [[Standardy WLAN]], [[Média počítačových sítí]]&lt;br /&gt;
* [[:Category:Bezpečnost| Bezpečnost]]: [[Rizika při práci s daty]], [[Malware]], [[Ochrana proti malware]],...&lt;br /&gt;
* Transportní vrstva: [[TCP a UDP]], [[Navazování spojení]], [[Socket a číslo portu]]&lt;br /&gt;
* Šifrování a podpis: [[Princip šifrování]], [[Hashovací funkce]], [[Elektronický podpis]], [[Šifrování prakticky]], [[Certifikát elektronického podpisu]]&lt;br /&gt;
* Relační a prezentační vrstva: [[Úkoly relační vrstvy]], [[Komprese]], [[Konverze formátů při přenosu]]&lt;br /&gt;
* Model ISO/OSI a&amp;amp;nbsp;úkoly vrstev: [[Úkoly vrstev ISO/OSI]], [[Úkoly fyzické vrstvy ISO/OSI|fyzická]], [[Úkoly linkové vrstvy ISO/OSI|linková]], [[Úkoly síťové vrstvy ISO/OSI|síťová]], [[Úkoly transportní vrstvy ISO/OSI|transportní]], [[Úkoly relační vrstvy|relační]], [[Úkoly prezentační vrstvy|prezentační]], [[Protokoly aplikační vrstvy|aplikační]].&lt;br /&gt;
* Konfigurace routeru a&amp;amp;nbsp;propojení sítí: [[Propojování sítí: Časté chyby|Časté chyby]], [[Propojování sítí: Troubleshooting|Troubleshooting]]&lt;br /&gt;
* [[:Category:Sítě|A další...]]&lt;br /&gt;
&lt;br /&gt;
== Aplikační software, [[Kancelářský software]] ==&lt;br /&gt;
* [[Licence na SW]]&lt;br /&gt;
; [[Kancelářský software]]&lt;br /&gt;
* Zpracování textů, [[Tabulkový procesor]], [[Prezentace]], [[Nástroje pro tvorbu prezentací]]&lt;br /&gt;
* [[Rejstřík]]&lt;br /&gt;
* Příklady z hodin, [[Šikovné vzorce pro Calc]]&lt;br /&gt;
* [[Kancelářský software|A další...]]&lt;br /&gt;
&lt;br /&gt;
== [[:Category:Grafika a 3D tisk|Grafika a 3D tisk]] ==&lt;br /&gt;
* [[Modelování pro 3D tisk]], [[3D tisk]]&lt;br /&gt;
* [[:Category:Grafika a 3D tisk|A další...]]&lt;br /&gt;
&lt;br /&gt;
== Související ==&lt;br /&gt;
* [[Ergonomie pracoviště]]&lt;br /&gt;
* [[Blockchain a kryptoměny]]&lt;br /&gt;
* [[Profesní prezentace]]&lt;br /&gt;
&lt;br /&gt;
== Zábava, různé ==&lt;br /&gt;
* [[Kalendář hackera]] ([http://stallman.org/articles/on-hacking.html Kdo je hacker? By RMS in english])&lt;br /&gt;
* [[Život s programátorem ;)]]&lt;br /&gt;
&lt;br /&gt;
== Postupně zrušit ==&lt;br /&gt;
* [[:Category:Zrušit|Stránky ke zrušení]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- --------------------------------------------------------------------------------------------------------------&lt;br /&gt;
------------------Starší stručnější verze, která byla vložena na hlavní stránce -----------------------------------&lt;br /&gt;
== Informatika ==&lt;br /&gt;
&lt;br /&gt;
* Historie počítačů&lt;br /&gt;
** [[Generace počítačů]]&lt;br /&gt;
** [[Von Neumannova architektura]]&lt;br /&gt;
** [[Historie Internetu]]&lt;br /&gt;
** [[Historie Windows]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Programování|Programování]]&lt;br /&gt;
** [[Řídící struktury programu]]&lt;br /&gt;
** [[Konvence|Dohodnuté konvence pro psaní kódu]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:OSY|Operační systémy]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Admin|Správa počítače]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Sítě|Sítě]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Office|SW pro kancelář]]&lt;br /&gt;
** [[Prezentace]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety</id>
		<title>Flutter: Základní widgety</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety"/>
				<updated>2026-01-26T09:39:20Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Uspořádání stránky */ Přidáno Expanded(...)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Uspořádání stránky ==&lt;br /&gt;
&lt;br /&gt;
 Center( child: ... )&lt;br /&gt;
* Vycentruje obsah uvnitř widgetu.&lt;br /&gt;
&lt;br /&gt;
 Column(&lt;br /&gt;
   mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
   children: &amp;lt;Widget&amp;gt;[ ... ]&lt;br /&gt;
 )&lt;br /&gt;
* Vloží blok více prvků poskládaných pod sebe.&lt;br /&gt;
&lt;br /&gt;
 Padding(&lt;br /&gt;
   padding: EdgeInsetsGeometry.all(20),&lt;br /&gt;
   child: ...&lt;br /&gt;
 )&lt;br /&gt;
* Všechny prvky budou odsazeny navzájem o 20 pixelů.&lt;br /&gt;
&lt;br /&gt;
 Expanded( child: ... )&lt;br /&gt;
* Tato část okna se bude roztahovat při zvětšování okna.&lt;br /&gt;
&lt;br /&gt;
== Textová pole ==&lt;br /&gt;
 TextField(&lt;br /&gt;
   controller: _abcController,&lt;br /&gt;
   readOnly: true, // Pokud chcete pole pouze pro čtení&lt;br /&gt;
   decoration: const InputDecoration(&lt;br /&gt;
     labelText: 'Nadpis pole – viditelný popisek:',&lt;br /&gt;
   ),&lt;br /&gt;
   keyboardType: TextInputType.number, // Pokud chceme omezit vstup na číselné hodnoty&lt;br /&gt;
 ),&lt;br /&gt;
&lt;br /&gt;
; Kontroler textového pole&lt;br /&gt;
 final TextEditingController _abcController = TextEditingController();&lt;br /&gt;
* Pro práci s obsahem textového pole slouží &amp;lt;code&amp;gt;TextEditingController&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 final double totalPrice = double.parse(parsedValue = _abcController.text.trim());&lt;br /&gt;
* Přístup k obsahu textového pole zprostředkovává atribut &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Obdobně lze &amp;lt;code&amp;gt;int.parse(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 _abcController.dispose()&lt;br /&gt;
* Při uvolňování paměti by měly být řádně uvolněny i kontrolery metodou &amp;lt;code&amp;gt;dispose()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; Nastavení vzhledu &amp;lt;code&amp;gt;InputDecoration&amp;lt;/code&amp;gt;&lt;br /&gt;
 contentPadding: EdgeInsets.all(20.0),&lt;br /&gt;
* Odsazení obsahu&lt;br /&gt;
 border: OutlineInputBorder(),&lt;br /&gt;
* Ohraničení textového pole&lt;br /&gt;
 hintText: 'Text'&lt;br /&gt;
* Nápověda – co má uživatel zadat do pole.&lt;br /&gt;
* Po zadání textu do pole text zmizí.&lt;br /&gt;
&lt;br /&gt;
== Tlačítka ==&lt;br /&gt;
  ElevatedButton(&lt;br /&gt;
    onPressed: _nazevMetodyReakce,&lt;br /&gt;
    child: const Text('Popis tlačítka'),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* Pro zobrazení dynamického seznamu prvků.&lt;br /&gt;
* Více viz samostatná stránka [[Flutter: ListView]].&lt;br /&gt;
&lt;br /&gt;
== Odsazení ==&lt;br /&gt;
 SizedBox(height: 10),&lt;br /&gt;
&lt;br /&gt;
Příklad použití:&lt;br /&gt;
 Column(&lt;br /&gt;
   Text('Hello'),&lt;br /&gt;
   Sizedbox(height: 10),&lt;br /&gt;
   Text('World!'),&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== Textová popiska ==&lt;br /&gt;
 const Text('Záznamy o tankování:',),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyskakovací bublina (Toast) ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;mobilních aplikacích se pro stručná oznámení používá spíše vyskakovací bublina, než vyskakovací okno.&lt;br /&gt;
&lt;br /&gt;
  setState(() {&lt;br /&gt;
    ScaffoldMessenger.of(context).showSnackBar(&lt;br /&gt;
      SnackBar(&lt;br /&gt;
          content: Text('Informace pro uživatele')&lt;br /&gt;
      ),&lt;br /&gt;
    );&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jednoduchý dialog ==&lt;br /&gt;
Pro zobrazení dialogu si můžeme vytvořit metodu:&lt;br /&gt;
  Future&amp;lt;void&amp;gt; displayDialog(String messageText) =&amp;gt; showDialog&amp;lt;void&amp;gt;(&lt;br /&gt;
    context: context,&lt;br /&gt;
    builder: (context) {&lt;br /&gt;
      return AlertDialog(&lt;br /&gt;
        title: const Text('Chybně zadaná data:'),&lt;br /&gt;
        content: Text(messageText),&lt;br /&gt;
        actions: &amp;lt;Widget&amp;gt;[&lt;br /&gt;
          TextButton(&lt;br /&gt;
            onPressed: () {&lt;br /&gt;
              Navigator.of(context).pop();&lt;br /&gt;
            },&lt;br /&gt;
            child: const Text('OK'),&lt;br /&gt;
          ),&lt;br /&gt;
        ],&lt;br /&gt;
      );&lt;br /&gt;
    },&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
Metodu následně voláme:&lt;br /&gt;
 displayDialog('Text');&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety</id>
		<title>Flutter: Základní widgety</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety"/>
				<updated>2026-01-26T09:37:53Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: ListView přesunut do samostatné stránky Flutter: ListView.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Uspořádání stránky ==&lt;br /&gt;
&lt;br /&gt;
 Center( child: ... )&lt;br /&gt;
* Vycentruje obsah uvnitř widgetu.&lt;br /&gt;
&lt;br /&gt;
 Column(&lt;br /&gt;
   mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
   children: &amp;lt;Widget&amp;gt;[ ... ]&lt;br /&gt;
 )&lt;br /&gt;
* Vloží blok více prvků poskládaných pod sebe.&lt;br /&gt;
&lt;br /&gt;
 Padding(&lt;br /&gt;
   padding: EdgeInsetsGeometry.all(20),&lt;br /&gt;
   child: ...&lt;br /&gt;
 )&lt;br /&gt;
* Všechny prvky budou odsazeny navzájem o 20 pixelů.&lt;br /&gt;
&lt;br /&gt;
== Textová pole ==&lt;br /&gt;
 TextField(&lt;br /&gt;
   controller: _abcController,&lt;br /&gt;
   readOnly: true, // Pokud chcete pole pouze pro čtení&lt;br /&gt;
   decoration: const InputDecoration(&lt;br /&gt;
     labelText: 'Nadpis pole – viditelný popisek:',&lt;br /&gt;
   ),&lt;br /&gt;
   keyboardType: TextInputType.number, // Pokud chceme omezit vstup na číselné hodnoty&lt;br /&gt;
 ),&lt;br /&gt;
&lt;br /&gt;
; Kontroler textového pole&lt;br /&gt;
 final TextEditingController _abcController = TextEditingController();&lt;br /&gt;
* Pro práci s obsahem textového pole slouží &amp;lt;code&amp;gt;TextEditingController&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 final double totalPrice = double.parse(parsedValue = _abcController.text.trim());&lt;br /&gt;
* Přístup k obsahu textového pole zprostředkovává atribut &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Obdobně lze &amp;lt;code&amp;gt;int.parse(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 _abcController.dispose()&lt;br /&gt;
* Při uvolňování paměti by měly být řádně uvolněny i kontrolery metodou &amp;lt;code&amp;gt;dispose()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; Nastavení vzhledu &amp;lt;code&amp;gt;InputDecoration&amp;lt;/code&amp;gt;&lt;br /&gt;
 contentPadding: EdgeInsets.all(20.0),&lt;br /&gt;
* Odsazení obsahu&lt;br /&gt;
 border: OutlineInputBorder(),&lt;br /&gt;
* Ohraničení textového pole&lt;br /&gt;
 hintText: 'Text'&lt;br /&gt;
* Nápověda – co má uživatel zadat do pole.&lt;br /&gt;
* Po zadání textu do pole text zmizí.&lt;br /&gt;
&lt;br /&gt;
== Tlačítka ==&lt;br /&gt;
  ElevatedButton(&lt;br /&gt;
    onPressed: _nazevMetodyReakce,&lt;br /&gt;
    child: const Text('Popis tlačítka'),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* Pro zobrazení dynamického seznamu prvků.&lt;br /&gt;
* Více viz samostatná stránka [[Flutter: ListView]].&lt;br /&gt;
&lt;br /&gt;
== Odsazení ==&lt;br /&gt;
 SizedBox(height: 10),&lt;br /&gt;
&lt;br /&gt;
Příklad použití:&lt;br /&gt;
 Column(&lt;br /&gt;
   Text('Hello'),&lt;br /&gt;
   Sizedbox(height: 10),&lt;br /&gt;
   Text('World!'),&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== Textová popiska ==&lt;br /&gt;
 const Text('Záznamy o tankování:',),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyskakovací bublina (Toast) ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;mobilních aplikacích se pro stručná oznámení používá spíše vyskakovací bublina, než vyskakovací okno.&lt;br /&gt;
&lt;br /&gt;
  setState(() {&lt;br /&gt;
    ScaffoldMessenger.of(context).showSnackBar(&lt;br /&gt;
      SnackBar(&lt;br /&gt;
          content: Text('Informace pro uživatele')&lt;br /&gt;
      ),&lt;br /&gt;
    );&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jednoduchý dialog ==&lt;br /&gt;
Pro zobrazení dialogu si můžeme vytvořit metodu:&lt;br /&gt;
  Future&amp;lt;void&amp;gt; displayDialog(String messageText) =&amp;gt; showDialog&amp;lt;void&amp;gt;(&lt;br /&gt;
    context: context,&lt;br /&gt;
    builder: (context) {&lt;br /&gt;
      return AlertDialog(&lt;br /&gt;
        title: const Text('Chybně zadaná data:'),&lt;br /&gt;
        content: Text(messageText),&lt;br /&gt;
        actions: &amp;lt;Widget&amp;gt;[&lt;br /&gt;
          TextButton(&lt;br /&gt;
            onPressed: () {&lt;br /&gt;
              Navigator.of(context).pop();&lt;br /&gt;
            },&lt;br /&gt;
            child: const Text('OK'),&lt;br /&gt;
          ),&lt;br /&gt;
        ],&lt;br /&gt;
      );&lt;br /&gt;
    },&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
Metodu následně voláme:&lt;br /&gt;
 displayDialog('Text');&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_ListView</id>
		<title>Flutter: ListView</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_ListView"/>
				<updated>2026-01-26T09:37:17Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Vytvoření základu stránky.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* &amp;lt;code&amp;gt;ListView&amp;lt;/code&amp;gt; slouží pro zobrazení dynamického seznamu položek, který lze skrolovat.&lt;br /&gt;
* Lze ho využít například pro zobrazení položek ze seznamu či pro položky, které přidáváme postupně.&lt;br /&gt;
&lt;br /&gt;
== Zobrazení seznamu ==&lt;br /&gt;
* Pro zobrazení seznamu &amp;lt;code&amp;gt;seznam&amp;lt;/code&amp;gt; můžeme použít ListView:&lt;br /&gt;
  Expanded(&lt;br /&gt;
    child: ListView.builder(&lt;br /&gt;
      itemCount: _seznam.length,&lt;br /&gt;
      itemBuilder: (context, index) {&lt;br /&gt;
        return ListTile(&lt;br /&gt;
            title: Text('${_seznam[index].abc}'),&lt;br /&gt;
            subtitle: Text('${_seznam[index].def}'),&lt;br /&gt;
        );&lt;br /&gt;
      },&lt;br /&gt;
    ),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vytvoření ListView ==&lt;br /&gt;
&lt;br /&gt;
=== ListView(children: []) ===&lt;br /&gt;
* Vhodné pro '''krátké statické seznamy''' &amp;amp;mdash; nelze přidávat položky.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
ListView(&lt;br /&gt;
  children: [&lt;br /&gt;
    ListTile(title: Text('Položka 1')),&lt;br /&gt;
    ListTile(title: Text('Položka 2')),&lt;br /&gt;
    ListTile(title: Text('Položka 3')),&lt;br /&gt;
  ],&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ListView.builder() ===&lt;br /&gt;
* Používá se pro '''delší nebo dynamické seznamy''' (nejčastější varianta).&lt;br /&gt;
* Vytváří položky '''až když jsou potřeba''' (lepší výkon)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
ListView.builder(&lt;br /&gt;
  itemCount: 10,&lt;br /&gt;
  itemBuilder: (context, index) {&lt;br /&gt;
    return ListTile(&lt;br /&gt;
      title: Text('Položka $index'),&lt;br /&gt;
    );&lt;br /&gt;
  },&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ListTile: položka seznamu ==&lt;br /&gt;
&lt;br /&gt;
* Jednu položku dynamického seznamu reprezentuje widget &amp;lt;code&amp;gt;ListTile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Vlastnosti &amp;lt;code&amp;gt;ListTile&amp;lt;/code&amp;gt;:&lt;br /&gt;
* '''leading''' – ikona vlevo&lt;br /&gt;
* '''trailing''' – ikona vpravo&lt;br /&gt;
* '''onTap''' – reakce na kliknutí&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
ListTile(&lt;br /&gt;
  leading: Icon(Icons.person),&lt;br /&gt;
  title: Text('Uživatel'),&lt;br /&gt;
  trailing: Icon(Icons.arrow_forward),&lt;br /&gt;
  onTap: () {&lt;br /&gt;
    print('Klik!');&lt;br /&gt;
  },&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* [[Flutter: Základní widgety]]&lt;br /&gt;
* [[Flutter: Kostra aplikace]]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Powershell:_Pipelining</id>
		<title>Powershell: Pipelining</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Powershell:_Pipelining"/>
				<updated>2026-01-23T09:29:08Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Filtrování */ Drobná oprava překlepu Get_ChildItem.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:OSY]][[Category:Windows]][[Category:Powershell]][[Category:Příkazový řádek]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Princip ==&lt;br /&gt;
* Propojujeme několik příkazů tak, aby jeden příkaz předával svůj výstup místo na obrazovku dalšímu příkazu ke zpracování.&lt;br /&gt;
* Na obrazovku se vypíše až výsledek celé posloupnosti příkazů.&lt;br /&gt;
* Zapisujeme tak, že mezi jednotlivé příkazy posloupnosti zapíšeme znak &amp;lt;code&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;/code&amp;gt;.&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;/code&amp;gt;... znak „roura“, anglicky „pipe“&lt;br /&gt;
* Příkazy si předávají objekty, nikoli text!&lt;br /&gt;
** (Na rozdíl od Unixu a příkazového řádku Windows.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 Get-Process *ss | Where handles -gt 900 | Sort handles&lt;br /&gt;
 Get-Service Sym* | Stop-Service -WhatIf&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zpracování ==&lt;br /&gt;
&lt;br /&gt;
 | Get-Member&lt;br /&gt;
* Zjištění vlastností objektu, který dostane na vstupu.&lt;br /&gt;
* Mohu využít jako pomocnou metodu pro zjištění, s&amp;amp;nbsp;jakými objekty pracuji.&lt;br /&gt;
*Vypisuje:&lt;br /&gt;
**Typ objektu&lt;br /&gt;
**Název, typ a popis atributů (properties)&lt;br /&gt;
**Název a popis metod&lt;br /&gt;
* Alias: &amp;lt;code&amp;gt;gm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 | Select&lt;br /&gt;
* Zobrazí pouze některé vlastnosti objektů (projekce).&lt;br /&gt;
* &amp;lt;code&amp;gt;-Property ''PropertyName1'',''PropertyName2'',''...''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 Get-ChildItem | Select -Property Name,Length | Sort -Property Length -Descending&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-ExpandProperty&amp;lt;/code&amp;gt;&lt;br /&gt;
** Skoro stejné jako &amp;lt;code&amp;gt;-Property&amp;lt;/code&amp;gt;, ale nezobrazuje nadpisy sloupců, pouze hodnoty.&lt;br /&gt;
** Vhodné pro použití uvnitř &amp;lt;code&amp;gt;(...)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-First ''N''&amp;lt;/code&amp;gt;&lt;br /&gt;
** Prvních &amp;lt;code&amp;gt;''N''&amp;lt;/code&amp;gt; položek.&lt;br /&gt;
&lt;br /&gt;
 | Sort&lt;br /&gt;
* &amp;lt;code&amp;gt;-Descending&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;-Property ''PropertyName''&amp;lt;/code&amp;gt;&lt;br /&gt;
** Podle čeho se bude řadit.&lt;br /&gt;
&lt;br /&gt;
 | Measure&lt;br /&gt;
* Zjistí počet objektů na výstupu commandletu.&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 Get-Verb | Measure&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Filtrování ==&lt;br /&gt;
 | Where-Object&lt;br /&gt;
* Commandlet pro obecné filtrování.&lt;br /&gt;
* Aliasy: &amp;lt;code&amp;gt;Where&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;-FilterScript {''...''}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Je default parametr, takže stačí i: &amp;lt;code&amp;gt; {''...''}&amp;lt;/code&amp;gt;&lt;br /&gt;
** Spustí kód v závorkách.&lt;br /&gt;
** Pokud spuštěný kód vrací pro daný objekt &amp;lt;code&amp;gt;$false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$null&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;, zahodí objekt. Jinak objekt ponechá v&amp;amp;nbsp;kolekci.&lt;br /&gt;
&lt;br /&gt;
* Lze využít: &amp;lt;code&amp;gt;$_&amp;lt;/code&amp;gt;&lt;br /&gt;
** Zastupuje aktuální objekt z kolekce.&lt;br /&gt;
** Můžeme pracovat s&amp;amp;nbsp;vlastnostmi tohoto objektu.&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 Get-Service | Where {$_.Status -eq &amp;quot;Running&amp;quot;}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;-Property ''Vlastnost'' ''operátor'' ''Hodnota''&amp;lt;/code&amp;gt;&lt;br /&gt;
** Je default parametr, takže stačí i: &amp;lt;code&amp;gt;''Vlastnost'' ''operátor'' ''Hodnota''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 Get-Service | Where Status -eq &amp;quot;Running&amp;quot;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Operátory&lt;br /&gt;
* Porovnání&lt;br /&gt;
** &amp;lt;code&amp;gt;-eq&amp;lt;/code&amp;gt;... přesná rovnost (pro textové řetězce &amp;amp;rarr; musí se přesně shodovat)&lt;br /&gt;
** &amp;lt;code&amp;gt;-gt&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-like&amp;lt;/code&amp;gt;... „podobnost“ &lt;br /&gt;
*** Pro textové řetězce &amp;amp;rarr; text musí obsahovat zadanou posloupnost jako podřetězec. &lt;br /&gt;
*** Umožní používat metaznaky &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;.&lt;br /&gt;
*** Podobné jako v&amp;amp;nbsp;SQL.&lt;br /&gt;
* Logické operátory&lt;br /&gt;
** &amp;lt;code&amp;gt;-and&amp;lt;/code&amp;gt;&lt;br /&gt;
** ...&lt;br /&gt;
; Doporučený postup&lt;br /&gt;
* Nejprve filtruj, pak zpracovávej! (Podobně jako v&amp;amp;nbsp;SQL.)&lt;br /&gt;
* Optimalizace výkonu.&lt;br /&gt;
&lt;br /&gt;
; Pro filtrování je lépe použít parametr &amp;lt;code&amp;gt;-Filter&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ale ne všechny příkazy ho mají.&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
Místo:&lt;br /&gt;
 Get-ChildItem | Where Name -like &amp;quot;*.xls&amp;quot;&lt;br /&gt;
Můžeme tedy psát:&lt;br /&gt;
 Get-ChildItem -Filter &amp;quot;*.xls&amp;quot;&lt;br /&gt;
Nebo dokonce:&lt;br /&gt;
 Get-ChildItem *.xls&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Výstup do souboru ==&lt;br /&gt;
 ... | Out-File vystup.txt&lt;br /&gt;
Lze použít také operátor &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;, který znáte z&amp;amp;nbsp;příkazového řádku Linuxu a Windows:&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 ls *.txt | Select name, length | Out-File vystup.txt&lt;br /&gt;
 ls *.txt | Select name, length &amp;gt; vystup.txt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pokud chcete obsah připojit ke stávajícímu obsahu souboru, lze použít operátor &amp;lt;code&amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; nebo přepínač &amp;lt;code&amp;gt;-Append&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 echo &amp;quot;Ahoj&amp;quot; | Out-File -Append vystup.txt&lt;br /&gt;
 echo &amp;quot;Ahoj&amp;quot; &amp;gt;&amp;gt; vystup.txt&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Předávání dat ==&lt;br /&gt;
*Commandlety mají v nápovědě informaci, jestli přijímají vstup z&amp;amp;nbsp;pipeline.&lt;br /&gt;
&lt;br /&gt;
=== Přijímání vstupu ===&lt;br /&gt;
* by value&lt;br /&gt;
** Přímo předáváme objekty.&lt;br /&gt;
** Typ objektů na výstupu prvního commandletu musí odpovídat typu objektu, který očekává na vstupu zpracovávající commandlet.&lt;br /&gt;
* by Property Name&lt;br /&gt;
** Přijímající commandlet očekává objekt, který má konkrétní vlastnost. &lt;br /&gt;
** Na samotném typu předávaného objektu nezáleží, důležité je, že má tuto konkrétní vlastnost.&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 Get-Process ''calc'' | dir&lt;br /&gt;
*Spusť předtím kalkulačku&lt;br /&gt;
*Zobrazí obsah adresáře, ve kterém je program, který realizuje proces Calc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Předávání počítačů ===&lt;br /&gt;
* Počítače nelze předávat jako objekty přímo.&lt;br /&gt;
&lt;br /&gt;
; Lze použít &amp;lt;code&amp;gt;{...}&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 Get-ADComputers -Filter * | Get-WMIObjects -class Win32_bios -ComputerName {$_.Name}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Mnoho příkazů umí také:&lt;br /&gt;
* &amp;lt;code&amp;gt;-ComputerName&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 Get-WMIObjects -class Win32_bios -ComputerName (Get-ADComputers -Filter *).Name&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Lze kombinovat se závorkou a&amp;amp;nbsp;&amp;lt;code&amp;gt;-ExpandProperty&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
 Get-WMIObjects -class ''Win32_bios'' -ComputerName (Get-ADComputers -Filter ''*'' | Select -ExpandProperty ''name'')&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Pr%C3%A1ce_s_HW_v_GNU/Linuxu</id>
		<title>Práce s HW v GNU/Linuxu</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Pr%C3%A1ce_s_HW_v_GNU/Linuxu"/>
				<updated>2026-01-21T07:31:02Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Obecné postupy */ Zrušena kapitola, rozdělena na jednotlivé části. Přidán speedtest-cli.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Linux]][[Category:Informatika]][[Category:Debian]]&lt;br /&gt;
&lt;br /&gt;
{{Based_on_Debian}}&lt;br /&gt;
&lt;br /&gt;
== Výpis připojených zařízení ==&lt;br /&gt;
* Pro jednotlivé typy sběrnic lze použít příkazy:&lt;br /&gt;
 lspci&lt;br /&gt;
 lsusb&lt;br /&gt;
&lt;br /&gt;
== Testování, ověřování ==&lt;br /&gt;
&lt;br /&gt;
=== Speedtest ===&lt;br /&gt;
* Nainstalujte balíček &amp;lt;code&amp;gt;speedtest-cli&amp;lt;/code&amp;gt; z&amp;amp;nbsp;repozitářů Debianu.&lt;br /&gt;
 speedtest-cli&lt;br /&gt;
&lt;br /&gt;
== Kliknutí dotykem touchpadu ==&lt;br /&gt;
* V GNU je standardně zakázáno vnímat „poklepání“ na touchpadu jako stisk tlačítka (u touchpadů, kde jsou i tlačítka). Nehrozí tak, že si zápěstím při psaní přemístíte kurzor.&lt;br /&gt;
; Dočasná změna&lt;br /&gt;
* Pokud chcete toto nastavení změnit, napište:&lt;br /&gt;
 synclient TapButton1=1&lt;br /&gt;
* Nastavení zrušíte příkazem:&lt;br /&gt;
 synclient TapButton1=0&lt;br /&gt;
; Trvalá změna v GNOME&lt;br /&gt;
* Debian 7: Klikněte na jméno uživatele &amp;amp;rarr; ''Nastavení systému'' &amp;amp;rarr; ''Myš a Touchpad''.&lt;br /&gt;
* Debian 8: Rozbalovací menu vpravo nahoře &amp;amp;rarr; ikonka nastavení &amp;amp;rarr; ''Myš a Touchpad''.&lt;br /&gt;
* Oba: V záložce ''Touchpad'' nastavte chování podle potřeby.&lt;br /&gt;
; Trvalá změna v LXDE&lt;br /&gt;
* Vytvořte konfigurační soubor (a odpovídající složky):&lt;br /&gt;
 /etc/X11/xorg.conf.d/synaptics.conf&lt;br /&gt;
* Zapište řádky:&lt;br /&gt;
 Section &amp;quot;InputClass&amp;quot;&lt;br /&gt;
        Identifier      &amp;quot;Touchpad&amp;quot;                      # required&lt;br /&gt;
        MatchIsTouchpad &amp;quot;yes&amp;quot;                           # required&lt;br /&gt;
        Driver          &amp;quot;synaptics&amp;quot;                     # required&lt;br /&gt;
        Option          &amp;quot;TapButton1&amp;quot;            &amp;quot;1&amp;quot;&lt;br /&gt;
 EndSection&lt;br /&gt;
&lt;br /&gt;
Další zdroje: [https://wiki.debian.org/SynapticsTouchpad Synaptic Touchpad na Debian Wiki]&lt;br /&gt;
&lt;br /&gt;
== Instalace nesvobodných ovladačů ==&lt;br /&gt;
* Pro některá HW zařízení neexistují svobodné ovladače, ale přesto ovladače existují. Debian standardně takové ovladače nezahrnuje do standardních repozitářů, ale do části [[Instalace_software_v_GNU/Linuxu#Práce_se_seznamem_repozitářů|non-free]].&lt;br /&gt;
* Postup instalace pak sestává ze tří částí:&lt;br /&gt;
*# Povolit použití části ''non-free'' repozitáře.&lt;br /&gt;
*# Aktualizace seznamu balíčků&lt;br /&gt;
*# Instalace samotného ovladače&lt;br /&gt;
* Uvádím několik běžných příkladů. Pro jiný HW je třeba nalézt odpovídající návod.&lt;br /&gt;
&lt;br /&gt;
=== Povolení repozitáře ''non-free'' ===&lt;br /&gt;
* Povolte repozitář [[Instalace_software_v_GNU/Linuxu#Práce_se_seznamem_repozitářů]].&lt;br /&gt;
** Přidejte do &amp;lt;tt&amp;gt;/etc/apt/sources.list&amp;lt;/tt&amp;gt; řádek:&lt;br /&gt;
 deb http://http.debian.net/debian/ ''stretch'' main contrib non-free&lt;br /&gt;
* Je třeba vždy dosadit správnou verzi distribuce &amp;amp;mdash; ponechte řádek jak jen, jen přidejte &amp;lt;code&amp;gt;contrib non-free&amp;lt;/code&amp;gt; na konec.&lt;br /&gt;
* Aktualizujte seznam balíků:&lt;br /&gt;
 aptitude update&lt;br /&gt;
&lt;br /&gt;
=== Bezdrátové síťové karty ===&lt;br /&gt;
* Nainstalujte ovladač:&lt;br /&gt;
 aptitude install firmware-iwlwifi&lt;br /&gt;
* Vypněte a znovu nahrajte odpovídající modul jádra:&lt;br /&gt;
 modprobe -r iwlwifi ; modprobe iwlwifi&lt;br /&gt;
&lt;br /&gt;
=== Grafická karta ATI Radeon 3000 ===&lt;br /&gt;
* Uvádím jako příklad instalace proprietárního ovladače. Podobný návod platí i pro další karty ATI viz [https://wiki.debian.org/ATIProprietary Wiki.Debian.org &amp;amp;rarr; ATI Proprietary].&lt;br /&gt;
* Typ karty zjistíte například:&lt;br /&gt;
 lspci -nn | grep VGA&lt;br /&gt;
; Postup instalace&lt;br /&gt;
* Nainstalujte hlavičky Linuxu:&lt;br /&gt;
 aptitude install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,')&lt;br /&gt;
* Nainstalujte ovladače karet (pro starší karty jako ATI Radeon 3000 to bude:&lt;br /&gt;
 aptitude -r -t wheezy-backports install fglrx-legacy-driver&lt;br /&gt;
* Vytvořte konfigurační soubor:&lt;br /&gt;
 aticonfig --initial&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Kostra_aplikace</id>
		<title>Flutter: Kostra aplikace</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Kostra_aplikace"/>
				<updated>2026-01-16T07:32:18Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Do uspořádání body přidáno `Padding` místo `Center` jako výchozí.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Základní kostra aplikace s měnícím se obsahem ==&lt;br /&gt;
&lt;br /&gt;
Metoda &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; &amp;amp;mdash; zde se začne provádět program:&lt;br /&gt;
&lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MainApp());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
; StatelessWidget – neměnná část aplikace.&lt;br /&gt;
&lt;br /&gt;
* Základ aplikace je neměnný. Pokud bychom měli aplikaci ``Hello World`` a podobné, stačilo by nám jejich vzhled nadefinovat v hlavní třídě.&lt;br /&gt;
* Části, které se musí překreslit nebo které mění obsah, jsou součásti stavu aplikace.&lt;br /&gt;
&lt;br /&gt;
 class MainApp extends StatelessWidget {&lt;br /&gt;
   const MainApp({super.key}); &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return const MaterialApp(&lt;br /&gt;
       home: XyzMainPage(title: 'Název aplikace'),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
; StatefulWidget – část UI, která se musí překreslit v&amp;amp;nbsp;průběhu životního cyklu aplikace.&lt;br /&gt;
&lt;br /&gt;
 class XyzMainPage extends StatefulWidget {&lt;br /&gt;
   const XyzMainPage({super.key, required this.title});&lt;br /&gt;
 &lt;br /&gt;
   final String title;&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;XyzMainPage&amp;gt; createState() =&amp;gt; _XyzMainPageState();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
; Reprezentace aktuálního stavu aplikace – State&lt;br /&gt;
&lt;br /&gt;
 class _XyzMainPageState extends State&amp;lt;XyzMainPage&amp;gt; {&lt;br /&gt;
 &lt;br /&gt;
   // Data aplikace&lt;br /&gt;
  &lt;br /&gt;
   // Metody pro práci s daty&lt;br /&gt;
   // Controllery tlačítek&lt;br /&gt;
 &lt;br /&gt;
   void _akceProvadejiciZmenuStavuOkna() { // Například reakce na stisk tlačítka.&lt;br /&gt;
      setState(() { ... });&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   @override&lt;br /&gt;
   void dispose() {      // Uvolnění případných kontrollerů, pokud jsou.&lt;br /&gt;
     _abcController.dispose();&lt;br /&gt;
     super.dispose();&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
         appBar: AppBar(&lt;br /&gt;
           backgroundColor: Colors.green,&lt;br /&gt;
           title: Text(widget.title),&lt;br /&gt;
         ),&lt;br /&gt;
         body: Padding(&lt;br /&gt;
           padding: const EdgeInsets.all(20.0),&lt;br /&gt;
           child: Column(&lt;br /&gt;
             mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
             children: &amp;lt;Widget&amp;gt;[&lt;br /&gt;
 &lt;br /&gt;
               // Widgety v hlavním okně&lt;br /&gt;
 &lt;br /&gt;
             ],&lt;br /&gt;
           ),&lt;br /&gt;
         ),&lt;br /&gt;
         floatingActionButton: FloatingActionButton(&lt;br /&gt;
           onPressed: _metodaProvedeniAkce,&lt;br /&gt;
           tooltip: 'Nápověda k tlačítku',&lt;br /&gt;
           child: const Icon(Icons.add),&lt;br /&gt;
         ),&lt;br /&gt;
       );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* Základní widgety pro vytvoření obsahu okna: [[Flutter: Základní widgety]].&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety</id>
		<title>Flutter: Základní widgety</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety"/>
				<updated>2026-01-16T05:57:41Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Uspořádání stránky */ Přidáno `Padding`, doplněny komentáře.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Uspořádání stránky ==&lt;br /&gt;
&lt;br /&gt;
 Center( child: ... )&lt;br /&gt;
* Vycentruje obsah uvnitř widgetu.&lt;br /&gt;
&lt;br /&gt;
 Column(&lt;br /&gt;
   mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
   children: &amp;lt;Widget&amp;gt;[ ... ]&lt;br /&gt;
 )&lt;br /&gt;
* Vloží blok více prvků poskládaných pod sebe.&lt;br /&gt;
&lt;br /&gt;
 Padding(&lt;br /&gt;
   padding: EdgeInsetsGeometry.all(20),&lt;br /&gt;
   child: ...&lt;br /&gt;
 )&lt;br /&gt;
* Všechny prvky budou odsazeny navzájem o 20 pixelů.&lt;br /&gt;
&lt;br /&gt;
== Textová pole ==&lt;br /&gt;
 TextField(&lt;br /&gt;
   controller: _abcController,&lt;br /&gt;
   readOnly: true, // Pokud chcete pole pouze pro čtení&lt;br /&gt;
   decoration: const InputDecoration(&lt;br /&gt;
     labelText: 'Nadpis pole – viditelný popisek:',&lt;br /&gt;
   ),&lt;br /&gt;
   keyboardType: TextInputType.number, // Pokud chceme omezit vstup na číselné hodnoty&lt;br /&gt;
 ),&lt;br /&gt;
&lt;br /&gt;
; Kontroler textového pole&lt;br /&gt;
 final TextEditingController _abcController = TextEditingController();&lt;br /&gt;
* Pro práci s obsahem textového pole slouží &amp;lt;code&amp;gt;TextEditingController&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 final double totalPrice = double.parse(parsedValue = _abcController.text.trim());&lt;br /&gt;
* Přístup k obsahu textového pole zprostředkovává atribut &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Obdobně lze &amp;lt;code&amp;gt;int.parse(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 _abcController.dispose()&lt;br /&gt;
* Při uvolňování paměti by měly být řádně uvolněny i kontrolery metodou &amp;lt;code&amp;gt;dispose()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; Nastavení vzhledu &amp;lt;code&amp;gt;InputDecoration&amp;lt;/code&amp;gt;&lt;br /&gt;
 contentPadding: EdgeInsets.all(20.0),&lt;br /&gt;
* Odsazení obsahu&lt;br /&gt;
 border: OutlineInputBorder(),&lt;br /&gt;
* Ohraničení textového pole&lt;br /&gt;
 hintText: 'Text'&lt;br /&gt;
* Nápověda – co má uživatel zadat do pole.&lt;br /&gt;
* Po zadání textu do pole text zmizí.&lt;br /&gt;
&lt;br /&gt;
== Tlačítka ==&lt;br /&gt;
  ElevatedButton(&lt;br /&gt;
    onPressed: _nazevMetodyReakce,&lt;br /&gt;
    child: const Text('Popis tlačítka'),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* Pro zobrazení seznamu &amp;lt;code&amp;gt;seznam&amp;lt;/code&amp;gt; můžeme použít ListView:&lt;br /&gt;
  Expanded(&lt;br /&gt;
    child: ListView.builder(&lt;br /&gt;
      itemCount: _seznam.length,&lt;br /&gt;
      itemBuilder: (context, index) {&lt;br /&gt;
        return ListTile(&lt;br /&gt;
            title: Text('${_seznam[index].abc}'),&lt;br /&gt;
            subtitle: Text('${_seznam[index].def}'),&lt;br /&gt;
        );&lt;br /&gt;
      },&lt;br /&gt;
    ),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
== Odsazení ==&lt;br /&gt;
 SizedBox(height: 10),&lt;br /&gt;
&lt;br /&gt;
Příklad použití:&lt;br /&gt;
 Column(&lt;br /&gt;
   Text('Hello'),&lt;br /&gt;
   Sizedbox(height: 10),&lt;br /&gt;
   Text('World!'),&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== Textová popiska ==&lt;br /&gt;
 const Text('Záznamy o tankování:',),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyskakovací bublina (Toast) ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;mobilních aplikacích se pro stručná oznámení používá spíše vyskakovací bublina, než vyskakovací okno.&lt;br /&gt;
&lt;br /&gt;
  setState(() {&lt;br /&gt;
    ScaffoldMessenger.of(context).showSnackBar(&lt;br /&gt;
      SnackBar(&lt;br /&gt;
          content: Text('Informace pro uživatele')&lt;br /&gt;
      ),&lt;br /&gt;
    );&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jednoduchý dialog ==&lt;br /&gt;
Pro zobrazení dialogu si můžeme vytvořit metodu:&lt;br /&gt;
  Future&amp;lt;void&amp;gt; displayDialog(String messageText) =&amp;gt; showDialog&amp;lt;void&amp;gt;(&lt;br /&gt;
    context: context,&lt;br /&gt;
    builder: (context) {&lt;br /&gt;
      return AlertDialog(&lt;br /&gt;
        title: const Text('Chybně zadaná data:'),&lt;br /&gt;
        content: Text(messageText),&lt;br /&gt;
        actions: &amp;lt;Widget&amp;gt;[&lt;br /&gt;
          TextButton(&lt;br /&gt;
            onPressed: () {&lt;br /&gt;
              Navigator.of(context).pop();&lt;br /&gt;
            },&lt;br /&gt;
            child: const Text('OK'),&lt;br /&gt;
          ),&lt;br /&gt;
        ],&lt;br /&gt;
      );&lt;br /&gt;
    },&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
Metodu následně voláme:&lt;br /&gt;
 displayDialog('Text');&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Skript</id>
		<title>Skript</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Skript"/>
				<updated>2026-01-14T08:53:18Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Vytvoření skriptu */ Přidán shebang&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Linux]]&lt;br /&gt;
&lt;br /&gt;
== Co je skript? ==&lt;br /&gt;
* Pokud často spouštíme stejnou nebo podobnou posloupnost příkazů (třeba zálohování nějakých složek atd.), můžeme si zjednodušit práci.&lt;br /&gt;
* Zapíšeme tyto příkazy do souboru (označujeme ho jako ''skript'') a spuštěním tohoto souboru se provedou všechny příkazy naráz.&lt;br /&gt;
* Lze zahrnout i podmínky, cykly, zadávat parametry apod.&lt;br /&gt;
&lt;br /&gt;
== Vytvoření skriptu ==&lt;br /&gt;
* Pro vyzkoušení můžete vytvořit jednoduchý skript „Hello world“:&lt;br /&gt;
* Připravte složku s názvem &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; ve své domovské složce.&lt;br /&gt;
* Připravte v ní skript (vytvořte textový soubor) s názvem &amp;lt;tt&amp;gt;pozdrav&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Do souboru zapište příkaz pro výpis &amp;quot;Ahoj světe&amp;quot; &amp;amp;mdash; bude fungovat ve Windows i v&amp;amp;nbsp;Linuxu:&lt;br /&gt;
 echo &amp;quot;Ahoj světe&amp;quot;&lt;br /&gt;
* Soubor ale zatím není považován za spustitelný, to doplníme v&amp;amp;nbsp;dalším kroku.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;&lt;br /&gt;
V&amp;amp;nbsp;Unixu a Linuxu je zvykem na prvním řádku skriptu uvést, který shell se má použít pro interpretaci skriptu. Například:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
&lt;br /&gt;
Toto se obvykle označuje jako „shebang line“. Pro spuštění Bashe je tedy vhodné skript v&amp;amp;nbsp;Linuxu zapsat takto:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Ahoj světe&amp;quot;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nastavení oprávnění a spuštění skriptu ==&lt;br /&gt;
=== Windows ===&lt;br /&gt;
* Příkazy zapište do souboru s příponou &amp;lt;tt&amp;gt;.bat&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Takový soubor půjde spustit jako program.&lt;br /&gt;
* Spouštíme ho buď ze složky, kde je uložen:&lt;br /&gt;
 skript.bat&lt;br /&gt;
* ... nebo ho přesuneme do složky, která je v [[Proměnné prostředí|proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;]]. Pak lze skript spustit ze kterékoli složky!&lt;br /&gt;
&lt;br /&gt;
=== GNU/Linux ===&lt;br /&gt;
* Přípona souboru zde nerozhoduje, obvykle se žádná přípona nepřipojuje.&lt;br /&gt;
* Aby šel program spustit, musíme nastavit [[Nastavování práv|práva pro spuštění]]:&lt;br /&gt;
 chmod a+x skript&lt;br /&gt;
* Skript musíme buď:&lt;br /&gt;
*# přesunout do nějakého adresáře uvedeného v proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;,&lt;br /&gt;
*# nebo spouštět s uvedením cesty:&lt;br /&gt;
 ./skript&lt;br /&gt;
&amp;lt;div class=&amp;quot;Upozorneni&amp;quot;&amp;gt;POZOR! Pokud není skript v proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, na rozdíl od Windows nestačí pro spuštění napsat ve složce skriptu:&lt;br /&gt;
 skript&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zařazení do PATH ===&lt;br /&gt;
* Skript nyní nejde spustit zapsáním jména skriptu, je třeba uvést cestu&lt;br /&gt;
 ''$'' pozdrav&lt;br /&gt;
 ''-bash: pozdrav: příkaz nenalezen''&lt;br /&gt;
 ''$'' ./pozdrav&lt;br /&gt;
 ''Ahoj''&lt;br /&gt;
* Pokud chcete skript spouštět pouze zapsáním jeho jména, přidejte složku &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; do proměnné &amp;lt;tt&amp;gt;$PATH&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 PATH=$PATH:~/bin&lt;br /&gt;
resp.:&lt;br /&gt;
 set PATH=%PATH%;%USERPROFILE%\bin&lt;br /&gt;
* Vyzkoušejte, že skript již lze spustit tak, že napíšete pouze název.&lt;br /&gt;
&lt;br /&gt;
* Můžete také přiřazení PATH vložit do inicializace Bashe tak, aby se vám proměnná nastavila automaticky při spuštění shellu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;Poznámka:&amp;lt;br /&amp;gt;&lt;br /&gt;
Pokud v Ubuntu existuje složka &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; ve Vaší domovské složce, automaticky se přidá do proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Tato akce se provede ve skriptu &amp;lt;tt&amp;gt;/.profile&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Podmínky ==&lt;br /&gt;
* Pro studenty Cisco Networking Academy viz kurz NDG Linux Essentials.&lt;br /&gt;
* Pro ostatní například: [http://www.linuxexpres.cz/praxe/bash-11-dil LinuxExpres.cz &amp;amp;rarr; BASH].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cyklus &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; ==&lt;br /&gt;
; Linux (bash)&lt;br /&gt;
* Základní syntaxe:&lt;br /&gt;
 for ''název-proměnné'' in ''varianty-oddělené-mezerou-nebo-metaznak''; do ''příkaz'' $''název-proměnné''&lt;br /&gt;
* Příklady:&lt;br /&gt;
 for user in Franta Marie Karel; do echo Hello $user&lt;br /&gt;
Postupně pozdraví všechny uživatele &amp;amp;mdash; pro každého vypíše pozdrav &amp;quot;Hello Franta&amp;quot; apod.&lt;br /&gt;
 for directory in data zalohy pokusy; do mkdir $directory&lt;br /&gt;
Vytvoří uvedené složky v&amp;amp;nbsp;aktuálním adresáři.&lt;br /&gt;
 for user in franta marie karel; do usermod -aG skupina $user&lt;br /&gt;
Přidá všechny uvedené uživatelské účty do skupiny s názvem &amp;lt;em&amp;gt;skupina&amp;lt;/em&amp;gt;. Musí spouštět správce počítače (&amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;). Uživatelské účty musí existovat (&amp;lt;code&amp;gt;adduser&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Viz také:&lt;br /&gt;
* Pro studenty Cisco Networking Academy viz NDG Linux Essentials.&lt;br /&gt;
* Pro ostatní například: [http://www.linuxexpres.cz/praxe/bash-9-dil LinuxExpres.cz &amp;amp;rarr; BASH].&lt;br /&gt;
&lt;br /&gt;
; Windows&lt;br /&gt;
* Základní syntaxe:&lt;br /&gt;
 for %''název-proměnné'' in (''varianty-oddělené-mezerou-nebo-metaznak'') do ''příkaz'' %''název-proměnné''&lt;br /&gt;
* Příklady:&lt;br /&gt;
 for %x in (a*.jpg) do ren %x %x.bkp&lt;br /&gt;
 for %slozka in (data zalohy pokusy) do if not exist %slozka md %slozka&lt;br /&gt;
* Ve skriptech je třeba znak procento zdvojit:&lt;br /&gt;
 for %%x in (a*.jpg) do ren %%x %%x.bkp&lt;br /&gt;
 for %%slozka in (data zalohy pokusy) do if not exist %%slozka md %%slozka&lt;br /&gt;
&lt;br /&gt;
== Funkce ==&lt;br /&gt;
; Linux (bash)&lt;br /&gt;
* Deklarace funkce:&lt;br /&gt;
 function ''název-funkce'' {&lt;br /&gt;
     ''příkazy''&lt;br /&gt;
 }&lt;br /&gt;
* Volání funkce:&lt;br /&gt;
 ''název-funkce''&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Skript</id>
		<title>Skript</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Skript"/>
				<updated>2026-01-14T08:49:30Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Přidán příklad vytvoření shellu - přesunut ze stránky Proměnné prostředí.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Linux]]&lt;br /&gt;
&lt;br /&gt;
== Co je skript? ==&lt;br /&gt;
* Pokud často spouštíme stejnou nebo podobnou posloupnost příkazů (třeba zálohování nějakých složek atd.), můžeme si zjednodušit práci.&lt;br /&gt;
* Zapíšeme tyto příkazy do souboru (označujeme ho jako ''skript'') a spuštěním tohoto souboru se provedou všechny příkazy naráz.&lt;br /&gt;
* Lze zahrnout i podmínky, cykly, zadávat parametry apod.&lt;br /&gt;
&lt;br /&gt;
== Vytvoření skriptu ==&lt;br /&gt;
* Pro vyzkoušení můžete vytvořit jednoduchý skript „Hello world“:&lt;br /&gt;
* Připravte složku s názvem &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; ve své domovské složce.&lt;br /&gt;
* Připravte v ní skript (vytvořte textový soubor) s názvem &amp;lt;tt&amp;gt;pozdrav&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Do souboru zapište příkaz pro výpis &amp;quot;Ahoj světe&amp;quot; &amp;amp;mdash; bude fungovat ve Windows i v&amp;amp;nbsp;Linuxu:&lt;br /&gt;
 echo &amp;quot;Ahoj světe&amp;quot;&lt;br /&gt;
* Soubor ale zatím není považován za spustitelný, to doplníme v&amp;amp;nbsp;dalším kroku.&lt;br /&gt;
&lt;br /&gt;
== Nastavení oprávnění a spuštění skriptu ==&lt;br /&gt;
=== Windows ===&lt;br /&gt;
* Příkazy zapište do souboru s příponou &amp;lt;tt&amp;gt;.bat&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Takový soubor půjde spustit jako program.&lt;br /&gt;
* Spouštíme ho buď ze složky, kde je uložen:&lt;br /&gt;
 skript.bat&lt;br /&gt;
* ... nebo ho přesuneme do složky, která je v [[Proměnné prostředí|proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;]]. Pak lze skript spustit ze kterékoli složky!&lt;br /&gt;
&lt;br /&gt;
=== GNU/Linux ===&lt;br /&gt;
* Přípona souboru zde nerozhoduje, obvykle se žádná přípona nepřipojuje.&lt;br /&gt;
* Aby šel program spustit, musíme nastavit [[Nastavování práv|práva pro spuštění]]:&lt;br /&gt;
 chmod a+x skript&lt;br /&gt;
* Skript musíme buď:&lt;br /&gt;
*# přesunout do nějakého adresáře uvedeného v proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;,&lt;br /&gt;
*# nebo spouštět s uvedením cesty:&lt;br /&gt;
 ./skript&lt;br /&gt;
&amp;lt;div class=&amp;quot;Upozorneni&amp;quot;&amp;gt;POZOR! Pokud není skript v proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, na rozdíl od Windows nestačí pro spuštění napsat ve složce skriptu:&lt;br /&gt;
 skript&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zařazení do PATH ===&lt;br /&gt;
* Skript nyní nejde spustit zapsáním jména skriptu, je třeba uvést cestu&lt;br /&gt;
 ''$'' pozdrav&lt;br /&gt;
 ''-bash: pozdrav: příkaz nenalezen''&lt;br /&gt;
 ''$'' ./pozdrav&lt;br /&gt;
 ''Ahoj''&lt;br /&gt;
* Pokud chcete skript spouštět pouze zapsáním jeho jména, přidejte složku &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; do proměnné &amp;lt;tt&amp;gt;$PATH&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 PATH=$PATH:~/bin&lt;br /&gt;
resp.:&lt;br /&gt;
 set PATH=%PATH%;%USERPROFILE%\bin&lt;br /&gt;
* Vyzkoušejte, že skript již lze spustit tak, že napíšete pouze název.&lt;br /&gt;
&lt;br /&gt;
* Můžete také přiřazení PATH vložit do inicializace Bashe tak, aby se vám proměnná nastavila automaticky při spuštění shellu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;Poznámka:&amp;lt;br /&amp;gt;&lt;br /&gt;
Pokud v Ubuntu existuje složka &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; ve Vaší domovské složce, automaticky se přidá do proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;. &lt;br /&gt;
Tato akce se provede ve skriptu &amp;lt;tt&amp;gt;/.profile&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Podmínky ==&lt;br /&gt;
* Pro studenty Cisco Networking Academy viz kurz NDG Linux Essentials.&lt;br /&gt;
* Pro ostatní například: [http://www.linuxexpres.cz/praxe/bash-11-dil LinuxExpres.cz &amp;amp;rarr; BASH].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cyklus &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; ==&lt;br /&gt;
; Linux (bash)&lt;br /&gt;
* Základní syntaxe:&lt;br /&gt;
 for ''název-proměnné'' in ''varianty-oddělené-mezerou-nebo-metaznak''; do ''příkaz'' $''název-proměnné''&lt;br /&gt;
* Příklady:&lt;br /&gt;
 for user in Franta Marie Karel; do echo Hello $user&lt;br /&gt;
Postupně pozdraví všechny uživatele &amp;amp;mdash; pro každého vypíše pozdrav &amp;quot;Hello Franta&amp;quot; apod.&lt;br /&gt;
 for directory in data zalohy pokusy; do mkdir $directory&lt;br /&gt;
Vytvoří uvedené složky v&amp;amp;nbsp;aktuálním adresáři.&lt;br /&gt;
 for user in franta marie karel; do usermod -aG skupina $user&lt;br /&gt;
Přidá všechny uvedené uživatelské účty do skupiny s názvem &amp;lt;em&amp;gt;skupina&amp;lt;/em&amp;gt;. Musí spouštět správce počítače (&amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;). Uživatelské účty musí existovat (&amp;lt;code&amp;gt;adduser&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Viz také:&lt;br /&gt;
* Pro studenty Cisco Networking Academy viz NDG Linux Essentials.&lt;br /&gt;
* Pro ostatní například: [http://www.linuxexpres.cz/praxe/bash-9-dil LinuxExpres.cz &amp;amp;rarr; BASH].&lt;br /&gt;
&lt;br /&gt;
; Windows&lt;br /&gt;
* Základní syntaxe:&lt;br /&gt;
 for %''název-proměnné'' in (''varianty-oddělené-mezerou-nebo-metaznak'') do ''příkaz'' %''název-proměnné''&lt;br /&gt;
* Příklady:&lt;br /&gt;
 for %x in (a*.jpg) do ren %x %x.bkp&lt;br /&gt;
 for %slozka in (data zalohy pokusy) do if not exist %slozka md %slozka&lt;br /&gt;
* Ve skriptech je třeba znak procento zdvojit:&lt;br /&gt;
 for %%x in (a*.jpg) do ren %%x %%x.bkp&lt;br /&gt;
 for %%slozka in (data zalohy pokusy) do if not exist %%slozka md %%slozka&lt;br /&gt;
&lt;br /&gt;
== Funkce ==&lt;br /&gt;
; Linux (bash)&lt;br /&gt;
* Deklarace funkce:&lt;br /&gt;
 function ''název-funkce'' {&lt;br /&gt;
     ''příkazy''&lt;br /&gt;
 }&lt;br /&gt;
* Volání funkce:&lt;br /&gt;
 ''název-funkce''&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Prom%C4%9Bnn%C3%A9_prost%C5%99ed%C3%AD</id>
		<title>Proměnné prostředí</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Prom%C4%9Bnn%C3%A9_prost%C5%99ed%C3%AD"/>
				<updated>2026-01-14T08:38:45Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Příklady */ Sekce Příklady přesunuta do Skript, protože je o skriptech.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:OSY]][[Category:Linux]][[Category:Příkazový řádek]]&lt;br /&gt;
&lt;br /&gt;
== Proměnné prostředí ==&lt;br /&gt;
* Anglicky: ''environment variables''&lt;br /&gt;
* Shell si můžeme představit jako interpret programovacího jazyka, tvořeného příkazy shellu. Pro vytváření programů (skriptů) pak často potřebujeme proměnné.&lt;br /&gt;
* Vlastně se jedná o způsob [[Komunikace mezi procesy|komunikace mezi procesy]].&lt;br /&gt;
&lt;br /&gt;
; Příklad použití&lt;br /&gt;
* Při instalaci programu instalátor nastaví do trvalých proměnných cesty k adresáři s fonty.&lt;br /&gt;
* Pokud adresář přesunu, stačí přenastavit hodnotu proměnné a program poběží bez problémů dál.&lt;br /&gt;
** může provést uživatel (z vlastních důvodů)&lt;br /&gt;
** nebo autor programu, například v příští verzi, když zjistí, že by bylo jiné umístění lepší.&lt;br /&gt;
* Při spuštění program načte aktuální cestu z proměnné.&lt;br /&gt;
* (Program ale musí být naprogramován tak, aby hledal cestu v proměnné prostředí.)&lt;br /&gt;
&lt;br /&gt;
; Kde se používají proměnné&lt;br /&gt;
*V shellu&lt;br /&gt;
**Jejich hodnoty nahrazuje shell&lt;br /&gt;
**pokud se na řádku objeví $promenna, dosadí hodnotu proměnné promenna&lt;br /&gt;
*Ve [[Skript | skriptech]]&lt;br /&gt;
*V programech&lt;br /&gt;
**Pro zajímavost: [http://download.oracle.com/javase/tutorial/essential/environment/env.html práce s proměnnými v Javě]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Priklad&amp;quot;&amp;gt;&lt;br /&gt;
;Příklady použití:&lt;br /&gt;
# Typografický systém LaTeX používá proměnné pro uložení informací o umístění složek s fonty, spustitelnými soubory apod.&lt;br /&gt;
# Pokud chceme spouštět balíčky .JAR v Javě, musíme mít k prostředí Javy nastavenu cestu (viz [[Java: Export balíčku JAR]]).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Proměnné shellu × proměnné prostředí ==&lt;br /&gt;
*Anglicky: ''shell variables'' × ''environment variables''&lt;br /&gt;
*Proměnné shellu platí pouze pro aktuální shell. (Spuštěné procesy je nezdědí.)&lt;br /&gt;
*Proměnné prostředí zdědí od aktuálního procesu všechny dceřinné procesy.&lt;br /&gt;
** Například příkazy spuštěné z shellu.&lt;br /&gt;
&lt;br /&gt;
== Práce s proměnnými: bash ==&lt;br /&gt;
; Vytvoření proměnné/nastavení hodnoty proměnné&lt;br /&gt;
* proměná shellu&lt;br /&gt;
 promenna=hodnota&lt;br /&gt;
* Kopírování (export) proměnné shellu do prostředí:&lt;br /&gt;
 export promenna&lt;br /&gt;
* Zkráceně lze psát naráz:&lt;br /&gt;
 export promenna=hodnota&lt;br /&gt;
* Dočasné nastavení jen pro spouštěnou aplikaci&lt;br /&gt;
    LANGUAGE=cs nano&lt;br /&gt;
&lt;br /&gt;
;Výpis hodnoty proměnné&lt;br /&gt;
*proměnná shellu nebo prostředí&lt;br /&gt;
 echo $promenna&lt;br /&gt;
*proměnné prostředí&lt;br /&gt;
 printenv promenna&lt;br /&gt;
&lt;br /&gt;
;Výpis všech proměnných&lt;br /&gt;
* všechny proměnné (i shellu)&lt;br /&gt;
 set&lt;br /&gt;
* proměnné prostředí&lt;br /&gt;
 printenv&lt;br /&gt;
&lt;br /&gt;
;Smazání proměnné&lt;br /&gt;
* nastavení prázdné hodnoty&lt;br /&gt;
** ale proměnná zůstane, byť s prázdnou hodnotou&lt;br /&gt;
 promenna=&lt;br /&gt;
* uvolnění proměnné prostředí i shellu&lt;br /&gt;
 unset promenna&lt;br /&gt;
* odstranění hodnoty z prostředí, ale ponechání aktuální hodnoty proměnné shellu&lt;br /&gt;
 export -n promenna&lt;br /&gt;
&lt;br /&gt;
== Významné proměnné Unixu/Linuxu ==&lt;br /&gt;
Dále uvádíme proměnné, které jsou v unixových systémech často nastaveny. &lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;V&amp;amp;nbsp;závislosti na konkrétním nastavení počítače a zvolené distribuci ale některé z těchto proměnných nemusí být nastaveny.&amp;lt;/div&amp;gt;&lt;br /&gt;
*http_proxy&lt;br /&gt;
    http_proxy=ht&amp;lt;tt&amp;gt;&amp;lt;/tt&amp;gt;tp://172.16.1.1:3128&lt;br /&gt;
*PATH&lt;br /&gt;
**složky, odkud se mohou spouštět soubory,&lt;br /&gt;
**cesty ke složkám jsou oddělené dvojtečkou.&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;Proměnná PATH funguje i ve Windows, jen jsou cesty oddělené středníkem.&amp;lt;/div&amp;gt;&lt;br /&gt;
*USER&lt;br /&gt;
    echo $USER&lt;br /&gt;
*SHELL&lt;br /&gt;
*HOME&lt;br /&gt;
**domovský adresář aktuálního uživatele&lt;br /&gt;
*PWD&lt;br /&gt;
**aktuální cesta&lt;br /&gt;
*EDITOR&lt;br /&gt;
    EDITOR=nano&lt;br /&gt;
*LANGUAGE&lt;br /&gt;
** nastavení jazyka (&amp;lt;tt&amp;gt;cs_CZ&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;en_US&amp;lt;/tt&amp;gt;)&lt;br /&gt;
    LANGUAGE=en_US nano&lt;br /&gt;
    LANGUAGE=cs_CZ nano&lt;br /&gt;
*LANG&lt;br /&gt;
** nastavení národního prostředí (&amp;lt;tt&amp;gt;cs_CZ.UTF-8&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;en_US.UTF-8&amp;lt;/tt&amp;gt;)&lt;br /&gt;
    LANG=en_US.UTF-8 nano&lt;br /&gt;
&lt;br /&gt;
== Nastavení hodnoty trvale ==&lt;br /&gt;
=== Windows ===&lt;br /&gt;
* Tento počítač-&amp;gt; Vlastnosti-&amp;gt; Upřesnit-&amp;gt; Proměnné prostředí&lt;br /&gt;
* Uživatelské proměnné&lt;br /&gt;
* Globální proměnné&lt;br /&gt;
&lt;br /&gt;
=== GNU/Linux (shell &amp;lt;tt&amp;gt;bash&amp;lt;/tt&amp;gt;) ===&lt;br /&gt;
* Vyzkoušeno v distribuci Debian.&lt;br /&gt;
* Při startu systému/shellu se spouští konfigurační skripty, kde lze nastavit proměnné.&lt;br /&gt;
* Obecně každý shell může spouštět jiné konfigurační skripty.&lt;br /&gt;
; Pro daného uživatele&lt;br /&gt;
* &amp;lt;tt&amp;gt;~/.profile&amp;lt;/tt&amp;gt;&lt;br /&gt;
** Spouští se při spuštění ''login shell-u'', tedy se načítá po přihlášení uživatele.&lt;br /&gt;
** Pro zajímavost: v tomto skriptu se nastavuje hodnota proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; (Debian 6).&lt;br /&gt;
* Další možnosti: &amp;lt;tt&amp;gt;~/.bash_profile&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;~./bash_login&amp;lt;/tt&amp;gt;&lt;br /&gt;
** pokud existují, &amp;lt;tt&amp;gt;bash&amp;lt;/tt&amp;gt; je použije místo &amp;lt;tt&amp;gt;~/.profile&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;~/.bashrc&amp;lt;/tt&amp;gt;&lt;br /&gt;
** Spouští se v ''non-login shellu'', tedy pokud jsem již přihlášen a spouštím další shell (například z grafického prostředí, nebo příkazem &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt;)&lt;br /&gt;
; Pro všechny uživatele &lt;br /&gt;
* &amp;lt;tt&amp;gt;/etc/profile&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;/etc/bash.bashrc&amp;lt;/tt&amp;gt;&lt;br /&gt;
** Specifické pro Ubuntu?&lt;br /&gt;
* &amp;lt;tt&amp;gt;/etc/environment&amp;lt;/tt&amp;gt;&lt;br /&gt;
**není to skript, jen přiřazení proměnných&lt;br /&gt;
&lt;br /&gt;
Více viz také: [https://wiki.debian.org/EnvironmentVariables Wiki.Debian.org &amp;amp;gt; EnvironmentVariables].&lt;br /&gt;
&lt;br /&gt;
== Úkoly ==&lt;br /&gt;
; Jednoduché úkoly:&lt;br /&gt;
# Vypište všechny proměnné&lt;br /&gt;
# Vypište hodnotu proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Nastavte proměnnou &amp;lt;tt&amp;gt;MyBinDir&amp;lt;/tt&amp;gt; na hodnotu &amp;lt;tt&amp;gt;~/bin&amp;lt;/tt&amp;gt;&lt;br /&gt;
#Přidejte cestu &amp;lt;tt&amp;gt;~/bin&amp;lt;/tt&amp;gt; do proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;. Ověřte, že proběhlo správně.&lt;br /&gt;
# Kdybyste smazali proměnnou &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;. Půjdou spustit příkazy??? Jak to vyřešíte? Vyzkoušejte!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Úkol &amp;amp;mdash; login skript&lt;br /&gt;
*Zařidte, aby byla kdykoli po spuštění shellu dostupná proměnná &amp;lt;tt&amp;gt;LOGIN_TIME&amp;lt;/tt&amp;gt;, ve které bude uložen čas přihlášení.&lt;br /&gt;
*Použijte příkaz &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;&lt;br /&gt;
*Vytvořte soubor &amp;lt;tt&amp;gt;.logintimes&amp;lt;/tt&amp;gt;, ve kterém budou data spuštění Bash-e pro každé přihlášení.&lt;br /&gt;
**Jak často se do souboru bude psát?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Reseni&amp;quot;&amp;gt;&lt;br /&gt;
Řešení úkolů (Linux):&lt;br /&gt;
# &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;echo $PATH&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;set | grep ^PATH=&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;MyBinDir=~/bin&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;PATH=$PATH:$HOME/bin&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;code&amp;gt;echo $PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;PATH=&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* [[Vyhodnocení příkazů]]&lt;br /&gt;
&lt;br /&gt;
== Zdroje ==&lt;br /&gt;
*[https://help.ubuntu.com/community/EnvironmentVariables Ubuntu.com -&amp;gt; Environment Variables]&lt;br /&gt;
*[http://wiki.ubuntu.cz/V%C3%ADcejazy%C4%8Dn%C3%BD%20syst%C3%A9m Wiki.Ubuntu.cz -&amp;gt; Vícejazyčný systém]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Skript</id>
		<title>Skript</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Skript"/>
				<updated>2026-01-14T08:07:50Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Vytvoření a spuštění skriptu */ Přidání obsahu skriptu k vyzkoušení.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Linux]]&lt;br /&gt;
&lt;br /&gt;
== Co je skript? ==&lt;br /&gt;
* Pokud často spouštíme stejnou nebo podobnou posloupnost příkazů (třeba zálohování nějakých složek atd.), můžeme si zjednodušit práci.&lt;br /&gt;
* Zapíšeme tyto příkazy do souboru (označujeme ho jako ''skript'') a spuštěním tohoto souboru se provedou všechny příkazy naráz.&lt;br /&gt;
* Lze zahrnout i podmínky, cykly, zadávat parametry apod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vytvoření a spuštění skriptu ==&lt;br /&gt;
=== Obsah skriptu ===&lt;br /&gt;
* Pro vyzkoušení můžete použít jednoduchý „Hello world“, který bude fungovat v&amp;amp;nbsp;Linuxu i ve Windows:&lt;br /&gt;
 echo Hello world&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
* Příkazy zapište do souboru s příponou &amp;lt;tt&amp;gt;.bat&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Takový soubor půjde spustit jako program.&lt;br /&gt;
* Spouštíme ho buď ze složky, kde je uložen:&lt;br /&gt;
 skript.bat&lt;br /&gt;
* ... nebo ho přesuneme do složky, která je v [[Proměnné prostředí|proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;]]. Pak lze skript spustit ze kterékoli složky!&lt;br /&gt;
&lt;br /&gt;
=== GNU/Linux ===&lt;br /&gt;
* Přípona souboru zde nerozhoduje, obvykle se žádná přípona nepřipojuje.&lt;br /&gt;
* Aby šel program spustit, musíme nastavit [[Nastavování práv|práva pro spuštění]]:&lt;br /&gt;
 chmod a+x skript&lt;br /&gt;
* Skript musíme buď:&lt;br /&gt;
*# přesunout do nějakého adresáře uvedeného v proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;,&lt;br /&gt;
*# nebo spouštět s uvedením cesty:&lt;br /&gt;
 ./skript&lt;br /&gt;
&amp;lt;div class=&amp;quot;Upozorneni&amp;quot;&amp;gt;POZOR! Pokud není skript v proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, na rozdíl od Windows nestačí pro spuštění napsat ve složce skriptu:&lt;br /&gt;
 skript&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Podmínky ==&lt;br /&gt;
* Pro studenty Cisco Networking Academy viz kurz NDG Linux Essentials.&lt;br /&gt;
* Pro ostatní například: [http://www.linuxexpres.cz/praxe/bash-11-dil LinuxExpres.cz &amp;amp;rarr; BASH].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cyklus &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; ==&lt;br /&gt;
; Linux (bash)&lt;br /&gt;
* Základní syntaxe:&lt;br /&gt;
 for ''název-proměnné'' in ''varianty-oddělené-mezerou-nebo-metaznak''; do ''příkaz'' $''název-proměnné''&lt;br /&gt;
* Příklady:&lt;br /&gt;
 for user in Franta Marie Karel; do echo Hello $user&lt;br /&gt;
Postupně pozdraví všechny uživatele &amp;amp;mdash; pro každého vypíše pozdrav &amp;quot;Hello Franta&amp;quot; apod.&lt;br /&gt;
 for directory in data zalohy pokusy; do mkdir $directory&lt;br /&gt;
Vytvoří uvedené složky v&amp;amp;nbsp;aktuálním adresáři.&lt;br /&gt;
 for user in franta marie karel; do usermod -aG skupina $user&lt;br /&gt;
Přidá všechny uvedené uživatelské účty do skupiny s názvem &amp;lt;em&amp;gt;skupina&amp;lt;/em&amp;gt;. Musí spouštět správce počítače (&amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;). Uživatelské účty musí existovat (&amp;lt;code&amp;gt;adduser&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Viz také:&lt;br /&gt;
* Pro studenty Cisco Networking Academy viz NDG Linux Essentials.&lt;br /&gt;
* Pro ostatní například: [http://www.linuxexpres.cz/praxe/bash-9-dil LinuxExpres.cz &amp;amp;rarr; BASH].&lt;br /&gt;
&lt;br /&gt;
; Windows&lt;br /&gt;
* Základní syntaxe:&lt;br /&gt;
 for %''název-proměnné'' in (''varianty-oddělené-mezerou-nebo-metaznak'') do ''příkaz'' %''název-proměnné''&lt;br /&gt;
* Příklady:&lt;br /&gt;
 for %x in (a*.jpg) do ren %x %x.bkp&lt;br /&gt;
 for %slozka in (data zalohy pokusy) do if not exist %slozka md %slozka&lt;br /&gt;
* Ve skriptech je třeba znak procento zdvojit:&lt;br /&gt;
 for %%x in (a*.jpg) do ren %%x %%x.bkp&lt;br /&gt;
 for %%slozka in (data zalohy pokusy) do if not exist %%slozka md %%slozka&lt;br /&gt;
&lt;br /&gt;
== Funkce ==&lt;br /&gt;
; Linux (bash)&lt;br /&gt;
* Deklarace funkce:&lt;br /&gt;
 function ''název-funkce'' {&lt;br /&gt;
     ''příkazy''&lt;br /&gt;
 }&lt;br /&gt;
* Volání funkce:&lt;br /&gt;
 ''název-funkce''&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Skript</id>
		<title>Skript</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Skript"/>
				<updated>2026-01-14T08:05:08Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Cyklus for */ Přidány příklady cyklů v Linuxu.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Linux]]&lt;br /&gt;
&lt;br /&gt;
== Co je skript? ==&lt;br /&gt;
* Pokud často spouštíme stejnou nebo podobnou posloupnost příkazů (třeba zálohování nějakých složek atd.), můžeme si zjednodušit práci.&lt;br /&gt;
* Zapíšeme tyto příkazy do souboru (označujeme ho jako ''skript'') a spuštěním tohoto souboru se provedou všechny příkazy naráz.&lt;br /&gt;
* Lze zahrnout i podmínky, cykly, zadávat parametry apod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vytvoření a spuštění skriptu ==&lt;br /&gt;
=== Windows ===&lt;br /&gt;
* Příkazy zapište do souboru s příponou &amp;lt;tt&amp;gt;.bat&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Takový soubor půjde spustit jako program.&lt;br /&gt;
* Spouštíme ho buď ze složky, kde je uložen:&lt;br /&gt;
 skript.bat&lt;br /&gt;
* ... nebo ho přesuneme do složky, která je v [[Proměnné prostředí|proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;]]. Pak lze skript spustit ze kterékoli složky!&lt;br /&gt;
&lt;br /&gt;
=== GNU/Linux ===&lt;br /&gt;
* Přípona souboru zde nerozhoduje, obvykle se žádná přípona nepřipojuje.&lt;br /&gt;
* Aby šel program spustit, musíme nastavit [[Nastavování práv|práva pro spuštění]]:&lt;br /&gt;
 chmod a+x skript&lt;br /&gt;
* Skript musíme buď:&lt;br /&gt;
*# přesunout do nějakého adresáře uvedeného v proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;,&lt;br /&gt;
*# nebo spouštět s uvedením cesty:&lt;br /&gt;
 ./skript&lt;br /&gt;
&amp;lt;div class=&amp;quot;Upozorneni&amp;quot;&amp;gt;POZOR! Pokud není skript v proměnné &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;, na rozdíl od Windows nestačí pro spuštění napsat ve složce skriptu:&lt;br /&gt;
 skript&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Podmínky ==&lt;br /&gt;
* Pro studenty Cisco Networking Academy viz kurz NDG Linux Essentials.&lt;br /&gt;
* Pro ostatní například: [http://www.linuxexpres.cz/praxe/bash-11-dil LinuxExpres.cz &amp;amp;rarr; BASH].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cyklus &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; ==&lt;br /&gt;
; Linux (bash)&lt;br /&gt;
* Základní syntaxe:&lt;br /&gt;
 for ''název-proměnné'' in ''varianty-oddělené-mezerou-nebo-metaznak''; do ''příkaz'' $''název-proměnné''&lt;br /&gt;
* Příklady:&lt;br /&gt;
 for user in Franta Marie Karel; do echo Hello $user&lt;br /&gt;
Postupně pozdraví všechny uživatele &amp;amp;mdash; pro každého vypíše pozdrav &amp;quot;Hello Franta&amp;quot; apod.&lt;br /&gt;
 for directory in data zalohy pokusy; do mkdir $directory&lt;br /&gt;
Vytvoří uvedené složky v&amp;amp;nbsp;aktuálním adresáři.&lt;br /&gt;
 for user in franta marie karel; do usermod -aG skupina $user&lt;br /&gt;
Přidá všechny uvedené uživatelské účty do skupiny s názvem &amp;lt;em&amp;gt;skupina&amp;lt;/em&amp;gt;. Musí spouštět správce počítače (&amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;). Uživatelské účty musí existovat (&amp;lt;code&amp;gt;adduser&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Viz také:&lt;br /&gt;
* Pro studenty Cisco Networking Academy viz NDG Linux Essentials.&lt;br /&gt;
* Pro ostatní například: [http://www.linuxexpres.cz/praxe/bash-9-dil LinuxExpres.cz &amp;amp;rarr; BASH].&lt;br /&gt;
&lt;br /&gt;
; Windows&lt;br /&gt;
* Základní syntaxe:&lt;br /&gt;
 for %''název-proměnné'' in (''varianty-oddělené-mezerou-nebo-metaznak'') do ''příkaz'' %''název-proměnné''&lt;br /&gt;
* Příklady:&lt;br /&gt;
 for %x in (a*.jpg) do ren %x %x.bkp&lt;br /&gt;
 for %slozka in (data zalohy pokusy) do if not exist %slozka md %slozka&lt;br /&gt;
* Ve skriptech je třeba znak procento zdvojit:&lt;br /&gt;
 for %%x in (a*.jpg) do ren %%x %%x.bkp&lt;br /&gt;
 for %%slozka in (data zalohy pokusy) do if not exist %%slozka md %%slozka&lt;br /&gt;
&lt;br /&gt;
== Funkce ==&lt;br /&gt;
; Linux (bash)&lt;br /&gt;
* Deklarace funkce:&lt;br /&gt;
 function ''název-funkce'' {&lt;br /&gt;
     ''příkazy''&lt;br /&gt;
 }&lt;br /&gt;
* Volání funkce:&lt;br /&gt;
 ''název-funkce''&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Dart_vs._Java</id>
		<title>Dart vs. Java</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Dart_vs._Java"/>
				<updated>2026-01-05T11:17:31Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Přidána syntaxe try-on-catch.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Java]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Dart vs. Java ==&lt;br /&gt;
&lt;br /&gt;
* Na této stránce shrnujeme základní rozdíly mezi programovacími jazyky Dart a Java.&lt;br /&gt;
* Stránka je určena pro čtenáře, kteří již znají Javu a chtějí se rychle zorientovat v&amp;amp;nbsp;jazyce Dart.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;&lt;br /&gt;
Syntaxi si můžete vyzkoušet například na: &lt;br /&gt;
* [https://dartpad.dev/ Dartpad.dev]&lt;br /&gt;
* [https://www.tutorialspoint.com/execute_dart_online.php TutorialsPoint.com &amp;amp;rarr; Execute Dart Online]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello world ==&lt;br /&gt;
&lt;br /&gt;
* Pro metodu &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; nemusíme vytvářet zapouzdřující třídu.&lt;br /&gt;
* Parametry metody &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; jsou volitelné, pokud je nevyužíváme, nemusíme je uvádět.&lt;br /&gt;
* Výpis na obrazovku se řeší příkazem &amp;lt;code&amp;gt;print&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 main(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Datové typy ==&lt;br /&gt;
&lt;br /&gt;
* Dart nepoužívá primitivní datové typy, všechny typy jsou objektové.&lt;br /&gt;
* Dart má vestavěné datové typy, pro které lze vytvářet literály (konkrétní hodnoty) přímo v&amp;amp;nbsp;kódu:&lt;br /&gt;
** Číselné typy: &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;&lt;br /&gt;
** Textové typy: &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
** Logické hodnoty: &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; (literály: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Záznamy: &amp;lt;code&amp;gt;(hodnota1, hodnota2)&amp;lt;/code&amp;gt;&lt;br /&gt;
** Kolekce: &amp;lt;code&amp;gt;List&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Set&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Map&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Runes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Symbol&amp;lt;/code&amp;gt;&lt;br /&gt;
** Prázdnou hodnotu: &amp;lt;code&amp;gt;Null&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Více viz: [https://dart.dev/language/built-in-types Dart.dev &amp;gt; Built-in Types].&lt;br /&gt;
&lt;br /&gt;
== String ==&lt;br /&gt;
&lt;br /&gt;
* Textové literály uvozujeme uvozovkami nebo apostrofy (běžněji se využívá apostrof – bohužel pro ty, kdo píší na české klávesnici).&lt;br /&gt;
* Víceřádkové texty lze uvozovat třemi apostrofy.&lt;br /&gt;
 'Text'&lt;br /&gt;
 &amp;quot;Text&amp;quot;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;Víceřádkový&lt;br /&gt;
 text&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
* Spojení (concatenate) textů můžete provádět pomocí operátoru &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; nebo tím, že je zapíšete za sebe:&lt;br /&gt;
 String text = 'Dart' 'is' 'fun';&lt;br /&gt;
 String text = 'Dart'+'is'+'fun';&lt;br /&gt;
* Pro vložení hodnot do textu můžete využít znak &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt;, který uvozuje vloženou hodnotu. Hodnotu lze ohraničit &amp;lt;code&amp;gt;${...}&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 print('Seznam $data má největší prvek ${getMax(data)}');&lt;br /&gt;
&lt;br /&gt;
Více o textech v&amp;amp;nbsp;Dartu: [https://api.dart.dev/stable/3.5.3/dart-core/String-class.html Dart.dev &amp;amp;rarr; String class].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Práce se seznamy ==&lt;br /&gt;
&lt;br /&gt;
* Do seznamu v&amp;amp;nbsp;Dartu lze vkládat i prvky primitivních datových typů.&lt;br /&gt;
* Lze vytvořit literál seznamu přímo v&amp;amp;nbsp;kódu pomocí znaků &amp;lt;code&amp;gt;[&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 List&amp;lt;int&amp;gt; ids = [1, 2, 3];&lt;br /&gt;
 ids.add(6);&lt;br /&gt;
&lt;br /&gt;
* Získání prvku ze seznamu:&lt;br /&gt;
&lt;br /&gt;
 print(ids[0]);&lt;br /&gt;
&lt;br /&gt;
* Metoda &amp;lt;code&amp;gt;print&amp;lt;/code&amp;gt; umí vypsat obsah seznamu.&lt;br /&gt;
&lt;br /&gt;
 print(ids);&lt;br /&gt;
&lt;br /&gt;
* Počet prvků seznamu:&lt;br /&gt;
&lt;br /&gt;
 print(ids.length)&lt;br /&gt;
&lt;br /&gt;
* Spojení prvků ze seznamu do jednoho textového řetězce:&lt;br /&gt;
&lt;br /&gt;
 list.join(delimiter);&lt;br /&gt;
 ids.join(',');&lt;br /&gt;
&lt;br /&gt;
* Více o práci se seznamy v&amp;amp;nbsp;Dartu viz například: [https://www.codevscolor.com/dart-insert-items-to-list CodeVsColor &amp;amp;rarr; Dart insert items to list].&lt;br /&gt;
&lt;br /&gt;
== Zápis tříd ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;Dartu můžeme umístit více tříd do jednoho souboru.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Přístupnost vlastností tříd ===&lt;br /&gt;
&lt;br /&gt;
* Dart nepoužívá modifikátory přístupu &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;protected&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Všechny vlastnosti (atributy a metody) tříd jsou přístupné v&amp;amp;nbsp;rámci jednoho souboru, případně v&amp;amp;nbsp;rámci jedné knihovny (library).&lt;br /&gt;
* Veřejné vlastnosti jsou přístupné i z&amp;amp;nbsp;ostatních knihoven (souborů).&lt;br /&gt;
* Privátní vlastnosti se odlišují tak, že jejich název začíná podtržítkem.&lt;br /&gt;
* Přístupové metody se označují klíčovými slovy &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 class A {&lt;br /&gt;
     String first;&lt;br /&gt;
     String _second;&lt;br /&gt;
   &lt;br /&gt;
     String get second {&lt;br /&gt;
         return _second;&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
     void set second(String second) {&lt;br /&gt;
         this._second = second;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void main() {&lt;br /&gt;
     A a = new A();&lt;br /&gt;
     a.first = 'x';&lt;br /&gt;
     a.second = 'y';&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Více viz: [https://www.woolha.com/tutorials/dart-using-access-modifiers-private-public Woolha.com &amp;gt; Dart using Access Modifiers] a [https://www.fluttersolution.com/2023/04/understanding-access-modifiers-in-dart.html FlutterSolution &amp;gt; Understanding Access Modifiers in Dart].&lt;br /&gt;
&lt;br /&gt;
=== Zkrácený zápis metod s návratovou hodnotou ===&lt;br /&gt;
* Pro krátké metody můžeme využít syntaxi s&amp;amp;nbsp;&amp;lt;code&amp;gt;=&amp;gt;&amp;lt;/code&amp;gt;:&lt;br /&gt;
 class Osoba {&lt;br /&gt;
    String _name = &amp;quot;Karel&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
    String get name =&amp;gt; _name;&lt;br /&gt;
    set name(String name) =&amp;gt; _name = name;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   Osoba osoba = new Osoba();&lt;br /&gt;
   osoba.name = &amp;quot;Ivan&amp;quot;;&lt;br /&gt;
   print(osoba.name);&lt;br /&gt;
 }&lt;br /&gt;
Místo delšího:&lt;br /&gt;
 //...&lt;br /&gt;
 String get getName {&lt;br /&gt;
    return _name;&lt;br /&gt;
 }&lt;br /&gt;
 void set setName(String name) {&lt;br /&gt;
    _name = name;&lt;br /&gt;
 }&lt;br /&gt;
 //...&lt;br /&gt;
&lt;br /&gt;
== Parametry metod ==&lt;br /&gt;
* Poziční (''position'') parametry metod píšeme stejně jako v&amp;amp;nbsp;Javě:&lt;br /&gt;
&lt;br /&gt;
 void metoda(String text, int cislo) { ... }&lt;br /&gt;
 &lt;br /&gt;
 metoda('Text', 30); &lt;br /&gt;
&lt;br /&gt;
* Lze ale také použít pojmenované parametry (''named''). Potom nezáleží na pořadí argumentů, ale každý z&amp;amp;nbsp;argumentů musí být uvozen názvem:&lt;br /&gt;
&lt;br /&gt;
 void metoda({required String text, required int cislo}) { ... }&lt;br /&gt;
 &lt;br /&gt;
 metoda(cislo: 30, text: 'Text'); &lt;br /&gt;
 metoda(text: 'Text', cislo: 30); &lt;br /&gt;
&lt;br /&gt;
* Lze také uvést výchozí hodnotu parametru. Pak se jedná o volitelný (''optional'') parametr, který nemusíme uvádět. &lt;br /&gt;
&lt;br /&gt;
Viz také: [https://blog.stackademic.com/dart-function-parameters-in-flutter-positional-vs-named-with-examples-fc475da97f7c StackAcademic.com &amp;gt; Dart Function Parameters in Flutter].&lt;br /&gt;
&lt;br /&gt;
== Výjimky a jejich řešení ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; může vyhazovat obecně libovolný datový typ. (Ne, že by byl až tak dobrý nápad vyhazovat něco, co není potomek &amp;lt;code&amp;gt;Exception&amp;lt;/code&amp;gt;.)&lt;br /&gt;
* Odchycení výjimky:&lt;br /&gt;
 try {&lt;br /&gt;
    // Kód, kde může nastat chyba&lt;br /&gt;
 } on XYException catch (ex) {&lt;br /&gt;
    // Ošetření chyby typu XYException&lt;br /&gt;
 } on Exception catch (ex) {&lt;br /&gt;
    // Ošetření všech chyb, které jsou potomky Exception&lt;br /&gt;
 } catch (error) {&lt;br /&gt;
    // Ošetření všech ostatních chyb - nejen těch, které vyhazují Exception.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Komentáře ==&lt;br /&gt;
* Jednořádkové a víceřádkové komentáře se píší stejně jako v&amp;amp;nbsp;Javě:&lt;br /&gt;
 // One-line comment&lt;br /&gt;
 /* Multi-line/inline comment */&lt;br /&gt;
&lt;br /&gt;
* Dokumentační komentář se uvozuje třemi lomítky jako v C# (lze použít i notaci z&amp;amp;nbsp;Javy, ale není doporučovaná):&lt;br /&gt;
 /// Saturated water pressure according to Antoine equation&lt;br /&gt;
 /// Depends on outer [temperatureC] in degrees of Celsius.&lt;br /&gt;
 double saturatedWaterPressureAntoine(double temperatureC) {&lt;br /&gt;
   /// Compute exponent using [Math.pow()] function:&lt;br /&gt;
   return pow(10, (8.07131 - (1730.63/(233.426 + temperatureC)))) as double;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Style: konvence pojmenování ==&lt;br /&gt;
&lt;br /&gt;
; PascalCase (UpperCamelCase)&lt;br /&gt;
* Názvy tříd&lt;br /&gt;
* Názvy výčtových typů&lt;br /&gt;
&lt;br /&gt;
 class Customer { ... }&lt;br /&gt;
&lt;br /&gt;
; lowercase_with_underscores&lt;br /&gt;
* Názvy souborů&lt;br /&gt;
* Název projektu/aplikace&lt;br /&gt;
* Názvy prefixů pro import&lt;br /&gt;
&lt;br /&gt;
Cílem je zajistit kompatibilitu s&amp;amp;nbsp;různými souborovými systémy, které nemusí rozlišovat velká a malá písmena (case-insensitive).&lt;br /&gt;
&lt;br /&gt;
; camelCase (LowerCamelCase)&lt;br /&gt;
* Všechno ostatní ;)&lt;br /&gt;
* Na rozdíl od Javy se doporučuje i pro pojmenování konstant. (Z&amp;amp;nbsp;hlediska konzistence s&amp;amp;nbsp;existujícími knihovnami se povoluje i SCREAMING_CASE.)&lt;br /&gt;
&lt;br /&gt;
 const defaultTimeout = 1000;&lt;br /&gt;
&lt;br /&gt;
Více o konvencích zápisu kódu viz: [https://dart.dev/effective-dart/style Dart.dev &amp;amp;rarr; Style].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* [[Flutter: Kostra aplikace]]&lt;br /&gt;
* [[Flutter: Základní widgety]]&lt;br /&gt;
* [[Dart: Užitečné tipy]]&lt;br /&gt;
* Další stránky v [[:Category:Flutter|kategorii Flutter]]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety</id>
		<title>Flutter: Základní widgety</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety"/>
				<updated>2025-12-15T12:12:17Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Přidán SizedBox pro odsazení widgetů od sebe.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Uspořádání stránky ==&lt;br /&gt;
&lt;br /&gt;
 Center( child: ... )&lt;br /&gt;
&lt;br /&gt;
 Column(&lt;br /&gt;
   mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
   children: &amp;lt;Widget&amp;gt;[ ... ]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== Textová pole ==&lt;br /&gt;
 TextField(&lt;br /&gt;
   controller: _abcController,&lt;br /&gt;
   readOnly: true, // Pokud chcete pole pouze pro čtení&lt;br /&gt;
   decoration: const InputDecoration(&lt;br /&gt;
     labelText: 'Nadpis pole – viditelný popisek:',&lt;br /&gt;
   ),&lt;br /&gt;
   keyboardType: TextInputType.number, // Pokud chceme omezit vstup na číselné hodnoty&lt;br /&gt;
 ),&lt;br /&gt;
&lt;br /&gt;
; Kontroler textového pole&lt;br /&gt;
 final TextEditingController _abcController = TextEditingController();&lt;br /&gt;
* Pro práci s obsahem textového pole slouží &amp;lt;code&amp;gt;TextEditingController&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 final double totalPrice = double.parse(parsedValue = _abcController.text.trim());&lt;br /&gt;
* Přístup k obsahu textového pole zprostředkovává atribut &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Obdobně lze &amp;lt;code&amp;gt;int.parse(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 _abcController.dispose()&lt;br /&gt;
* Při uvolňování paměti by měly být řádně uvolněny i kontrolery metodou &amp;lt;code&amp;gt;dispose()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; Nastavení vzhledu &amp;lt;code&amp;gt;InputDecoration&amp;lt;/code&amp;gt;&lt;br /&gt;
 contentPadding: EdgeInsets.all(20.0),&lt;br /&gt;
* Odsazení obsahu&lt;br /&gt;
 border: OutlineInputBorder(),&lt;br /&gt;
* Ohraničení textového pole&lt;br /&gt;
 hintText: 'Text'&lt;br /&gt;
* Nápověda – co má uživatel zadat do pole.&lt;br /&gt;
* Po zadání textu do pole text zmizí.&lt;br /&gt;
&lt;br /&gt;
== Tlačítka ==&lt;br /&gt;
  ElevatedButton(&lt;br /&gt;
    onPressed: _nazevMetodyReakce,&lt;br /&gt;
    child: const Text('Popis tlačítka'),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* Pro zobrazení seznamu &amp;lt;code&amp;gt;seznam&amp;lt;/code&amp;gt; můžeme použít ListView:&lt;br /&gt;
  Expanded(&lt;br /&gt;
    child: ListView.builder(&lt;br /&gt;
      itemCount: _seznam.length,&lt;br /&gt;
      itemBuilder: (context, index) {&lt;br /&gt;
        return ListTile(&lt;br /&gt;
            title: Text('${_seznam[index].abc}'),&lt;br /&gt;
            subtitle: Text('${_seznam[index].def}'),&lt;br /&gt;
        );&lt;br /&gt;
      },&lt;br /&gt;
    ),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
== Odsazení ==&lt;br /&gt;
 SizedBox(height: 10),&lt;br /&gt;
&lt;br /&gt;
Příklad použití:&lt;br /&gt;
 Column(&lt;br /&gt;
   Text('Hello'),&lt;br /&gt;
   Sizedbox(height: 10),&lt;br /&gt;
   Text('World!'),&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== Textová popiska ==&lt;br /&gt;
 const Text('Záznamy o tankování:',),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyskakovací bublina (Toast) ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;mobilních aplikacích se pro stručná oznámení používá spíše vyskakovací bublina, než vyskakovací okno.&lt;br /&gt;
&lt;br /&gt;
  setState(() {&lt;br /&gt;
    ScaffoldMessenger.of(context).showSnackBar(&lt;br /&gt;
      SnackBar(&lt;br /&gt;
          content: Text('Informace pro uživatele')&lt;br /&gt;
      ),&lt;br /&gt;
    );&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jednoduchý dialog ==&lt;br /&gt;
Pro zobrazení dialogu si můžeme vytvořit metodu:&lt;br /&gt;
  Future&amp;lt;void&amp;gt; displayDialog(String messageText) =&amp;gt; showDialog&amp;lt;void&amp;gt;(&lt;br /&gt;
    context: context,&lt;br /&gt;
    builder: (context) {&lt;br /&gt;
      return AlertDialog(&lt;br /&gt;
        title: const Text('Chybně zadaná data:'),&lt;br /&gt;
        content: Text(messageText),&lt;br /&gt;
        actions: &amp;lt;Widget&amp;gt;[&lt;br /&gt;
          TextButton(&lt;br /&gt;
            onPressed: () {&lt;br /&gt;
              Navigator.of(context).pop();&lt;br /&gt;
            },&lt;br /&gt;
            child: const Text('OK'),&lt;br /&gt;
          ),&lt;br /&gt;
        ],&lt;br /&gt;
      );&lt;br /&gt;
    },&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
Metodu následně voláme:&lt;br /&gt;
 displayDialog('Text');&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Dart:_U%C5%BEite%C4%8Dn%C3%A9_tipy</id>
		<title>Dart: Užitečné tipy</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Dart:_U%C5%BEite%C4%8Dn%C3%A9_tipy"/>
				<updated>2025-12-14T18:52:30Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Doplněno trim() a  toString(), lepší formátování.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Vstup a výstup ==&lt;br /&gt;
&lt;br /&gt;
=== Konec řádku ===&lt;br /&gt;
 Platform.lineTerminator&lt;br /&gt;
* Ukončení řádku odpovídající použité platformě (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;\r\n&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Je třeba naimportovat:&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
&lt;br /&gt;
=== Konverze čísel a textů ===&lt;br /&gt;
&lt;br /&gt;
 int.parse(''text'')&lt;br /&gt;
 double.parse(''text'')&lt;br /&gt;
* Převod textového zápisu na číselnou hodnotu.&lt;br /&gt;
&lt;br /&gt;
 ''text''.trim()&lt;br /&gt;
* Odstraní úvodní a závěrečné mezery z&amp;amp;nbsp;textu.&lt;br /&gt;
&lt;br /&gt;
 ''num''.toString()&lt;br /&gt;
* Převede číselnou hodnotu na textový zápis.&lt;br /&gt;
&lt;br /&gt;
 ''num''.toStringAsFixed(2)&lt;br /&gt;
* Převede číslo &amp;lt;code&amp;gt;num&amp;lt;/code&amp;gt; na text, zaokrouhlený na zadaný počet desetinných míst.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.e-mis.cz/index.php/Flutter:_Kostra_aplikace</id>
		<title>Flutter: Kostra aplikace</title>
		<link rel="alternate" type="text/html" href="http://mis.e-mis.cz/index.php/Flutter:_Kostra_aplikace"/>
				<updated>2025-12-14T18:39:16Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Základní kostra aplikace s měnícím se obsahem */ Přidána metoda dispose().&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Základní kostra aplikace s měnícím se obsahem ==&lt;br /&gt;
&lt;br /&gt;
Metoda &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; &amp;amp;mdash; zde se začne provádět program:&lt;br /&gt;
&lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MainApp());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
; StatelessWidget – neměnná část aplikace.&lt;br /&gt;
&lt;br /&gt;
* Základ aplikace je neměnný. Pokud bychom měli aplikaci ``Hello World`` a podobné, stačilo by nám jejich vzhled nadefinovat v hlavní třídě.&lt;br /&gt;
* Části, které se musí překreslit nebo které mění obsah, jsou součásti stavu aplikace.&lt;br /&gt;
&lt;br /&gt;
 class MainApp extends StatelessWidget {&lt;br /&gt;
   const MainApp({super.key}); &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return const MaterialApp(&lt;br /&gt;
       home: XyzMainPage(title: 'Název aplikace'),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
; StatefulWidget – část UI, která se musí překreslit v&amp;amp;nbsp;průběhu životního cyklu aplikace.&lt;br /&gt;
&lt;br /&gt;
 class XyzMainPage extends StatefulWidget {&lt;br /&gt;
   const XyzMainPage({super.key, required this.title});&lt;br /&gt;
 &lt;br /&gt;
   final String title;&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;XyzMainPage&amp;gt; createState() =&amp;gt; _XyzMainPageState();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
; Reprezentace aktuálního stavu aplikace – State&lt;br /&gt;
&lt;br /&gt;
 class _XyzMainPageState extends State&amp;lt;XyzMainPage&amp;gt; {&lt;br /&gt;
 &lt;br /&gt;
   // Data aplikace&lt;br /&gt;
  &lt;br /&gt;
   // Metody pro práci s daty&lt;br /&gt;
   // Controllery tlačítek&lt;br /&gt;
 &lt;br /&gt;
   void _akceProvadejiciZmenuStavuOkna() { // Například reakce na stisk tlačítka.&lt;br /&gt;
      setState(() { ... });&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   @override&lt;br /&gt;
   void dispose() {      // Uvolnění případných kontrollerů, pokud jsou.&lt;br /&gt;
     _abcController.dispose();&lt;br /&gt;
     super.dispose();&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
         appBar: AppBar(&lt;br /&gt;
           backgroundColor: Colors.green,&lt;br /&gt;
           title: Text(widget.title),&lt;br /&gt;
         ),&lt;br /&gt;
         body: Center(&lt;br /&gt;
           child: Column(&lt;br /&gt;
             mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
             children: &amp;lt;Widget&amp;gt;[&lt;br /&gt;
 &lt;br /&gt;
               // Widgety v hlavním okně&lt;br /&gt;
 &lt;br /&gt;
             ],&lt;br /&gt;
           ),&lt;br /&gt;
         ),&lt;br /&gt;
         floatingActionButton: FloatingActionButton(&lt;br /&gt;
           onPressed: _metodaProvedeniAkce,&lt;br /&gt;
           tooltip: 'Nápověda k tlačítku',&lt;br /&gt;
           child: const Icon(Icons.add),&lt;br /&gt;
         ),&lt;br /&gt;
       );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* Základní widgety pro vytvoření obsahu okna: [[Flutter: Základní widgety]].&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	</feed>