Zde najdete veškeré informace pro přednášky a cvičení předmětu Skriptovací programovací jazyky a jejich aplikace.

Rozvrh

Přednáška

Pondělí
12:30 - 14:00, C3
Středa
07:15 - 08:45, EB330 (anglicky)

Studijní opora

K dispozici je studijní text.

Hodnocení aneb za co se získávají body

V průběhu semestru dostanete na cvičeních zadáno 8 úloh, které samostatně vypracujete pod dohledem cvičícího na daném cvičení. Samozřejmě se budete moci cvičícího doptat na případné nejasnosti. Tyto úlohy se budou týkat témat probraných na přednáškách. K jednotlivým cvičením budete též mít k dispozici krátký text vysvětlující danou problematiku. Za každé cvičení budete moci získat až 5 bodů. Celkové bodové ohodnocení se Vám bude počítat ze 6ti nejlepších výsledků, kterých na cvičeních dosáhnete (maximálně tedy 30 bodů). Toto je nastaveno z důvodů, že můžete onemocnět a tudíž se nebudete moci dostavit na cvičení apod.

Dále budete mít zadánu jednu domácí úlohu. Zadání úlohy bude vystaveny na této stránce a budete ní informováni na přednášce a cvičeních. Vašim úkolem je tuto úlohu samostatně nebo ve dvojici vypracovat a v zadaném termínu předvést na cvičení svému cvičícímu, který ohodnotí funkčnost řešení a také způsob, jakým je úloha naprogramována. Úloha je za 30 bodů. Pokud úlohu neodevzdáte v zadaném termínu, budou za každý započatý týden po řádném termínu odevzdání odečteny 3 body z maximálního přídělu. Úkol je povinný! Musíte jej odevzdat! Z tohoto úkolu musíte získat alespoň 10 bodů.

V zápočtovém týdnu také proběhne závěrečný test, který musíte absolvovat. Za tento test můžete získat až 40 bodů. Minimálně musíte získat 15 bodů.

Závěrečný test

Závěrečný test proběhne v zápočtovém týdnu a budete o něm dostatečně dopředu informování na přednášce a tomto webu. Termín NENÍ vypsán v Edisonu.

Další termíny testů

Níže jsou uvedeny termíny zápočtových testů. Test proběhne na učebně EB213.

Termín Čas
11.1.2016 09:00
22.1.2016 09:00

Shrnutí

Typ úlohy MAX bodů  MIN bodů  Poznámka
Vypracování úloh na cvičeních 30 (40) 6 Bodování uvedeno v textu výše.
Odevzdání projektu v Djangu 30 10 Možno vypracovat ve dvojici.
Test 40 15  

Další zdroje

Dokumentace k jazyku Python

Zajímavý online interaktivní kurz nalezneta na Codeacademy.

Pro základy programování můžete využít knihu Think Python, kterou si můžete stáhnout zdarma.

Velice pěkný tutoriál k Pythonu se jmenuje Dive into Python, který se dá použít i pro rychlé vyhledávání programovacích technik v Pythonu.

Přečtěte si také výukový text z MIT, který vřele doporučuji.

Jako doplňkovou literaturu můžete použít oficiální Python Tutoriál.

Sada přednášek z MIT, které vysvětlují použití Pythonu na různých úlohách.

Django

Část našich cvičení se zabývá vývojem webových aplikací pomocí Django frameworku. Existují i české stránky, kde naleznete dokumentaci k verzi 1.0 v češtině.

Pro zájemce o další informace z oblasti použití Django, doporučuji knihu The Django Book.

Pěkný seriál o Djangu vycházel na serveru Zdroják.

Projekt pro studenty denního studia

Zadání projektu pro studenty denního studia je uvedeno jako úloha 5 (prezenční).

Kombinované studium

Pro studenty kombinované formy studia budou připravy 4 úlohy. Termín odevzdání jednotlivých úkolů (budou se postupně objevovat na této stránce) je ideálně do zápočtového týdne. Není však problém odevzdat úkoly a vyplnit test i v pozdějším termínu (ideálně tak do 2. týdne zkouškového období).

Úkoly odevzdávejte na e-mail tutora, kde předmet bude tvaru: SPJA-KOMB-PROJ-X-login, kde X je pořadové číslo úkolu a login je Vaše studentské číslo. Vaše došlá řešení budou průběžně kontrolována a bodována. Diskuse k řešením bude samozřejme moci probíhat na tutoriálech.

