GJK Cat Informatika - Repozitář studijních materiálů

Vítejte na webu GJK Kočky, který slouží jako zdroj studijních materiálů jak od kantorů, tak od studentů. V postranní nabídce si můžete zvolit předmět a přesunout se na materiály daného předmětu. Stránky s učiteli a tagy seskupují obsah podle různých kritérií. Pokud byste rádi přidali nějaké materiály na tento web, podívejte se na https://gjk.cat.

Vytváření materiálů na platformě gjk.cat vyžaduje znalost Git(hub)u a formátu Markdown. Pokud je neznáte, navštivte https://gjk.cat.

Kontakt

Tuto wiki spravuje Lukáš Hozda. Pro více kontaktních informací navštivte mojí kartu učitele.

Předměty

NázevUnixové operační systémy
Zodpovědná osobaEmil Miler
PopisV tomto předmětu se probírají unixové operační systémy a pokročilejší informatika

Unixové operační systémy

Cílem předmětu je studenty seznámit s rodinou unixových operačních systémů a naučit je, jak s nimi pracovat. Naučí se ovládat shell, psát vlastní skripty, spravovat serverové aplikace. Ve výsledku budou umět Linuxové systémy použít nejen jako náhradu za proprietární operační systémy. Předmět se zaměřuje i na obecná témata z oblasti hardwaru, počítačových věd, sítí a bezpečnosti.

Seznam materiálů

NázevBezpečnost
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Bezpešnost

Bezpečnost je velmi široký pojem, do kterého můžeme zahrnout obrovské množství věcí. Nás zajímá hlavně bezpečnost chování na síti, bezpečnost aplikací, ukládání dat a bezpečná práce s daty.

Ukládání dat

Měl jsem akamarádku, kterou nenapadlo nic lepšího, než ukládat svou bakaláčkou práci jen na jednu flešku. Když na práci chtěla pracovat, připojila flešku a pracovala se soubory přímo na ní. Jednoho dne se fleška rozhodla přestat fungovat.

Data se z FLASH pamětí dostávají velice obtížně a stojí to neskutečné množství peněz. Z plotnových disků se ztracená data zachraňují snáz, ošem lepší je ztrátě dat úplně předcházet.

Tagy

security unix

NázevHuffmanovo kódování
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Huffmanovo kódování

Jde o kompresní algoritmus, který využívá strom pro zakódování vstupu. Funguje na tom principu, že nejčastěji opakující-se znaky mají nejmenší bitový popis a nejméně časté znaky mají na svůj popis nejvíce bitů. My se věnujeme jen statickému Huffmanovo kódování.

Vlastnosti:

  • Bezztrátový
  • Asymetrický
  • Dvou-průchodový

V praxi se využívá překvapivě často, například jako část komprese ve formátu JPEG při redukci opakujících-se pixelů.

Postup zakódování

Pro příklad budeme mít vstup řetězec ABRAKADABRA.

Seřazení znaků

Prvním krokem je důležité vyfiltrovat unikátní znaky, což jsou v tomto případě znaky A B R K D. Ke každému znaku zároveň připíšeme číslo označující počet výskytů znaku v řetězci.

Dále vypíšeme znaky seřazené sestupně (od nejvíce výskytů po nejméně výskytů). Seřazené znaky budou tvořit spodní část stromu.

Seřazené unikatní znaky{width=50%}

Vytvoření stromu

K vytvoření stromu je třeba spojit dva objekty s nejmenším počtem výskytů a jejich počet sečíst. Pokud jsou více než dva objekty se stejným číslem, můžeme si libovolně vybrat.

Sestavený strom včetně sečtených hodnot{width=50%}

Každá objekt může mít pouze dva potomky. Tím je strom kompletní.

Zakódování vstupu

Každou větev stromu si označíme, například levou větev jako 1 a pravou větev jako 0.

Označení větví{width=50%}

Zakódování pak probíhá jen tak, že zmapuji cestu ke znaku.

Cesta ke znaku B{width=50%}

Znaky budou mít tedy tyto kódy:

A 1
B 011
R 010
K 001
D 000

Zakódování řetězce už je jen o popsání správných jedniček a nul podle vstupu.

ABRAKADABRA = 10110101001100010110101

Postup dekódování

Dekódování funguje tak, že podle zakódovaného řetězce postupujeme hlouběji do stromu,dokud nenarazíme na znak.

1 011 010 1 001 1 000 1 011 010 1
A  B   R  A  K  A  D  A  B   R  A

Huffmanovo kódování je navrženo tak, že se při čtení zakódovaného řetězce nedostaneme do konfliktu a vždy přistaneme na správném znaku.

Zakódování a rekonstrukce stromu

Když pošleme zakódovanou zprávu, příjemce jí bez stromu nedokáže dekódovat. Proto je nutné poslat i samotný strom.

Strom lze zakódovat tak, že ho celý projdeme. Každou cestu hlouběji do stromu označíme jako 1 a návrat zpět jako 0.

Postup zakódování stromu{width=50%}

Zakódovaný strom bude tedy 1011101001101000. Spolu s ním musíme poslat i znaky ve stromu, tedy ABRKD.

Jeho rekonstrukce probíhá opačně, tj. podle zakódovaného řetězce stromu kreslíme větvě - při 1 jdeme do hloubky a při 0 se vracíme po větvi zpět.

Tagy

unix crypto

NázevImperativní programování
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Imperativní paradigma

Říkám počítači, jak chci něco provést. Popisuji tedy postup.

Příklady jazyků:

  • C
  • Basic
  • BrainFuck
  • Rust
  • Go
  • Python

Sruktura

Proměnná

Označení části paměti, ve které můžeme uložit vlastní data.

Podmínky

Cykly

Procedura & funkce

Datové typy

Integer

Označení int. Maximální 2^32. Signed int má rozsah <-2^31,2^31-1>.

Float & Double

Desetinné čílo. Double má větší rozsah než float.

Char

ANSII znaky

Pole

Unsigned

Tagy

unix imperativni paradigma

NázevKódování znaků
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Kódování znaků

Dříve existovaly teletypery/teleprintery - po síti byl poslán znak a tele-type ho natiskl na papír.

S příchodem počítačů vznikala spousta různých standardů. Například v Japonsku vznikly 4 různé standardy mezi sebou nekompatibilní. To při odeslání textu z jednoho počítače na druhý produkovalo jen rozházený text. V japonštině pro označení takové situace dokonce vzniklo slovo mojibake.

ASCII

American Standard Code for Information Interchange. Standard pro kódování znaků vytvořený primárně pro teleprintery. Znaky jsou kódovány v sedmi bitech. Počet možných znaků je tedy 128. Znaky mají přesně definované číslo, ke kterému patří.

Znak A je v ASCII definován jako 65 1000001 a znak a jako 97 1100001. Lze tak jednoduše určit zakódované znaky okem přímo z binární soustavy.

ASCII tabulka{width=100%}

Z ASCII později vycházely standardy pro specifické jazyky, které mezi sebou nejsou kompatibilní.

UTF-8

Standard prvotně načrtnutý na ubrousku v jídelně (Ken Thompson a Rob Pike). Unicode má seznam 277021 znaků ve verzi (11.0 červen 2018). UTF-8 může kódovat až 1112064 znaků.

Příklad: Kdybychom chtěli zakódovat znak A přímo do např. 32b, dostali bychom 00000000000000000000000001000001. To nám navýší velikost souboru 4.5 krát. Staré počítače zároveň vyhodnotí nulový byte 00000000 jako konec řetězce.

Pokud v UTF-8 chceme zakódovat znak, který patří do ASCII tabulky (jde zakovat v sedmi bitech), zakódujeme ho stejně a na začátek přidáme nulu, tedy A 65 01000001.

