Cvičenia sa konajú sa každý týždeň v

  • pondelky o 11:40 – 13:55 v SA1C03
  • utorky 09:50 – 12:05 v SA1C0

Odporúčam používať vlastné laptopy. Počas semestra budeme potrebovať tieto programy:

 

Pre používateľov macOS odporúčam všetko inštalovať cez Homebrew.

Pre používateľov Linuxu odporúčam používať distribučné „app stores“ a repozitáre. Pozor, Docker Desktop je proprietárny program a väčšina distribúcií ho nemá. Buď si nainštalujte z ich stránky, alebo použite klasický Docker (Engine) bez GUI, ktorý sa v repozitároch nachádza. Pre naše potreby je to jedno.

Ak si na Linuxe nainštalujete Docker Desktop, t.j. nie klasický Docker Engine, tak IntelliJ môže mať problém spúšťať Docker súbory. To sa dá napraviť príkazom 

sudo ln -s $HOME/.docker/desktop/docker.sock /var/run/docker.sock

Taktiež je potrebné, aby Docker príkazy fungovali bez sudo, ináč sa to IntelliJ ani Jave nebude páčiť. Pre otestovanie Dockera na Linuxe odporúčam pustiť príkaz

docker ps

Ak vyhodí problém s povoleniami, tak to fixnete príkazmi

sudo groupadd docker

sudo gpasswd -a $USER docker

sudo service docker restart 

 

Alternatívne si môžete sťiahnuť predpripravený VM obraz s Linuxom, kde je všetko nastavené. Odporúčam tento obraz používať na počítačoch v učebniach, keďže tam nie sú nainštalované niektoré potrebné programy. (Docker Desktop na Windows aj Mac vie byť dosť masaker pre staršie/slabšie stroje, odporúčam aspoň 16 GB RAM, alebo alternatívne Linux VM.)

 

Zdrojové kódy z cvičení nájdete na fakultnom Gitlabe.

1. Cvičenie (22.9.2025, 23.9.2025)

  • Git – lokálne úložisko, GitHub, Commit, Push, Fetch, Pull, klonovanie, riešenie konfliktov, Merge v spoločnej vetve
  • Úlohy:
    • 1. Urobte si účet na Githube. (Voliteľne: Nastavte si aj SSH prístup a GPG podpisovanie)
    • 2. Vytvorte dvojice a jeden člen vytvorí prázdny verejný projekt na Githube.
    • 3. Autor projektu pridá svojho kolegu ako kolaborátora.
    • 4. Naklonujte si projekt do vášho počítača – buď cez
      git clone
      , alebo cez IntelliJ IDEA
    • 5. Lokálne vytvorte súbor
      autori.md
      a dajte tam prezývku/login a email jedného člena.
    • 6. Zmeny kommitnite a pushnite na Github
    • 7. Druhý člen tímu si pullne zmeny, zapíše sa tiež do
      autori.md
        a kommitne+pushne.
    • 8. Obaja členovia spravia pull, a vo svojich lokálnych projektoch zmenia svoje riadky. Napr. tam pridajte kde študujete.
    • 9. Obaja členovia po sebe spravia kommit a push. Ten, čo urobí push druhý, dostane chybovú hlášku o konflikte.
    • 10. Skúste spoločne nájst ako vyriešiť tzv. merge konflikt u daného člena tímu a pushnite jeho zmeny. Sú dva spôsoby: merge a rebase. (Všimnite si nový `merge` commit ak ste konflikt riešili mergovaním.)
    • 11. Diskutujte, aký je rozdiel medzi merge a rebase a čo by sa kedy malo používať.