Hodnocení

Typ úlohy MAX bodů  MIN bodů  Poznámka
Odevzdání souboru 4 úloh 60 25 Nutno odevzdat všechny úlohy!
Test 40 15  

Termíny testů

Níže jsou uvedeny termíny zápočtových testů. Test je možno opakovat. Můžete tedy přijít na více termínů, pokud test. Vše se odehraje na učebně EB405.

Termín Čas
6. 1. 2017 14:00
9. 1. 2017 14:00
11. 1. 2017 14:00
13. 1. 2017 14:00
20. 1. 2017 14:00

Cvičení 1

Skript, do kterého můžete postupně doplňovat kód, je k dispozici zde: cv1_labs.py. Pro stažení klikněte na odkaz pravým tlačítkem a zvolte Save Link As... nebo (Uložit odkaz jako...).

Řešení: cv1_labs_full.py

Na cvičení budeme probírat níže uvedená témata:

Obecně:

  • Dynamická typovost
  • Garbage collector

Pracovní prostředí:

  • ipython
    • Magic command %run, %hist

Základní datové typy:

  • čísla (int, long, float, complex)
  • string
    • immutable
    • literal pro long string
    • kódováni (prefix u)
  • list, tuple
  • dict
  • Singletony: None, True, False

Základy syntaxe:

  • Komentáře (+ docstring)
  • Přiřazení do proměnné
  • Volání funkcí
    • print (základní %-substituce)
  • Podmínky (možnost obejití absence switche)
  • Cykly
    • for
    • while
  • Definice funkce

Doporučeno k procvičení:

Skript z akademického roku 2011/2012, který navíc obsahuje rekurzi: cv1_labs_extended.py. Pro stažení klikněte na odkaz pravým tlačítkem a zvolte Save Link As... nebo (Uložit odkaz jako...).

Řešení: cv1_labs_extended_full.py

Cvičení 2

Bodované cvíčení na témata probraná na 1. přednášce + obsah 1. cvičení, kde se používalo jednoduché volání funkcí.

Studijním materiálem je text uvedený v úvodu stránky.

Cvičení 3

Bodované cvíčení na témata probraná na 2. přednášce: Funkce, list comprehension, funkcionální prvky programování, čtení ze souboru.

Studijním materiálem je text uvedený v úvodu stránky. Výjimky a čtení ze souboru je vysvětleno v prezentaci.

Cvičení 4

Bodované cvíčení na témata probraná na 3. přednášce: Objektově orientované programování.

Studijním materiálem je text uvedený v úvodu stránky.
Slidy k importům a balíčkům.
Slidy k objektově orientovanému programování.

Cvičení 5

Bodované cvíčení na témata probraná na 3.-4. přednášce: Objektově orientované programování.

Studijním materiálem je text uvedený v úvodu stránky.
Slidy k objektově orientovanému programování.

Cvičení 6

Bodované cvíčení na témata probraná na 3.-5. přednášce: Objektově orientované programování.

Studijním materiálem je text uvedený v úvodu stránky.
Slidy k objektově orientovanému programování.

Cvičení 7

Bodované cvíčení na témata probraná na 6. přednášce: XML

Slidy k zpracování XML.

Příklad na parsovaní xml souboru menza.xml.

Příklad na hlednání na Twitteru (nejede od roku 2013).

Cvičení 8

Bodované cvíčení na témata probraná na 8. přednášce: XML-RPC

Studijním materiálem je text uvedený v úvodu stránky.

Příklad na XML-RPC:
calc_client.py
calc_service.py
calc_service2.py

Cvičení 9

Cvičení na témata ze všech předchozích cvičení.

Úloha 1 (kombinovaní)

Dokumentace k jazyku Python

Naimplementujte funkce dot_product a cross_product, které vrátí skalární a vektorový součin vektorů. Jako vstup uvažujme 2D a 3D vektory, které budou reprezentovány listem (v případě vektorového součinu uvažujme pouze 3D vektory). Nezapomeňte ošetřit stav, kdy vektory nebudou 2D nebo 3D, a kdy funkce dostanou vektory různé délky. V takovém případě funkce vrátí None.

Vstup funkce: dva listy reprezentující vektory (přepokládejme 2D a 3D vektory)
Výstup funkce: číslo (pro funkci dot_product) nebo list (pro funkci cross_product)

