Skip to content

Latest commit

 

History

History
370 lines (291 loc) · 22.4 KB

File metadata and controls

370 lines (291 loc) · 22.4 KB

Курс "Разработчик Java" в OTUS

Содержание:

Студент

ФИО слушателя: Люлин Вадим Евгеньевич Название курса: Разработчик Java Группа: 2020-06

Модуль hw01-gradle

Проект gradle с модульной структурой

Домашнее задание Проект gradle с модульной структурой Цель: нучиться создавать проект Gradle (Maven), подготовиться к выполнению домашних заданий.

  1. Создайте аккаунт на github.com (если еще нет)
  2. Создайте репозиторий для домашних работ
  3. Сделайте checkout репозитория на свой компьютер
  4. Создайте локальный бранч hw01-gradle
  5. Создать проект gradle
  6. В проект добавьте последнюю версию зависимости com.google.guava guava
  7. Создайте модуль hw01-gradle
  8. В модуле сделайте класс HelloOtus
  9. В этом классе сделайте вызов какого-нибудь метода из guava
  10. Создайте "толстый-jar"
  11. Убедитесь, что "толстый-jar" запускается.
  12. Сделайте pull-request в gitHub
  13. Ссылку на PR отправьте на проверку (личный кабинет, чат с преподавателем).

При желании, можно сделать maven-проект и далее на курсе работать с maven-ом. Для Maven инструкция аналогичная (просто в тексте замените Gradle на Maven).

Модуль hw02-DIY-ArrayList

Домашнее задание DIY ArrayList

Цель: изучить как устроена стандартная коллекция ArrayList. Попрактиковаться в создании своей коллекции. Написать свою реализацию ArrayList на основе массива. class DIYarrayList implements List{...}

Проверить, что на ней работают методы из java.util.Collections: Collections.addAll(Collection<? super T> c, T... elements) Collections.static void copy(List<? super T> dest, List<? extends T> src) Collections.static void sort(List list, Comparator<? super T> c)

Модуль hw03-Reflection

Домашнее задание Свой тестовый фреймворк Цель: научиться работать с reflection и аннотациями, понять принцип работы фреймворка junit. Написать свой тестовый фреймворк.

Поддержать свои аннотации @Test, @Before, @After.

Запускать вызовом статического метода с именем класса с тестами.

Т.е. надо сделать:

  1. создать три аннотации - @Test, @Before, @After.
  2. Создать класс-тест, в котором будут методы, отмеченные аннотациями.
  3. Создать "запускалку теста". На вход она должна получать имя класса с тестами, в котором следует найти и запустить методы отмеченные аннотациями и пункта 1.
  4. Алгоритм запуска должен быть следующий:: метод(ы) Before текущий метод Test метод(ы) After для каждой такой "тройки" надо создать СВОЙ объект класса-теста.
  5. Исключение в одном тесте не должно прерывать весь процесс тестирования.
  6. На основании возникших во время тестирования исключений вывести статистику выполнения тестов (сколько прошло успешно, сколько упало, сколько было всего)

Модуль hw04-GCComparisons

Сравнение разных сборщиков мусора Цель: на примере простого приложения понять какое влияние оказывают сборщики мусора Написать приложение, которое следит за сборками мусора и пишет в лог количество сборок каждого типа (young, old) и время которое ушло на сборки в минуту.

Добиться OutOfMemory в этом приложении через медленное подтекание по памяти (например добавлять элементы в List и удалять только половину).

Настроить приложение (можно добавлять Thread.sleep(...)) так чтобы оно падало с OOM примерно через 5 минут после начала работы.

Собрать статистику (количество сборок, время на сборки) по разным GC.

!!! Сделать выводы !!! ЭТО САМАЯ ВАЖНАЯ ЧАСТЬ РАБОТЫ: Какой gc лучше и почему?

Выводы оформить в файле Сonclusions.md в корне папки проекта. Результаты измерений сведите в таблицу.

Попробуйте провести этот эксперимент на небольшом хипе порядка 256Мб, и на максимально возможном, который у вас может быть.

Модуль hw05-AOP

Автоматическое логирование. Цель: Понять как реализуется AOP, какие для этого есть технические средства. Разработайте такой функционал: метод класса можно пометить самодельной аннотацией @Log, например, так:

class TestLogging { @Log public void calculation(int param) {}; }

При вызове этого метода "автоматически" в консоль должны логироваться значения параметров. Например так.

class Demo { public void action() { new TestLogging().calculation(6); } }

В консоле дожно быть: executed method: calculation, param: 6

Обратите внимание: явного вызова логирования быть не должно.