2. Cvičenie (29.9.2025, 30.9.2025)

  • branche v gite, projekt „Prezenčka“, používateľské požiadavky, návrh tried
  • Zadanie: Potrebujeme aplikáciu na zapisovanie účasti študentov na predmetoch. Aplikácia umožní registrovať študentov, kde každý bude mať meno, priezvisko, pohlavie a dátum narodenia. Každý študent bude jedinečne identifikovateľný umelým číselným identifikátorom. Aplikácia taktiež umožní registrovať predmety. Predmet má názov, ročník štúdia a jedinečný identifikátor a zoznam zapísaných študentov. Aplikácia umožní ukladať prezenčky podľa dátumu a predmetu, kde budeme môct zaškrtávať prítomných študentov. 
  • Hotové riešenie v gite projektu attender – vetva c02
  • Úlohy:
    • 1. Identifikujte vhodné triedy a vytvorte ich v novom Maven Java projekte. Rovno vytvorte aj Git repozitár začiarknutím príslušného políčka.
    • 2. Pre jednu vhodnú triedu A vytvorte „servisnú“ triedu AService, ktorá bude schopná z nejakého interného zoznamu inštancíí triedy A vypočítať nejaký štatistický údaj. Napr. v triede StudentService vypočítajte pomer chlapcov a dievčat, alebo počty ľudí s rovnakými krstnými menami, atď.. Stačí implementovať jeden príklad. Ak máte svoj nápad, kľudne ho konzultujte s cvičiacim.
    • 3. Projekt zverejnite na Github. Môžete využiť funkciu z IntelliJ (Horný panel/Git/Github/Share Project on Github). 
    • 4. Nájdite si spolužiaka (napr. z minulého cvičenia) a spravte z neho kolaborátora na vašom projekte (viď. minulé cvičenie).
    • 5. Vymeňte si projekty: Stiahnite si cez „git clone“ (alebo cez IntelliJ IDEA) spolužiakov projekt.
    • 6. V druhom projekte vytvorte novú vetvu (cez „git checkout -b feature-unit-tests„, alebo cez IntelliJ – tlačítko „New Branch“), ktorú nazvite „feature-unit-tests“.
    • 7. V novej vetve druhého projektu vytvorte unit test/y pre metódu z úlohy 2 a pushnite ich (pre push do ešte na serveri neexistujúcej vetvy cez konzolu napíšte „git push –set-upstream origin feature-unit-tests„, push cez IntelliJ funguje normálne). Testy by mali pokryť aspoň prípady nižšie, pričom ak nájdete chybu v implementácii, tak ju opravte (kľudne opravu konzultujte s kolegom):
      • Prázdny vstup
      • Null vstup
      • OK vstup („tzv. Happy Path“)
    • 8. V Githube vytvorte v druhom žiadosť o spojenie kódu („pull request“), kde chcete spojiť vetvu „feature-unit-tests“ do hlavnej vetvy.
    • 9. Choďte na Github vlastného projektu a schválte a spojte (mergnite) vytvorený pull request.