Ukázka:

dot_produkt([1, 2, 0], [0, 1, 2])
Výstup: 2

cross_produkt([1, 2, 0], [0, 1, 2])
Výstup: [4, -2, 1]

Ukázka chybného zadání (nejsou uvedeny všechny kombinace):

cross_produkt([1, 2, 0], [0, 1, 2, 4])
Výstup: None

Úloha 2 (kombinovaní)

Naprogramujte funkce "make_index" a "search_by_index"

Popis funkce "make_index":

Vytvoří ze vstupního souboru rejstřík slov s informací na jakých řádcích se slova nacházejí. Rejstřík se uloží do souboru. Za oddelovač slov se považuje mezera, tečka, čárka, středník, otazník, výkřičník a uvozovky.

Formát indexu:

<slovo> <radek1> <radek2> ... <radekN>

Každé slovo je na samostatném řádku.

Příklad:

first-rate 41
flexible 18
for 12 13 20 25 27 29 34 36 44 46

Rejstřík musí být setříděn lexikograficky. Čísla řádek jsou setříděna a neopakují se.

Vstup: Jméno vstupního souboru a jméno souboru, do kterého bude index uložen
Výstup: None

Popis funkce "search_by_index":

Využije vytvořeného indexu a vrátí čísla řádek, na kterých se nachází slovo.

Vstup: Jméno souboru s indexem a hledané slovo
Výstup: Seznam integeru

Example:

make_index("input.txt", "index.txt")
search_by_index("index.txt", "Python")
Výstup: [1, 3, 16, 18, 20, 21, 23, 25, 27, 29, 31, 32, 34, 36, 37, 39, 41, 42, 44, 46]

search_by_index("index.txt", "Kreatrix")
Vystup: []

Testovací data:

Testovaci vstupní soubor je k dispozici zde. Testovaci indexový soubor je též k dispozici. Pokud používáte Windows, dejte si pozor na zalomení řádek, které je v tomto souboru ve stylu Unixu, popřípadě na kódování vstupního souboru.

Další specifikace zadání

  • V programu musi být ošetřeny všechny výjimky.
  • Pro práci s listy použijte "list comprehension", který jsme na cvičeních dost používali. Nepoužívejte funkce map a reduce.
  • Pro parsování vstupního souboru a dělení slov pomocí oddělovačů nejprve vstupní soubor upravte pomocí funkce string.translate (odkaz na dokumentaci), pak jednotlivé řádky rozdělte pomocí jediného oddělovače. Tímto způsobem odstraníte procházení jednotlivých znaků na řádku.
  • Zpětné vyhledání pomocí indexového souboru bude efektivní, tzn. nebudete vytvářet nový slovník. Budete pouze procházet soubor a pro dané slovo vrátíte výsledek. Pro práci s listem platí stejná pravidla jako výše.
  • Kde to jde, používejte slicing.

Úloha 3 (kombinovaní)

Naprogramujte třídy Inventar a Polozka.

Popis třídy "Polozka":

Třída reprezentuje fyzickou položku v majetku VŠB. Její atributy a metody jsou vypsány níže:

Id položky je vždy string ve tvaru <fakulta>/cislo, kde <fakulta> je jedna z následujících zkratek: FEI, HGF, EkF, FBI, FMMI, FS, FAST.

Metoda amortizace provede amortizaci položky podle zadaního amortizačního koeficientu. Při vytvoření objektu je puvodni_cena a zbytkova_cena nastavena na stejnou hodnotu. Pro provedení amortizace bude zbytkova_cena snizena. Vzorec pro výpočet zbytkové ceny je následující:
zbytkova_cena = zbytkova_cena - puvodni_cena * koef_amortizace

Metoda __str__ bude vracet řetězec v následujícím tvaru: Typ: <typ>, ID: <id>, Mistnost: <mistnost>, kde hodnoty mezi šipkami budou aktuální hodnoty položky. Metoda se volá například při použití print. Příklad je uveden níže.

Její atributy a metody jsou vypsány níže:

Třída Polozka:

  • atributy:
    • id
    • nazev
    • mistnost
    • puvodni_cena
    • zbytkova_cena
    • koef_amortizace
  • metody:
    • __init__(self, id, nazev, mistnost, cena, koef_amortizace)
    • amortizace(self)
    • __str__(self)

