Java Enterprise Online Project
===============================
Разработка полнофункционального 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.

Когда вы слышите что-то, вы забываете это.
Когда вы видите что-то, вы запоминаете это.
Но только когда вы начинаете делать это,
вы начинаете понимать это
Старинная китайская поговорка
## Описание и план проекта
### Демо разрабатываемого приложения
### [Изменения проекта (Release Notes)](ReleaseNotes.md)
### Требования к участникам, Wiki
### Составление резюме, подготовка к интервью, поиск работы
Вводное занятие (обязательно смотреть все видео)
===============
##  1. Осваиваем Java Enterprise. Трудоустройство. Ответы на вопросы.
- Слайды презентации
- Java Tools and Technologies Landscape Report 2016
- [Java in 2017 Survey](http://www.baeldung.com/java-in-2017)
- Из юниоров в разработчики: получаем первую работу
#### Spring Pet-Clinic
- Spring PetClinic Sample Application
- Presentation
##  2. Системы управления версиями. Git.
- **Wiki по ведению проекта в Git**
- Система управления версиями. VCS/DVSC.
- Ресурсы:
- Интерактивная Git обучалка
- Еще одна интерактивная обучалка, по-русски
- Книга Git
- Working with remote repositories
- Видео по обучению Git
- Git Overview
- [Основы Git за 20 минут](https://www.youtube.com/watch?v=TMeZGvtQnT8)
- [Git - для новичков](https://www.youtube.com/watch?list=PLY4rE9dstrJyTdVJpv7FibSaXB4BHPInb&v=PEKN8NtBDQ0)
##  3. Работа с проектом (выполнять инструкции)
**ВНИМАНИЕ: выбирайте для проекта простой пусть без пробелов и русских букв, например (Windows) `c:\projects\topjava\`. Иначе впоследствии будут проблемы**
> Проект постоянно улучшается, поэтому видео иногда отличается от кода проекта. Изменения указываю после видео: в `UserMeals/UserMealWithExceed` поля изменились на `private`
- **Prepare_ to_ HW0.patch (скачать и положить в каталог вашего проекта)**
## Инструкция по шагам (из видео):
- Установить ПО (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)
- По ходу видео сделать Apply Patch... скаченного патча Prepare_ to_ HW0.patch
- Закоммитить и запушить изменения (commit + push)
- Сделать ветку домашнего задания
- Выполнить задание и залить на GitHub (commit + push)
- Переключиться в основную ветку проекта master.
##  Домашнее задание HW0
```
Реализовать метод UserMealsUtil.getFilteredWithExceeded через циклы (`forEach`):
- должны возвращаться только записи между startTime и endTime
- поле UserMealWithExceed.exceed должно показывать,
превышает ли сумма калорий за весь день параметра метода caloriesPerDay
Т.е UserMealWithExceed - это запись одной еды, но поле exceeded будет одинаково для всех записей за этот день.
- Проверьте результат выполнения ДЗ (можно проверить логику в 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` в одной ветке в разных методах. Проще делать, проще проверять
#### Optional (Java 8 Stream API)
```
Сделать реализацию через Java 8 Stream API.
```
- Видео: Доступно о Java 8 Lambda
- Java 8: Lambda выражения
- Java 8: Потоки
- Pуководство по Java 8 Stream
- Java 8 Stream API в картинках и примерах
- [7 способов использовать groupingBy в Stream API](https://habrahabr.ru/post/348536)
- Лямбда-выражения в Java 8
- A Guide to Java 8
- Шпаргалка Java Stream API
- Алексея Владыкин: Элементы функционального программирования в Java
- Yakov Fain о новом в Java 8
- stream.map vs forEach
- Дополнительно
- [Сергей Куксенко — Stream API, часть 1](https://www.youtube.com/watch?v=O8oN4KSZEXE)
- [Сергей Куксенко — Stream API, часть 2](https://www.youtube.com/watch?v=i0Jr2l3jrDA)
#### Optional 2 (+5 бонусов)
```
Сделать реализацию со сложностью O(N):
- циклом за 1 проход по List. Обратите внимание на п.13 замечаний
- через Stream API за 1 проход по исходному списку Stream meals
- возможно дополнительные проходы по частям списка
- нельзя использовать внешние коллекции, не являющиеся частью коллектора или результатами работы stream
```
#### Замечания по использованию Stream API:
- Когда встречаешь что-то непривычное, приходится перестраивать мозги. Например, переход с процедурного на ООП программирование дается непросто. Те, кто не знает шаблонов (и не хотят учить) также их встречают плохо. Хорошая новость в том, что если это принять и начать использовать, то начинаешь получать от этого удовольствие. И тут главное не впасть в другую крайность:
- [Используйте Stream API проще (или не используйте вообще)](https://habrahabr.ru/post/337350/)
- Если вас беспокоить производительность стримов, обязательно прочитайте про оптимизацию
- ["Что? Где? Когда?"](http://optimization.guide/intro.html)
- [Перформанс: что в имени тебе моём?](https://habrahabr.ru/company/jugru/blog/338732/)
- [Performance это праздник](https://habrahabr.ru/post/326242/)
При использовании Stream API производительность улучшиться только на больших задачах, где возможно распараллеливание.
Еще - просто так запустить и померять скорость JVM нельзя (как минимум дать прогреться и запустить очень большое число раз). Лучше использовать какие-нибудь бенчмарки, например [JMH](http://tutorials.jenkov.com/java-performance/jmh.html), который мы юзаем на другом проекте (Mastejava).
##  Замечания к HW0
- 1: Код проекта менять можно! Одна из распространенных ошибок как в тестовых заданиях на собеседовании, так и при работе на проекте, что ничего нельзя менять. Конечно при правках в рабочем проекте обязательно нужно проконсультироваться/проревьюироваться у авторов кода (находится по истории VCS)
- 2: Наследовать `UserMealWithExceed` от `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.getFilteredWithExceeded` мы будем использовать [в нашем приложении](http://topjava.herokuapp.com/) для фильтрации по времени и отображения еды правильным цветом.
- 12: Обращайте внимание на комментарии к вашим коммитам в git. Они должны быть короткие и информативные (лучше на english)
- 13: Не полагайтесь в решении на то, что список будет подаваться отсортированным. Такого условия нет.
-----
## [Пример 7-го занятия онлайн стажировки, несколько видео открыто](https://github.com/JavaOPs/topjava/blob/master/doc/lesson07.md)
### Полезные ресурсы
> ВНИМАНИЕ:
> - **ДЗ первого урока будет связано с [созданием небольшого CRUD приложения (в памяти, без DB) на JSP и сервлетах](https://danielniko.wordpress.com/2012/04/17/simple-crud-using-jsp-servlet-and-mysql/)**. Введение будет, но предварительное знакомство не помешает.
> - основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия!
Все остальное - опционально.
#### HTML, JavaScript, CSS
- [Basic HTML and HTML5](https://learn.freecodecamp.org/responsive-web-design/basic-html-and-html5/say-hello-to-html-elements/)
- [Справочник по WEB](https://developer.mozilla.org/ru/)
- [Видео по WEB технологиям](https://www.youtube.com/user/WebMagistersRu/playlists)
- [Изучение JavaScript в одном видео уроке за час](https://www.youtube.com/watch?v=QBWWplFkdzw)
- HTML, CSS, JAVASCRIPT, SQL, JQUERY, BOOTSTRAP
- Введение в программирование на JavaScript
- Стандарты кодирования для HTML, CSS и JavaScript’a
- Основы работы с HTML/CSS/JavaScript
- JavaScript - Основы
- Основы JavaScript
- Bootstrap 3 - Основы
- jQuery для начинающих
#### Java (базовые вещи)
- Интуит. Программирование на Java
- 1й урок MasterJava: Многопоточность
- Основы Java garbage collection
- Размер Java объектов
- Введение в Java Reflection API
- Структуры данных в картинках
- Обзор java.util.concurrent.*
- Синхронизация потоков
- String literal pool
- Маленькие хитрости Java
- A Guide to Java 8
### Туториалы, разное
- [Что нужно знать о бэкенде новичку в веб-разработке](https://tproger.ru/translations/backend-web-development)
- [Туториалы: Spring Framework, Hibernate, Java Core, JDBC](http://proselyte.net/tutorials/)
#### Сервлеты
- Как создать Servlet? Полное руководство.
#### JDBC, SQL
- Основы 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