3. Cvičenie (6.10.2025, 7.10.2025)

  • JavaFX projekt, FXML, Scene Builder, načítanie CSV súboru
  • Vychádzajte z vetvy c02 gitu projektu attender
  • Hotové riešenie v gite projektu attender – vetva c03
    • Riešenie obsahuje všetky úlohy okrem 8. (tú si urobte sami, ak chcete)
  • Úlohy:
    • 1. Do pom.xml pridajte podporu pre JavaFX ako to bolo ukázané na prednáške.
    • 2. Cez SceneBuilder si vytvorte FXML súbor a Controller triedu. FXML súbor bude okrem kontajnera (AnchorPane) obsahovať komponenty:
      • Label s nejakým textom
      • Button, s nejakým textom, po stlačení zmení text Labela na náhodné číslo (napr. cez Math.random())
    • 3. Stiahnite si 3 súbory s príponou .csv a dajte ich vo vašom projekte do src/resources/[meno.balíčka].
    • 4. Upravte „servisnú“ triedu z minulého cvičenia tak, aby mohla načítať tieto 3 súbory a inicializovať svoj vnútorný zoznam.
      • Napr. StudentService si zo students.csv vytvorí zoznam študentov, kde každý riadok z csv predstavuje jedného študenta.
      • Súbory v priečinku resources vieme otvoriť napr cez VašaService.class.getResourceAsStream(„students.csv“). Výsledok tejto metódy môžete dať do konštruktora triedy Scanner, ktorým môžete čítať súbor riadok po riadku.
    • 5. Tlačidlo z úlohy 2 preprogramujte tak, že po stlačení:
      • Vytvorí inštanciu vašej servisnej triedy.
      • Načíta do nej CSV dáta podľa úlohy 4.
      • Zavolá metódu z vašej servisnej triedy, ktorú ste implementovali v predchádzajúcom cvičení v úlohe 2 (ďalej len servisná metóda).
        • Ak servisná metóda potrebuje parametre, tak ich zatiaľ hardcode-nite.
      • Nastaví zobrazovaný text Labela na výsledok servisnej metódy.
    • 6. Pre fajnšmekrov: Ak vaša servisná metóda potrebuje parametre, tak do FXML pridajte TextField(y) na zadávanie parametrov do servisnej metódy užívateľom. Nech tlačidlo si ich pri stlačení načíta a korektne nimi zavolá servisnú metódu.
    • 7. Pre ozajstných fajnšmekrov:  Namiesto kontajnera AnchorPane v úlohe 2 použite kontajner Grid, kde tlačidlo bude na spodku a roztiahnuté cez celú šírku okna. Label nech bude stále (približne) v strede okna. Ak ste implementovali úlohu 6, tak TextField(y) dajte na spodok nad tlačidlo.
    • 8. Pre elitných fajnšmekrov: Preprogramujte tlačidlo tak, že po stlačení otvorí DirectoryChooser, ktorý umožní vybrať si priečinok. Následne skontroluje, či priečinok obsahuje súbory s pevne danými názvami (students.csv, subjects.csv, attendances.csv). Ak nie, potom aplikácia vypíše chybu (napr. do Labela). Ak tie súbory obsahuje, tak ich použite na inicializáciu dát vašej „servisnej“ triedy a následne zavolajte servisnú metódu.

4. Cvičenie (13.10.2025, 14.10.2025)

  • Otváranie druhého okna, Model, DAO, prispôsobený ListView, ComboBox, CheckBox, skrolovanie, vkladanie závislostí
  • Vychádzajte z vetvy c03 gitu projektu attender
  • Hotové riešenie v gite projektu attender – vetva c04 
  • Úlohy:
    • 1. Prerobte hlavné okno tak, že bude obsahovať
      • tlačidlo na pridanie prezenčky,
      • zoznam všetkých prezenčiek.
    • 2. Implementujte triedy MemoryStudentDao, MemoryAttendanceDao a MemorySubjectDao. Budú poskytovať základné CRUD operácie nad interným zoznamom hodnôt. Implementujte aj inicializáciu pomocou hard-coded CSV súborov, viď. AttendanceService z predchádzajúceho cvičenia.
    • 3. Tlačidlo na pridanie prezenčky otvorí nové modálne okno „New attendance“. Modalita znamená, že počas existencie nového okna bude hlavné okno „zamrznuté“. Nové okno nech má vlastný FXML súbor a príslušný kontrolér. Nech obsahuje:
      • Komponent na výber dátumu.
      • ComboBox na výber zo zoznamu predmetov (Subject). Nech zobrazuje iba názvy predmetov.
      • Zaškrtávací zoznam študentov zapísaných na predmet. Tých, čo v GUI zaškrtneme pridáme do prezenčky.
      • Tlačidlo na uloženie prezenčky do príslušného DAO. Po stlačení tiež zavrie okno.
    • 4. V hlavnom okne upravte zoznam prezenčiek tak, aby:
      • Zobrazoval prezenčky vo formáte „2024-10-08 PAZ1c (4/8 students)“, kde 4 je príklad počtu prítomných študentov a 8 je počet prihlásených študentov.
      • Položky boli usporiadané od posledného dátumu. Toto urobte v DAO tak, aby usporiadanie nemenilo interný zoznam dát.
    • 5. Prerobte kontrolér z úlohy 3. tak, aby používal vlastný Model.