Popis třídy "Inventar":

Třída reprezentuje databázi majetku VŠB. Nad touto databází je možno provádět jednoduché operace přidání, listování počtu položek a listování souhrnné ceny majetku.

Databázi, která obsahuje majetek implementujte jako slovník, kde klíčem bude id položky.

Metoda cena_polozek vrátí zbytkovou cenu všeh položek, které patří dané fakultě.

Metoda pocet_polozek vrátí počet položek, které patří dané fakultě.

Metoda proved_amortizaci provede amortizaci položek, které patří dané fakultě.

Atributy a metody třídy jsou vypsány níže:

Třída Inventar:

  • atributy:
    • inventar (slovník)
  • metody:
    • __init__(self)
    • pridej(self, majetek)
    • pocet_polozek(self, fakulta)
    • cena_polozek(self, fakulta)
    • proved_amortizaci(self, fakulta)

Example:

inventar = Inventar()
inventar.pridej(Polozka("FEI/4605511", "Zidle", "A1036", 1600, 0.05))
inventar.pridej(Polozka("FEI/4605512", "Stul", "A1036", 2360, 0.05))
print inventar.inventar["FEI/4605511"]
print inventar.cena_polozek("FEI")
inventar.proved_amortizaci("FEI")
print inventar.cena_polozek("FEI")
print inventar.cena_polozek("HGF")

Výstup:
Typ: Zidle, ID: FEI/4605511, Mistnost: A1036
3960
3762.0
0

Úloha 4 (kombinovaní)

Termín odevzdávání: v týdnu od 17.12.2012 do 20.12.2012

Vytvořte jednoduchou XML-RPC službu, která bude pracovat s inventářem majetku, který bude velmi podobný předchozímu zadání. Deklarace některých metod jsou však jiné.

Naprogramujte třídy Inventar a Polozka.

Popis třídy "Polozka":

Třída reprezentuje fyzickou položku v majetku VŠB. Její atributy a metody jsou vypsány níže:

Id položky je vždy string ve tvaru <fakulta>/cislo, kde <fakulta> je jedna z následujících zkratek: FEI, HGF, EkF, FBI, FMMI, FS, FAST.

Metoda amortizace provede amortizaci položky podle zadaního amortizačního koeficientu. Při vytvoření objektu je puvodni_cena a zbytkova_cena nastavena na stejnou hodnotu. Pro provedení amortizace bude zbytkova_cena snizena. Vzorec pro výpočet zbytkové ceny je následující:
zbytkova_cena = zbytkova_cena - puvodni_cena * koef_amortizace

Metoda __str__ bude vracet řetězec v následujícím tvaru: Nazev: <nazev>, ID: <id>, Mistnost: <mistnost>, kde hodnoty mezi šipkami budou aktuální hodnoty položky. Metoda se volá například při použití print.

Metoda vrat_xml_element vrací položku jako XML element z Python modulu ElementTree. Tuto metodu využijte při ukládání databaze. Vyjděte z ukázkové reprezentace jedné položky v inventáři, která je ke stažení níže.

Atributy a metody třídy Polozka:

  • atributy:
    • id
    • nazev
    • mistnost
    • puvodni_cena
    • zbytkova_cena
    • koef_amortizace
  • metody:
    • __init__(self, id, nazev, mistnost, puvodni_cena, zbytkova_cena, koef_amortizace)
    • amortizace(self)
    • vrat_xml_element(self)
    • __str__(self)

Samozřejmě si můžete přidat další atributy nebo metody tak, abyste si ulehčili práci.

Popis třídy "Inventar":

Třída reprezentuje databázi majetku VŠB a je zároveň XML-RPC službou pro vzdálený přístup do této databáze. Nad touto databází je možno provádět jednoduché operace přidání, listování počtu položek, listování souhrnné ceny majetku, provádět amortizaci majetku a trvale tuto databázi ukládat do XML souboru. Tímto způsobem zajistíte, že pokud bude služba zastavena a následně spuštěna, stále budete mít uloženy i položky, které jste přidali za běhu služby.

Databáze bude ukládána do souboru v podobě XML dat, jehož název bude předán jako argument konstruktoru třídy Inventar. Databázi v paměti můžete opět reprezentovat jako minule pomocí slovníku. Není to však podmínkou, proto není tento atribut zmíněn ve výpisu níže.