Další znaky se kódují pomocí hlaviček v bytech.

volné bitybyte 0byte 1byte 2byte 3
11110xxxxx10xxxxxx
161110xxxx10xxxxxx10xxxxxx
2111110xxx10xxxxxx10xxxxxx10xxxxxx

110 udává, kolik hlaviček v řetězci je. V dalším bajtu je hlavička 10, která označuje začátek bloku. Prázdná místa x jsou použita jako datová. Pomocí hlaviček získáme strukturu dat a jejich odstraněním z řetězce bitů získáme samotná data.

UTF-8|Obsah bloků bez hlaviček|Číslo v base10 -|-|-|- 1101000110111000|10001111000|1114 111010011010111010011011|1001101110011011|39835

  • Nenastane situace, kdy bude osm 0 za sebou
  • Neplýtvá se místem

Tagy

unix kodovani unicode

NázevMinimalizace
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Minimalizace

V tomto příkladu si vytvoříme driver jednoho segmentu sedmi-segmentového displeje a provedeme jeho minimalizaci.

Vytvoření driveru

Vybereme se jeden segment z displeje, pro který navrhneme driver.

Vybraný segment vyznačený červeně.{height=100px}

Pro popis hodnot od 0 do 9 potřebujeme 4 bity - potřebujeme tedy 4 vstupy. Jako první je třeba vypsat stavy, při kterých bude segment svítit. Vypíšeme si tedy 4-bitová binární čísla s hodnotami 0 až 9.

x  A B C D

0  0 0 0 0
1  0 0 0 1
2  0 0 1 0
3  0 0 1 1
4  0 1 0 0
5  0 1 0 1
6  0 1 1 0
7  0 1 1 1
8  1 0 0 0
9  1 0 0 1

A, B, C a D jsou naše 4 vstupy a x je pouze hodnota v desítkové soustavě. Nyní musíme přidat výstupní bit Q, který nám definuje, při jaké hodnotě bude segment rozsvícen. U čísla 0 svítit bude, ale například u čísla 5 ne.

x  A B C D  Q

0  0 0 0 0  1
1  0 0 0 1  1
2  0 0 1 0  1
3  0 0 1 1  1
4  0 1 0 0  1
5  0 1 0 1  0
6  0 1 1 0  0
7  0 1 1 1  1
8  1 0 0 0  1
9  1 0 0 1  1

Sice nám zbývají další nevyužité hodnoty (10, 11, 12 atd.), ale u těch je nám nezáleží na jejich stavu. To se nám hodí později při minimalizaci.

Nyní si vypíšeme funkci, která popisuje všechny stavy, při kterých bude segment svítit. Například hned u stavu s hodnotou 1 svítit bude, proto popíšeme stavy vstupů jako $\bar{A}\bar{B}\bar{C}D$. Vstupy s hodnotou 0 označíme čarou nad písmenem, což je NOT. Znaménko $$ samozřejmě označuje AND a znaménko $+$ značí OR.

$$ f(x) = \ \bar{A}\bar{B}\bar{C}\bar{D} + \ \bar{A}\bar{B}\bar{C}D + \ \bar{A}\bar{B}C\bar{D} + \ \bar{A}\bar{B}CD + \ \bar{A}B\bar{C}\bar{D} + \ \bar{A}B\bar{C}D + \ \bar{A}BC\bar{D} + \\bar{A}BCD + \ A*\bar{B}\bar{C}\bar{D} + \ A*\bar{B}*\bar{C}*D $$

A máme hotový vzorec pro implementaci jednoho segmentu. Pokud bychom ale chtěli tuto věc implementovat, potřebovali bychom 25 NOTů, 30 ANDů a 9 ORů, to je celých 64 součástek!!!? Proto je dobré provést minimalizaci.

Minimalizace

Minimalizace nám pomůže zjednodušit náš vzorec pro implementaci a v reálném světě nám ušetří spousty peněz za součástky.

V našem případě využijeme Karnaughovu mapu o velikosti $4*4$.

Základní Karnaughova mapa.{width=300px}

Do mapy doplníme všechny stavy při hodnotách 09 z naší první tabulky z výstupy Q. Mapa se vyplňuje tak, že musíme najít jeden společný průnik všech vstupů. Začneme vstupem A. Ten má na hodnotu 0, vybereme tedy bloky v mapě, pro které platí, že A je 0.

Vybraná pole pro $\bar{A}$. Černá tečka značí všechny platné bloky.{width=150px}

Vybraná pole pro $\bar{A}*\bar{B}$ se čtyřmi průniky v rozích.{width=150px}

Vybraná pole pro $\bar{A}\bar{B}\bar{C}$ se dvěma společnými průniky.{width=150px}

Vybraná pole pro $\bar{A}\bar{B}\bar{C}*\bar{D}$ se jedním společným průnikem a hodnotou.{width=150px}

\newpage

Do bloku, na který jsme narazili sečtením všech průniků, zapíšeme hodnotu zda segment svítí nebo nesvítí. Protože jsme hledali blok pro desítkovou hodnotu 0, při které bude segment svítit, dáme do mapy hodnotu 1 (bude svítit). Stejným postupem vyplníme celou tabulku pro zbylé hodnoty 19.

Vyplněná mapa pro všechny hodnoty 0 až 9.{width=150px}

Pro minimalizaci musíme seskupit všechny hodnoty 1 do skupin nejlépe po čtyřech. Čím větší bloky, tím větší zjednodušení výsledku.

Pro Karnaughovu mapu platí, že hodnoty lze seskupovat i přes hrany, či přes rohy. Detaily o tom proč a jak toto funguje jsou popsány například na wikipedii.

Další specialita mapy je ta, že nevyplněné bloky si můžeme doplnit podle potřeby. Vzpomeňte si na začátek dokumentu, kde nám zbylo několik nevyužitých hodnot pro čísla 11, 12 atd. U těch je nám jedno, v jakém stavu budou, a proto si je do mapy můžeme doplnit podle sebe a tím si uměle vytvořit lepší bloky pro minimalizaci.

První blok se nám nabízí například vlevo nahoře, kde si můžeme doplnit jedničku a vytvořit blok $2*2$.

Vytvořený první blok.{width=150px}

Dále můžeme využít to, že bloky lze vytvářet i přes rohy. V každém rohu se nachází 1, tak je dáme do dalšího bloku.

Vytvořený další blok přes rohy.{width=150px}

\newpage

Tímto způsobem dotvoříme zbytek bloků, dokud nebudou v blocích všechny námi vypsané (modré) jedničky.

Kompletní mapa pokrytá čtyřmi bloky.{width=150px}

Všechny bloky teď popíšeme do vzorce. Protože bloky jsou o velikosti $2*2$, stačí nám na popis každého bloku pouze dva vstupy.

$$ f(x) = \bar{C}\bar{D} + \bar{A}\bar{B} + DC + D\bar{B} $$

To dám dohromady dává pouze 12 součástek. Základní minimalizace je kompletní.

Tagy

unix algoritmy

NázevPaměti
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Paměti ROM

PROM

Programovatelná paměť, do které lze zapsat jen jednou.

EPROM

Programovatelná paměť, kterou lze smazat UV zářením.

EEPROM

Programovatelná paměť, kterou lze smazat elektrickým nábojem.

Paměti RAM

  • Lze přiepisovat bloky po bitech
    • To umožňuje tzv. bit select tranzistor
  • Je třeba mít více tranzistorů na buňku

DRAM

Dynamic RAM

