[Java Enterprise Online Project](https://javaops.ru/view/topjava) =============================== Разработка полнофункционального 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. ![topjava_structure](https://javaops.ru/static/images/projects/top-scheme.jpg) Когда вы слышите что-то, вы забываете это. Когда вы видите что-то, вы запоминаете это. Но только когда вы начинаете делать это, вы начинаете понимать это Старинная китайская поговорка ## Описание и план проекта ### Демо разрабатываемого приложения ### [Изменения проекта (Release Notes)](ReleaseNotes.md) ### Требования к участникам, Wiki ### Составление резюме, подготовка к интервью, поиск работы Обновленное вводное занятие (обязательно смотреть все видео) =============== ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Вступление, история, команда, источники](doc/video1.md) ## Обзор наиболее востребованных технологий, которые будут изучаться на курсе TopJava ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2.1. [Часть 1: инфраструктура](doc/video2.1.md) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2.2. [Часть 2: frameworks Spring, ORM](doc/video2.2.md) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2.3. [Часть 3: тренды](doc/video2.3.md) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2.3. [Часть 4: обзор разрабатываемого приложения](doc/video2.4.md) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Рекомендуемые подходы к обучению на курсе](doc/video3.md) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Структура приложения (многоуровневая архитектура)](doc/video4.md) ### [Демо приложения](http://javaops-demo.ru/topjava) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. [Системы управления версиями. Git](doc/video5-vcs-git.md) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 6. Работа с проектом (выполнять инструкции) - **ВНИМАНИЕ: выбирайте для проекта простой путь без пробелов и русских букв, например, `c:\projects\topjava\` (Windows). Иначе впоследствии будут проблемы** - **Плагин Git Intergation уже не требуется, а вкладку `Version control` в IDEA переименовали в `Git`** - **C Ultimate IDEA сейчас сложности**, надеемся что временные. - Скачать IDEA и установливать плагины [можно по инструкции](https://github.com/JavaOPs/topjava/wiki/IDEA#download) - После Trial 30 дней [способы продлить использование](https://github.com/JavaOPs/topjava/wiki/IDEA#licence) Для переключения режима отображения изменений из вкладки `Commit` в `Git: Local Changes` нужно переключить `Settings/Preferences | Version Control | Commit | Use non-modal commit interface` или в контекстном меню вкладки `Commit`: ![image](https://user-images.githubusercontent.com/13649199/105491518-72d8f300-5cc7-11eb-8b79-c46382562deb.png) ![image](https://user-images.githubusercontent.com/13649199/105488663-05c35e80-5cc3-11eb-962e-30f403d623e8.png) ### Патч [prepare_to_HW0.patch](https://drive.google.com/file/d/1LNPpu9OkuCpfpD8ZJHO-o0vwu49p2i5M) (скачать и положить в каталог вашего проекта) > Проект постоянно улучшается, поэтому видео иногда отличается от кода проекта. Изменения указываю после видео: > - переименовал класс `UserMealWithExceed` и его поле `exceed` в `UserMealWithExcess.excess` > - в `UserMeals/UserMealWithExcess` поля изменились на `private` > - обновил данные `UserMealsUtil.meals` и переименовал некоторые переменные, поля и методы > - добавил `UserMealWithExcess.toString()` и метод для выполнения _Optional домашнего задания_ > - метод фильтрации в `TimeUtil` переименовал в `isBetweenHalfOpen` (также изменилась логика сравнения: `startTime` включается в интервал, а `endTime` - не включается) ### GitHub поменял политику: теперь пушить нужно через токен. IDEA предложит его сгенерировать при пуше, или можно [создать токен в настройках](https://www.jetbrains.com/help/idea/github.html#register-account) - [Способы авторизации в GitHub](https://topjava.ru/blog/vvedeniye-v-git-github-ustanovka-i-nastroyka#6) ## Инструкция по шагам (из видео): - Установить ПО (Git, JDK8, IntelliJ IDEA, Maven) - Создать аккаунт на GitHub - Сделать Fork **ЭТОГО** проекта (https://github.com/JavaOPs/topjava) - Сделать локальный репозиторий проекта:
git clone https://github.com/[Ваш аккаунт]/topjava.git
> Вместо Fork можно сделать [клонирование проекта](https://github.com/JavaOPs/topjava//Git#user-content-Клонирование-проекта): он не будет привязан к исходному https://github.com/JavaOPs/topjava и у него не будет истории. - Открыть и настроить проект в IDEA - Выставить кодировку UTF-8 в консоли - Поставить кодировку UTF-8 - Опционально: поменять шрифт по умолчанию на DejaVu или на **новый [JetBrains Mono](https://habr.com/ru/company/jugru/news/t/484134/)** - По ходу видео сделать `Apply Patch...` скачанного патча `Prepare_to_HW0.patch` - Закоммитить и запушить изменения (`commit` + `push`) - Сделать ветку домашнего задания - Выполнить задание и залить на GitHub (`commit` + `push`) - Переключиться в основную ветку проекта `master`. ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 7. [Maven](https://drive.google.com/file/d/1qEJTwv9FNUQjx-y9MSydH01xaAne0-hu) - [Как установить Maven 3 на Ubuntu или Windows](https://devcolibri.com/как-установить-maven-3-на-ubuntu-или-windows/) - [Руководство по Maven](https://topjava.ru/blog/apache-maven-osnovy-1) - Wiki: [Apache Maven](https://ru.wikipedia.org/wiki/Apache_Maven) - [The Central Repository](http://search.maven.org) - Дополнительно: - [Мой Wiki по Maven](https://github.com/JavaOPs/topjava/wiki/Maven) - [Основы Maven](https://www.youtube.com/watch?v=0uwMKktzixU) - JavaRush: [Основы Maven](https://javarush.ru/groups/posts/2523-chastjh-4osnovih-maven) - Инструмент сборки проектов [Maven](https://www.examclouds.com/ru/java/java-core-russian/lesson20) - [Maven Getting Started Guide](https://maven.apache.org/guides/getting-started/index.html) - [Видео: Maven vs Gradle vs SBT (Архипов, Борисов, Садогурский)](https://www.youtube.com/watch?v=21qdRgFsTy0) - [Build Lifecycle](http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html) - [Dependency Mechanism](http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 8. [Как правильно относиться к техзаданию (ТЗ). Полуоткрытый интервал.](https://drive.google.com/file/d/1BpTzjNFjS0TSekCyt_xvt6YoLvuw5KTZ) - [Типы промежутков](https://ru.wikipedia.org/wiki/Промежуток_(математика)) ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW0 ### ВНИМАНИЕ: НЕ НАДО в репозиторий делать Pull Request со своими решениями! См. видео выше ("Работа с проектом") Реализовать метод `UserMealsUtil.filteredByCycles` через циклы (`forEach`): - должны возвращаться только записи между `startTime` и `endTime` - поле `UserMealWithExcess.excess` должно показывать, превышает ли сумма калорий за весь день значение `caloriesPerDay` Т. е. `UserMealWithExcess` - это запись одной еды, но поле `excess` будет одинаково для всех записей за этот день. > - Проверьте результат выполнения ДЗ (можно проверить логику в [http://javaops-demo.ru/topjava](http://javaops-demo.ru/topjava), список еды) > - Оцените Time complexity алгоритма. Если она больше O(N), например O(N*N) или N*log(N), сделайте O(N). > **Внимание: внимательно прочитайте про O(N). O - это любой коэффициент, 2*N это тоже O(N).** - Java 8 Date and Time API - Алгоритмы и структуры данных для начинающих: сложность алгоритмов - [Сложность алгоритмов и Big O Notation](https://threadreaderapp.com/thread/1470666237286010881) - [Головач: сложность алгоритмов в теме коллекций](https://www.youtube.com/watch?v=Ek9ijOiplNE&feature=youtu.be&t=778) - Time complexity - Временная сложность алгоритма - Вычислительная сложность #### ВНИМАНИЕ: варианты Optional делайте в одной ветке в разных методах `UserMealsUtil`. Проще делать, проще проверять ### Optional (Java 8 Stream API) ``` Реализовать метод `UserMealsUtil.filteredByStreams` через Java 8 Stream API. ``` - Видео: Доступно о Java 8 Lambda - Java 8: Lambda выражения - Java 8: Потоки - Pуководство по Java 8 Stream - [Полное руководство по Java 8 Stream API в картинках и примерах](https://annimon.com/article/2778) - [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` - без циклов по другим коллекциям/массивам (к ним также относим методы коллекций `addAll()/removeAll()`) - через Stream API за 1 проход по исходному списку `meals.stream()` - нельзя использовать внешние коллекции, не являющиеся частью коллектора - возможно дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Те например нельзя разбить список на 2 подсписка с четными и нечетными датами и затем их объединить, с подсчетом превышения для каждого элемента. Временная сложность реализации должна быть O(N) (обратите внимание на п. 13 замечаний) Решение должно быть рабочим в общем случае (должно работать в приложении с многими пользователями, не только при запуске `main`) Нельзя 2 раза проходить по исходному списку (в том числе по его отфильтрованной или преобразованной копии) Ресурсы: - [Baeldung: Custom Collectors](https://www.baeldung.com/java-8-collectors#Custom) - [Руководство по Java 8 Stream API: Collector](https://annimon.com/article/2778#collector) - [Хватит писать циклы! Топ-10 лучших методов для работы с коллекциями из Java 8](https://javarush.ru/groups/posts/524-khvatit-pisatjh-ciklih-top-10-luchshikh-metodov-dlja-rabotih-s-kollekcijami-iz-java8) - [Понять Java Stream API](https://vc.ru/u/604567-yerlan-akzhanov/194409-ponyat-java-stream-api) ### Замечания по использованию 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). ## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Замечания к HW0 - 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 предлагает оптимизацию (желтым подчеркивает), например, заменить лямбду на ссылку на метод (method reference), соглашайтесь (Alt+Enter) - 8: Пользуйтесь форматированием кода в IDEA: `Alt+Ctrl+L` - 9: Перед check-in (отправкой изменений на GitHub) просматривайте внесенные изменения (Git -> [Log](https://www.jetbrains.com/help/idea/log-tab.html) -> курсор на файл и Ctrl+D): не оставляйте в коде ничего лишнего (закомментированный код, TODO и пр.). Если файл не меняется (например только пробелы или переводы строк), не надо его чекинить, делайте ему `revert` (Git -> Revert / `Ctrl+Alt+Z`). - 10: `System.out.println` нельзя использовать нигде, кроме как в `main`. Позже введем логирование. - 11: Результаты, возвращаемые `UserMealsUtil.filteredByStreams`, мы будем использовать [в нашем приложении](http://javaops-demo.ru/topjava) для фильтрации по времени и отображения еды правильным цветом. - 12: Обращайте внимание на комментарии к вашим коммитам в Git. Они должны быть короткие и информативные (лучше на english) - 13: Не полагайтесь в решении на то, что список еды будет подаваться отсортированным. Такого условия нет. ----- > - ДЗ первого урока будет связано с созданием небольшого [CRUD](https://ru.wikipedia.org/wiki/CRUD)-приложения (в памяти, без базы данных) на JSP и сервлетах > - основы JavaScript необходимы для понимания проекта, начиная с 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"](https://www.youtube.com/playlist?list=PLyxk-1FCKqockmP-fXZmHQ7UlYP3qvZRa) - 1-й урок MasterJava: Многопоточность - [Основы Java garbage collection](http://web.archive.org/web/20180831013112/https://ggenikus.github.io/blog/2014/05/04/gc) - Размер Java объектов - Введение в Java Reflection API - Структуры данных в картинках - Обзор java.util.concurrent.* - Синхронизация потоков - String literal pool - Маленькие хитрости Java - A Guide to Java 8 ### Туториалы, разное - [Открытый курс: Spring Boot + HATEOAS](https://javaops.ru/view/bootjava) - [Что нужно знать о бэкенде новичку в веб-разработке](https://tproger.ru/translations/backend-web-development) - [Туториалы: Spring Framework, Hibernate, Java Core, JDBC](http://proselyte.net/tutorials/) #### Сервлеты - Как создать Servlet? Полное руководство. - [Сервлеты](https://metanit.com/java/javaee/4.1.php) #### Туториалы по Spring - [Юрий Ткач: Spring Framework - The Basics](https://www.youtube.com/playlist?list=PL6jg6AGdCNaWF-sUH2QDudBRXo54zuN1t) - [Java Brains: Spring Framework](https://www.youtube.com/playlist?list=PLC97BDEFDCDD169D7) - [Тимур Батыршинов: Spring Core - основы фреймворка, ядро](https://www.youtube.com/watch?v=CfHDr-19WWY&list=PL8X2nqRlWfaYYP1-qXjdPKE7bXYkl6aL4) - [alishev: Spring Framework](https://www.youtube.com/playlist?list=PLAma_mKffTOR5o0WNHnY0mTjKxnCgSXrZ) #### 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