Počítejte s tím, že z klienta bude možno volat pouze následující metody: pridej, cena_polozek, pocet_polozek, proved_amortizaci.

Metoda import_xml_db načte soubor předaný konstruktoru. Z XML dat načte databázi do paměti pro další práci pomocí metod z Python modulu ElementTree.

Metoda uloz_xml_db uloží majetek z paměti do XML souboru pomocí metod z Python modulu ElementTree.

Metoda pridej přidá položku do databáze. Když budete v klientovi volat tuto metodu s argumentem, který bude instancí třídy Polozka, bude tato instance předána jako slovník. Toto je standardní chování XML-RPC. Je proto nutno z tohoto slovníku opět vytvořit objekt typu Polozka.

Metoda cena_polozek vrátí zbytkovou cenu všech položek, které patří dané fakultě.

Metoda pocet_polozek vrátí počet položek, které patří dané fakultě.

Metoda proved_amortizaci provede amortizaci položek, které patří dané fakultě.

Atributy a metody třídy Inventar:

  • atributy:
    • xml_db_file
  • metody:
    • __init__(self, xml_db_file)
    • import_xml_db(self)
    • uloz_xml_db(self)
    • pridej(self, polozka)
    • pocet_polozek(self, fakulta)
    • cena_polozek(self, fakulta)
    • proved_amortizaci(self, fakulta)

Dobře promyslete, kdy je nutné databázi z paměti ukládat do XML, neboť metodu pro uložení nemáte volat z klienta a nemůžete si být jisti, zda služba bude stále přístupná.

Počáteční databáze, kterou je možno použít jako argument konstruktoru je k dispozici zde: inventar.xml. Také si prostudujte strukturu XML dokumentu, abyste správně vytvářeli XML reprezentaci třídy Polozka a celé databáze pro další spuštění.

Také nazapomeňte, že metody volané přes XML-RPC musí něco vracet. Pokud tedy neočekáváte na straně klienta žádnou návratovou hodnotu, jednoduše vraťte integer 0.

Vaši službu náležitě otestujte ideálně pomocí dvou klientů podle následujícího návodu. Pro otestování trvalého uložení položek v XML souboru můžete využít následující posloupnost kroků:

  • spustit službu
  • spustit klienta s listováním, přidáním položek a amortizací
  • službu vypnout a následne zapnout
  • slustit službu s listováním, zde by se již měla projevit amortizovaná cena položek

Při implementaci využijte následujících modulů Pythonu: xml.etree.ElementTree a SimpleXMLRPCServer (případně dalších standardních modulů).

Pro práci s XML využijte nápovědu k modulu ElementTree.

Úloha 5 (prezenční)

Termín odevzdávání: na cvičeních v týdnu od 12.12.2016 do 15.12.2016

Pomocí Django frameworku naprogramujte jednoduchou webovou aplikaci, která bude splňovat následující kritéria:

  • aplikace bude obsahovat alespoň 6 modelů (2 řešitelé) nebo 3 modely (1 řešitel), které budou vzájemně provázány vazbou
  • k modelům vytvořte adekvátní administrativní rozhraní
  • aplikace bude obsahovat alespoň 12 view (2 řešitelé) nebo 6 view (1 řešitel) a s tím spojené URL, které budou s modely pracovat
  • view Vaší aplikace budou obsah předávat templatům (budete tedy implementovat 12 templatů (2 řešitelé) nebo 6 templatů (1 řešitel)
  • aplikace bude obsahovat alespoň 6 formulářů (2 řešitelé) nebo 3 formuláře (1 řešitel) (ať už formulář vázaný na model nebo Váš vlastní)
  • výsledná aplikace by měla tvořit nějaký logický celek, tj. jednotlivé stánky na sebe budou odkazoval pomocí linků
  • blogovací a fórum aplikace nejsou přípustné, neboť jsme je dělali na přednášce
  • projekt na téma benzínové stanice není přípustný, neboť jsme jej dělali na cvičeních
  • aplikace nemusí obsahovat grafické prvky a CSS styly
  • aplikace nemusí obsahovat geografickou složku
  • aplikace nesmí obsahovat generické view

Aplikace může být např. Vaše velmi jednoduchá implementace služby Twitter, část školního informačního systému (udělování zápočtu studentům), nějaká část modré stránky (Facebook), apod.