dram

  • Je nutné ho neustále dobíjet
  • Obsahuje pouze jeden FET
    • Jednoduché na výrobu
    • Levné
  • Používá se v operačních pamětech

SRAM

Static RAM

sram

  • Obsahuje invertory
  • Není třeba neustále refreshovat
  • Rychlé operace
  • Postaven z šesti tranzistorů
    • Zabírá větší plochu
    • Je dražší na výrobu
  • Používá se v CACHE pamětech

Paměti FLASH

  • Nevolatilní paměť

  • Do buňky lze provést jen omezený počet zápisů

  • Mažou se celé bloky (i během přepisu jednoho bitu)

    • blok paměti se smaže (logické 1)
    • relevantní bity se zapíší (pouze logické 0)
  • Zápis je rychlý

  • Mazání pro přepis je pomalé

    • TRIM u SSD

Běžné velikosti pamětí:

EEPROMNORNAND
64K - 512K512K - 128M128M - nGB

Ovšem tyto velikoti se odvíjí od ceny. Lze vytvořit jakoukoliv velikost paměti.

Floating-gate tranzistor

Varianta MOSFET s přidanou bránou, která dokáže uchovat záporný elektrický náboj (logická 1), nebo žádný náboj (logická 0).

----------------+
                |
               Gate
                |            <- dielektrikum
      +---Floating gate---+
      |                   |  <- dielektrikum
--- Source               Drain --- GND

U jiných druhů (MLC, TLC, QLC) se jen přidají stavy náboje.

NAND

  • Paměť postavená na NotAND hradlech
  • Počet zápisů je mezi 500 - 100000.
  • Sekvenční přístup k datům

Druhy buňek:

SLCMLCTLCQLC
1b2b3b4b

NOR

  • Náhodný nebo sekvenční přístup k datům
  • Použití u BIOS chipů, ovládacích IC u procesorů atd.
  • Výhodou je vyšší životnost (nemusí ze přepisovat buňky v sekvenci)

Magnetické paměti

HDD

  • Elektro-mechanické zařízení
  • Data se ukládají maggnetizovaním sektorů na plotně
  • Plotna je rozdělena na stopy a sektory od středu disku.

Hybridní HDD obsajují i paměť FLASH.

Magnetická Páska

Disketa

Disk rozdělen na sektory, stejně jako HDD.

Optické paměti

  • Data jsou na disku od středu směrem ke kraji
  • Spirálový zápis
  • Díra 0, plocha 1
  • Laser se odráží (na ploše) do fotoelektického senzoru
  • Objem uložitelných dat závisí na velikosti pitů a landů
TechnologieObjem datVelikost díryPrůměr paprskuVlnová délka ($\lambda$)
CD0.7 GB800x600 nm1.6 um780 nm
DVD4.7 GB400x320 nm1.1 um650 nm
Blu-ray25 GB150x130 nm.48 um405 nm

DVD+R vs. DVD-R

+ a - označují metody zjištění relativní polohy laseru (čtecí hlavy). Metoda - zjišťuje polohu pomocí převytvořených děr (prepits). Metoda + měří kmitání disku a jeho úroveň jeho vychýlení -- čím větší vychýlení, tím dále od středu se hlava nachází.

RW

Fungují na principu fázového posunu světelného spektra. Zahřátím dojde k roztavení materiálu, který nepropouští světlo. Paprsek se pak neodrazí od reflektivní vrstvy do senzoru.

MiniDisc

  • Magneto-optické disky
  • Magnet na disk zapisuje, laser čte
  • Při zápisu laser nahřeje disk na 200° C

Další formáty

  • LaserDisc
  • MiniCD
  • MiniDVD
  • UMD
  • MiniDisc

Tagy

unix pamet

NázevPrvo v IT
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Proprietární software

EULA

Svobodný software

Čtyří základní svobody:

  • 0: Používat program jakkoliv a za jakýmkoliv účelem.
  • 1: Studovat zdrojový kód a provádět na něm úpravy.
  • 2: Distribuovat program komukoliv a jakýmkmoliv způsobem.
  • 3: Distribuovat vlastní modifikovanou verzi programu.

GPL

GPLv2

GPLv3

MIT

BSD

Non-Disclosure Agreenment

Smlouva o mlčenlivosti a zachování informací. Uzavřeno mezi dvěma a více subjekty, např. zákaz šíření zdrojového kódu apod.

NDA musí obsahovat:

  • Definici toho, co přesně spadá pod NDA.
  • Dobu platnosti NDA.
  • Podmínky v případě porušení.

Service-Level Agreenment

Smlouva mezi uživatelem a poskytovatelem služby. SLA poposuje, co poskytovatel zprostředkuje uživateli, za jakých podmínek, cenu apod.

Open-Source vs Free Software

  • Svobodný software splňuje 4 základní svobody
  • OpenSource navazuje na svobodný software s cílem zalíbit se korporacím
  • OpenSource je jen o sdílení zdrojového kódu, ovšem ne nutně bez ostatních svobod

Creative Commons

Vybírátor licence

Licenční prvky:

  • Právo dílo šířit
  • Právo dílo upravovat
  • Uvedení autora
  • Zachování licence
  • Nevyužívání díla komečně
  • Nezahahovat do díla

Copyright v Česku

Tagy

unix pravo

NázevProgramovací jazyk C
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Základní struktura

int main(void){
	return 0;
}

Pro práci se standardním vstupem/výstupem potřebujeme importovat knihovnu stdio.h. Chceme-li tedy vypisovat něco na výstup, potřebujeme knihovnu.

#include <stdio.h>

int main(void){
	printf("Hello World!");
	return 0;
}

Proměnné

#include <stdio.h>

int main(void){
	int a = 5;
	int b = 7;
	int c = a + b;

	printf("%d+%d=%d\n",a,b,c);

	return 0;
}

Vstup od uživatele

#include <stdio.h>

int main(void){
	int a, b, c;

	printf("Zadej dve cisla...\n");
	scanf("%d %d", &a, &b);
	c = a + b;
	printf("%d+%d=%d\n",a,b,c);

	return 0;
}

Podmínky

Ověření, zda tři velikosti tvoří pravoúhlý trojúhelník.

#include <stdio.h>

int main(void){
	int a, b, c;

	printf("Zadej tri rozmery sten trojuhelniku...\n")
	scanf("%d %d %d", &a, &b, &c);

// zjistit ktere cislo je nejvetsi

	if(c*c == a*a + b*b){ // Pythagorova veta
		printf("trojuhelnik je pravouhly\n");
	}else{
		printf("trojuhelnik neni pravouhly\n");
	}
	
	printf("%d+%d=%d\n",a,b,c);

	return 0;
}

Cykly

funkce & procedury

Pointer

Tagy

unix c promenne if loop

NázevReprezentace čísel v paměti
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Reprezentace čísel v paměti

Binární soustava

Počítače vidí rozumí jen binárním stavům, které reprezentujeme jako 1 a 0.

Hexadecimální soustava

894 -> 37E

894 /16 | 55.875 | r14 55 /16 | 3.4375 | ...

37E = E * 16^0 +7 * 16^1 +3 * 16^2

14 * 1 +7 * 16 +3 * 256 = 894

479 -> 1DF

Integer

Unsigned int

  • scitani mocnin dvou
  • 8 bitu (char) -> 256 hodnot

Signed int

Číslo se znaménkem. Reprezentuje se tak, že první bit definuje znaménko, kde 1 je mínus a 0 je plus. Efektivní rozsah je -128127.

Záporné číslo je znározněné doplňkovým kódem. Znamená to, že přičítáme směrem k nule od -128. Máme-li binární signed int 10000001, nejde o číslo -1, ale o -127. Přičetli jsme totiž jedničku (0000001) k -128.

