Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и HSQLDB.
Когда вы слышите что-то, вы забываете это.
Когда вы видите что-то, вы запоминаете это.
Но только когда вы начинаете делать это,
вы начинаете понимать это
Старинная китайская поговорка
- Слайды презентации
- Java Tools and Technologies Landscape Report 2016
- Java in 2017 Survey
- Из юниоров в разработчики: получаем первую работу
- ВНИМАНИЕ: выбирайте для проекта простой пусть без пробелов и русских букв, например (Windows)
c:\projects\topjava\
. Иначе впоследствии будут проблемы - Плагин уже Git Intergation не требуется и вкладку
Version control
в IDEA переименовали вGit
Патч prepare_to_HW0.patch (скачать и положить в каталог вашего проекта)
Проект постоянно улучшается, поэтому видео иногда отличается от кода проекта. Изменения указываю после видео:
- переименовал класс
UserMealWithExceed
и его полеexceed
вUserMealWithExcess.excess
- в
UserMeals/UserMealWithExcess
поля изменились наprivate
- обновил данные
UserMealsUtil.meals
и переименовал некоторые пременные, поля и методы- добавил
UserMealWithExcess.toString()
и метод для выполнения Optional домашнего задания- метод фильтрации в
TimeUtil
переименовали вisBetweenHalfOpen
(также изменилась логика сравнения -startTime
включается в интервал)
- Установить ПО (git, JDK8, IntelliJ IDEA, Maven)
- Создать аккаунт на GitHub
- Сделать Fork ЭТОГО проекта (https://github.com/JavaOPs/topjava)
- Сделать локальный репозиторий проекта:
git clone https://github.com/[Ваш аккаунт]/topjava.git
- Открыть и настроить проект в IDEA
- Выставить кодировку UTF-8 в консоли
- Поставить кодировку UTF-8
- Опционально: Поменять фонт по умолчанию (DejaVu) или на новый JetBrains Mono
- По ходу видео сделать Apply Patch... скаченного патча Prepare_ to_ HW0.patch
- Закоммитить и запушить изменения (commit + push)
- Сделать ветку домашнего задания
- Выполнить задание и залить на GitHub (commit + push)
- Переключиться в основную ветку проекта master.
Реализовать метод `UserMealsUtil.filteredByCycles` через циклы (`forEach`):
- должны возвращаться только записи между `startTime` и `endTime`
- поле `UserMealWithExcess.excess` должно показывать,
превышает ли сумма калорий за весь день значение `caloriesPerDay`
Т.е `UserMealWithExcess` - это запись одной еды, но поле `excess` будет одинаково для всех записей за этот день.
- Проверьте результат выполнения ДЗ (можно проверить логику в http://topjava.herokuapp.com , список еды)
- Оцените Time complexity алгоритма. Если она больше O(N), например O(N*N) или N*log(N), сделайте O(N).
- Java 8 Date and Time API
- Алгоритмы и структуры данных для начинающих: сложность алгоритмов
- Головач: сложность алгоритмов в теме коллекций
- Time complexity
- Временная сложность алгоритма
- Вычислительная сложность
ВНИМАНИЕ: варианты Optional делайте в UserMealsUtil
в одной ветке в разных методах. Проще делать, проще проверять
Реализовать метод `UserMealsUtil.filteredByStreams` через Java 8 Stream API.
- Видео: Доступно о Java 8 Lambda
- Java 8: Lambda выражения
- Java 8: Потоки
- Pуководство по Java 8 Stream
- Java 8 Stream API в картинках и примерах
- 7 способов использовать groupingBy в Stream API
- Лямбда-выражения в Java 8
- A Guide to Java 8
- Шпаргалка Java Stream API
- Алексея Владыкин: Элементы функционального программирования в Java
- Yakov Fain о новом в Java 8
- stream.map vs forEach</a
- Полное руководство по Java 8 Stream API в картинках и примерах
- Дополнительно
Сделать реализацию со сложностью O(N) (обратите внимание на п.13 замечаний):
- циклом за 1 проход по
List<UserMeal>
- без циклов по другим коллекциям/массивам (к ним также относим методы коллекций
addAll()/removeAll()
) - решение должно быть рабочим в общем случае (работать в приложении с многими пользователями, не только при запуске main)
- без циклов по другим коллекциям/массивам (к ним также относим методы коллекций
- через Stream API за 1 проход по исходному списку
meals.streem()
- нельзя использовать внешние коллекции, не являющиеся частью коллектора
- нельзя 2 раза проходить по исходному списку (в том числе его отфильтрованной копии)
- возможно дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Те например нельзя разбить список на на 2 подсписка с четными и нечетными датами и затем их объединить, с подсчетом превышения для каждого элемента.
Ресурсы:
- Когда встречаешь что-то непривычное, приходится перестраивать мозги. Например, переход с процедурного на ООП программирование дается непросто. Те, кто не знает шаблонов (и не хотят учить) также их встречают плохо. Хорошая новость в том, что если это принять и начать использовать, то начинаешь получать от этого удовольствие. И тут главное не впасть в другую крайность:
- Если вас беспокоить производительность стримов, обязательно прочитайте про оптимизацию
При использовании Stream API производительность улучшиться только на больших задачах, где возможно распараллеливание. Еще - просто так запустить и померять скорость JVM нельзя (как минимум дать прогреться и запустить очень большое число раз). Лучше использовать какие-нибудь бенчмарки, например JMH, который мы юзаем на другом проекте (Mastejava).
- 1: Код проекта менять можно! Одна из распространенных ошибок как в тестовых заданиях на собеседовании, так и при работе на проекте, что ничего нельзя менять. Конечно при правках в рабочем проекте обязательно нужно проконсультироваться/проревьюироваться у авторов кода (находится по истории VCS)
- 2: Наследовать
UserMealWithExcess
отUserMeal
я не буду, т.к. это разные сущности: Transfer Object и Entity. Мы будет их проходить на 2м уроке. - 3: Правильная реализация должна быть простой и красивой, можно сделать 2-мя способами: через стримы и через циклы. Сложность должна быть O(N), т.е. без вложенных стримов и циклов.
- 4: При реализации через циклы посмотрите в
Map
на методыgetOrDefault
илиmerge
- 5: При реализации через
Stream
заменяйтеforEach
операторомstream.map(..)
- 6: Объявляйте переменные непосредственно перед использованием (если возможно - сразу с инициализацией). При объявлении коллекций используйте тип переменной - интерфейс (Map, List, ..)
- 7: Если IDEA предлагает оптимизацию (желтым подчеркивает), например заменить лямбду на метод-референс, соглашайтесь (Alt+Enter)
- 8: Пользуйтесь форматированием кода в IDEA:
Alt+Ctrl+L
- 9: Перед check-in проверяйте чендж-лист (курсор на файл и Ctrl+D): не оставляйте в коде ничего лишнего (закомментированный код, TODO и пр.). Если файл не меняется (например только пробелы или переводы строк), не надо его чекинить, делайте ему
revert
(Git -> Revert /Ctrl+Alt+Z
). - 10:
System.out.println
нельзя делать нигде, кроме как вmain
. Позже введем логирование. - 11: Результаты, возвращаемые
UserMealsUtil.filteredByStreams
мы будем использовать в нашем приложении для фильтрации по времени и отображения еды правильным цветом. - 12: Обращайте внимание на комментарии к вашим коммитам в git. Они должны быть короткие и информативные (лучше на english)
- 13: Не полагайтесь в решении на то, что список еды будет подаваться отсортированным. Такого условия нет.
ВНИМАНИЕ:
- ДЗ первого урока будет связано с созданием небольшого CRUD приложения (в памяти, без DB) на JSP и сервлетах. Введение будет, но предварительное знакомство не помешает.
- основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия!
Все остальное - опционально.
- Basic HTML and HTML5
- Справочник по WEB
- Видео по WEB технологиям
- Изучение JavaScript в одном видео уроке за час
- HTML, CSS, JAVASCRIPT, SQL, JQUERY, BOOTSTRAP
- Введение в программирование на JavaScript
- Стандарты кодирования для HTML, CSS и JavaScript’a
- Основы работы с HTML/CSS/JavaScript
- JavaScript - Основы
- Основы JavaScript
- Bootstrap 3 - Основы
- jQuery для начинающих
- Интуит. Программирование на Java
- 1й урок MasterJava: Многопоточность
- Основы Java garbage collection
- Размер Java объектов
- Введение в Java Reflection API
- Структуры данных в картинках
- Обзор java.util.concurrent.*
- Синхронизация потоков
- String literal pool
- Маленькие хитрости Java
- A Guide to Java 8
- Что нужно знать о бэкенде новичку в веб-разработке
- Туториалы: Spring Framework, Hibernate, Java Core, JDBC
- Основы SQL на примере задачи
- Уроки по JDBC
- Learn SQL
- Интуит. Основы SQL
- Try SQL
- Курс "Введение в базы данных"
- Вопросы по собеседованию, ресурсы для подготовки
- Эффективная работа с кодом в IntelliJ IDEA
- Quizful- тесты онлайн
- Введение в Linux
- Джошуа Блох: Java. Эффективное программирование. Второе издание
- Гамма, Хелм, Джонсон: Приемы объектно-ориентированного проектирования. Паттерны проектирования
- Редмонд Э.: Семь баз данных за семь недель. Введение в современные базы данных и идеологию NoSQL
- Brian Goetz: Java Concurrency in Practice
- G.L. McDowell: Cracking the Coding Interview