5. Cvičenie (20.10.2025, 21.10.2025)

  • Dvojkliky, editovanie existujúceho záznamu, mazanie, ikony. confirm alert, FileChooser.
  • Vychádzajte z vetvy c04 gitu projektu attender
  • Hotové riešenie v gite projektu attender – vetva c05 
  • Úlohy:
    • 1. Nech dvojklik na existujúcu prezenčku v hlavnom okne otvorí nové okno na editáciu prezenčky. Snažte sa to urobiť bez vytvárania nového kontroléra a FXML súboru. Editovať bude môžno iba zoznam študentov. Nebude teda možné editovať dátum a predmet prezenčky. Odporúčam tieto komponenty v okne zobraziť, no zablokovať ich.
    • 2. Do hlavného okna pridajto tlačidlo na zmazanie vybranej prezenčky.
    • 3. Nech tlačidlo na mazanie najprv zobrazí varovanie a až po potvrdení nech zmaže prezenčku.
    • 4. Do tlačidla na mazanie pridajte ikonu smetného koša. Napríklad môžete použiť túto kolekciu ikon.
    • 5. Implementujte návrhový vzor Továreň a refaktorujte všetky miesta, kde sa vytvára DAO za použitia továrne.
    • 6. Do hlavného okna pridajte tlačidlo, ktoré po stlačení otvorí DirectoryChooser. Ten umožní vybrať si priečinok. Ak užívateľ stlačí na OK, tak nech DirectoryChooser skontroluje, či priečinok obsahuje súbory s pevne danými názvami (students.csv, subjects.csv, attendances.csv). Ak nie, potom aplikácia vypíše chybu v podobe Alert-u. Ináč nerobte nič.
    • 7. V prípade, že DirectoryChooser pri stlačení tlačidla OK obsahuje príslušné csv, tak ich použite na inicializáciu dát DAO tried.
      • Refaktorujte metódy „fromResource“, aby neboli statické a aby namiesto hardcodených súborov si ich zobrali z parametra. (Rada: Je OK, ak jedno DAO použije aj iné DAO)
      • Po načítaní nech vypíše počet vložených riadkov v alerte.
      • Dajte pozor, aby ste nepridávali duplicitné položky.
    • 8. Pre fajnšmekrov: Vylepšite logiku načítavania CSV.
      •  Pridajte validáciu na názvy stĺpcov aby sedeli s tým, čo je v príslušnej entitnej triede.
      •  Urobte načítavanie CSV tak, aby fungovalo aj keď poradie „stĺpcov“ v súbore bude iné.

6. Cvičenie (27.10.2025, 28.10.2025)

  • Vytvorenie databázy
  • Vychádzajte z vetvy c05 gitu projektu attender
  • Hotové riešenie v gite projektu attender – vetva c06 
  • Úlohy:
    • 1. Navrhnite relačnú databázu pre projekt Attender ako ER diagram.
    • 2. Namodelujte databázu v MySQL Workbench, pomocou komponentu na EER.
    • 3. Exportujte model ako SQL skript a uložte ho do init.sql v koreňovom priečinku projektu.
    • 5. Vytvorte docker-compose.yml, ktorý spustí MySQL a pri prvotnom spustení si spustí príkazy v súbore init.sql.

7. Cvičenie (3.11.2025, 4.11.2025)

  • Rozšírenie Factory, Mysql***Dao, časť 1
  • Vychádzajte z vetvy c06 gitu projektu attender
  • Hotové riešenie v gite projektu attender – vetva c07 
  • Úlohy:
    • 1. Vytvorte triedu MysqlStudentDao, ktorá implementuje rozhranie StudentDao.
    • 2. Vytvorte triedy MysqlSubjectDao, ktorá implementuje rozhranie SubjectDao.

8. Cvičenie (10.11.2025, 11.11.2025)

  • Rozšírenie Factory, Mysql***Dao, časť 2
  • Vychádzajte z vetvy c07 gitu projektu attender
  • Hotové riešenie v gite projektu attender – vetva c08 
  • Úlohy:
    • 1. Vytvorte triedu MysqlAttendanceDao, ktorá implementuje rozhranie AttendanceDao.
    • 2. Upravte triedu Factory, aby vytvárala nové implementácie Dao.
    • 3. Implementujte automatické testy nových Dao tried pomocou knižnice TestContainers.