Учтите, что аннотацию можно поставить, например, на такие методы: public void calculation(int param1) public void calculation(int param1, int param2) public void calculation(int param1, int param2, String param3)

P.S. Выбирайте реализацию с ASM, если действительно этого хотите и уверены в своих силах. Критерии оценки: Система оценки максимально соответсвует привычной школьной: 3 и больше - задание принято (удовлетворительно). ниже - задание возвращается на доработку.

Модуль hw06-ATM

Эмулятор банкомата Цель: Применить на практике принципы SOLID. Написать эмулятор АТМ (банкомата).

Объект класса АТМ должен уметь:

  • принимать банкноты разных номиналов (на каждый номинал должна быть своя ячейка)
  • выдавать запрошенную сумму минимальным количеством банкнот или ошибку если сумму нельзя выдать Это задание не на алгоритмы, а на проектирование. Поэтому оптимизировать выдачу не надо.
  • выдавать сумму остатка денежных средств

В этом задании больше думайте об архитектуре приложения. Не отвлекайтесь на создание таких объектов как: пользователь, авторизация, клавиатура, дисплей, UI (консольный, Web, Swing), валюта, счет, карта, т.д. Все это не только не нужно, но и вредно! Критерии оценки: Система оценки максимально соответсвует привычной школьной: 3 и больше - задание принято (удовлетворительно). ниже - задание возвращается на доработку.

Модуль hw07-MessageHandler

Домашнее задание Обработчик сообщений Цель: Применить на практике шаблоны проектирования. Реализовать todo из модуля homework.

Модуль hw08-JsonObjectWriter

Cвой json object writer Цель: Научиться сериализовывать объект в json, попрактиковаться в разборе структуры объекта. Напишите свой json object writer (object to JSON string) аналогичный gson на основе javax.json.

Gson это делает так: Gson gson = new Gson(); AnyObject obj = new AnyObject(22, "test", 10); String json = gson.toJson(obj);

Сделайте так: MyGson myGson = new MyGson(); AnyObject obj = new AnyObject(22, "test", 10); String myJson = myGson.toJson(obj);

Должно получиться: AnyObject obj2 = gson.fromJson(myJson, AnyObject.class); System.out.println(obj.equals(obj2));

Поддержите:

  • примитивные типы
  • массивы примитивных типов
  • коллекции (interface Collection) не забываться, что obj может быть null

Модуль hw09-Jdbc

Самодельный ORM Цель: Научиться работать с jdbc. На практике освоить многоуровневую архитектуру приложения. Работа должна использовать базу данных H2.

Создайте в базе таблицу User с полями:

• id bigint(20) NOT NULL auto_increment • name varchar(255) • age int(3)

Создайте свою аннотацию @Id

Создайте класс User (с полями, которые соответствуют таблице, поле id отметьте аннотацией).

Реализуйте интерфейс JdbcMapper, который умеет работать с классами, в которых есть поле с аннотацией @Id. JdbcMapper должен сохранять объект в базу и читать объект из базы. Для этого надо реализовать оставшиеся интерфейсы из пакета mapper. Таким обзазом, получится надстройка над DbExecutor, которая по заданному классу умеет генерировать sql-запросы. А DbExecutor должен выполнять сгенерированные запросы.

Имя таблицы должно соответствовать имени класса, а поля класса - это колонки в таблице.

Проверьте его работу на классе User.

За основу возьмите класс HomeWork.

Создайте еще одну таблицу Account: • no bigint(20) NOT NULL auto_increment • type varchar(255) • rest number

Создайте для этой таблицы класс Account и проверьте работу JdbcMapper на этом классе.

Модуль hw10-Hibernate

Использование Hibernate Цель: На практике освоить основы Hibernate. Понять как аннотации-hibernate влияют на формирование sql-запросов. Работа должна использовать базу данных H2.

Возьмите за основу предыдущее ДЗ (Самодельный ORM), используйте предложенный на вебинаре api (пакет api) и реализуйте функционал сохранения и чтения объекта User через Hibernate. (Рефлексия больше не нужна) Конфигурация Hibernate должна быть вынесена в файл.

Добавьте в User поля: адрес (OneToOne) class AddressDataSet { private String street; } и телефон (OneToMany) class PhoneDataSet { private String number; }

Разметьте классы таким образом, чтобы при сохранении/чтении объека User каскадно сохранялись/читались вложенные объекты.

ВАЖНО.

  1. Hibernate должен создать только три таблицы: для телефонов, адресов и пользователей.
  2. При сохранении нового объекта не должно быть update-ов. Посмотрите в логи и проверьте, что эти два требования выполняются. Критерии оценки: Система оценки максимально соответсвует привычной школьной: 3 и больше - задание принято (удовлетворительно). ниже - задание возвращается на доработку.

