Celem zajęć jest zapoznanie z zaawansowanymi technikami programowania w języku Java.
Przebieg zajęć:
Zajęcia odbywają się co tydzień. Przewidują one realizację zadań, na których wykonanie jest jeden lub dwa tygodnie.
Rozpoczynają się one krótkim wprowadzeniem do obecnych zajęć. Następnie studenci prezentują poprzednie zadanie, za które otrzymują ocenę cząstkową.
Można pracować na swoich komputerach.
Wykorzystywane IDE jest również dowolne.
Zasady zaliczenia:
Warunkiem zaliczenia zajęć jest oddanie wszystkich prac i uzyskanie z nich ocen co najmniej 3.0.
Ocena końcowa:
Ocenę końcową stanowi średnia ważona ocen cząstkowych. Zadania o tygodniowym czasie realizacji posiadają wagę 1, dwutygodniowe - 2.
Za każdy tydzień opóźnienia ocena obniżana jest o 0.5 w dół do minimalnego pułapu 3.0.
Materiały ogólne:
Bruce Eckel: Thinking in Java. Edycja polska, Helion.
Cay Horstmann, Gary Cornell: Java 2. Podstawy, Helion.
Cay Horstmann, Gary Cornell: Java 2. Techniki zaawansowane, Helion.
Temat:
Szkolenie stanowiskowe BHP. Sprawy organizacyjne. Uruchomienie środowiska programowania i kompilacja przykładowego programu.
Wymagania:
Do realizacji zadania potrzebna będzie wiedza o środowisku programowania, sposobie kompilacji i uruchamiania aplikacji.
Zadanie:
Napisz program umożliwiający opracowanie wyników testów wyboru (przeprowadzonych np. podczas kolokwium). Opracowanie ma polegać na załadowaniu dwóch plików -
szablonu testu (format dowolny) zawierającego pytania i odpowiedzi, ze wskazaniem na prawidłowe, a także zbioru kart odpowiedzi (proponowany format .csv)
z odpowiedziami udzielonymi przez studentów. Wczytane dane powinny zostać przetworzone, a rezultaty wyświetlone w przystępnej formie.
Aplikacja powinna posiadać własną ikonę, ekran powitalny, dokumentację (javadoc).
Przykładowe statystyki obliczane przez program:
- Histogram wyników (dla każdej karty odpowiedzi weryfikuje się liczbę zdobytych punktów, a następnie robi się histogram tych punktów)
- Liczby przypadków wpadających w zadane przedziały ocen
- Rozkład poprawnych odpowiedzi wg klucza
- i inne
Program powinien być podzielony na dwie części:
- Bibliotekę pomocniczą
- Właściwą aplikację
Biblioteka powinna zapewniać modele danych powiązanych z testami (szablon, karta odpowiedzi) oraz logikę ich przetwarzania (wyliczanie statystyk), aplikacja natomiast obsługę UI i ładowania danych.
Biblioteka powinna być spakowana za pomocą narzędzia jar, a następnie dołączona do aplikacji, która również ma zostać spakowana przy pomocy narzędzia jar.
Zadanie dodatkowe:
- Opracuj ekran ręcznego wprowadzania wyników testu
- Dodaj przykładowe testy jednostkowe (JUnit)
Temat:
Stworzenie aplikacji okienkowej z możliwością zmiany ustawień lokalizacyjnych
Wymagania:
Do realizacji zadania potrzebna będzie wiedza o wsparciu internacjonalizacji w aplikacjach Java oraz budowaniu interfejsów o zwiększonej dostępności
Zadanie:
Napisz program zarządzający listą posiadanych przedmiotów / przedmiotów na magazynie (domowo - długopisy, książki, mąka, cukier itd. albo przemysłowo - silniki, olej, tworzywa sztuczne).
Program powinien pozwalać na dodawanie / usuwanie przedmiotów zdefiniowanych w aplikacji przedmiotów.
Dane powinny być zapamiętywane - przykładowo, w pliku xml na dysku.
Każdy przedmiot powinien być opisany kilkoma atrybutami (nazwa, cena) oraz mieć graficzną reprezentację - np. zdjęcie, stronę tytułową.
Interfejs użytkownika powinien pozwalać na zmianę lokalizacji (wybór języka prezentacji informacji).
Należy skorzystać z pakietów zawierających tłumaczenie etykiet (ang. bundles). W pakietach tych powinny być uwzględnione warianty (warianty są potrzebne do zmiany sposobu wyświetlania etykiety w zależności np. od liczby opisywanych atrybutów: 1 opis, 2 opisy, 5 opisów).
Powinno też być uwzględnione właściwe formatowanie jednostek.
Materiały:
Trail: Internationalization
Temat:
Implementacja wielowątkowej aplikacji o rozszerzalnej funkcjonalności z własnym ładowaczem klas i wykorzystaniem miękkich referencji
Wymagania:
Do realizacji zadania potrzebna będzie wiedza o:
- Zastosowaniu i własnościach miękkich referencji
- Programowaniu współbieżnym i klasach pomocniczych
- Implementacji własnego ładowacza klas
- Mechanizmach refleksji
Zadanie:
Zadaniem jest stworzenie eksploratora plików graficznych - aplikacja ma umożliwiać nawigację pomiędzy katalogami i wyświetlanie miniaturek zawartych w nich plików graficznych (mogą być jednego typu). Aplikacja powinna też umożliwiać
manipulację tymi obrazami - obracanie, robienie negatywu, rozmycie itd.
Słabe referencje powinny być wykorzystane do przechowywania wygenerowanych miniaturek obrazów - w razie potrzeby pamięć ta zostanie zwolniona.
Miniaturki powinny być generowane w osobnym wątku / wątkach - można do tego wykorzystać zarówno podstawowe mechanizmy, jak i klasę SwingWorker, z pomocą klas z pakietu java.util.concurrent (ConcurrentMap itd.)
Wykorzystanie własnego ładowacza klas obejmuje ładowanie "pluginów" do transformacji obrazów - pluginy te powinny być umieszczane w określonym katalogu i wylistowane w stosownym menu w aplikacji.
Przynajmniej jedna z ładowanych klas powinna być zależna od innej ładowanej klasy (Rozwijanie klas (resolve)). Typami atrybutów metod mogą być typy podstawowe i typ String oraz tablice jednowymiarowe typów podstawowych i typu String.
Wywoływane mogą być metody klasy oraz metody instancyjne (w tym drugim przypadku trzeba wywoływać konstruktor tworzący odpowiedni obiekt, aby było łatwiej można przyjąć założenie, że istnieje konstruktor bezargumentowy). Załadowane klasy powinno dać się także wyładować
Materiały:
Różnego rodzaju referencje (Łukasz Dembiński)
Wątki (dr Tomasz Kubik)
SwingWorker (dr Tomasz Kubik)
ClassLoader (JournalDev)
ClassLoader (Oracle Tutorial)
ClassLoader (dr Tomasz Kubik)
Reflection API (dr Tomasz Kubik)
Temat:
Projekt aplikacji rozproszonej o zadanej funkcjonalności z aplikacjami wykorzystującymi ziarna Javy.
Wymagania:
- Wiedza o wzorcach projektowych wykorzystywanych przy tworzeniu ziaren Javy, mechanizmie introspekcji i tworzeniu włączanych do projektów paczek jar z odpowiednim manifestem
- Umiejętność tworzenia aplikacji rozproszonych z wykorzystaniem RMI
Zadanie:
Ogólny opis aplikacji:
Swtórz grę polegającą na zarządzaniu załogą statku kosmicznego (pomysł oparty na grze
Spaceteam).
W grze występują dwie role graczy:
- kapitan - jego rolę może pełnić tylko jedna osoba
- załoga - może (a nawet powinna ;)) pełnić ją więcej niż jedna osoba
Kapitan posiada odrębny, w stosunku do załogi, ekran gry. Na jego panelu wyświetlają się polecenia, które musi wydać załodze (np. ustaw moc silników na 3). Posiada także pole informujące o aktualnej liczbie punktów, a także przyciski pozwalające na rozpoczęcie lub zakończenie gry. Załoga posiada ekran gry reprezentujący panel sterowniczy złożony z przyrządów różnego typu reprezentowanych za pomocą suwaka, listy, radio buttonów, pola tekstowego. Panel posiada swoją nazwę (np. Sterownia silnika), podobnie jak i każdy przyrząd (np. moc silników). Część z przyrządów może być aktywna, a część nie.
Każdy gracz posiada swój indywidualny panel.
Gra polega na głosowym wydawaniu poleceń wyświetlonych na panelu przez kapitana załodze po rozpoczęciu rozgrywki. Polecenia te dotyczą ustawienia wartości konkretnego przyrządu na zadaną wartość. Z racji, że każdy członek załogi powinien posiadać indywidualny zbiór przyrządów, są one skierowane do konkretnego członka załogi.
Za poprawne wykonanie polecenia (ustawienie danego przyrządu na określoną wartość) przyznawany jest jeden punkt, za niepoprawne (zły przyrząd / zła wartość) odejmowany jest jeden.
Po poprawnym lub niepoprawnym wykonaniu polecenia pojawia się nowe do czasu zakończenia gry przez kapitana. Można wprowadzić ograniczenie czasowe na wykonanie polecenia.
Implementacja:
Gra powinna składać się z 3 części:
- Pojedynczej aplikacji dla kapitana
- Pojedynczej aplikacji serwera
- Kilu wariacji aplikacji załogi
Komunikację pomiędzy aplikacjami należy zrealizować za pomocą mechanizmu RMI.
Aplikacja kapitana powinna pobierać listę graczy z serwera, umożliwiać rozpoczęcie i kończenie gry, zbierać informacje o działaniu aplikacji załogi podlicząc punkty, a także generować kolejne (wykonywalne) komendy.
Serwer powinien przyjmować połączenia kolejnych graczy, wyświetlać ich listę i umożliwić wyrzucenie ich z gry ("wykickowanie").
Aplikacje załogi, każda reprezentująca osobny panel, powinny być do siebie podobne - zawierać te same typy przyrządów (niektóre niedostępne - zablokowane), ale odpowiadających za równe funkcje, o różnych możliwych wartościach. Dobrym pomysłem byłaby realizacja ogólnej reprezentacji panelu, którą możnaby w zależności od aplikacji, dowolnie dostosowywać. Można to zrealizować przy pomocy zaimplementowanego jednorazowo komponentu Java Beans. Komponent powinien być zbudowany z nazwy panelu, kilku typów przyrządów (wspomniany suwak, lista, radio buttony, pola tekstowe) wraz z ich nazwami.
Ziarno powinno posiadać: właściwości wszystkich możliwych typów (proste, ograniczone, wiązane), graficzną reprezentację oraz klasę opisową BeanInfo z klasami pomocniczymi edytorów (należy zwrócić uwagę na metodę getJavaInitializationString) i customizera (należy zwrócić uwagę na metodę setObject), służącymi do zmian właściwości ziarenka.
Właściwościami panelu powinny być co najmniej:
- nazwa panelu (właściwość prosta)
- nazwy poszczególnych przyrządów
- informacja o włączeniu / wyłączeniu poszczególnych przyrządów
- rozmiar pola tekstowego (właściwość wiązana)
- graniczne wartości przyrządów (właściwość ograniczona)
Ziarno powinno być zastosowane dla kolejnych aplikacji poprzez uprzednie utworzenie paczki jar ze wszystkimi klasami niezbędnymi do jego funkcjonowania, włączeniu do każdej z aplikacji, a następnie wstawienie na wybrany panel z pomocą wizarda i odpowiednie dostosowanie go.
Materiały:
Java Beans (dr Tomasz Kubik)
przykłady ziaren (dr Tomasz Kubik)
RMI (Oracle Java Tutorial)
RMI (dr Tomasz Kubik)
RMI (Jay Sridhar)
Temat:
Wykorzystanie bazy danych w aplikacji przeznaczonej do przetwarzania dużych zbiorów danych.
Wymagania:
Do realizacji zadania potrzebna będzie wiedza o sposobach komunikacji z bazami danych za pomocą JDBC (choć istnieją frameworki ORM pozwalające na tworzenie aplikacji z warstwą danych, jednak nie będą one wykorzystane - chodzi tu o stworzenie aplikacji korzystającej bezpośrednio z JDBC). Ponadto wymagana będzie znajomość sposobów przetwarzania plików XML w języku Java za pomocą JAXB.
Zadanie:
Ogólny opis aplikacji:
Zaimplementowana aplikacja powinna służyć do klasyfikowania bakterii o zadanym genotypie.
Genotyp bakterii stanowić będzie ciąg 6 cyfr, przykładowo:
351244
Genotyp ten koduje trzy geny:
- 34 - alpha
- 54 - beta
- 12 - gamma
Geny alfa i beta odpowiadają za kodowanie liczby wici (1, 2, 3...) , natomiast beta i gamma - klasę twardości błony komórkowej (a, b, c...).
Aplikacja ma za zadanie służyć do klasyfikacji nieznanych wcześniej osobników na podstawie ich genotypów i zapisywać pomiar do bazy do odpowiedniej tabeli -
w przypadku istnienia pomiaru dla danego genotypu ma być aktualizowany.
Do klasyfikacji posłużyć ma
algorytm 1-NN wraz z bazą przebadanych wcześniej (można wygenerować dane losowo, ale postaram się zamieścić też jakieś przykładowe dane).
Przykładowy fragment bazy danych, zawierajacy informacje o pomiarach liczby wici, klasie twardości dla różnych wartości genów i klasyfikacji badanych został przedstawiony ponizej.
Należy wykorzystać dokładnie wskazane nazwy tabel i atrybutów.
Do realizacji zadania można wykorzystać dowolną bazę danych (MS SQL, Oracle, a także plikowe - SQLite itd.)
Aplikacja powinna:
- Umożliwić podłączenie do bazy danych pod dowolnym adresem / nazwą pliku
- Wyświetlać listę historii przebadanych osobników wraz z klasyfikacją (wykorzystać procedury zapisane)
- Zapisywać listę przebadanych osobników do pliku XML
- Pozwalać na klasyfikację pojedynczego osobnika (wraz z natychmiastową informacją o klasyfikacji i zapisaniu do historii)
- Pozwalać na klasyfikację wielu osobników (wykorzystanie transakcji przy zapisywaniu do historii)
- Minimalizować liczbę zapytań do bazy danych.
- Wykorzystywać zapytania parametryzowane
Materiały:
JDBC (dr Tomasz Kubik)
Algorytm k-nn (Wikipedia)
JAXB (Vogella)
Temat:
Implementacja prostej aplikacji sieciowej i serwerowej.
Wymagania:
Do realizacji zadania potrzebna będzie wiedza o gniazdach, protokole HTTP, SOAP, XML i wdrażaniu aplikacji serwerowych. Choć kurs dotyczy głównie stosu technologii JAVA SE podczas realizacji zadania można posiłkować się wiedzą z zakresu Java EE, w szczególności wiedzą o frameworku Apache Axis2 (
http://axis.apache.org/axis2/java/core/).
Zadanie:
Zaprojektuj architekturę rozproszonego systemu, w którym wymiana informacji bazuje na wykorzystaniu SOAP. Architektura ta może przyjąć formę "pierścienia", "gwiazdy", "łańcucha" lub ich kombinacji. Zaimplementuj węzły takiego systemu. Implementację można oprzeć się na gniazdach TCP/IP lub na frameworku Apache Axis/Axis2. System może służyć do rozsyłania komunikatów pomiędzy węzłami (adresowanych bezpośrednio do jakiegoś węzła lub rozsyłanych do wszystkich węzłów). Węzły uruchamiane są jako osobne aplikacje, na interfejsie których wyświetlane są wiadomości przychodzące oraz redagowane są wiadomości wychodzące. Do realizacji logiki przesyłania komunikatów należy wykorzystać możliwości, jakie dostarcza protokół SOAP (a więc pola części head), zaś sama treść komunikatów powinna być przenoszona w części transportowej (a więc w części body). Do realizacji zadania (gdy wykorzystuje się gniazda TCP/IP) można użyć pakiet javax.xml.soap.*.
W szczególności architektura systemu może przyjąć postać jak na schemacie poniżej (strzałki pokazują kierunek przepływu komunikatów).
Każdy z węzłów powinien być parametryzowany nazwą, numerami portów, oraz atrybutem mówiącym o jego umiejscowieniu w architekturze (tu: numerem warstwy). W tym konkretnym przypadku wiadomości wychodzące można adresować do wszystkich węzłów w tej sieci, do węzłów danej warstwy, do konkretnych węzłów.
Materiały:
Rozwiązania sieciowe (dr Tomasz Kubik)
SOAP (Wikipedia)
Temat:
Wykorzystanie szyfrowania oraz polityki bezpieczeństwa przy ładowaniu klas.
Wymagania:
Do realizacji zadania potrzebna będzie wiedza o kluczach, cyfrowym podpisywaniem paczek jar, weryfikacji podpisów.
Zadanie:
Napisz program, który pozwoli użytkownikowi zaszyfrować i rozszyfrować dany plik. Program powinien korzystać z klasy, która została dostarczona w podpisanej cyfrowo paczce jar. Podczas realizacji zadania należy wygenerować klucz prywatny i publiczny. Należy podpisać cyfrowo jar zawierający skompilowane klasy. Należy wykorzystać pliki polityki i zezwolenia (permissions).
Materiały:
Security Features in Java SE (Oracle)
Signed Classes (JavaSecurity)
Temat:
Przygotowanie wdrożenia aplikacji Java.
Wymagania:
Do realizacji zadania potrzebna będzie wiedza o JavaWS oraz JNLP.
Zadanie:
Napisz program, który można będzie uruchomić poprzez JavaWS. Podczas realizacji zadania należy wygenerować plik JNLP i skorzystać z lokalnej instacji serwera Apache Tomcat (na nim opublikowane powinny być plik JNLP oraz jar z aplikacją). Program powinien być aplikacją okienkową (Swing / JavaFX) realizującą dowolną funkcjonalność - przykładowo prosty kalkulator.
Temat:
Rozbudowa wybranej aplikacji Java o funkcje zaimplementowane w kodzie natywnym.
Wymagania:
Do realizacji zadania potrzebna będzie wiedza o sposobie implementacji i wykorzystaniu metod natywnych (JNI). Niezbędna będzie znajomość tematu tworzenia bibliotek ładowanych dynamicznie w języku C/C++.
Zadanie:
Napisz program z wykorzystaniem JNI, w którym zostanie wykorzystana klasa posiadająca metody natywne służące do obliczania iloczynu skalarnego dwóch wektorów. Schemat implementacji tej klasy powinien być taki, jak pokazano poniżej. W trakcie implementacji należy zwrócić uwagę na właściwą alokację i zwalnianie pamięci po stronie kodu natywnego oraz na zgodność bitową JVM oraz bibliteki ładowanej dynamicznie (32/64 bit). Do realizacji zadania można wykorzystać dowolne kompilatory języka C/C++ (niezbędne do wygenerowania biblioteki ładowanej dynamicznie).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 | class DotProduct {
private Double[] a;
private Double[] b;
private Double c;
public Double[] getA(){}
public Double[] getB(){}
public double getC(){}
public void setA(Double[] a){}
public void setB(Double[] b){}
public void setC(double c){}
/*
zakładamy, że po stronie kodu natywnego wyliczony zostanie iloczyn skalarny dwóch wektorów
*/
public native Double multi01(Double[] a, Double[] b);
/*
zakładamy, że drugi atrybut będzie pobrany z obiektu przekazanego do metody natywnej
*/
public native Double multi02(Double[] a);
/*
zakładamy, że po stronie natywnej utworzone zostanie okienko na atrybuty,
a po ich wczytaniu i przepisaniu do a,b obliczony zostanie wynik.
Wynik powinna wyliczać metoda Javy multi04
(korzystająca z parametrów a,b i wpisująca wynik do c).
*/
public native void multi03();
private void multi04(){
// mnoży a i b, wynik wpisuje do c
}
}
|
Materiały:
Java Native Interface (JNI) (Chua Hock-Chuan (ehchua@ntu.edu.sg))
Temat:
Projekt aplikacji do testowania algorytmów w problemach sztucznej inteligencji poprzez wykorzystanie skryptów.
Wymagania:
Do realizacji zadania potrzebna będzie wiedza o wykorzystaniu silnika Nashorn interpretującego JavaScript razem z aplikacjami Java.
Zadanie:
Napisz program służący do gry w kółko i krzyżyk człowieka z komputerem na planszy o zadanym rozmiarze (wygrywa zawodnik, który ustawi 5 sąsiadujących ze sobą znaków w rzędzie/kolumnie/po ukosie). Program powinien korzystać z rozszerzeń - skryptów JavaScript dostarczających metod do generowania kolejnych ruchów według jakiejś strategii oraz z odpowiednim poziomem trudności. Skrypty powinny być wczytywane ze wskazanego katalogu w sposób dynamiczny (powinno dać się zmienić strategię i poziom trudności - a więc skrypt i metodę w nim zdefiniowaną w trakcie gry). Można założyć, że metody generujące kolejne ruchy mają taką samą listę atrybutów oraz zwracają wartości takiego samego typu - np. pobierają "planszę" a zwracają współrzędne "strzału". W szczególności w załadowanych skryptach można wykorzystać klasy Java.
Materiały:
Java 8 Nashorn Tutorial (Benjamin Winterberg)
Temat:
Implementacja i uruchomienie aplikacji bazującej na JavaFX.
Wymagania:
Do realizacji zadania potrzebna będzie wiedza o tworzeniu aplikacji z wykorzystaniem JavaFX.
Zadanie:
Zaimplementuj aplikację z Laboratorium 2 korzystając z JavaFX.
Materiały:
Getting Started with JavaFX (Oracle)
Zadanie dodatkowe przewidziane jest dla osób, które posiadają średnią ocen z laboratoriów większą od 5.0 i chciałyby otrzymać ocenę końcową 5.5.
Temat:
Aplikacja na platformę Android.
Wymagania:
Do realizacji zadania potrzebna będzie wiedza na temat programowania na platformę Android, bibliotek RxJava oraz Retrofit.
Zadanie:
Aplikacja, funkcjonująca na platformie Android, powinna móc pobrać dane (sformatowane jako JSON) z API za pomocą biblioteki Retrofit (wykorzystując przykładowo paremetry typu GET) i RxJava, przetworzyć je (np. wykorzystując mapowanie) i wyświetlić.
Przykładowo, aplikacja może pobrać listę postów danego użytkownika z przykładowego API zamieszczonego w materiałach, wyfiltrować te o zadanej długości a następnie zmapować na wyświetlone później w postaci listy tytuły.
Termin oddania:
27.06.18
Materiały:
Getting started with Android development
RxJava
Retrofit
Przykładowe API