Doplňkový kód lze vypočítat jednoduše. Chceme-li získat záporné číslo -25, stačí nám 25 zkonvertovat do dvojkové soustavy (7 bitů) - což je 0011001 - a invertujeme všechny bity na 1100110. Poté přidáme jako první bit znaménko, tj. 1 a dostaneme číslo -25.

-13 je 11110011, 13 je 0001101. Dopocitava se k nule, tj. 1001101 je -128 + 13 = -115. muzem invertovat bity a vyjde to.

Float

V desétkové soustavě zapisujeme desetinné číslo ve formátu 1000 100 10 1 . 1/10 1/100 1/1000.

Číslo, které není rekurzivní v jedné soustavě, může být rekurzivní v jiné soustavě. Zlomek $\frac{1}{3}$ zapíšeme v desítkové soustavě jako $0.\overline{3333333}$. Stejně tak číslo $0.1$ zapíšeme v binární soustavě jako $0.0001100\overline{1100110011}$. Počítače nerozumí rekurzi, což znamená, že při práci s destinými čísli přicházíme o přesnost.

$0.1 + 0.2 = 0.300000...000001$

$\frac{1}{3} + \frac{1}{3} + \frac{1}{3} = 0.3\overlive{333333} + 0.3\overline{333333} + 0.3\overline{333333} = 1$

u vypoctu zbytku (z floatu na binarni) nasobime zakladem (2).

7/10 | 1
4/10 | 0
8/10 | 1
6/10 | 1
2/10 | 0
4/10 | 0 |
8/10 | 1 |
6/10 | 1 |
...
  • v pameti jsou cisla s plovouci nebo pevnou desetinno ucarkou
  • u starych jsou s pevnou, tj. presne dany pocet cifer pred a za carkou
    • omezeny rozsah cisel
  • s plovouci carkou je znazornene, kde se carka nachazi
  • maji kladnou i zapornou nulu lol
  • dane u IEEE-754
  • neperiodicke cislo v jedne soustave muze byt periodicke v druhe
    • 0.1 + 0.2 = 0.30000000000004

Tagy

unix typy pamet

NázevSítě
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Síťové prvky

Client

Hub

Switch

Router

Gateway

Adresy

  • IP adresa
  • MAC adresa

TCP/IP

Jde o síťovou architekturu, která vychází ze síťového modelu ISO/OSI. Nejdříve byly navrhnuty protokoly, později až architektura přímo pro počítačové sítě. Funguje nespolehlivě a nespojovaně na principech Best Effort a přepojování paketů.

tcpip

Vrstva síťového rozhraní

  • Sloučené vrstvy L1 a L2 z ISO/OSI
  • Pracuje s Ethernet rámci
  • Kódování
  • Samotná binární data

Síťová vrstva

  • IP adresy
  • Směrování
  • ARP, ICMP, ...
  • Rozdělení dat na pakety / datagramy
  • Uspořádání příchozích paketů / datagramů do původní podoby

Transportní vrstva

  • TCP / UDP
  • Stará se o integritu dat apod.

Aplikační vrstva

  • Implementace protokolů (https, sftp, ssh, ntp, ...)
  • Samotné aplikace komunikují s aplikační vstrvou pomocí portů (http 80, ssh 22, ...)

Verze IP

IPv4

Numerické adresy pro síťovou vrstvu ve formátu čtyř čísel v rozsahu 0-255 oddělených tečkou: 192.168.1.1. Adresy jsou popsány 32 bity. Počet možných IPv4 adres je tedy $2^{32} = 4.29 * 10^{9}$.

IPv6

Adresy jsou popsány 128 bity, tj. $2^{128} = 3.4 * 10^{38}$. Adresy IPv6 jsou popsány v osmi blocích čtyř hexadecimálních znaků oddělených dvojtečkou: fd2f:77df:6fe6:0:5da8:f2da:1058:4a4b.

DHCP - Dynamic Host Configuration Protocol

ARP - Address Resolution Protocol

DNS - Domain Name System

Síťové technologie

IEEE 802.3 - Ethernet

10BASE5/2

10BASE-T

100BASE-TX

1000BASE-T

IEEE 802.11 - WiFi

Tagy

unix networking

NázevShell
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Shell je rozhraní pro uživatele umožňující uživatelům spouštět a ovládat programy, tj. Interpretuje uživatelem zadané příkazy systému.

Shellů existuje celá řada. Nejběžněji používaným shellem je Bash.

Základní programy

Práce se soubory a složkami

  • ls — vypsat obsah složky
  • cd — přepnou se do složky
  • pwd — vypsat adresu aktivní složky
  • cat — vypsat obsah souboru/ů
  • touch — vytvořit prázdný soubor
  • mkdir — vytvořit prázdnou složku
  • rm — odstranit soubor/složku
  • cp — zkopírovat soubor/složku
  • mv — přesunout/přejmenovat soubor/složku

Proudové editory

  • grep — vyhledá všechny řádky obsahující daný obsah
  • sed — najít a nahradit
  • awk — vypisuje dané sloupce

Proudy

ZnakFunkce
|Přesměrování výstupu na vstup jiného programu
>Přepsat soubor
>>Připsat na konec souboru

Aliasy

Alias je uživatelem definovaná zkratka. Pomocí aliasu lze na vybrané klíčové slovo nastavit složitý příkaz, který lze poté vyvolat samotným Klíčovým slovem.

Alias lze nastavit přímo v terminálu: alias testalias="echo 'i love pizza'". Po definování tohoto aliasu a napsáním klíčového slova testalias se spustí definovaný příkaz echo 'i love pizza'.

$ alias testalias="echo 'i love pizza'"
$ testalias
i love pizza

Příkladem aliasu může být namapování příkazu cal -m na klíčové slovo cal. To nám umožní automaticky vyvolávat kalendář s prvním dnem nastaveným na pondělí bez toho, aniž bychom museli přepínač -m definovat pokaždé manuálně.

Persistentní aliasy

Po uzavření okna terminálu se nastavené aliasy resetují. Pro jejich uchování je třeba aliasy definovat v konfiguračním souboru shellu, v našem případě tedy v souboru .basahrc v našem domovském adresáři.

V konfiguračním souboru stačí na nové řádky aliasy definovat stejně, jako když je definujeme přímo v terminálu.

Tagy

unix shell

NázevSložitosti algoritmu
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Složitosti algoritmu

Algoritmus je popis nějakého postupu.

  • délka kódu
  • počet provedených instrukcí
  • doba běhu programu
  • počet cyklů
funkce$N = 10$$N = 100$$N = 1000$$N = 10000$
$log_2 N$1234
$N$10100100010000
$L log_2 N$10200300040000
$N^2$10010000$10^6$$10^8$
$2^n$1024$10^31$$10^310$$10^3100$

for(i = 0; i < n; i++){
	printf("*");
}

slozitost je $3n+1$, tj. $O(n)$.

  • 1 prirazeni
  • n porovnani
  • n souctu
  • n print

for(i = 0; i < n; i++){
	for(j = 0; h < n; j++>){
		printf("*");
	}
}

slozitost je $n*(3n+1)+1+n = 3n^2+3n+1$, tj. $n^2$.

  • 1 prirazeni
  • n i++
  • n prirazeni
  • n^2 j++

for(i = 0; i < n; i++){
	for(j = 0; j < i; j++){
		printf("*");
	}
}

$0+1+2+3+...+n = \frac{(n^2+n)}{2} = \frac{1}{2}n^2 + \frac{1}{2}n^2 = O(n)^2$


while(n >= 1){
	printf("*");
	n = n/2;
}

