Warning
This page is located in archive.

Rozvrh na FEL Odevzdávací systém 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 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 plagiátů! Pro vypracování semestrální úlohy a úkolů lze použít open-source knihovny jako jsou:

Knihovna však nesmí řešit úlohu jako celek.

Podmínky odevzdávání

Úlohy odevzdávejte do odevzdávacího systému BRUTE. Úlohy se nyní odevzdávají emailem na sivakfil@fel.cvut.cz v příloze v archivu zip.

Očekávám archiv se strukturou:

└───src
    ├───main
    └───test
└───pom.xml  
  1. 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)
  2. Všechny odevzdané úlohy musí být Maven project
  3. Kód a komentáře pište anglicky
  4. Neodevzdávejte soubory a složky nesouvisející s projektem
    1. Neodevzdávejte soubory generované IDE (př.: “.idea”)
    2. Neodevzdávejte zkompilované knihovny (tj složku “target”)

Kritéria hodnocení

  1. Kód dodržuje Google Java Style Guide
  2. Kód správně řeší zadanou úlohu (kód dělá to co má)
  3. Kód dodržuje principy správného návrhu (viz 2. cvičení)
    1. kód využívá návrhové vzory (GoF,Fowler)
  4. Počet odevzdání, dotazy a konzultace nemají negativní vliv na hodnocení
  5. Úlohu odevzdanou po deadlinu je možné uznat pro získání zápočtu, nedostanete však body

Doporučení:

1. Týden

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.

2. Týden - Návrhové vzory

Prezentace ze cvičení

  • Demonstrace 1 - Stack<E> extends Vector<E>
  • Demonstrace 2 - Dependency injection (stáhněte si prosím: 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 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)
    • 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: maven project k cvičení 3

Řešení 1) 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):

  • 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: 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):

Minitask (řešte Task2) řešení

5. Týden

Stáhněte si prosím: 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.

  1. Demos
    1. Optional
    2. Try.of
    3. Try with resource the functional way
  2. Tasks
    1. User to address (java.util.Optional) řešení na pastebin
    2. Date parsing using Joda time (javaslang.control.Try) řešení na pastebin
    3. Strategy pattern using higher-order function řešení na pastebin
  3. Homework 5
    1. Deadline 4.4. 2017
    2. Parsujte soubor “data.txt”, cílem je vytvořit CSV se sloupci (telefon, datum)
      1. 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ší
      2. Vaším úkolem je zpracovat data tak, aby se dále dali jednodše analyzovat
      3. Telefonní čísla jsou náhodně generovaná, nevolejte na ně
      4. K parsování telefonního čísla můžete použít regulární výraz
      5. K parsování data použijte Joda time knihovnu
    3. Použijte funkcionální / reaktivní programování a funkci takeWhile
      1. Java stream nemá takeWhile funkci! Musíte použít RxJava nebo javaslang Stream
    4. Filtrujte špatně formátovaná data
    5. Pozor! Datum je ve dvou formátech!
      1. EEE, MM. dd. YYYY hh:mm:ss Z
      2. MM. dd. YY hh:mm
      3. 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

  1. Odevzdávejte prosím na BRUTE

Aktualizace 3. 4. 2017

  1. Preferuji krátké čitelné řešení, před komplikovaným
  2. 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()
  3. Může vám přijít zajímavý operátor buffer
  4. Někdo z vás použil na parsování telefonního čísla knihovnu libphonenumber od Google (řešení uznávám, Vaší kreativitě se nebráním)

6. Týden - Reaktivní programování 2

řada 1 řada 2 celá třída

  • Domácí úkol 6
    • Deadline úterý 11. 4. 2017 23:59
    • Vytvořte reaktivní cache podle článku Loading data from multiple sources with rxjava pomocí operátoru concat
    • K vytvoření cache použijte nějakou konkurentní hash mapu, třeba ConcurrentHashMap
      • Pamatujte na Liskov subs. principle, vytvořte třídu, která používá mapu, ne extenduje
      • Cache musí používat 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 BRUTE
    • Aktualizace 1. 4. 2017 (není apríl):
    • 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 na příklad.
    • Aktualizace 11. 4. 2017
    • Aktualizace 25. 4. 2017
      • Příklad časté chyby (načítání dat mimo observable) a její snadné opravy

7. Týden

Cvi 7

  • 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
        • 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 kontrolu kvality kódu
    • Aktualizace 9.5. 2017

8. Týden

  • diagram k reaktivní cache
  • cvičení na reflexe
    • stáhněte si jar: 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<Vault11>
        • 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
        • 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 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 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)
      • 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
    • Troubleshooting
      • Pro testování doporučuji použít příkaz “telnet host port”, př.: “telnet localhost 8080”
      • 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 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 Selection key je “acceptable”, pak je možné na registrovaném kanálu akceptovat klienta. SelectionKey.channel() tedy nevrací kanál náležící klientovi, ale 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 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 lombok.jar
      • Na Windows 7+ stažený lombok.jar 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 Project lombok -> download
      • Idea i NetBeans jsou podporovány
  • Stáhněte si maven projekt: cvi12.zip
  • Program cvičení
    • spring framework 5 (reactive spring)
      • reaktivní REST controller
    • Apache lombok
    • konzultace

13. Týden

  • HW8
      • 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

Zajímavé přednášky

Nepovinný rozšiřující materiál, který nebude testován u zkoušky

Backlog

Technologie, které by bylo dobré zmínit, ale za tím na ně nevyšel čas:

courses/a4b77ass/cviceni.txt · Last modified: 2017/05/16 15:46 by sivakfil