[[https://www.fel.cvut.cz/cz/education/rozvrhy-ng.B162/public/cz/predmety/12/58/p12583304.html|Rozvrh na FEL]] [[https://cw.felk.cvut.cz/upload/|Odevzdávací systém]] [[https://www.fel.cvut.cz/cz/education/rozvrhy-ng.B162/public/cz/paralelky/P12/58/par12583304.1.html|Posluchači ASS]] --------------- ====== Cvičení ====== Vede Filip Sivák ([[mailto:sivakfil@fel.cvut.cz]]) ===== Týdenní přehled ===== ^ Týden ^ Datum ^ Poznámka ^ | 5 | 21. 3. | | | 6 | 28.3. | | | 7 | 4.4 | | | 8 | 11.4. | | | 9 | 18.4. | | | 10 | 25.4. | | | 11 | 2.5. | Výuka jako v pondělí! | | 12 | 9.5. | | | 13 | 16.5. | | | 14 | 23.5. | Cvičení odpadá! | ===== Zpětná vazba ===== Pište anonymně kdykoliv v průběhu semestru do [[http://bit.ly/A4B77ASS_feedback|google formuláře]]. ===== Podmínky zápočtu ===== * Účast na cvičení * Odevzdané domácí úkoly splňující podmínky odevzdávání * Odevzdaná semestrální úloha splňující podmínky odevzdávání * Zisk alespoň 50% z bodů získatelných na cvičení, získaných dle kritérií hodnocení Kromě účasti na cvičení je nutno odevzdat v termínu domácí úkoly a semestrální úlohu, která bude zadána v druhé polovině semestru. Bezdůvodně lze vynechat nejvýše 2 cvičení. Před vznikem třetí absence pište email cvičícímu. Úlohy je nutno vypracovat samostatně a vyvarovat se [[https://cw.fel.cvut.cz/wiki/help/common/plagiaty_opisovani|plagiátů]]! Pro vypracování semestrální úlohy a úkolů lze použít open-source knihovny jako jsou: * [[http://netty.io/|Netty]] * [[http://hc.apache.org/httpclient-3.x/|httpclient]] * [[http://juel.sourceforge.net/|JUEL]] * [[http://commons.apache.org/|Commons ReflectionUtil, BeanUtils]] * apod. Knihovna však nesmí řešit úlohu jako celek. ===== Podmínky odevzdávání ===== Úlohy odevzdávejte do odevzdávacího systému [[https://cw.felk.cvut.cz/brute/|BRUTE]]. Úlohy se nyní odevzdávají emailem na [[mailto:sivakfil@fel.cvut.cz|sivakfil@fel.cvut.cz]] v příloze v archivu zip. Očekávám archiv se strukturou: └───src ├───main └───test └───pom.xml - Pro každou úlohu je nutné mít testy v TestNG nebo JUnit (není vyžadováno 100% pokrytí, testujte to, co je rozumné testovat) - Všechny odevzdané úlohy musí být Maven project - Kód a komentáře pište anglicky - Neodevzdávejte soubory a složky nesouvisející s projektem - Neodevzdávejte soubory generované IDE (př.: ".idea") - Neodevzdávejte zkompilované knihovny (tj složku "target") ===== Kritéria hodnocení ===== - Kód dodržuje [[https://google.github.io/styleguide/javaguide.html|Google Java Style Guide]] - Kód správně řeší zadanou úlohu (kód dělá to co má) - Kód dodržuje principy správného návrhu (viz 2. cvičení) - [[https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)|DRY, KISS, YAGNI, SOLID]] - kód využívá návrhové vzory ([[https://en.wikipedia.org/wiki/Design_Patterns|GoF]],[[https://www.martinfowler.com/eaaCatalog/|Fowler]]) - Počet odevzdání, dotazy a konzultace nemají negativní vliv na hodnocení - Úlohu odevzdanou po deadlinu je možné uznat pro získání zápočtu, nedostanete však body Doporučení: * používejte [[http://www.sonarlint.org/|Sonar lint]] ===== 1. Týden ===== [[https://drive.google.com/open?id=0B8dhdNa7zcCNZndMd29wSUZmdlE|Prezentace z prvního týdne se zadáním úkolu [pdf]]] Deadline pro první úkol: Úterý 7. 3. 2017 23:59 **FAQ k úkolu:** * V zadání je append popsána jako metoda, která připojí prvek na začátek seznamu a prepend jako metoda, která připojí prvek na konec seznamu, což je obráceně. Za chybu se omlouvám a budu uznávat obě verze. * Java 7: metodu remove v iterátoru nemusíte implementovat (vyhoďte UnsupportedOperationException, nebo podobnou) * metoda count počítá počet prvků v poskytnuté kolekci, nikoliv ve vašem listu (je to pouze umělé cvičení na generic wildcards) * v iterátoru neimplementujte forEachRemaining, má defaultní implementaci == Nepovinná doporučená četba == Každý týden doporučím zajímavou doporučenou "četbu", nejčastěji formou youtube přednášky, která si myslím, že stojí za to. * [[https://www.youtube.com/watch?v=V1vQf4qyMXg|YouTube: Effective Java - Still Effective After All These Years [1 hodina 13 minut] ]] * Případně v knižní podobě: [[https://vufind.techlib.cz/Record/000652500|BLOCH, Joshua. Effective Java. 2nd ed. Upper Saddle River: Prentice Hall, c2008. ISBN 978-0-321-35668-0.]] ===== 2. Týden - Návrhové vzory ===== [[https://drive.google.com/open?id=0B8dhdNa7zcCNM0ZhMFlPd0Vqbm8|Prezentace ze cvičení]] * Design principles * Software never written, always rewritten [[https://vufind.techlib.cz/Record/000648575|HUNT, Andrew a David THOMAS. Programátor pragmatik: jak se stát lepším programátorem a vytvářet kvalitní software. Brno: Computer Press, 2007. ISBN 978-80-251-1660-9.]] * Tracer bullets * Prototypes * Soft.eng psychology * Let go of ego * Be unemotional * Conduct code review * Flexibility breeds complexity * KISS * YAGNI * DRY (dont repeat effort!) * On long methods * SOLID * Design patterns * Inversion of control [[https://martinfowler.com/articles/injection.html|recommended - Martin Fowler: Inversion of Control Containers and the Dependency Injection pattern]] * GoF - [[https://github.com/kamranahmedse/design-patterns-for-humans|recommended - Kamran Ahmed: Design patterns for humans (Github)]] * Fowler * MVC, MVP, MVVM [[https://nirajrules.wordpress.com/2009/07/18/mvc-vs-mvp-vs-mvvm/|Niraj Bhatt: MVC vs. MVP vs. MVVM]] * bidirectional binding * Demonstrace 1 - Stack extends Vector * Demonstrace 2 - Dependency injection (stáhněte si prosím: [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/dependencyinjection.zip|dependencyinjection.zip]]) == Domácí úkol 2 - Refactoring špatného kódu na MVP == Deadline: Úterý 14. 3. 23:59 Úterý 21. 3. 23:59 * Stáhněte si prosím maven projekt [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/hw2.zip|hw2.zip]] * Změňte package a grouid v maven projektu na "ass.yourusername" * Najděte chyby porušující design principles zmíněné na cvičení a opravte je * Tight coupling * Liskov principle * ... * Refaktorujte aplikaci do MVP * View bude implementovat interface * metody jako "setMessages", "getNewMessageText", ... * Vytvořte Presenter, který přistupuje k View prostřednictvím interface a ukládá data do repositáře * View nemá žádnou závislost na Modelu (repositáři) * Presenter si u repositáře zaregistruje notifikace, repositář na každou změnu upozorní zaregistrované Presentery (push notifikace) * Můžete použít [[https://docs.oracle.com/javase/8/docs/api/java/util/Observable.html|Observerable]] * Nebo si vytvořit generický [[http://stackoverflow.com/a/13362639|Observerable interface]] * Vzhled aplikace neměňte * Použijte Dependency Injection (ze cvičení, vlastní nebo knihovnu - třeba Google guice), Service locator nebo Factory Aktualizace 5.3. 2017 * Napište alespoň jeden test, ve kterém testujete Presenter. Vyzkoušíte si tak výhodu schování implementačních detailů View za interface. View mockujte jednoduchou implementací Vašeho view interface * View interface nesmí mít závislost na swing komponentách Aktualizace 14.3. 2017 * Za použití DI kontejneru, jako Google guice (případně Spring DI) bude +50% bonusových bodů (celkem tedy můžete získat 150%!). ===== 3. Týden - Multithreading a reaktivní programování ===== Stáhněte si: [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/cviceni3.zip|maven project k cvičení 3]] Řešení 1) [[http://pastebin.com/sKPitPFX|na pastebin]] Osnova cvičení: * Runnable * Callable * Future * Executor * Kolik threadů je potřeba? * Reaktivní programování Domácí úkol HW3 (deadline 21. 3. 23:59): * Stáhněte si [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/cviceni3.zip|maven project k cvičení 3]] * Přejmenujte package (změňte sivakfil na svůj username!) * Implementujte ExecutorTrader, který je implementací IStockTrader a prochází všemi testy v TraderTest * ExecutorTrader využívá ExecutorService * Implementujte ReactiveTrader, který využívá RxJava, je implementací IStockTrader a prochází všemi testy v TraderTest (nápověda: [[http://pastebin.com/fH63RHD6|na pastebin]]) ===== 4. Týden ===== Konzultační cvičení k úlohám. Domácí úkol za 4. týden nebyl zadán, studenti měli za úkol dokončit úkoly, které mají rozpracované. == Dobrovolné cvičení (zadáno pouze na 2. cvičení, kde zbyl čas): == [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/cvi4_minitask.zip|Minitask]] (řešte Task2) [[http://pastebin.com/5cSmhF8V|řešení]] ===== 5. Týden ===== Stáhněte si prosím: [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/cvi5.zip|cvi5]] Dema, jsou řešení příklady předvedené na cvičení, neodevzdáváte je. Tasky, jsou příklady, které řešíte na cvičení, neodevzdáváte je. Pro své obohacení je však vypracujte. Homework je domácí práce, kterou odevzdáváte. - Demos - Optional - Try.of - [[https://regex101.com/|https://regex101.com/]] - Try with resource the functional way - Tasks - User to address (java.util.Optional) [[http://pastebin.com/Jf6T6d6E|řešení na pastebin]] - Date parsing using Joda time (javaslang.control.Try) [[http://pastebin.com/YaufEsF3|řešení na pastebin]] - Strategy pattern using higher-order function [[http://pastebin.com/y6mQq0GH|řešení na pastebin]] - Homework 5 - Deadline 4.4. 2017 - Parsujte soubor "data.txt", cílem je vytvořit CSV se sloupci (telefon, datum) - Soubor obsahuje data o uživatelích. Záznamy jsou přes několik řádků, počet řádků se u každého uživatele liší - Vaším úkolem je zpracovat data tak, aby se dále dali jednodše analyzovat - Telefonní čísla jsou náhodně generovaná, nevolejte na ně - K parsování telefonního čísla můžete použít regulární výraz - K parsování data použijte Joda time knihovnu - Použijte funkcionální / reaktivní programování a funkci takeWhile - Java stream nemá takeWhile funkci! Musíte použít RxJava nebo javaslang Stream - Filtrujte špatně formátovaná data - Pozor! Datum je ve dvou formátech! - EEE, MM. dd. YYYY hh:mm:ss Z - MM. dd. YY hh:mm - Nápověda jak parsovat datum: DateTimeFormatter format = DateTimeFormat.forPattern(DATE_TIME_PATTERN).withLocale(Locale.US); format.parseDateTime("Nejaky string s datumem") Aktualizace 28. 3. 2017 - Nápověda, jak rozdělit soubor po tokenech - [[https://github.com/davidmoten/rxjava-extras#transformerstolistwhile|rxjava-extras Transformers.toListWhile]] - knihovna je [[https://mvnrepository.com/artifact/com.github.davidmoten/rxjava-extras|dostupná na Maven central repositáři]] - podívejte se, [[https://github.com/davidmoten/rxjava-extras/blob/b6bae6aa6a9b5e15b2a7417cade2ff2ba07a1307/src/main/java/com/github/davidmoten/rx/Transformers.java|jak je operátor implementován]] - Odevzdávejte prosím na [[https://cw.felk.cvut.cz/brute/|BRUTE]] Aktualizace 3. 4. 2017 - Preferuji krátké čitelné řešení, před komplikovaným - Preferuji řešení, které nenačítá vstupní soubor celý do RAM, snažte se tedy zpracovávat ve streamu a nepoužívat konstrukty jako toList().blockingGet() - Může vám přijít zajímavý operátor [[http://reactivex.io/documentation/operators/buffer.html|buffer]] - Někdo z vás použil na parsování telefonního čísla knihovnu [[https://github.com/googlei18n/libphonenumber|libphonenumber od Google]] (řešení uznávám, Vaší kreativitě se nebráním) ===== 6. Týden - Reaktivní programování 2 ===== [[https://docs.google.com/document/d/1NBby8O1GX5YQLMBicquX1YpSvF2FbWs8CbKIwxh4q4s/edit?usp=sharing|řada 1]] [[https://docs.google.com/document/d/1WJ9BH_TueK2IgqnkfxA-EAOiMl2zSEWQXyObyKlBgDA/edit?usp=sharing|řada 2]] [[https://docs.google.com/document/d/1Av7q074B0UapuxqELJdORuVbDUwpCUUn9omdRPL72mE/edit?usp=sharing|celá třída]] * Příklady ze cvičení * [[https://pastebin.com/fz60u88k|Javaslang takeWhile imperative example]] * [[https://pastebin.com/0BqphLkK|Observerable of file lines]] * [[https://pastebin.com/AaLB6WWJ|Soft reference minimal example]] * Reaktivní řízení * [[https://www.youtube.com/watch?v=A-fxij3zM7g|Youtube: Brian Douglas - The Braitenberg Vehicles]] [15 minut, není součástí zkoušky] * Domácí úkol 6 * Deadline úterý 11. 4. 2017 23:59 * Vytvořte reaktivní cache podle článku [[http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/|Loading data from multiple sources with rxjava]] pomocí operátoru **concat** * K vytvoření cache použijte nějakou konkurentní hash mapu, třeba [[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html|ConcurrentHashMap]] * Pamatujte na Liskov subs. principle, vytvořte třídu, která používá mapu, ne extenduje * Cache musí používat [[https://docs.oracle.com/javase/8/docs/api/java/lang/ref/SoftReference.html|Soft reference]]. To znamená, že cache obsahuje soft reference na objekty, které může Garbage collector v případě nutnosti uvolnit z paměti * Odevzdávejte prosím na [[https://cw.felk.cvut.cz/brute/|BRUTE]] * Aktualizace 1. 4. 2017 (není apríl): * Můžete využít [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/hw6-template.zip|template s doporučeným rozhraním a ukázkou testu]] * Aktualizace 6. 4. 2017 * Mezi studenty panuje nedůvěra k operátoru .first(). Často máte dojem, že dělá něco jiného, než potřebujete. Podívejte se prosím [[https://pastebin.com/KXNtjpQc|na příklad]]. * Aktualizace 11. 4. 2017 * Podívejte se na [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/rx-cache.pdf|diagram]] * Aktualizace 25. 4. 2017 * [[https://pastebin.com/PWbM1trM|Příklad]] časté chyby (načítání dat mimo observable) a její snadné opravy ===== 7. Týden ===== [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/cvi7.zip|Cvi 7]] * Doporučené rozšiřující čtení * Facebook BigPipe [[https://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919/|BigPipe: Pipelining web pages for high performance]] * motivace: čím méně requestů na webserver přijde, tím více jich zpracuje * Domácí úkol 7 [deadline úterý 18. 4. 2017 23:59] * Vytvořte modul přístupu k souborům pro Váš webserver: * vstup: žádost o soubor (IRequest) * výstup: odpověď se souborem (IResponse) * využívá cache z úkolu 6 * je možné mu nakonfigurovat document root, tj. cesta ke složce, ze které webserver servíruje statické soubory * filtruje nežádoucí žádosti o soubory * př.: "/../../soubor.txt" * př.: "C:\windows\system32\..." * implementujte HTTP BASIC autentizaci * řiďte se: [[https://cw.fel.cvut.cz/wiki/courses/a4b77ass/semestralka#autentifikace]] * v případě, kdy ve složce existuje soubor ".htaccess" obsahující username:heslo, nevrátí soubor, pokud není v requestu správný username a heslo (rozhraní IRequest si upravte jak potřebujete) * pokud přihlašovací údaje neexistují či nejsou správné, vracejte odpovídající response * přidejte si do projektu findbugs konfiguraci * nezapomeňte na smysluplné unit testy * Přidejte do svého projektu [[https://cw.fel.cvut.cz/wiki/courses/a4b77ass/semestralka#kontrola_kvality_kodu|kontrolu kvality kódu]] * Aktualizace 9.5. 2017 * Příklad na [[https://pastebin.com/Fcdmr2si|hashování hesla]] [pastebin] ===== 8. Týden ===== * [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/rx-cache.pdf|diagram]] k reaktivní cache * cvičení na reflexe * stáhněte si jar: [[https://drive.google.com/file/d/0B8dhdNa7zcCNRUoyOE02MVIxeGM/view?usp=sharing|vault.jar]] * V jaru je třída vault.Vault11, která na sobě má: * protected static final String password = "..."; * private final String password2(String inputPassword) * Cílem je zjistit, co za tajemství vrací metoda password2 * Řešit můžete dvěma způsoby * Reflexe (lehký) * Založte nový projekt, nebo použijte nějaký stávající * Projektu nastavte jako external jar dependency stažený vault.jar * Získejte instanci třídy Vaultu: Class * Pomocí reflexe získejte hodnotu filedu password * Pomocí reflexe instanciujte Vault11 a zavolejte na něm password2, do kterého vložíte dekódovaný password1 (password1 je nějak zakódovaný, zjistěte jak a rozkódujte ho) * Dekompilace (těžký) * dekompilujte jar a prozkoumejte zdrojový kód * můžete použít třeba [[http://jd.benow.ca/|http://jd.benow.ca/]] * zjistěte, jak je tajemství v password2 uchováno a prolomte ho brute force útokem (relevantní kus dekompilovaného kódu si zkopírujte do nějakého projektu) * cvičení na reflexe 2 (generování formulářů podle třídy) * Stáhněte si prosím [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/cvi8.zip|projekt]] * Doplňte chybějící kód v ass.excercises.cvi8.formbuilder.task.ReflectionFormBuilder (nikde jinde doplňovat nemusíte) * Spusťte a vyzkoušejte ass.excercises.cvi8.formbuilder.task.SwingAppExample * Po kliknutí na "Save" se na stdout vypíše obsah vyplněného formuláře * Spusťte a vyzkoušejte ass.excercises.cvi8.formbuilder.task.HttpServerAppExample * Po odeslání formuláře se má vrátit JSON s obsahem formuláře * Doporučuji se podívat, na zbytek kódu aplikace ===== 9. Týden ===== * Předzápis 17. 4. - 28. 4. 2017 ===== 10. Týden ===== * Předzápis 17. 4. - 28. 4. 2017 * Stáhněte si prosím [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/cvi10.zip|projekt pro cvičení]] (neslouží jako šablona na HW8) * Náplň cvičení: kreslící chat aplikace s využitím REDIS Pub/Sub * RxJava subject * WebSocket jako alternativa k HTTP * HW8 - Server socket (bude upřesněno) (Deadline: 9. 5. 2017) * [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/hw8-template.zip|Šablona pro úkol]] * Výrazně usnadňuje řešení úkolu, doporučuji použít * Používat nemusíte, musíte však využít RxJava a nonblocking IO * Doplňte chybějící kód podle TODO komentářů v souborech: * Main * RequestHandler * ResponseWriter * Server * Cílem je napsat jednoduchý nonblocking server, který přijme request ve formě řádky textu a odešle response ve formě řádky textu, kde jsou malá písmena změněna na velká a velká na malá, která je uppercase pro vstup sudé délky a lowercase pro vstup liché délky * Server bude mít tři komponenty (tři hlavní komponenty samozřejmě můžete dále dekomponovat!): * Server socket channel * Request handler * Response writer * Stejně jako semestrální práce, aplikace bude spustitelná z příkazové řádky a to s parametrem PORT. * příklad: "java -jar hw8.jar 8080" * doporučená literatura * YouTube: [[https://www.youtube.com/watch?v=uKc0Gx_lPsg|Istanbul tech talks: ITT 2015 - Heinz Kabutz - The Multi-threading, Non Blocking IO]] [1h 8min] * [[http://tutorials.jenkov.com/java-nio/non-blocking-server.html|Java NIO: Non-blocking Server]] - tutoriál * Kód z tutoriálu dostupný na [[https://github.com/jjenkov/java-nio-server|https://github.com/jjenkov/java-nio-server]] * Troubleshooting * Pro testování doporučuji použít příkaz "telnet host port", př.: "telnet localhost 8080" * Na windows je nutné [[https://napoveda.seznam.cz/cz/email/overeni-dostupnosti-nastrojem-telnet/jak-zapnout-telnet/|telnet klienta zapnout]] * java.net.BindException: Address already in use: bind - server Vám již jednou na vybraném portu běží, nebo na tomto portu běží jiná aplikace. Řešením je výběr jiného portu. * IllegalBlockingModeException - pravděpodobně jste nezavolali "configureBlocking(false)" * Aktualizace 5. 5. 2017 * Všimněte si, že [[http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/subjects/Subject.html|Subject]] je zároveň Observable, Observer a ObservableSource. Můžete do něj tedy vkládat prvky i po konstrukci a to pomocí metody onNext(). * Pokud [[https://docs.oracle.com/javase/8/docs/api/java/nio/channels/SelectionKey.html|Selection key]] je "acceptable", pak je možné na registrovaném kanálu akceptovat klienta. [[https://docs.oracle.com/javase/8/docs/api/java/nio/channels/SelectionKey.html#channel--|SelectionKey.channel()]] tedy nevrací kanál náležící klientovi, ale [[https://docs.oracle.com/javase/8/docs/api/java/nio/channels/ServerSocketChannel.html|ServerSocketChannel]], na kterém je možné zavolat metodu accept() a tím získat kanál klienta, na kterém je možné registrovat selector pro operace READ a WRITE (doporučuji registrovat pouze READ). Pokud se pro operaci READ či WRITE pokusíte zaregistrovat ServerSocketChannel, dostanete IllegalArgumentException. * Pro vytváření spustitelné maven aplikace doporučuji používat [[https://www.mkyong.com/maven/create-a-fat-jar-file-maven-shade-plugin/|Maven shade plugin]] [tutoriál]. ===== 11. Týden ===== Není cvičení. Výuka probíhá jako v pondělí. ===== 12. Týden ===== * Nainstalujte si Lombok * Eclipse * Stáhněte si [[https://projectlombok.org/download.html|lombok.jar]] * Na Windows 7+ stažený lombok.jar [[https://codingoutloud.files.wordpress.com/2010/02/dreaded-unblock.png|odblokujte]] * Spusťte lombok.jar: java -jar lombok.jar * Vyberte kde máte nainstalován eclipse (klikněte na "Specify location") * Klikněte na "Install/Update" * Restartujte eclipse * Ostatní IDE jsou popsány na stránce [[https://projectlombok.org/download.html|Project lombok -> download]] * Idea i NetBeans jsou podporovány * Stáhněte si maven projekt: [[https://cw.fel.cvut.cz/wiki/_media/courses/a4b77ass/cvi12.zip|cvi12.zip]] * Program cvičení * spring framework 5 (reactive spring) * reaktivní REST controller * Apache lombok * konzultace ===== 13. Týden ===== * HW8 * [[https://pastebin.com/1ZwKtuae|Response writer template]] * namísto něj můžete použít naivní while+hasRemaining kombinaci, nicméně v semestrální úloze nebude efektivní a můžete získat méně bodů z performance testů ===== Doplňující literatura ===== * Funkcionální reaktivní programování * [[https://gist.github.com/staltz/868e7e9bc2a7b8c1f754|The introduction to Reactive Programming you've been missing]] [Text/Video] * popisuje reaktivní programování obecně * [[https://github.com/mutexkid/rxjava-koans|rxjava koans]] [Cvičení v RxJava s připravenými automatickými testy] * netuším, zdali se zaměřuje na rxjava 1.x nebo 2.x * [[https://www.youtube.com/watch?v=QOR69q1e63Y|YouTube: Introducing RxJava into a Spring Boot REST API]] [1 hod 34 minut] * přednáška je pomalá, doporučuji sledovat zrychleně (na youtube zkratka shift+.) * [[http://www.slideshare.net/SpringCentral/practical-rxjava|slidy jsou k dispozici]] * [[https://www.youtube.com/watch?v=QOR69q1e63Y&t=8m15s|Vysvětlování začíná na 8m15s]] * [[https://www.youtube.com/watch?v=QOR69q1e63Y&t=33m54s|Flat map je vysvětlen na 33m54s]] ===== Zajímavé přednášky ===== Nepovinný rozšiřující materiál, který nebude testován u zkoušky * [[https://www.youtube.com/watch?v=LH75sJAR0hc|Why Scala? ...by a hilarious Indian guy]] ===== Backlog ===== Technologie, které by bylo dobré zmínit, ale za tím na ně nevyšel čas: * Alternativy k Maven (gradle, sbt) * Joda time * Scala? * SPRING INITIALIZR - [[https://start.spring.io/|https://start.spring.io/]] * Facebook Flux - moderní reaktivní single-page aplikace * pouze pokud zbude čas (v případě, že nezbude, bude přesunuto na další týden) * doporučuji: [[https://www.youtube.com/watch?v=iwbkgOq1SMQ|YouTube - Jared Anderson: Intro to the Flux Architecture]] [58 minut]