Bubble sort ma slozitorst $O(n^2)$

Tagy

unix algoritmy

NázevUnix
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Základní prvky *nixového systému (POSIX)

  • Vše je soubor
  • Program dělá jednu věc a dělá jí dobře
  • Výstup jednoho programu může býti vstupem jiného programu
  • Programy umí zpracovat textové proudy

Souborový systém

Souborový systém unixového systému se od systému Windows liší tím, že je vše umístěno pod hlavním tzv. kořenovým adresářem /. Příklad souborové struktury:

/
	bin
	dev
	etc
	home
		adam
			documents
			videos
		petr
			music

Absolutní a relativní cesty

Popis cesty v unixovém systému se zapisuje pomocí názvů složek/souborů a znaku /. Cesta začínající tímto znakem definuje to, že cesta začíná v kořenovém adresáři a je tedy absolutní, například /home/user/documents/school. Relativní popis cesty je kterýkoliv jiný popis.

Relativní cesta může začínat jen názvem složky, nebo jedním ze speciálních znaků:

ZnakDefinice
.Aktuální složka (working directory)
..Rodičovská složka (složka nadřazená aktuálnímu adresáři)
~Domovská složka přihlášeného uživatele (/home/$USER)

Relativní cestou je například ../documents/school, nebo ~/documents/school atd.

Tagy

unix os

NázevVerzovací systémy
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Verzovací systémy

Verzovací systémy slouží k organizaci sdílené práce na souborech. Tyto systémy se označují jako VCS (Version Control System).

Před nástupem VCS se soubory sdílely různými způsoby, např. přenášením na fyzických médiích, či po síti. Nebylo ovšem spolehlivě zjistitelné, která verze souboru je aktuální/správná.

Pokud se na úpravách jednoho souboru, například programu, chtělo podílet několik uživatelů, mohli mít všichni v jednu chvíli přístup k souboru na serveru. Ovšem pokud soubor upravovovali dva uživatelé ve stejnou chvíli, změny posledního uživatele, který zapsal změny, přepsaly všechny uložené změny předchozího uživatele.

Centralizované systémy

Tyto systémy se vyznačují tím, že soubory i jejich historie jsou umístěny na jednom zařízení - serveru. Ze serveru si uživatelé stahují vybrané verze souborů a pracují na nich.

Zamykání souboru

Pokud jeden uživatel otevře soubor pro editaci, ostatním uživatelům je umožněno soubor pouze číst. Tento systém zapříčiní vzniku konfliktu při slučování různých verzí.

Nevýhodou je, že zápis může v jednu chvíli provádět pouze jeden uživatel. To nemusí být v produkci účinné.

CVS

Concurrent Version System, ve zkratce CVS, je jedním z prvních rozšířených distribuovaných systémů. Byl vyvíjen jako součást projektu GNU a dodnes se v některých projektech používá. Je to ovšem již archaický systém bez dalšího zásadního vývoje.

Subversion

Subversion, nebo-li SVN, je systém, který měl za cíl nahradit CVS a opravit jeho nedostatky. Oproti CVS umí lépe řešit konflikty a manipulace se soubory, uchovávat v repozitářích i jiná data kromě textových souborů a větvit repozitář.

Stavy repozitáře se vypočítávají na základe předchozích změn. Výhodou toho je, že se šetří úložiště, ovšem výpočet rozsáhlého projektu může být velmi náročný. Podle zásad nepatří velké binární soubory do repozitáře, čímž se výhoda s využitým místem stává nepodstatnou.

Distribuované systémy

U distribuovaných systémů jsou zdrojové soubory - včetně celé historie repozitáře - uloženy na zařízeních všech uživatelů, kteří s repozitářem pracují. Změny se poté synchronizují do hlavního repozitáře na serveru.

Mercurial

Mercurial, často zmiňovaný zkratkou hg je distribuovaný verzovací systém. Vznikl přibližně ve stejné době jako git, liší se jednak tím, že je monolitický (jedna binárka) a orientací na přátelskost použití. Několik uživatelů popisuje Mercurial jako "DropBox pro programátory".

Zajímavé je, že že někteří poskytovatelé se Mercurialu zbavují a zachovávají pouze git, například Bit Bucket.

Git

V současnosti nejrozšířenější verzovací systém. který byl napsán Linusem Torvaldsem, autorem kernelu Linux. Právě pro vývoj Linuxu byl git napsán. Podobně jako Mercurial se jedná o distribuované VCS, ovšem Git je spousta malých programů, oproti monolitickému Mercurialu.

Git umí velmi dobře procházet a manipulovat s historií repozitáře, je velmi flexibilní a poměrně jednoduše rozšiřitelný přes shellové skripty.

Na rozdíl od SVN uchovává git kopie každé revize, respektive změněných souborů, a nevypočítává jejich stavy na základě změn.

Tagy

unix vcs

NázevVerzovací systém git
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětUnixové operační systémy

Git

Git je distribuovaný verzovací systém.

Získání souborů a kontrola stavu

clone

Slouží k vytvoření lokální kopie vzdáleného repozitáře.

git clone <remote address>

pull

Synchronizuje lokální verzi repozitáře se vzdáleným repozitářem, tj. stáhne všechny změny.

git pull

status

Vypíše všechny neuložené změny v lokálním repozitáři (které nejsou v commitu).

git status

log

Vypíše poslední provedené commity, jejich popis, ID a další informace.

git log

Nahrání změn

Proces nahrání lokálních změn do repozitáře

add

Připraví vybrané soubory ke commitu. Dokud se neprovede commit, lze soubory přidávat a odstraňovat.

git add <file>

commit

V podstatě "zabalí" všechny připravené soubory a vytvoří nový stav, ke kterému se v budoucnu lze vrátit. Změny provedené v commitu standardně nelze měnit.

Příkaz pro commit otevře editor, ve kterém se na první řádek napíše stručný popis změn s maximálním počtem 72 znaků. Na další řádky lze změny popsat do detailu, ovšem řádky by se měly zalamovat po nejvíce 72 znacích. Editor vim může zalamování automatizovat pomocí set tw=72.

git commit

Nechceme-li pracovat v editoru, máme možnost popis zadat rovnou přepínačem -m.

git commit -m "Kratky popis zmen"

push

Nahraje všechny lokálně vytvořené commity na vzdálený repozitář.

git push

Konflikty

Dojde-li k situaci, kdy dva uživatelé pracovali na stejném souboru a jeden nahrál změny do hlavního repozitáře, musí druhý uživatel před nahráním vlastních změn vyřešit potencionální konflikty.

Konflikt nastane v případě, že oba uživatelé upravili stejný řádek, nebo provedli podobné změny. Druhý uživatel musí tedy ručně (s pomocí gitu) zvolit, které řádky chce zachovat a které nahradit

Před vyřešením konfliktu je nutné lokální repozitář synchronizovat na poslední verzi.

Práce s vetvemi

Pro výběr větve, se kterou chceme pracovat, použijeme příkaz git checkout <branch>, ve kterém musíme zvolit správný název větve. Chceme-li větev vytvořit, můžeme příkaz rozšířit o přepínač -b, tj. git checkout -b <branch>. Mazání větví provádíme přepínačem -d.

Existující větve lze vypsat příkazem git branch -a. Aktivní větev je označena hvězdičkou.

Spojení větví se provádí příkazem git merge <branch>, který spojí specifikovanou větev s aktivní větví vybranou příkazem checkout.

Tagy

unix git vcs

NázevProgramovací jazyk Python
Zodpovědná osobaDawid J. Kubis
PopisV tomto předmětu se učí Python