17.11.2025 a 18.11.2025 nebude cvičenie

  • Cvičenie nebude ani v pondelok (sviatok) ani v utorok

9. Cvičenie (24.11.2025, 25.11.2025)

  • Prihlasovanie
  • Vychádzajte z vetvy c08 gitu projektu attender
  • Hotové riešenie v gite projektu attender – vetva c09
  • Úlohy:
    • 1. Refaktorujte entitu student na entitu user.
      • Pozor na tabuľku
      • User bude mať nový atribút role, ktorý bude mať hodnoty student, teacher.
      • User bude mať nový atribút password typu varchar(60).
      • User bude mať nový atribút email typu varchar(60).
    • 2. Pridajte  do databázy nejakého učiteľa, heslo uložte ako BCrypt hash.
      • Môžete si vytvoriť nový Main, ktorý vytvorí admin používateľa s id -1 a náhodným heslom (napr. UUID.randomUUID.toString()), ktoré vypíše do konzoly. Pozor, to náhodné heslo stále do DB zahešujte. Alebo si môže prihlasovacie meno a heslo vypýtať.
    • 3. Implementujte okienko, ktoré sa umožní prihlásiť učiteľovi na základe emailu a hesla.
      • Prihlasovacie okienko sa spustí spolu s hlavným okienkom, ktoré bude zablokované, kým sa užívateľ príhlási.
      • Vhodne riešte aj zadanie nesprávnych údajov.
    • 4. Pre fajnšmekrov: Implementujte podporu stránkovania pre zoznam prezenčiek v hlavnom okne.
      • Pod zoznamom bude text field, ktorý udáva počet zobrazených prezenčiek. Predvolená hodnota bude 5.
      • Ďalej tam bude label ktorý udáva aktuálnu stránku a počet celkových stránok.
      • Počet celkových stránok pocetVsetkychPrezenciek / pocetZobrazenychPrezenciek. Pozor na zvyšok po delení.
      • Dve tlačidlá na dekrementovanie a inkrementovanie stránok.
      • Zmena počtu zobrazených prezenčiek nastaví prvú stránku s novým počtom.
      • Stránkovanie implementujte v DAO cez SQL.

10. Cvičenie (1.12.2025, 2.12.2025)

  • REST server
  • Vychádzajte z vetvy c09 gitu projektu attender
  • Hotové riešenie v gite projektu attender – vetva c10 
  • Úlohy:
    • 1. Doplňte do pom.xml závislosti pre spring-boot-starter-parent a spring-boot-starter-web.
    • 2. Implementujte REST kotroléry pre všetky DAO triedy.
      • Pozor, aby ste vracali HTTP status 201 v prípade POST požiadaviek.
    • 3. Implementujte mechanizmus na vhodné mapovanie výnimiek na HTTP statusy.

11. Cvičenie (8.12.2025, 9.12.2025)

  • React Web klient
  • Vychádzajte z vetvy c10 gitu projektu attender
  • Hotové riešenie v gite projektu attender – vetva c11 
  • Úlohy:
    • 1. Vytvorte projekt webovej aplikácie v Reacte cez nástroj Vite, ktorá bude používať Typescript.
      • Aplikáciu pomenujte attender-web.
    • 2. Doplňte závislosť na Material UI a React Router Dom/Tanstack Router.
    • 3. Implementujte hlavnú funkcionalitu z JavaFX projektu.
      • Hlavná stránka zobrazí zoznam prezenčiek, ktorý bude obsahovať dátum prezenčky, názov predmetu. počet prítomných študentov a počet zapísaných študentov na predmete.
      • Každý riadok bude obsahovať tlačidlo na editovanie a mazanie prezenčky.
      • Nad zoznamom prezenčiek bude tlačitlo na pridanie novej prezenčky.
      • Editovanie a pridávanie prezenčiek riešte na novej stránke. Použite knižnicu React Router Dom, alebo Tanstack Router.
      • Ako „perzistentnú“ vrstvu (DAO) použite volania na REST server z predchádzajúceho cvičenia.