From e1f2a8d047d74a6682ad670d0e3d8687b3a5b873 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 25 Apr 2023 12:58:42 +0300 Subject: [PATCH 01/28] Update graduation.md --- graduation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index 3d526124c670..d31115e0e461 100644 --- a/graduation.md +++ b/graduation.md @@ -1,6 +1,6 @@ ## Выпускной проект [стажировки TopJava](https://javaops.ru/view/topjava) -Design and implement a REST API using Hibernate/Spring/SpringMVC (or Spring-Boot) **without frontend**. +Design and implement a REST API using Spring-Boot/Spring Data JPA **without frontend**. The task is: From 8224d026a6643428c49f0734742fa1677cafb28c Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 2 May 2023 00:19:23 +0300 Subject: [PATCH 02/28] Update graduation.md --- graduation.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/graduation.md b/graduation.md index d31115e0e461..e98287fce795 100644 --- a/graduation.md +++ b/graduation.md @@ -59,8 +59,7 @@ _Антуан де Сент-Экзюпери_ - [Лучшие практики разработки REST API: правила 1-7,15-17](https://tproger.ru/translations/luchshie-praktiki-razrabotki-rest-api-20-sovetov/) - 2.5: Разделение на роли я предпочитаю на уровне URL. Сразу и однозначно видно, какой API у админа, какое у пользователя (API админа начинается, например, с */admin/...*). - 2.6: На управление (CRUD) ресторанами и едой должны быть ОТДЕЛЬНЫЕ контроллеры. Не надо все, что может админ, сваливать в одну кучу! -- 2.7: Проверьте в Swagger, что в POST и PUT нет ничего лишнего, а в GET есть все необходимые данные. Например, при запросе голоса должен быть `id` ресторана, а при -создании-редактировании ресторана не должно быть меню и еды. +- 2.7: Проверьте в Swagger, что в POST и PUT нет ничего лишнего, а в GET есть все необходимые данные. Например, при запросе голоса должен в ответе отображаться `id` ресторана, а не весь объект, при создании-редактировании ресторана в примерах swagger не должно быть меню и еды. - 2.8: `Profile` означает, что данные принадлежат профилю пользователя. Все остальное называйте по-другому. - 2.9: Отсутствие данных часто бывает "бизнес кейсом", те НЕ ошибкой в запросе или приложении. В этом случае не надо исключений, просто возвращайте пустой ответ. From cac6ec6e1345b35fc4bfacd7be6f6b4a17cc7bb4 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 12 May 2023 13:45:15 +0300 Subject: [PATCH 03/28] Update graduation.md --- graduation.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/graduation.md b/graduation.md index e98287fce795..ed37f0cdbe19 100644 --- a/graduation.md +++ b/graduation.md @@ -97,7 +97,7 @@ _Антуан де Сент-Экзюпери_ ### 6: Доступ к БД - 6.1: Используйте Spring Data JPA (без лишней делегации). Методы Repository можно вызывать напрямую из сервиса или из контроллера. -- 6.2: Если приложению в объекте требуется только его id, используйте reference (`getById`) +- 6.2: Если приложению в объекте требуется только его id, используйте reference (`getReferenceById`) - 6.3: В DATA-JPA 2.x используются `Optional`. Попробуйте работать с ними, это безопасный способ работать с null-значениями (используйте `orElseThrow`) - 6.4: Не делайте при обновлении записи ради экономии пары строчек кода так: ``` @@ -114,16 +114,15 @@ repository.save(entity) - 7.2: Тщательно считайте количество обращений в базу на каждый запрос. Особенно при запросах от юзеров, которых очень много! Также на сложность запросов от них, чтобы не положить базу - 7.3: Сделайте [индексы к таблицам](https://ru.wikipedia.org/wiki/Индекс_(базы_данных)). Попробуйте обеспечить UNIQUE (один голос пользователя в день, один уникальный пункт меню в день). Следите за **порядком полей в индексе**, от этого зависит индексирование запросов. -- 7.4: При популировании добавь записи за сегодняшний день - `now()`, чтобы всегда были актуальные исходные данные +- 7.4: При популировании добавь записи за сегодняшний день - `now()`, чтобы всегда были актуальные исходные данные - 7.5: Поля базы case insensitive, не пишите camelStyle (для которых нужны кавычки) - 7.6: Таблицы обычно именуются в единственном числе. Исключение - `users`, `orders` и другие зарезервированные слова - 7.7: `date`/`timestamp` - зарезервированное слово, лучше избегать их при именовании полей ### 8: Security -- 8.1: Проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, Доступ к AuthorizedUser). +- 8.1: Проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, доступ к AuthorizedUser). - 8.2: Я предпочитаю четкое разделение ролей на основе URL. Для админа URL содержит `/admin` -- 8.3: Еще раз - призываю не менять код TopJava ### 9: Кэширование @@ -133,8 +132,8 @@ repository.save(entity) ### 10: Валидация -- 10.1: Одних аннотаций валидации недостаточно. Должны быть `@Valid/@Validation` -- 10.2: Проверяйте входные данные при `create/update` в контроллерах! В TopJava это `ValidationUtil.checkNew()/assureIdConsistent()` +- 10.1: Одних аннотаций валидации на полях недостаточно. Должны быть `@Valid/@Validation` в контроллере +- 10.2: Прячте `id` при `create/update` в примерах Swagger. Если их передали - проверяйте на соответствие (в TopJava это `ValidationUtil.checkNew()/assureIdConsistent()`) ### 11: Дополнительно @@ -145,7 +144,7 @@ repository.save(entity) - 12.1: Поместите вначале `readme` ТЗ или **ссылку на него** - будет понятно о чем твой проект - 12.2: Если задание на English, описание пиши также на English (то же самое относится к языку резюме: вакансия на English предполагает резюме на English) -- 12.3: Требуемые примеры `curl` не прячьте, а пишите здесь! Оптимально здесь должна быть ссылка на `Swagger UI` с креденшелами для выполнения запросов +- 12.3: Требуемые примеры `curl` не прячьте, а пишите здесь! Оптимально сделать **ссылку на `Swagger UI` с креденшелами для выполнения запросов** - 12.4: Проверяют люди с опытом в Java: не надо писать инструкций, как устанавливать Java и Maven ### 13: Git From ccb9d8d918333cdaa11443dbe926d10046b2e232 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 12 May 2023 18:42:58 +0300 Subject: [PATCH 04/28] Update graduation.md --- graduation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graduation.md b/graduation.md index ed37f0cdbe19..b9705b1bc8d0 100644 --- a/graduation.md +++ b/graduation.md @@ -51,11 +51,11 @@ _Антуан де Сент-Экзюпери_ - 2.1: API продумывай с точки зрения не программиста и объектов, а с точки зрения того, кто им будет пользоваться (клиента, UI) - 2.1: Тщательно считайте количество запросов в вашем API для отображения нужной информации - 2.3: Из потребностей приложения (клиента) реализуй только очевидные сценарии. Необходимо и достаточно: ВСЕ НЕОБХОДИМОЕ для клиента и НИЧЕГО ЛИШНЕГО. Процесс творческий, приходит с опытом. -- 2.4: Делаем REST API в соответствии с концепцией REST (url в общем имеют вид`{ресурс}/{id_ресурсa}[/{подресурс}/{id_подресурсa}][параметры]`). Имена ресурсов во множественном числе! +- 2.4: Делаем REST API в соответствии с концепцией REST (url в общем имеют вид`{ресурс}/{id_ресурсa}[/{подресурс}/{id_подресурсa}][параметры]`, см. ниже ссылки про REST и иерархию). Имена ресурсов во множественном числе! Самая распространенная и грубая ошибка - не придерживаться этих простых правил. - **[15 тривиальных фактов о правильной работе с протоколом HTTP](https://habrahabr.ru/company/yandex/blog/265569/)** - **[10 Best Practices for Better RESTful API](https://medium.com/@mwaysolutions/10-best-practices-for-better-restful-api-cbe81b06f291)** - - [REST resource hierarchy](https://stackoverflow.com/questions/20951419/what-are-best-practices-for-rest-nested-resources) + - **[REST resource hierarchy](https://stackoverflow.com/questions/20951419/what-are-best-practices-for-rest-nested-resources)** - [Лучшие практики разработки REST API: правила 1-7,15-17](https://tproger.ru/translations/luchshie-praktiki-razrabotki-rest-api-20-sovetov/) - 2.5: Разделение на роли я предпочитаю на уровне URL. Сразу и однозначно видно, какой API у админа, какое у пользователя (API админа начинается, например, с */admin/...*). - 2.6: На управление (CRUD) ресторанами и едой должны быть ОТДЕЛЬНЫЕ контроллеры. Не надо все, что может админ, сваливать в одну кучу! From 9a9a14ad8b83b54a9bacf2731696658bb894a17e Mon Sep 17 00:00:00 2001 From: JavaOPs Date: Thu, 22 Jun 2023 00:33:20 +0300 Subject: [PATCH 05/28] Update md --- README.md | 1 + graduation.md | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c2ab201a624d..139ce5792c1d 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ Java Enterprise Online Project - Переключиться в основную ветку проекта `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) diff --git a/graduation.md b/graduation.md index b9705b1bc8d0..a12812b65825 100644 --- a/graduation.md +++ b/graduation.md @@ -77,7 +77,7 @@ _Антуан де Сент-Экзюпери_ ### 4: Модель -- 4.1: В БД обычно хранятся все введенные пользователем и админом данные (история). Они не удаляются и не переписываются заново. Есть базовые вещи, которые закладываются в архитектуру приложения, и есть неочевидные доработки к ТЗ, делать не надо. +- 4.1: В БД обычно хранятся все введенные пользователем и админом данные c возможность их редактирования. Это означает, что мы не удаляем прошлые меню, а храним их в базе, как и историю голосования. Есть базовые вещи, которые закладываются в архитектуру приложения, и есть неочевидные доработки к ТЗ, делать не надо. - 4.2: Не делайте в модели объектов, которые не будут использоваться в коде (например, не надо двунаправленных связей, если достаточно однонаправленных) - 4.3: еще раз про [hashCode/equals в Entity](https://stackoverflow.com/questions/5031614/the-jpa-hashcode-equals-dilemma): не делайте в модели сравнение по полям! - 4.4: ORM работает с объектами. [Иногда, для упрощения логики, fk_id как поля допустимы](https://stackoverflow.com/questions/6311776/hibernate-foreign-keys-instead-of-entities) @@ -97,9 +97,8 @@ _Антуан де Сент-Экзюпери_ ### 6: Доступ к БД - 6.1: Используйте Spring Data JPA (без лишней делегации). Методы Repository можно вызывать напрямую из сервиса или из контроллера. -- 6.2: Если приложению в объекте требуется только его id, используйте reference (`getReferenceById`) -- 6.3: В DATA-JPA 2.x используются `Optional`. Попробуйте работать с ними, это безопасный способ работать с null-значениями (используйте `orElseThrow`) -- 6.4: Не делайте при обновлении записи ради экономии пары строчек кода так: +- 6.2: В DATA-JPA 2.x используются `Optional`. Попробуйте работать с ними, это безопасный способ работать с null-значениями (используйте `orElseThrow`) +- 6.3: Не делайте при обновлении записи ради экономии пары строчек кода так: ``` if(updateCondition) repository.delete(entity) @@ -123,6 +122,7 @@ repository.save(entity) - 8.1: Проверьте, станет ли код проще с `@AuthenticationPrincipal` (урок 11, доступ к AuthorizedUser). - 8.2: Я предпочитаю четкое разделение ролей на основе URL. Для админа URL содержит `/admin` +- 8.3: Еще раз - призываю не менять код TopJava ### 9: Кэширование @@ -163,3 +163,7 @@ repository.save(entity) - 13.2: API ДОЛЖЕН соответствовать принципам REST (см. ссылки выше) - 13.3: ОБЯЗАТЕЛЬНО: запустите `mvn test` - ошибок быть не должно - 13.4: ОБЯЗАТЕЛЬНО: запустите приложение без всяких предварительных настроек (базы, переменных окружения, ..), лучше на другом компьютере. Приложение должно запускаться и работать! + +## Оценка +ТЗ очень скромное, не дает понимания, что хочет получить заказчик, именно поэтому моих комментариев к этому ТЗ больше на 2 порядка. Это реальное тестовое задание на работу. При оценке учитывается отсутствие грубых ляпов, простота и красота решения + его расширяемость, если понадобится дорабатывать приложение. Если практический опыт небольшой, еще раз очень рекомендую держаться как можно ближе к нашему коду на Spring Boot. +Тестовое задание дается для того, чтобы оценить вас, как программиста. Нужны ли вы компании или нет. Это умение спроектировать грамотную модель и API, придерживаясь принципов REST и без своих велосипедов, и ваш чистый красивый код. From f4a12f593c1544ba5d555b7413ab97f60aeb3275 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 28 Jun 2023 13:39:53 +0300 Subject: [PATCH 06/28] Add junior hint --- cv.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/cv.md b/cv.md index 805af727a784..8e57cfda209d 100644 --- a/cv.md +++ b/cv.md @@ -106,11 +106,14 @@ - Грамотно уделяй время каждой проблеме. Две крайности: сразу бросаться за помощью и биться над проблемой часами. Пробуй решить ее сам и, в зависимости от проблемы, выделяй на это разумное время. -- Если тебе что-то объясняют по проекту - обязательно записывай. -- Когда получаешь задачу - уточни все очень подробно. -- Получай в процессе решения обратную связь - в том ли направлении ты идешь. -- Не игнорируй совместные ланчи (курилки) -- Готовься к стендапам/летучкам. Задавай на них вменяемые вопросы. Выказывай заинтересованность +- Не бросайся сразу писать код, поищи в проекте схожий функционал! И далее - минимум своих подходов, если хотите внести что-то свое - обязательно спросите! +Проект должен быть однотипным по максимуму во всех мелочах: - описание, пакеты, имена классов и методов и даже переменных, реализация, хелп. +Обычно можно найти сходный функционал, взять его себе и делать в нем изменения под свою реализацию. +- Если тебе что-то объясняют по проекту - обязательно записывай. +- Когда получаешь задачу - уточни все очень подробно. Если задач несколько - обязательно выясни приоритеты! +- Получай в процессе решения обратную связь - в том ли направлении ты идешь +- Не игнорируй совместные ланчи (курилки) +- Готовься к стендапам/летучкам. Задавай на них вменяемые вопросы. Выказывай заинтересованность - Выдели самое главное путем опроса босса и важных коллег. Не распыляйся на мелочи. - [**5 вещей, которые разработчик должен сделать прежде чем попросить о помощи**](https://techrocks.ru/2018/07/16/5-things-a-developer-should-do-before-asking-for-help/) - [**Советы новичкам**](http://blog.csssr.ru/2016/09/19/how-to-be-a-beginner-developer) From 2b4dff034e2933f1b6e1c145a104aad5db655fb3 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 28 Jun 2023 13:55:59 +0300 Subject: [PATCH 07/28] Update graduation.md --- graduation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index a12812b65825..d66f1c35e95a 100644 --- a/graduation.md +++ b/graduation.md @@ -61,7 +61,7 @@ _Антуан де Сент-Экзюпери_ - 2.6: На управление (CRUD) ресторанами и едой должны быть ОТДЕЛЬНЫЕ контроллеры. Не надо все, что может админ, сваливать в одну кучу! - 2.7: Проверьте в Swagger, что в POST и PUT нет ничего лишнего, а в GET есть все необходимые данные. Например, при запросе голоса должен в ответе отображаться `id` ресторана, а не весь объект, при создании-редактировании ресторана в примерах swagger не должно быть меню и еды. - 2.8: `Profile` означает, что данные принадлежат профилю пользователя. Все остальное называйте по-другому. -- 2.9: Отсутствие данных часто бывает "бизнес кейсом", те НЕ ошибкой в запросе или приложении. В этом случае не надо исключений, просто возвращайте пустой ответ. +- 2.9: Отсутствие данных часто бывает "бизнес кейсом", те НЕ ошибкой в запросе или приложении. Исключение - это ошибка, например неверный `id`. Запрос на данные, которые могут быть, могут нет, не должен приводить к исключениям. Посмотрите в сторону `ResponseEntity.of()` ### 3: Код: - 3.1: Строго соблюдайте соглашения Java по именованию: пакеты ТОЛЬКО маленькими буквами, методы начинаются с маленькой буквы, классы с большой. Незнания Java Core - тестовое задание сразу в корзину. From c09023eaa6d6415c2997973e8080e2d2fb76bfc1 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 13 Jul 2023 23:20:46 +0300 Subject: [PATCH 08/28] Update cv.md --- cv.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cv.md b/cv.md index 8e57cfda209d..c9312fbf9a52 100644 --- a/cv.md +++ b/cv.md @@ -34,6 +34,7 @@ ## [Тестовое собеседование, самые спрашиваемые темы](http://javaops.ru/interview/test.html) ### Интервью: +- [Собеседования для бэкендеров: как готовиться, тренироваться и не облажаться](https://habr.com/ru/companies/getmatch/articles/744760/) - [10 неочевидных фактов об ИТ-собеседованиях](https://proglib.io/p/molchanie-intervyuera-ili-10-neochevidnyh-faktov-ob-it-sobesedovaniyah-2022-06-14) - Михаил Портнов. Собеседование на работу: как продать себя грамотно - Михаил Портнов. Какие вопросы мы задаем на собеседовании? From ea09ef21261ecf957ceb23d03b2b7c41f2f9195d Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 5 Sep 2023 19:04:33 +0300 Subject: [PATCH 09/28] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 139ce5792c1d..370205362722 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Java Enterprise Online Project +[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. From 9150a3487e86c2695bc321599579cb4c14da24e0 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 6 Sep 2023 22:47:41 +0300 Subject: [PATCH 10/28] Update graduation.md --- graduation.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index d66f1c35e95a..4e961189aed0 100644 --- a/graduation.md +++ b/graduation.md @@ -62,7 +62,8 @@ _Антуан де Сент-Экзюпери_ - 2.7: Проверьте в Swagger, что в POST и PUT нет ничего лишнего, а в GET есть все необходимые данные. Например, при запросе голоса должен в ответе отображаться `id` ресторана, а не весь объект, при создании-редактировании ресторана в примерах swagger не должно быть меню и еды. - 2.8: `Profile` означает, что данные принадлежат профилю пользователя. Все остальное называйте по-другому. - 2.9: Отсутствие данных часто бывает "бизнес кейсом", те НЕ ошибкой в запросе или приложении. Исключение - это ошибка, например неверный `id`. Запрос на данные, которые могут быть, могут нет, не должен приводить к исключениям. Посмотрите в сторону `ResponseEntity.of()` - +- 2.10: По REST url должно быть однозначно понятно, какие будут параметры на входе и что ждат на выходе. Без сюрпризов! + ### 3: Код: - 3.1: Строго соблюдайте соглашения Java по именованию: пакеты ТОЛЬКО маленькими буквами, методы начинаются с маленькой буквы, классы с большой. Незнания Java Core - тестовое задание сразу в корзину. - 3.2 В проекте (и тестовом задании на работу), в отличие от нашего учебного topjava, оставляйте только необходимый для работы по ТЗ приложения код, ничего лишнего From e6465ff47db256d8162556a4844ce784a8dad5e4 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 6 Sep 2023 22:49:14 +0300 Subject: [PATCH 11/28] Update graduation.md --- graduation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index 4e961189aed0..7a9a89f26413 100644 --- a/graduation.md +++ b/graduation.md @@ -62,7 +62,7 @@ _Антуан де Сент-Экзюпери_ - 2.7: Проверьте в Swagger, что в POST и PUT нет ничего лишнего, а в GET есть все необходимые данные. Например, при запросе голоса должен в ответе отображаться `id` ресторана, а не весь объект, при создании-редактировании ресторана в примерах swagger не должно быть меню и еды. - 2.8: `Profile` означает, что данные принадлежат профилю пользователя. Все остальное называйте по-другому. - 2.9: Отсутствие данных часто бывает "бизнес кейсом", те НЕ ошибкой в запросе или приложении. Исключение - это ошибка, например неверный `id`. Запрос на данные, которые могут быть, могут нет, не должен приводить к исключениям. Посмотрите в сторону `ResponseEntity.of()` -- 2.10: По REST url должно быть однозначно понятно, какие будут параметры на входе и что ждат на выходе. Без сюрпризов! +- 2.10: По REST URL должно быть однозначно понятно, какие будут параметры на входе и что ждать на выходе. Без сюрпризов! ### 3: Код: - 3.1: Строго соблюдайте соглашения Java по именованию: пакеты ТОЛЬКО маленькими буквами, методы начинаются с маленькой буквы, классы с большой. Незнания Java Core - тестовое задание сразу в корзину. From 29cf805afc5e32960732c104b46952e24b4b8c35 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 20 Sep 2023 14:00:56 +0300 Subject: [PATCH 12/28] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 370205362722..4e07fe385b23 100644 --- a/README.md +++ b/README.md @@ -223,6 +223,12 @@ - Как создать 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 From a7b64f9a60ff9c58ed93e2d07d6d386e32dadf45 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 5 Oct 2023 13:17:05 +0300 Subject: [PATCH 13/28] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e07fe385b23..bca057919ef7 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ ## ![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. Работа с проектом (выполнять инструкции) +## ![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`** From d6d3069bc2ae8207a9239d25d35181631044173a Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 10 Oct 2023 23:16:35 +0300 Subject: [PATCH 14/28] Update graduation.md --- graduation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graduation.md b/graduation.md index 7a9a89f26413..331fb082b533 100644 --- a/graduation.md +++ b/graduation.md @@ -58,7 +58,7 @@ _Антуан де Сент-Экзюпери_ - **[REST resource hierarchy](https://stackoverflow.com/questions/20951419/what-are-best-practices-for-rest-nested-resources)** - [Лучшие практики разработки REST API: правила 1-7,15-17](https://tproger.ru/translations/luchshie-praktiki-razrabotki-rest-api-20-sovetov/) - 2.5: Разделение на роли я предпочитаю на уровне URL. Сразу и однозначно видно, какой API у админа, какое у пользователя (API админа начинается, например, с */admin/...*). -- 2.6: На управление (CRUD) ресторанами и едой должны быть ОТДЕЛЬНЫЕ контроллеры. Не надо все, что может админ, сваливать в одну кучу! +- 2.6: На управление (CRUD) ресторанами и едой должны быть ОТДЕЛЬНЫЕ контроллеры. Не надо все, что может админ, сваливать в одну кучу! Смотрите на результат операции - помещаете в этот контроллер! - 2.7: Проверьте в Swagger, что в POST и PUT нет ничего лишнего, а в GET есть все необходимые данные. Например, при запросе голоса должен в ответе отображаться `id` ресторана, а не весь объект, при создании-редактировании ресторана в примерах swagger не должно быть меню и еды. - 2.8: `Profile` означает, что данные принадлежат профилю пользователя. Все остальное называйте по-другому. - 2.9: Отсутствие данных часто бывает "бизнес кейсом", те НЕ ошибкой в запросе или приложении. Исключение - это ошибка, например неверный `id`. Запрос на данные, которые могут быть, могут нет, не должен приводить к исключениям. Посмотрите в сторону `ResponseEntity.of()` From 3c099a08d3f785507084267a83e63d1f0867c6cd Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 10 Jan 2024 20:28:53 +0500 Subject: [PATCH 15/28] Update cv.md --- cv.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cv.md b/cv.md index c9312fbf9a52..6317f14eb1c6 100644 --- a/cv.md +++ b/cv.md @@ -5,6 +5,7 @@ - Научиться программировать сложнее, чем кажется - [Собеседование. Разработка ПО. Вопросы.](https://drive.google.com/file/d/0B9Ye2auQ_NsFQVc2WUdCR0xvLWM/view?usp=sharing&resourcekey=0-HaWoRxoyboMSKjg5P2I1cQ) - [Набор ссылок для тренировки и прохождения интервью](https://github.com/andreis/interview) +- [Полезные советы Jun-ам](https://github.com/JavaOPs) ### Составление резюме: - [VisualCV: create resume in minutes](https://www.visualcv.com/) From d18519566b7ee80936443b5bf60b20afe948517a Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 8 Feb 2024 20:45:16 +0300 Subject: [PATCH 16/28] Update graduation.md --- graduation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/graduation.md b/graduation.md index 331fb082b533..7488e41f0ea8 100644 --- a/graduation.md +++ b/graduation.md @@ -151,6 +151,7 @@ repository.save(entity) ### 13: Git - 13.1: Должна быть история ваших комитов с внятными комментариями. Это смотрят. +> Эйчар обращает внимание на дату создания аккаунта и то, как в него заливались коммиты (элементы проекта), постепенно или в один день, насколько технологии в аккаунте коррелируют с технологиями в резюме - 13.2: Не комить служенбые файлы: логи, DB, настройки IDEA и пр., это сразу - уровень Junior. - 13.3: Все служебные файлы должны быть в `.gitignore` From 4b5c99912f8a005d351cf8b6d7e5e562505c3f80 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 20 Mar 2024 12:57:59 +0300 Subject: [PATCH 17/28] Update cv.md --- cv.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cv.md b/cv.md index 6317f14eb1c6..c808b25f0c52 100644 --- a/cv.md +++ b/cv.md @@ -91,6 +91,7 @@ ### После прохождения испытательного срока жду твою [историю успеха](http://javaops.ru/view/story) ### Основные сайты поиска работы: +- [Актуальная подборка Junior вакансий от CodeReview](https://jobs.yourcodereview.com/jobs?utm_source=partner&utm_medium=javaops&utm_campaign=landing) - Яндекс агрегатор - HH - LinkedIn From e5eeafab6c360d8ad23ff8900c4b3d7e26f5ee42 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 20 Mar 2024 13:09:36 +0300 Subject: [PATCH 18/28] Update cv.md --- cv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cv.md b/cv.md index c808b25f0c52..e2176bfe9006 100644 --- a/cv.md +++ b/cv.md @@ -91,7 +91,7 @@ ### После прохождения испытательного срока жду твою [историю успеха](http://javaops.ru/view/story) ### Основные сайты поиска работы: -- [Актуальная подборка Junior вакансий от CodeReview](https://jobs.yourcodereview.com/jobs?utm_source=partner&utm_medium=javaops&utm_campaign=landing) +- [Актуальная подборка Junior вакансий от CodeReview](https://jobs.yourcodereview.com?utm_source=partner&utm_medium=javaops&utm_campaign=landing) - Яндекс агрегатор - HH - LinkedIn From c007727e4d3917d9b3b412780132ec4b4018098d Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 3 Sep 2024 14:59:23 +0300 Subject: [PATCH 19/28] Update graduation.md --- graduation.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/graduation.md b/graduation.md index 7488e41f0ea8..a2192f1845c8 100644 --- a/graduation.md +++ b/graduation.md @@ -31,7 +31,8 @@ P.P.S.: Assume that your API will be used by a frontend developer to build front - **Не изобретай велосипедов!** Грубая ошибка - пытаться сделать стандартные вещи по-своему, чаще всего криво. На проекте все должно быть единообразно! Ваш проект TopJava - сделай все МАКСИМАЛЬНО в этом стиле. Если тебе кажется, что есть лучшее решение, чем в TopJava - пишите мне в личку, я всегда открыт для улучшений. -- **Рекомендую писать проект на востребованном на рынке стеке**: Spring Boot + Spring Data JPA (работа с БД) + Swagger/OpenAPI 3.0 (REST документация). **Оптимально подойдет код миграции TopJava на Spring Boot в конце стажировки**. +- **Рекомендую писать проект на востребованном на рынке стеке**: Spring Boot + Spring Data JPA (работа с БД) + Swagger/OpenAPI 3.0 (REST документация). +- **Оптимально подойдет код миграции TopJava на Spring Boot в конце стажировки или [курса BootJava](https://javaops.ru/view/bootjava)** *Представьте себе, что ПМ (лид, архитектор) дал вам ТЗ и некоторое время недоступен. У вас, конечно, есть много мыслей, для чего нужно приложение, как исправить ТЗ, дополнить его и сделать правильно. НО НЕ НАДО ИХ РЕАЛИЗОВЫВАТЬ В КОДЕ. Нужно сделать все строго по ТЗ, максимально просто, удобно для доработок и для использования со стороны клиента.* @@ -86,7 +87,7 @@ _Антуан де Сент-Экзюпери_ ### 5: Архитектура / pom - 5.1: Можно: - или подключить DATA-REST (см.курс [Spring Boot 2.x + HATEOAS](https://javaops.ru/view/bootjava)). Контроллеры генерируются автоматически по репозиториям, требуется настройка ресурсов в кастомных контроллерах - - или делать на основе миграции TopJava / кода [TopJava-2](https://github.com/JavaOPs/topjava2) + - **РЕКОМЕНДУЕТСЯ** делать на основе миграции TopJava / кода [курса BootJava](https://javaops.ru/view/bootjava) Нельзя смешивать эти подходы вместе! Я рекомендую 2-й вариант, без data-rest. Обязательно посмотрите в Swagger, какие контроллеры получились в результате. - 5.2: Не размещайте бизнес-логику приложения и преобразования в TO в слое доступа к DB From 9da336dd82b68a1be4e68054a28634df7e7a22cf Mon Sep 17 00:00:00 2001 From: JavaOPs Date: Fri, 27 Sep 2024 16:35:15 +0300 Subject: [PATCH 20/28] fix --- doc/video1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/video1.md b/doc/video1.md index 3c62fc31b3f6..d1d9b16482e5 100644 --- a/doc/video1.md +++ b/doc/video1.md @@ -65,7 +65,7 @@ Помимо известного всем Hibernate, можно столкнуться с использованием JOOQ или чистого JDBC. Зачастую на проектах используются готовые решения -для хеширования данных (Redis), поисковые движки (ElasticSearch), +для кэширования данных (Redis), поисковые движки (ElasticSearch), различные брокеры сообщений (RabbitMQ, ActiveMQ, Kafka). Инфраструктура проектов также может быть довольно сложной. From 1c12a29768a70e3a7cef936a39a44878efa59c37 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 27 Sep 2024 23:24:52 +0300 Subject: [PATCH 21/28] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bca057919ef7..a567639aa2e2 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ ## Описание и план проекта ### Демо разрабатываемого приложения ### [Изменения проекта (Release Notes)](ReleaseNotes.md) -### Требования к участникам, Wiki +### Требования к участникам, Wiki ### Составление резюме, подготовка к интервью, поиск работы Обновленное вводное занятие (обязательно смотреть все видео) From b80810674939a83fadf791e0f1db59cc9b63b674 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 27 Sep 2024 23:25:48 +0300 Subject: [PATCH 22/28] Update ReleaseNotes.md --- ReleaseNotes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index f7d46f6540a2..f6ef9b44af59 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,7 +1,7 @@ # TopJava Release Notes ### TopJava 26 -- починили шаблоны запросов на создание в Swagger хчз [ApiModelProperty](https://www.baeldung.com/spring-swagger-hide-field) +- починили шаблоны запросов на создание в Swagger через [ApiModelProperty](https://www.baeldung.com/spring-swagger-hide-field) - в новой версии Data JPA `getById`->`getReferenceById` - мелкие правки From 391b35e234400509bee1677d236cd030b2fd8591 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 27 Sep 2024 23:26:10 +0300 Subject: [PATCH 23/28] Update ReleaseNotes.md --- ReleaseNotes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index f6ef9b44af59..40fef33ddfb3 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -6,7 +6,7 @@ - мелкие правки ### TopJava 25 -- поправил `NoHtmlValidator`: `Jsoup.clean().equals -> `Jsoup.isValid` +- поправил `NoHtmlValidator`: `Jsoup.clean().equals` -> `Jsoup.isValid` - починил `role VARCHAR NOT NULL` - добавил нового тестового пользователя `guest` From 286e4142d23c9437c995a2a97988bdd77c59ac5d Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 3 Oct 2024 12:37:11 +0300 Subject: [PATCH 24/28] Update cv.md --- cv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cv.md b/cv.md index e2176bfe9006..2f01659fea12 100644 --- a/cv.md +++ b/cv.md @@ -119,7 +119,7 @@ - Готовься к стендапам/летучкам. Задавай на них вменяемые вопросы. Выказывай заинтересованность - Выдели самое главное путем опроса босса и важных коллег. Не распыляйся на мелочи. - [**5 вещей, которые разработчик должен сделать прежде чем попросить о помощи**](https://techrocks.ru/2018/07/16/5-things-a-developer-should-do-before-asking-for-help/) -- [**Советы новичкам**](http://blog.csssr.ru/2016/09/19/how-to-be-a-beginner-developer) +- [**Советы новичкам**](https://blog.csssr.com/ru/article/how-to-be-a-beginner-developer) - [ТОП-13 ошибок начинающего программиста](https://proglib.io/p/beginners-fails/) - [25 ошибок начинающего программиста](https://habr.com/ru/post/413129/) - [Путеводитель по синдрому самозванца](https://vc.ru/hr/167443-eshche-odin-putevoditel-po-sindromu-samozvanca-korni-prichiny-simptomy-i-posledstviya-chast-1) From dde9b4963c0abb0267380465fb5e06c1dea80a4d Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 10 Oct 2024 20:57:32 +0300 Subject: [PATCH 25/28] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index a567639aa2e2..2122dc19a8f4 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,9 @@ ## ![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`: From 0d9fa943cb2a03686f952d901b58dfa6d6f03a2e Mon Sep 17 00:00:00 2001 From: JavaOPs Date: Wed, 28 May 2025 23:34:55 +0300 Subject: [PATCH 26/28] fix url and update maven-compiler-plugin --- pom.xml | 4 ++-- src/main/java/ru/javawebinar/topjava/Main.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 0b1c2896da5b..cf231320e25d 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 1.0-SNAPSHOT Calories Management - http://topjava.herokuapp.com/ + https://javaops-demo.ru/topjava 1.8 @@ -24,7 +24,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.1 + 3.14.0 ${java.version} ${java.version} diff --git a/src/main/java/ru/javawebinar/topjava/Main.java b/src/main/java/ru/javawebinar/topjava/Main.java index c2f9cc618f7c..723742bacade 100644 --- a/src/main/java/ru/javawebinar/topjava/Main.java +++ b/src/main/java/ru/javawebinar/topjava/Main.java @@ -1,7 +1,7 @@ package ru.javawebinar.topjava; /** - * @see Demo application + * @see Demo application * @see Initial project */ public class Main { From ff62c330df026e202497fae5e616cdfc578866a1 Mon Sep 17 00:00:00 2001 From: JavaOPs Date: Tue, 28 Apr 2026 13:32:35 +0300 Subject: [PATCH 27/28] update readme --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2122dc19a8f4..55dfac682b36 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [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. +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), DataTables, jQuery + plugins, Stream and Time API и хранением в базах данных Postgresql и HSQLDB. ![topjava_structure](https://javaops.ru/static/images/projects/top-scheme.jpg) @@ -14,7 +14,7 @@ ## Описание и план проекта ### Демо разрабатываемого приложения ### [Изменения проекта (Release Notes)](ReleaseNotes.md) -### Требования к участникам, Wiki +### Требования к участникам, Wiki ### Составление резюме, подготовка к интервью, поиск работы Обновленное вводное занятие (обязательно смотреть все видео) @@ -38,7 +38,7 @@ ## ![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). Иначе впоследствии будут проблемы** +- **ВНИМАНИЕ: выбирайте для проекта простой путь без пробелов и русских букв, например, `c:\projects\topjava\` (Windows). Иначе впоследствии будут проблемы** - **Плагин Git Intergation уже не требуется, а вкладку `Version control` в IDEA переименовали в `Git`** - **C Ultimate IDEA сейчас сложности**, надеемся что временные. - Скачать IDEA и установливать плагины [можно по инструкции](https://github.com/JavaOPs/topjava/wiki/IDEA#download) @@ -67,11 +67,11 @@ - Сделать локальный репозиторий проекта:
git clone https://github.com/[Ваш аккаунт]/topjava.git
-> Вместо Fork можно сделать [клонирование проекта](https://github.com/JavaOPs/topjava/wiki/Git#user-content-Клонирование-проекта): он не будет привязан к исходному https://github.com/JavaOPs/topjava и у него не будет истории. +> Вместо Fork можно сделать [клонирование проекта](https://github.com/JavaOPs/topjava//Git#user-content-Клонирование-проекта): он не будет привязан к исходному https://github.com/JavaOPs/topjava и у него не будет истории. - Открыть и настроить проект в IDEA - Выставить кодировку UTF-8 в консоли - - Поставить кодировку UTF-8 + - Поставить кодировку UTF-8 - Опционально: поменять шрифт по умолчанию на DejaVu или на **новый [JetBrains Mono](https://habr.com/ru/company/jugru/news/t/484134/)** - По ходу видео сделать `Apply Patch...` скачанного патча `Prepare_to_HW0.patch` - Закоммитить и запушить изменения (`commit` + `push`) @@ -121,9 +121,9 @@ #### ВНИМАНИЕ: варианты Optional делайте в одной ветке в разных методах `UserMealsUtil`. Проще делать, проще проверять -### Optional (Java 8 Stream API) +### Optional (Stream API) ``` -Реализовать метод `UserMealsUtil.filteredByStreams` через Java 8 Stream API. +Реализовать метод `UserMealsUtil.filteredByStreams` через Stream API. ``` - Видео: Доступно о Java 8 Lambda - Java 8: Lambda выражения @@ -147,7 +147,7 @@ - без циклов по другим коллекциям/массивам (к ним также относим методы коллекций `addAll()/removeAll()`) - через Stream API за 1 проход по исходному списку `meals.stream()` - нельзя использовать внешние коллекции, не являющиеся частью коллектора - - возможно дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Те например нельзя разбить список на на 2 подсписка с четными и нечетными датами и затем их объединить, с подсчетом превышения для каждого элемента. + - возможно дополнительные проходы по частям списка, при этом превышение должно считаться один раз для всего подсписка. Те например нельзя разбить список на 2 подсписка с четными и нечетными датами и затем их объединить, с подсчетом превышения для каждого элемента. Временная сложность реализации должна быть O(N) (обратите внимание на п. 13 замечаний) Решение должно быть рабочим в общем случае (должно работать в приложении с многими пользователями, не только при запуске `main`) From 1a8d2eee401ff6179c04450f65ea898399af51f5 Mon Sep 17 00:00:00 2001 From: JavaOPs Date: Tue, 28 Apr 2026 13:40:16 +0300 Subject: [PATCH 28/28] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55dfac682b36..72ec4c70d6ec 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ ## ![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** - Скачать IDEA и установливать плагины [можно по инструкции](https://github.com/JavaOPs/topjava/wiki/IDEA#download) - После Trial 30 дней [способы продлить использование](https://github.com/JavaOPs/topjava/wiki/IDEA#licence)