Python je rozšířený interpretovaný programovací jazyk, vhodný ke psaní skriptů, rychlých simulací a výpočtů.

Seznam materiálů

NázevBoolean výrazy
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Boolean výrazy

Boolean výrazy jsou výrazy které obsahují dvě možné hodnoty : True nebo False.

Operátory

Tyhle základní logické operátory rozlišujeme v pythonu :

<, > - menší než, větší než

>>> 2 < 3
True
>>> 2 > 3
False

==, != - rovnost, nerovnost

>>> 2 == 2
True
>>> 2 != 3
True

and, or - logické 'a' a 'nebo'

>>> True and True
True
>>> True and False # a obracene
False
>>> False and False
False
>>> True or True
True
>>> True or False # a obracene
True
>>> False or False
False

not - negace

>>> not True
False
>>> not False
True

Tagy

python bool

NázevDatové typy
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Datové Typy

V programování existuje pojem datových typů, které specifikují jakého typu může být hodnota v proměnné.

Staticky a dynamicky typované jazyky

Staticky typované jazyky vyžadují specifikaci typu proměnné při její deklaraci (některé si typy doplňují při kompilaci a není potřeba je tam psát).

Dynamicky typované jazyky kontrolují typy při spouštění programu a tudíž se typy proměnných můžou měnit v průběhu práce.

Python je dynamicky typovaný jazyk :

>>> x = 3
>>> x
3
>>> x = 'foo'
>>> x
'foo'

Datové Typy

Teď si projedeme několik základních datových typů. Budu tady používat "funkci" type(), o které jsme se sice nezmíňovali ale hodí se na zjišťování datového typu proměnných.

int

Typ int (integer) je typ který popisuje nějaké celé číslo, kladné nebo záporné nebo nulové. V Pythonu vypadá takhle :

>>> x = 2 # tohle je int
>>> x = -32 # tohle je taky int
>>> type(x)
<class 'int'>

float

Typ float je typ který popisuje nějaké číslo s destinnou čárkou, kladné nebo záporné nebo nulové (psáno jako 0.0).

>>> x = 2.3232 # tohle je float
>>> x = -32.4444 # tohle je taky float
>>> type(x)
<class 'float'>

str/String

Typ str (také String) je typ který popisuje nějaký textový řetězec. V Pythonu je do tohoto typu taky zahrnutý takzvaný typ char, který popisuje jeden znak. Řeťezec by měl být obalen uvozovkami ("") nebo apostrofy ('') aby se dal odlišit od názvů proměnných.

>>> x = 'hello world' # str
>>> type(x)
<class 'str'>
>>>x = 'h' # taky str
>>> type(x)
<class 'str'>

bool

Typ bool (také boolean) je typ který má dvě možné hodnoty : True čili pravda nebo Falsečili nepravda. Tento typ dokáže přímo pracovat z if-ama, jelikož je sám v sobě boolean výrazem.