Модуль hw11-MyCache

Свой cache engine Цель: Научится применять WeakHashMap, понять базовый принцип организации кеширования. Закончите реализацию MyCache из вебинара. Используйте WeakHashMap для хранения значений.

Добавьте кэширование в DBService из задания про Hibernate ORM или "Самодельный ORM". Для простоты скопируйте нужные классы в это ДЗ.

Убедитесь, что ваш кэш действительно работает быстрее СУБД и сбрасывается при недостатке памяти.

Модуль hw12-WebServer

Веб сервер Цель: Научиться создавать серверный и пользовательский http-интерфейсы. Научиться встраивать web-сервер в уже готовое приложение. Встроить веб-сервер в приложение из ДЗ про Hibernate ORM (или в пример из вебинара встроить ДЗ про Hibernate :)). Сделать стартовую страницу, на которой админ должен аутентифицироваться. Сделать админскую страницу для работы с пользователями. На этой странице должны быть доступны следующие функции:

  • создать пользователя
  • получить список пользователей

Модуль hw13-DI

Домашнее задание (Собственный IoC контейнер) Цель: В процессе создания своего контекста понять как работает основная часть Spring framework. Обязательная часть:

  • Скачать заготовку приложения тренажера таблицы умножения из репозитория с примерами
  • В классе AppComponentsContainerImpl реализовать обработку, полученной в конструкторе конфигурации, основываясь на разметке аннотациями из пакета appcontainer. Так же необходимо реализовать методы getAppComponent
  • В итоге должно получиться работающее приложение. Менять можно только класс AppComponentsContainerImpl

Дополнительное задание (можно не делать):

  • Разделить AppConfig на несколько классов и распределить по ним создание компонентов. В AppComponentsContainerImpl добавить конструктор, который обрабатывает несколько классов-конфигураций

Дополнительное задание (можно не делать):

  • В AppComponentsContainerImpl добавить конструктор, который принимает на вход имя пакета, и обрабатывает все имеющиеся там классы-конфигурации (см. зависимости в pom.xml)

##Модуль hw14-SpringMVC

Домашнее задание Веб-приложение на Spring MVC Цель: Нучиться создавать war-пакеты и запускать их в TomCat. Научиться пользоваться Thymeleaf.

  • Собрать war для приложения из ДЗ про Web Server
  • Создавать основные классы приложения, как Spring beans (Кэш, Dao, DBService)
  • Настройку зависимостей выполнить с помощью Java/Annotation based конфигурации
  • Для обработки запросов использовать @Controller и/или @RestController
  • В качестве движка шаблонов использовать Thymeleaf
  • Запустить веб приложение во внешнем веб сервере

Авторизацию и аутентификацию делать не надо.

##Модуль hw15-Executors Последовательность чисел Цель: Освоить базовые механизмы синхронизации. Два потока печатают числа от 1 до 10, потом от 10 до 1. Надо сделать так, чтобы числа чередовались, т.е. получился такой вывод: Поток 1:1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 2 3 4.... Поток 2: 1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1 2 3....

Всегда должен начинать Поток 1.

##Модуль hw16-MessageSystem

Домашнее задание MessageSystem Цель: На практике освоить архитектурный подход "Система сообщений". Добавить систему обмена сообщениями в ДЗ про веб сервер с IoC контейнером (тут проще использовать Spring Boot). Пересылать сообщения из вебсокета в DBService и обратно.

Как работать с вебсокетами смотрите пример из вебинара «Asynchronous Web applications».

MessageSystem добавьте как модуль, по примеру из вебинара.

##Модуль hw17-MicroServices

Домашнее задание MessageServer Цель: Научиться разрабатывать сетевые приложения. Cервер из предыдущего ДЗ про MessageSystem разделить на три приложения: ▪ MessageServer ▪ Frontend ▪ DBServer

  • Сделать MessageServer сокет-сервером, Frontend и DBServer клиентами

  • Пересылать сообщения с Frontend на DBService через MessageServer

  • Запустить приложение с двумя Frontend и двумя DBService (но на одной базе данных) на разных портах

  • Frontend и DBService запускать "руками"

  • По желанию, можно сделать запуск Frontend и DBServer из MessageServer

  • Такой запуск должен быть "отчуждаемый", т.е. "сборка" должна запускаться на другом компьютере без особых хлопот.

Преподаватели

Сергей Петрелевич
Стрекалов Павел
Александр Оруджев
Вячеслав Лапин
Виталий Куценко