Cvičenia sa konajú sa každý týždeň v utorky 09:50 – 12:05 v SA1C03 (uprostred je 10 min prestávka).
Odporúčam používať vlastné laptopy. Počas semestra budeme potrebovať tieto programy:
- Git
- JDK 21
- IntelliJ IDEA Ultimate, free licenciu si zaregistrujte cez univerzitný email/ISIC
- NodeJS v20.x.x, POZOR nie poslednú (napr. nie v22.x.x)
- JavaFX Scene Builder
- Docker Desktop
- MySQL Workbench, tí čo máte aj predmet DBS1a si však radšej nainštalujte celý MySQL
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 story“ 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.
Zdrojové kódy z cvičení nájdete na fakultnom Gitlabe.
1. Cvičenie (17.9.2024)
- 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. Majiteľ projektu pridá svojho kolegu ako kolaborátora.
- 4. Naklonujte si projekt do vášho počítača – buď cez
, alebo cez IntelliJ IDEAgit clone
- 5. Lokálne vytvorte súbor
a dajte tam prezývku/login a email jedného člena.autori.md
- 6. Zmeny kommitnite a pushnite na Github
- 7. Druhý člen tímu si pullne zmeny, zapíše sa tiež do
a kommitne+pushne.autori.md
- 8. Obaja členovia spravia pull a vo svojich lokálnych projektov zmenia svoje riadky. Napr. tam pridajte kde študujete.
- 9. Obaja členovia po sebe spravia kommit a push. Ten, čo urobí push neskôr dostane chybovú hlášku o konflikte.
- 10. Skúste spoločne nájst ako vyriešiť 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.)
2. Cvičenie (24.9.2024)
- 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.
- Úlohy:
- 1. Identifikujte vhodné triedy a vytvorte ich v novom Maven Java projekte. Odporúčam rovno vytvoriť 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 interného zoznamu inštancíí vypočítať nejaký štatistický údaj. Napr. vypočítajte pomer chlapcov a dievčat, alebo počty ľudí s rovnakým krstným menom, 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 (Git/Github/Share Project on Github). Ak to nevidíte, tak vytvorte Git repozitár (dá sa viacero spôsobmi), ak ste to neurobili už rovno pri vytváraní projektu.
- 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 (1.10.2024)
- 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 „akože“ 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 (8.10.2024)
- 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)“.
- 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.
- 1. Prerobte hlavné okno tak, že bude obsahovať
5. Cvičenie (15.10.2024)
- 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ých tried a FXML súborov. 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 (22.10.2024)
- 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 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.
Predstavenie DB návrhov projektov (29.10.2024)
7. Cvičenie (5.11.2024)
- Rozšírenie Factory, Mysql***Dao, časť 1
- Vychádzajte z vetvy c06 gitu projektu attender
- Hotové riešenie v gite projektu attender – vetva c07
- Vetva obsahuje aj riešenie následujúceho cvičenia
- Úlohy:
- 1. Vytvorte triedu MysqlStudentDao, ktorá implementuje rozhranie StudentDao.
- 2. Vytvorte triedy MysqlSubjectDao, ktorá implementuje rozhranie SubjectDao.
8. Cvičenie (12.11.2024)
- Cvičenie sa zrušilo
9. Cvičenie (19.11.2024)
- Rozšírenie Factory, Mysql***Dao, časť 2
- Hotové riešenie v gite projektu attender – vetva c07
- Ú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.
10. Cvičenie (26.11.2024)
- Prihlasovanie
- Ú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 ručne do databázy nejakého učiteľa, heslo uložte ako BCrypt hash.
- 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.
- 1. Refaktorujte entitu student na entitu user.
11. Cvičenie (2.12.2024)
- REST server
- Úlohy:
- 1. Doplňte do pom.xml závislosti pre spring-boot-starter-pareny 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.
12. Cvičenie (9.12.2024)
- React Web klient
- Ú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.
- 1. Vytvorte projekt webovej aplikácie v Reacte cez nástroj Vite, ktorá bude používať Typescript.