>>> x = True
>>> x = False
>>> type(x)
<class 'bool'>
x = True
if x:
	print('tohle se provede protoze x je pravda tudiz nemusime psat : "if x == True:'")

Tagy

python typy

NázevDictionarary
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Dict

dict je datový typ sloužící k ukládání hodnot pod určitými klíči. Jedná se určitým způsobem o něco jako pole, kde místo číselných indexů používáme libovolné neměnné objekty (čísla, stringy, tuply...)

Příklad:

>>> # Jedno z využití dictonary je snadná reprezentace složených dat
>>> mydict = {'jmeno': 'Lukáš', 'vek': 7893, 'poznamka': 'naposledy jsem to přestal počítat před 7893 lety'}
>>> mydict['vek']
7893
>>> # Za pomocí dictionary můžeme reprezentovat třeba i orientovaný graf.
>>> graph = {0: [2, 3], 1: [1, 0], 2: [3, 1]}
>>> graph[2] # Cesty z vrcholu číslo 2
[3, 1]

Tagy

python dictionary hashmap sbirka

NázevFor - smyčka
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

For

For slouží k procházení seznamů. Při definici píšeme název proměnné (v příkladu dole je to i) do které se ukládají všechny hodnoty. Například :

for i in range(10): # cisla od 0 do 100
	print(i) # vypsani cisla

vypíše :

0
1
2
3
4
5
6
7
8
9

Tagy

python loop for

NázevFunkce
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Funkce

Funkce jsou jedna z nejpodstatnějších věcí o kterých se budeme bavit.

Funkce nám pomáhají neopakovat kód, jinými slovy díky funkcím můžeme znovupoužít kusy kódu.

Funkce slouží jako logické rozdělení toho jak má fungovat náš program.


def fungce():
	print('tahle funkce nema zadny argumenty')

def funkce(argument, dalsi_argument):
	print(argument)
	print(dalsi_argument)

>>> fungce()
tahle funkce nema zadny argumenty
>>> funkce('hello', 'world')
hello
world
>>> funkce(1,2)
1
2

Input/Output

Vstup a výstup funkce zajištují argumenty a return hodnoty.

Argumenty píšeme do závorky za názvem funkce.

def funkce(argument, dalsi_argument):
	# .. bla bla bla
	# s argumenty pracujeme jako s promennymi

Return píšeme uvnitř funkce.

def funkce():
	return 'ahoj' # tahle funkce vraci 'ahoj' po spusteni
	# return ukonci praci funkce

>>> print(funkce())
ahoj

Pass

pass nám dovolí nechat nedopsanou funkci která nevyhodí error při interpretaci. Má to svoji funkci když plánujeme co napíšeme a tvoříme funkce ale není to podstatný si to pamatovat. Spíše se jenom nedivte až to někde uvidíte.

def funkce():
	pass

>>> funkce()
>>> # nic se nestalo lol

Tagy

python funkce

NázevIF - Podmínka
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

IF

If je blok který vyhodnocuje nějaký boolean výrazu (výrazu který vrací buď True nebo False) a provadí určitý kód na základě toho, co dostane

Příklad


cislo = 12 # tady by mohl byt input() od uzivatele

if cislo % 2 == 0: # jeden blok (if - elif - else)
	# if vzdy zacina blok, tudiz muze byt jen jeden v jednom bloku
	print('cislo je sude') # toto se provede jelikoz 12 % 2 je 0
elif cislo % 3 == 0:
	# elif-u tady muze byt 'nekonecne' mnoho
	print('cislo je delitelne tremi') # toto se neprovede i presto ze 12 % 3 je 0
else:
	# v jednom bloku muze byt else jenom jeden
	print('cislo je liche') # toto by se provedlo kdyby se vsechno nad tim neprovedlo

Další Příklad


cislo = 12

if cislo % 2 == 0: # jeden blok
	print('cislo je sude') # provede se
if cislo % 3 == 0: # dalsi blok (if - else)
	print('cislo je delitelne tremi') # taky se provede
else:
	print('cislo neni delitelne tremi') # neprovede se, patri k if-u nad tim

Tagy

if python

NázevImporty
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Importy

Importy nam slouzi k organizaci kodu nebo pouzivani kodu kterej napsal nekdo jinej.

Importovani vlastniho kodu

Rekneme ze mate takovouhle slozku:

.
├── lib.py
└── main.py

lib.py:

def hello(jmeno):
    return "hello " + jmeno

print("tohle je modul lib.py") # pozor; tohle se spusti, hned vysvetlim

main.py:

import lib # ne `import lib.py`

print(lib.hello("world")) # ne `hello("world")` ale `lib.hello("world")`

Kdyz pak udelame python main.py a spustime tim program tak dostaneme:

tohle je modul lib.py # <- tohle dostaneme protoze pri importu se `lib.py` jakoby spusti, to ale nechceme
hello world # <- tohle je vystup z main.py, to co jsme chteli

Prave proto si davejte pozor co pisete do veci ktery pak importujete, idealne by neco mel delat jenom jeden soubor a zbytek by mel byt plny funkci (nic nedelat) abyste se nedostali k situaci kdy se vam neco posralo hledate to mezi vsema python souborama.

Importovani cizicho kodu

Cizi kod muzeme ziskat tim, ze si ho stahneme pomoci pipu z oficialnich repositari python moduluu.

Ukazeme si to na prikladu modulu requests, ktery nam dovoluje vyrizovat http requesty v pythonu.

Zacneme tim ze si ho stahneme:

pip install requests

nebo na nekterych kompech:

python -m pip install requests

Pak pockame az se stahne requests a muzeme pouzivat:

import requests

a = requests.get("https://raw.githubusercontent.com/Dawidkubis/python-gjk/master/8/importy.md")
print(a.text)

Schvalne zkuste co vam to vypise :D

Tagy

python import

NázevInterpretace vs. kompilace
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Interpretace vs. Kompilace

Source kód vs. strojový kód

Souce kód je kód napsaný v nějakém počítačovém jazyce, který sám o sobě nic neznamená.

Strojový kód jsou přímé instrukce pro počítač, tudíž soubory se strojovým kódem můžeme rovnou spustit. Jsou napsány v binárním kódu.

Kompilace vs. Interpretace

Kompilace je základní princip fungování počítačových jazyků. Idea je taková že vezmeme nějakej source kód a přeložíme ho na strojový kód. Programu který překládá se říká "compiler".

konkretne compiler preklada kod urovne vyssi (napriklad python) do urovne nizsi (napriklad pythoni bytecode)

  • Karel Jílek

Tagy

python kompilace interpretace

NázevKomentáře
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Komentáře

Komentář (anglicky comment) označuje sekci v kódu, která není určená pro Pythoní interpreter, ale pro programátora, který kód čte. Hodí se většinou pro přehlednost a taky když se podíváte na svůj kód po nějaké době tak aby se tomu dalo porozumět. Ve větších projektech je komentování kódu vhodné, aby bylo snadnější se v kódu vyznat. V Pythonu se dělá znakem #.

Komentáře se v pythonu dělají následujícím způsobem:

print("Hello World") # Vsechno za znakem # je ignorovany
print("...")

Interpret jazyka Python prostě ignoruje vše, co se nachází po # na daném řádku

Je dobrým zvykem komentovat anglicky, protože je angličtina nejdůležitější jazyk v programování. My budeme komentovat česky bez znaků pro studijní účely ale vy nemusíte.

Tagy

python comment

NázevList comprehensions
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

List Comprehensions

list comprehensions jsou super. Dovolujou zkratit kod uplne strasne moc.

Je to prakticky for kterej dovoluje filtrovat.

Tohle:

# chceme sebrat vsechna sudo cisla do 1000
n = []
for i in range(1000):
	if i % 2 == 0:
		n.append(i)
print(n)

Je ekvivalence:

n = [i for i in range(1000) if i % 2 == 0]
print(n)

coz muzeme cist jako: "n je seznam vsech cisel do 1000 kde zbytek z deleni dvemi je nula, tl;dr vsech sudych cisel"

Tagy

python fp list funkce

NázevOperace
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Operace

+, - : sčítání, odčítání

>>> 2 + 3
5
>>> 2 - 3
-1

*, /, // : násobení, dělení

>>> 2 * 3
6
>>> 2 / 3 # vraci float
0.6666666666666666
>>> 2 // 3 # vraci int; deleni beze zbytku
0

** : umocňování

>>> 2 ** 3
8
>>> 2 ** (1/2) # muzeme umocnovat floatem; vychazi odmocnina ze dvou
1.4142135623730951

% : modulo

Modulo je operace která vrací zbytek z dělení, hodí se na zjišťování dělitelnosti čísel (viz. sude_nebo_liche.py).

>>> 17 % 2
1
>>> 17 % 9
8

Tagy

python aritmetika operator

NázevProměnné
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Proměnná

Proměnná (anglicky variable) je základ ukládání hodnot v programu. Narozdíl od matematiky je proměnná v programování (v jazyce Python) přepisovatelná (můžeme jít měnit). Do proměnné se zapisuje za pomocí =.

Příklad:

>>> x = 10
>>> x = x + 1
>>> x
11

Je vhodné pojmenovávat proměnné krátkými názvy (proměnná text_od_uzivatele_k_parsingu je hrůza) ale s dostatečným významem (nechceme mít v kódu celou abecedu protože se v tom nikdo nevyzná). Proměnné píšeme s malým počátečním písmenem, a bez mezer (_ na místě mezery). Python to sice nepožaduje, ale dělá se to tak, aby jiní lidé nebyli z vašeho kódu zmatení a nenadávali vám.

Tagy

python variable

NázevPython interpreter
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Python Interpreter

Python interpreter je program jež nám umožňuje spustit skript který jsme si napsali. Pokud je v $PATH (což by měl být) tak ho můžeme volat z příkazového řádku (takhle to vypadá u mě) :

$ python
Python 3.7.4 (default, Jul 16 2019, 07:12:58) 
[GCC 9.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Když takhle zavoláme Python bez argumentů, tak se interpreter spustí v tzv. interaktivním módu. Vocaď můžeme Python používat jako kalkulačku, například :

>>> 2 * 3
6
>>> 2 + 3
5
>>> x = 2 * 3
>>> x * 70
420

Python nám automaticky vyprintuje hodnoty všech výrazů, což je specialita interaktivnícho módu.

Když chceme spustit nějaký soubor s python kódem, musíme přidat cestu k souboru jako argument.

$ python <nazev_skriptu>.py

Všechny python skripy by měly končit koncovkou .py. Toto bude fungovat jenom pokud jste ve stejné složce jako je <nazev_skriptu>.py, jinak budete muset specifikovat relativní nebo absolutní cestu, případně přejít do složky se skriptem pomocí příkazu cd. Více o cestách a shellových příkazech najdete zde (windowsáci si budou muset v mysli nahradit ls za dir)

Tagy

python kompilace interpretace

NázevRange (rozsahy)
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Range

Range popisuje seznam celých čísel v nějakém intervalu.

range(10) jsou čísla 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

range(5, 10) jsou čísla 5, 6, 7, 8, 9

Pozor, když chcete s range pracovat jako se seznamem čísel, čili provádět na seznamu operace a ne jenom procházet pomocí for tak si ten range uložte jako

x = list(range(10))

Tagy

python range

NázevHTTP v Pythonu
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Http

Http je způsob komunikace ktery se pouziva na siti.

Http posila data, vetsinou ve formatu html, kterej nespis znate ale neplette si ty pojmy. Http zacina headerem kterej popisuje:

  • jestli je to pozadavek nebo odpoved (request & response)
  • pokud je to odpoved tak jestli doslo k nejaky chybe
  • pokud je to pozadavek tak co se vlastne po tom serveru chce

Http metody

  • GET - chceme ziskat obsach, vetsinou html, ze serveru. Neposilame zadny data
  • POST - chceme neco postnout na server, posilame data v nejakym formatu (vetsinou json) Je jich vic, ale to tady nebudu rozebirat. Pokud vas to zajima tak si to vygooglete.

Requests

Requests nam dovoli pracovat s tema http metodama a posilat http pozadavky (requesty - proto requests).

GET

import requests # viz. importy.md
response = requests.get("https://google.com") # posilame GET na google
# tohle se bezne deje kdyz nacitame tu stranku v prohlizeci
print(response.text) # html ktery jsme dostali zpatky, prohlizec tyto data zpracuje
		     # aby to nejak hezky vypadalo
		     # responese ma jeste mnoho veci ktery jsme mohli tahat
		     # treba:
		     #response.status_code
		     # atd, ale to nebudu rozebirat, proste se s tim da delat hromada veci

POST

To tady nebudu resit, ted se mi to nechce psat

Tagy

python http

NázevSeznamy
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Seznamy

Seznamy nám dovolují ukládat hodnoty v seznamu (lol) a pracovat s nima. Datové typy v seznamech se sice můžou lišit ale je lepší aby všechny byly stejné. Jednotlivé prvky v seznamech jsou označeny tzv. indexem, což je číslo které popisuje kolikátý prvek to je.

>>> x = [1, 2, 3]
>>> x[0] # prvek v `x` s indexem 0
1
>>> x[1]
2
>>> x[2]
3

operace na seznamech

>>> x = [1,2,3]
>>> len(x) # delka x
3
>>> x.append(4) # prida prvek na konec seznamu
>>> x
[1, 2, 3, 4]
>>> x.pop() # odebere prvek z konce seznamu
4
>>> x
[1, 2, 3]

Tagy

python list vector sbirka

NázevTernární operátor
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Tenarni operator

Unarni operatory jsou operatory ktery berou 1 vstup. Napriklad not je unarni operator.

Binarni operatory jsou operatory ktery berou 2 vstupy. Napriklad + je binarni operator.

Tenarni operator je operator ktery bere 3 vstupy. Ten je v pythonu tedy jenom jeden vypada takto:

n = 2 # nejaky cislo
print("sudy" if n % 2 == 0 else "lichy") # vypise `sudy` protoze n je sudy

coz je ekvivalence:

n = 2
if n % 2 == 0:
	print("sudy")
else:
	print("lichy")

Tagy

python operator ternarni if

NázevProgramovací jazyk Python
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Třídy a Objekty

Třídy v programování popisují nějaký "typ" určité hodnoty. Například hodnota 1 je typu int, hodnota 'ahoj' je typu str - typy jsou třídy a hodnoty objekty. Třídy popisují jen obecné vlastnosti a činnosti (funkce, u tříd se jim říká metody).

Objekty jsou instance třídy, které mají nějaké konktrétní hodnoty.

Takhle vypadá definice třídy v pythonu:

class Clovek: # tridy se nazyvaji s velkym pocatecnim pismenem
	def __init__(self, age, height):
		self.age = age # self.age patri objektu, age je argument metody
		self.height = height

Metoda __init__ je tzv. konstruktor, čili je volána vždy když tvoříme objekt. self je proměnná do které se automaticky přiřadí objekt.

Takle vypadá konstrukce objektu třídy člověk:

x = Clovek(18, 180)

Je dobré si všimnout, že při konstrukci jsme dali metodě __init__ jen dva argumenty, i když v definici bere tři. To je proto, že objekt se automaticky přiřadí k proměnné self (nebo jakékoli proměnné která bude na začátku). Protože __init__ je konstruktor, tak k self se přiřadí prázdný objekt, kterému potom dáváme nějaké vlastnosti. Je to lechce podobný proces jako při práci se slovníky:

def init(age, height)
	x = dict()
	x["age"] = age
	x["height"] = height

	return x

Až na to, že k datům objektu přistupujeme pomocí tečky (x.age místo x["age"]).

Tagy

python oop class objekt typy

NázevWhile smyčka
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

While

Bere booleanovský výraz jako argument. Loopuje dokud je výraz True.

while True:
	print('tohle bezi donekonecna')
i = 0
while i < 10
	print(i) # tohle se provede 10krat
	i += 1

Tagy

python loop while

NázevZákladní funkce
AutorNeznámý
Naposledy upravilLukáš Hozda
Poslední změna2021-01-24 22:53:14 +0100
PředmětProgramovací jazyk Python

Základní funkce

V naší první hodině jsme probrali několik funkcí. Funkce je kus kódu, který můžeme volat na vícero místech (to si ale do detailu probereme později).

Syntax volání

Nyní potřebujete znát hlavně základní syntax volání funkcí. Funkce může dostávat nějaké argumenty, což jsou jakési vstupy, které funkce zpracovává. Různé funkce mají různý počet argumentů. Je to asi nějak takhle:

jmeno_funkce(argument1, argument2, ...)

Funkce může vracet nějaký výstup, který si můžeme například uložit do proměnné. Třeba takhle:

ahoj = nejaka_funkce()

Pár funkcí do základní výbavy

My jsme probrali několik funkcí.

print

Nejzákladnější je funkce print. Ta bere neomezený počet argumentů, které spojí mezerou a vypíše do konzole. Příklad

print("Hello World")

jmeno = "Dawid"
print("Ahoj", jmeno) # Vypíše Ahoj Dawid

input

Dále jsme probrali funkci input. Ta bere maximálně jeden argument. Funguje tak, že čeká, dokud uživatel nezadá nějaký vstup a zmáčkne enter a vrátí vstup, který uživatel zadal. Když dostane argument, tak jej vypíše uživateli před místo, kam zadává vstup.

jmeno = input("Zadej prosím své jméno.")

int

Jako poslední jsme probrali funkci int (což je spíše datový typ, ale my budeme předstírat, že je to funkce). Ta nám převede nějaký string (zadaný jako argument) na celé číslo, pokud je to možné. Jestliže to možné není, tak hodí chybu (později se naučíme, jak se s takovouhle chybou vyrovnat).

Příklad:

ahoj = "1234" # Všimněte si, že ahoj je string (typ str)
ahoj_cislo = int(ahoj) # ahoj_cislo je nyní celé číslo

Tagy

python fp funkce

Vyučující

Božena Patáková Dawid J. Kubis Emil Miler Julie Jará Karel Jurečka Lukáš Hozda Milan Špaček Richard Šašek Viktorie Koláčková Zbyněk Stříbrný

Božena Patáková

Bio

falešný profil pro zaplnění databáze učitelů

Předměty

Materiály


Dawid J. Kubis

Bio

github

Předměty

Materiály


Emil Miler

Bio

Tento profil doopravdy nepatří Emilovi, ale slouží jako demonstrace toho, když se na materiálech podílí více autorů

Předměty

Materiály


Julie Jará

Bio

falešný profil pro zaplnění databáze učitelů

Předměty

Materiály


Karel Jurečka

Bio

falešný profil pro zaplnění databáze učitelů

Předměty

Materiály


Lukáš Hozda

Bio

další informace -> https://magnusi.tech/

Předměty

Materiály


Milan Špaček

Bio

falešný profil pro zaplnění databáze učitelů

Předměty

Materiály


Richard Šašek

Bio

falešný profil pro zaplnění databáze učitelů

Předměty

Materiály


Viktorie Koláčková

Bio

falešný profil pro zaplnění databáze učitelů

Předměty

Materiály


Zbyněk Stříbrný

Bio

falešný profil pro zaplnění databáze učitelů

Předměty

Materiály


Tagy

algoritmy aritmetika bool c class comment crypto dictionary for fp funkce git hashmap http if imperativni import interpretace kodovani kompilace list loop networking objekt oop operator os pamet paradigma pravo promenne python range sbirka security shell ternarni typy unicode unix variable vcs vector while

algoritmy

aritmetika

bool

c

class

comment

crypto

dictionary

for

fp

funkce

git

hashmap

http

if

imperativni

import

interpretace

kodovani

kompilace

list

loop

networking

objekt

oop

operator

os

pamet

paradigma

pravo

promenne

python

range

sbirka

security

shell

ternarni

typy

unicode

unix

variable

vcs

vector

while