[[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]