diff --git a/lesson/lesson01.md b/lesson/lesson01.md new file mode 100644 index 00000000..aa5a34c0 --- /dev/null +++ b/lesson/lesson01.md @@ -0,0 +1,115 @@ +# Первое занятие + +## [Демо разрабатываемого приложения](http://javaops-demo.ru/basejava/resume?theme=light) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Видеообзор курса Basejava](https://www.youtube.com/watch?v=0ydTRfKS9yY) + +### Подготовка рабочего окружения +- Установите последнюю версию [JDK](https://www.oracle.com/java/technologies/downloads/) +- Установите систему управления версиями [Git](http://git-scm.com/downloads) +- Создайте аккаунт на [GitHub](https://github.com/) +- Установите [боковую панель](https://topjava.ru/blog/vvedeniye-v-git-github-ustanovka-i-nastroyka#8) для удобной навигации по файлам на GitHub +- Установите [IntelliJ IDEA Community](https://www.jetbrains.com/idea/download/) (Ultimate-версия понадобится позже, при работе с базой данных и web) +- Установите плагин для [Checkstyle](https://topjava.ru/blog/nastroyka-checkstyle-v-intellij-idea) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Разработка ПО](https://drive.google.com/file/d/0B_4NpoQW1xfpVjZUTEpvVUN1TTA/view?usp=sharing&resourcekey=0-hnn1HIBU3WIuDMVuQAxA8w) +- [Мифический человеко-месяц](https://habr.com/ru/companies/raiffeisenbank/articles/533216/) +- [Подборка книг для руководителей в сфере IT](https://habr.com/ru/companies/skyeng/articles/465215/) +- [Размеры проектов в количестве строк кода](https://www.freecodecamp.org/news/the-biggest-codebases-in-history-a128bb3eea73) +- [Соглашения по оформлению кода](https://topjava.ru/blog/google-java-style-guide) +- Методологии разработки ПО: [Agile, Scrum](https://youtu.be/cDvZaXzQezs), [Kanban](https://youtu.be/1_Zti9v5ugA) +- [Методологии разработки и их влияние на качество](https://youtu.be/y4B2Hv3HgpE) +- [Ещё раз про семь основных методологий разработки](https://habr.com/ru/companies/edison/articles/269789/) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Обзор инструментов и технологий](https://drive.google.com/file/d/0B_4NpoQW1xfpTXJYU2xZbjN2d2M/view?usp=sharing&resourcekey=0-Uw_lRGW12YNjwY7phXzVdg) +- [Java в 2025 году](https://habr.com/ru/companies/spring_aio/articles/933180/) +- [State of Developer Ecosystem Report 2025](https://devecosystem-2025.jetbrains.com/ru) +- [Java Trends Report 2025](https://www.infoq.com/articles/java-trends-report-2025/) +- [The 2025 Developer Survey](https://survey.stackoverflow.co/2025) +- Рейтинги языков программирования: [TIOBE](https://www.tiobe.com/tiobe-index/), [PYPL](https://pypl.github.io/PYPL.html), [IEEE](https://spectrum.ieee.org/tag/top-programming-languages) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Обзор языка Java](https://drive.google.com/file/d/0B_4NpoQW1xfpTU5SSElhUjlGNnc/view?usp=sharing&resourcekey=0-DOyRoGhREx2kvKwAKTOlYg) + +![jvm](https://cloud.githubusercontent.com/assets/18701152/15219296/e6c67e86-186b-11e6-986f-651a87deec6c.png) + +- [Java](http://ru.wikipedia.org/wiki/Java), [JIT-компиляция](http://ru.wikipedia.org/wiki/JIT) +- Java [ME](http://ru.wikipedia.org/wiki/Java_Platform,_Micro_Edition), [SE](https://ru.wikipedia.org/wiki/Java_Platform,_Standard_Edition), [EE](http://ru.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition) +- [Что такое JDK? Введение в средства разработки Java](https://topjava.ru/blog/what-is-the-jdk) +- [Что такое JVM? Знакомство с виртуальной машиной Java](https://topjava.ru/blog/what-is-the-jvm) +- [Что такое JRE? Введение в среду выполнения Java](https://topjava.ru/blog/what-is-the-jre) +- [Что такое Java? История создания](http://www.intuit.ru/studies/courses/16/16/lecture/27105) +- [Руководство по массивам в Java](https://topjava.ru/blog/rukovodstvo-po-massivam-v-java-ch1) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Системы управления версиями. Git](https://drive.google.com/file/d/0B9Ye2auQ_NsFSUNrdVc0bDZuX2s/edit?resourcekey=0-6scb0PBj2A3Oqf6rsU2egQ) + +- [Введение в Git: установка и настройка](https://topjava.ru/blog/vvedeniye-v-git-github-ustanovka-i-nastroyka) +- [Введение в Git: базовые команды](https://topjava.ru/blog/vvedeniye-v-git-github-bazovyye-komandy) +- [Введение в Git: ошибки использования](https://topjava.ru/blog/vvedeniye-v-git-oshibki-ispolzovaniya-ch-9) +- [Git: от установки до основных команд](https://tproger.ru/translations/beginner-git-cheatsheet/) +- [Сравнение разных VCS](https://dzen.ru/a/Z0Z0Ry7VD0gfPV5X) +- [Видео-уроки по Git](https://www.youtube.com/playlist?list=PLDyvV36pndZHkDRik6kKF6gSb0N0W995h) +- Интерактивные Git-обучалки: [1](https://githowto.com/ru), [2](http://learngitbranching.js.org) +- [Официальная книга по Git](https://git-scm.com/book/ru/v2) +- [GitHub for beginners](https://github.blog/tag/github-for-beginners/) + +### Настройка проекта +- Создайте на GitHub репозиторий с названием `basejava` +- Откройте консоль у себя на компьютере (в папке, где планируете разместить проект) и выполните следующее: + - **Скачайте копию проекта с заранее заданными классами: `git clone https://github.com/JavaOps/basejava.git`. Реализацию дз выполняйте в рамках данной копии** + - Перейдите в каталог проекта: `cd basejava` + - Настройте git у себя на компьютере на свой репозиторий в GitHub: + - `git remote set-url origin url_на_ваш_basejava-репозиторий.git` — настройка pull + - `git remote set-url --push origin url_на_ваш_basejava-репозиторий.git` — настройка push + - `git remote -v` — удостоверьтесь, что команда выводит ссылки на ваш удаленный репозиторий + - `git push -u origin master` — [устанавливаем связь](https://qna.habr.com/q/118865) между локальной и удаленной веткой master + +## Домашнее задание HW1 +- Откройте в IntelliJ IDEA ваш проект, выбрав каталог `basejava`, который вы скачали ранее к себе на компьютер: + +![Screenshot_5](https://github.com/user-attachments/assets/554c3119-85cc-41be-9ef0-087f360577f4) + +- Реализуйте методы `save, get, delete, clear, getAll, size` в классе `ArrayStorage`, организовав хранение резюме в массиве +- Храните все резюме в начале `storage` (без пустот в виде null), чтобы не перебирать каждый раз 10_000 элементов +- При реализации метода `delete` учитывайте: + - после удаления резюме между оставшимися резюме не должно быть пустых (null) ячеек + - резюме должны размещаться в ячейках под индексами `< size`. В противном случае обнуляйте их +``` +Схема хранения резюме в массиве storage (в элементах от 0 до size - 1 отсутствуют null): + +r1, r2, r3,..., rn, null, null,..., null +<----- size -----> +<------- storage.length (10_000) ------> +``` +- Проверьте вашу реализацию с помощью классов `MainArray.main()` и `MainTestArrayStorage.main()` +- Изучите дополнительные материалы по IntelliJ IDEA: + - [Idea Wiki](https://github.com/JavaOPs/topjava/wiki/IDEA) + - Отладка Java кода в IDEA: [1](https://youtu.be/Z1BQsf0A4xY?si=E8RtUNE1Pm3xP_w9), [2](https://youtu.be/V5iQ1FyRtBo), [3](https://blog.jetbrains.com/idea/2025/04/debugging-java-code-in-intellij-idea/) + - [Эффективная работа с кодом в IntelliJ IDEA](https://www.youtube.com/watch?v=tpv5n2jWHlw) + - [Эффективная работа в IDEA](https://www.youtube.com/watch?v=_rj7dx6c5R8) + +### Вопросы по HW1 + > Не могу запустить программу, да и иконки рядом с классами изменились + + ![badsrc](https://github.com/user-attachments/assets/00db6e0a-59df-46d4-9ddd-abba0e52a7c9) + - Проблема в том, что IDEA неправильно "воспринимает" папку `src`. Для ее решения необходимо нажать `ПКМ на папке src -> выбрать Mark Directory as -> Sources Root` + +### Замечания по выполнению HW1 +1. Все резюме в хранилище имеют уникальный `uuid`, что исключает повторы. Сортировка по `uuid` не требуется +1. Давайте осмысленные комментарии коммитам +1. Перед каждым коммитом не забывайте пользоваться сочетанием клавиш `Ctrl + Alt + L` (автоматическое форматирование кода) +1. Удаляйте в классах неиспользуемые импорты (`Ctrl + Alt + O`) +1. Не игнорируй подсказки IDEA (подсвечивает) +1. В методе `clear()` обнуление массива предполагает обнуление (null) ячеек, где хранятся Resume, а не создание нового или присваивание ему null +1. При реализации методов не используйте коллекции +1. Не меняйте сигнатуры методов в `ArrayStorage` +1. Не добавляйте в `Resume` новые поля +1. `Resume r` — давайте переменным осмысленные имена, например resume. r допустимо в коротких циклах и лямбда-выражениях + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 5. [Вебинар "Быть программистом: от детства к зрелости"](https://www.youtube.com/watch?v=D5Hej0TyLaU) + - [Слайды вебинара](https://docs.google.com/presentation/d/1YwtCCZsaGMdl-V15kTDHiJxiS52IAl-qqheNPpiNr54/) +### Советы по обучению + - Учитесь грамотно формулировать проблему: "у меня не работает" может иметь тысячи причин. В процессе формулирования часто приходит ее решение + - Учитесь исследовать проблему. Внимательное чтение логов и умение дебажить — основные навыки разработчика. В логах необходимо читать верхнюю часть самого нижнего иксепшена. Именно там находится причина возникшей ошибки + - Грамотно распределяйте время для каждой проблемы. Не впадайте в крайности: сразу бросаться за помощью или биться над ней часами. Подходите к ее решению разумно + - Получайте в процессе решения обратную связь, что бы убедиться в правильности выбранного направления + - [Советы новичкам](https://blog.csssr.com/ru/article/how-to-be-a-beginner-developer/) diff --git a/lesson/lesson02.md b/lesson/lesson02.md new file mode 100644 index 00000000..90291ccc --- /dev/null +++ b/lesson/lesson02.md @@ -0,0 +1,54 @@ + +# Второе занятие +> разбор HW1 будет на следующем уроке вместе с HW2 +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Принципы ООП](https://drive.google.com/open?id=0B_4NpoQW1xfpOHpyYWhOMGQ4VXc) +- [Объектно-ориентированное программирование](http://info.javarush.ru/translation/2016/01/28/Объектно-ориентированное-программирование-перевод-статьи-.html) +- [Основы Объектно-Ориентированного Программирования (ООП)](https://github.com/ichimax/Core-Java-Interview-Questions/blob/master/Questions/1.%20OOP.md) +- [Наследование, агрегация, композиция, ассоциация](https://ru.wikipedia.org/wiki/Диаграмма_классов#Взаимосвязи) (wiki) +- [Типы отношений между классами](http://www.intuit.ru/studies/courses/16/16/lecture/27107?page=4) +- [Достоинства / Недостатки ООП](http://www.intuit.ru/studies/courses/16/16/lecture/27107?page=5) +- [ООП в Java: четыре принципа с примерами](https://highload.today/oop-v-java-chetyre-printsipa-s-primerami) +- [Николай Алименков — Парадигмы ООП](https://www.youtube.com/watch?v=G6LJkWwZGuc) (youtube) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Структура памяти: куча, стек, регистры, константы](https://drive.google.com/open?id=0B_4NpoQW1xfpZHRnTEhNWmk5Xzg) + - [Стек и куча в Java](https://topjava.ru/blog/stack-and-heap-in-java) + - [Основы Java garbage collection](https://youtu.be/3TROgt7ncMo?t=51) (youtube) + - **Дополнительно:** + - [Из каких частей состоит память java процесса](http://habrahabr.ru/post/117274/) + - [Размер Java объектов](http://habrahabr.ru/post/134102/) + - [JVM - краткий курс общей анатомии](https://www.youtube.com/watch?v=-fcj6EL9rc4) (youtube) + - [What and where are the stack and heap?](http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap#24171266) + - [The Java Virtual Machine Specification Java SE 8 Edition](https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf) + +> - Начиная с Java 8 область памяти `PermGen` была упразднена и заменена на [`Metaspace`](https://www.javacodegeeks.com/2013/02/java-8-from-permgen-to-metaspace.html) +> - При загрузке класса (когда JVM встречает его коде впервые) JVM ищет этот класс в classpass и создает в `Metaspace` объект `Class<Ваш_Класс>` - описание класса: его поля, методы, конструкторы. + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Типы данных. Пакеты](https://drive.google.com/open?id=0B_4NpoQW1xfpQzRVTHg1LVhvOEk) + - [Типы данных](http://www.intuit.ru/studies/courses/16/16/lecture/27111) + - [Классы-обертки](http://www.intuit.ru/studies/courses/16/16/lecture/27129?page=2) + - [Java types](https://youtu.be/JmplWN-FdMQ) (youtube) + - [Модификаторы доступа](https://www.youtube.com/watch?v=e14xUIUc6y0) (youtube) + - [Руководство по пакетам в Java](https://topjava.ru/blog/rukovodstvo-po-paketam-v-java) + - [Пакеты](https://youtu.be/a6KGNASOtK8) (youtube) + - **Дополнительно:** + - [Packages](https://docs.oracle.com/javase/tutorial/java/package/index.html) + - [Primitive data types](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) + - [What is a NullPointerException, and how do I fix it?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) + - [Why should one use Objects.requireNonNull()?](https://stackoverflow.com/questions/45632920/why-should-one-use-objects-requirenonnull) + - [Инициализация и загрузка классов](https://www.youtube.com/watch?v=TdvnGw_KcFY) (youtube) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Домашнее задание HW2](https://drive.google.com/open?id=0B_4NpoQW1xfpWUxUVWx5MFpCZkE) +> Правка к видео: в `ArrayStorage.delete()` вместо `storage[i] = null` нужно записать `storage[size - 1] = null` + +- Еще раз прочитайте, [как правильно форматировать код](https://topjava.ru/blog/google-java-style-guide) +- [Настройте IDEA](https://stackoverflow.com/a/30634421) на автоматическое удаление неиспользуемых импортов +- Поместите классы в пакеты, как это показано в уроке +- Реализуйте в `ArrayStorage` метод `update(Resume resume)`. Проверьте его на работоспособность в `MainTestArrayStorage` +- Метод `update` должен обновлять резюме целиком +- Сделайте проверки в: + - `get`, `update`, `delete` на наличие резюме в `storage` + - `save` на переполнение `storage` и на отсутствие резюме в `storage` +- Выводите в консоль информативные предупреждения, для указанных выше проверок, с указанием `uuid` +- Устраните дублирование кода в `ArrayStorage` +- Выберите в классе `java.util.Arrays` подходящие методы для реализации `clear()` и `getAll()` +- В `clear()` очищайте не весь `storage`, а только те ячейки, где хранятся резюме diff --git a/lesson/lesson03.md b/lesson/lesson03.md new file mode 100644 index 00000000..60ee5777 --- /dev/null +++ b/lesson/lesson03.md @@ -0,0 +1,60 @@ + +# Третье занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор домашнего задания](https://drive.google.com/open?id=0B_4NpoQW1xfpVVFEX0tOS3UtLXM) + +**Коммиты:** + - [`HW1`](https://github.com/JavaWebinar/basejava/tree/ec51b1158f07789b62dadf457c25b0864a126b1d/src) + - [`Introduce package and encapsulation`](https://github.com/JavaWebinar/basejava/commit/68e4d8652320d487a0716179e7d01723fffc4b8d) + - [`lesson03 HW02`](https://github.com/JavaWebinar/basejava/tree/08adbede7c25bc34807c3cebecb8b67921366793/src/ru/javawebinar/basejava) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Объектная модель в Java](https://drive.google.com/open?id=0B_4NpoQW1xfpNW54RGFlZkRWbk0) + +**Коммиты:** + - [`Lesson03 equals&hashCode, static`](https://github.com/JavaWebinar/basejava/tree/9d8464cc24be306b0dbce112607122149ec327d8/src/ru/javawebinar/basejava) + - [`Lesson03 implements interface`](https://github.com/JavaWebinar/basejava/tree/ba20418d59dcc998c2cab218d84ca1f7099676c8/src/ru/javawebinar/basejava/storage) + +**Ресурсы:** +- [Руководство по модификатору static в Java](https://topjava.ru/blog/rukovodstvo-po-modifikatoru-static-v-java) +- [Модификатор static](http://www.intuit.ru/studies/courses/16/16/lecture/27119) +- [10 заметок о модификаторе static в Java](https://javarush.ru/groups/posts/modifikator-static-java) +- [Класс Object. Контракт equals/hashCode](http://www.intuit.ru/studies/courses/16/16/lecture/27129?page=1) +- [Абстрактные классы](https://www.youtube.com/watch?v=ZjiFL2Yo2fw) (youtube) +- [Интерфейсы](http://www.intuit.ru/studies/courses/16/16/lecture/27119?page=3) +- [Полиморфизм](http://www.intuit.ru/studies/courses/16/16/lecture/27119?page=4) +- [Отличия абстрактного класса от интерфейса](https://topjava.ru/blog/razlichiya-mezhdu-abstraktnymi-klassami-i-interfeysami-v-java) +- **Дополнительно:** + - [Что такое полиморфизм?](https://github.com/ichimax/Core-Java-Interview-Questions/blob/master/Questions/1.%20OOP.md#%D0%A7%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-%D0%BF%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC) + - [Ключевое слово static](https://www.youtube.com/watch?v=GZzVfeY7yEM) (youtube) + - [Интерфейсы, абстрактные классы, полиморфизм](https://www.youtube.com/watch?v=7NMFk2oj1-c&index=4&list=PLkKunJj_bZefB1_hhS68092rbF4HFtKjW) (youtube) + - [Разбираемся с hashCode() и equals()](https://www.pvsm.ru/java/26304) + - [История эволюции интерфейсов в Java](https://habr.com/ru/post/482498/) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Сложность алгоритмов](https://drive.google.com/open?id=0B_4NpoQW1xfpQldyRk5oc3Z1S00) +- [Про сложность алгоритмов и Big O Notation](https://threadreaderapp.com/thread/1470666237286010881) +- [Алгоритмы и структуры данных для начинающих: сложность алгоритмов](https://tproger.ru/translations/algorithms-and-data-structures) +- [Time complexity](https://drive.google.com/file/d/0B9Ye2auQ_NsFNEJWRFJkVDA3TkU/view?resourcekey=0-MPCuoLVdSLiSc7hlE2jefQ) +- [Бинарное дерево поиска](https://www.youtube.com/watch?time_continue=447&v=HBMlhZAOhoI) (youtube) +- **Дополнительно** + - Легко написанная книга по алгоритмам и их сложности [Грокаем алгоритмы](https://www.litres.ru/book/aditya-bhargava/grokaem-algoritmy-71518519/) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Паттерн проектирования Шаблонный метод](https://drive.google.com/open?id=0B_4NpoQW1xfpT0tyYXR0RHBpUWM) + +**Коммиты:** + - [`Lesson03 abstract storage & sorted storage`](https://github.com/JavaWebinar/basejava/tree/0bf48cf81987ddb9d59880f10920f3994923f8c0/src/ru/javawebinar/basejava) + +**Ресурсы:** + - [Руководство по Шаблонному методу в Java](https://topjava.ru/blog/pattern-shablonnyy-metod-v-java) + - [Шаблонный метод (Template Method)](https://youtu.be/mNcmp-Msi6U) (youtube) + - [Шаблонный метод](https://refactoring.guru/ru/design-patterns/template-method/java/example) + - **Дополнительно** + - Книга из известной серии Head First — [Паттерны проектирования](https://www.litres.ru/book/elizabet-robson/head-first-patterny-proektirovaniya-39123671/) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Домашнее задание HW3](https://drive.google.com/open?id=0B_4NpoQW1xfpdkdlV2xPbE5VM2c) + +- Перед тем, как приступить к ДЗ, приведите свой проект в соответствии с коммитами. Обратите внимание, что `packages` в видео и коммитах — отличаются +- Закончите реализацию `AbstractArrayStorage`, `ArrayStorage`, `SortedArrayStorage`, используя паттерн Шаблонный метод +- В `SortedArrayStorage` храните элементы отсортированными: + - для их упорядочивания воспользуйтесь Arrays.binarySearch (бинарный поиск). Разберитесь с тем, какие значения он возвращает, и как их можно применить для упорядочивания резюме + - не используйте `Arrays.sort()` или самописные методы для сортировки + - сортировать весь массив не надо diff --git a/lesson/lesson04.md b/lesson/lesson04.md new file mode 100644 index 00000000..c975b16f --- /dev/null +++ b/lesson/lesson04.md @@ -0,0 +1,79 @@ + +# Четвертое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор домашнего задания](https://drive.google.com/open?id=0B_4NpoQW1xfpQXVMb2xjRXJPdUU) +**Коммиты:** + - [`lesson04 HW03`](https://github.com/JavaWebinar/basejava/tree/afc0cc5111434375f9da00e225ed7cbb15bbd4b7/src/ru/javawebinar/basejava/storage) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Работа со строками](https://drive.google.com/open?id=0B_4NpoQW1xfpSWVLYk51M2JpRnM) +**Коммиты:** + - [`Lesson04 String`](https://github.com/JavaWebinar/basejava/blob/7f5a5d70a63fbeea40539397b1c4b2cfb3bd272f/src/ru/javawebinar/basejava/MainString.java) + +**Ресурсы:** +- [Строки в Java](https://urvanov.ru/2016/04/20/java-8-строки/) +- [Кодировка в Java](https://web.archive.org/web/20210515175050/http://www.skipy.ru/technics/encodings.html) +- [Ошибки при использовании строк](https://web.archive.org/web/20170608030853/http://www.skipy.ru/technics/strings.html) +- [Обработка строк в Java](https://habrahabr.ru/post/260767/) +- [Руководство по String pool в Java](https://topjava.ru/blog/rukovodstvo-po-string-pool-v-java) +- **Дополнительно:** + - [StringBuilder vs StringBuffer](https://stackoverflow.com/questions/355089/difference-between-stringbuilder-and-stringbuffer?rq=1) + - [String vs StringBuffer vs StringBuilder](https://www.journaldev.com/538/string-vs-stringbuffer-vs-stringbuilder) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Исключения](https://drive.google.com/open?id=0B_4NpoQW1xfpQ1BaQjc3Y3N1MTQ) +**Коммиты:** + - [`Lesson04 Exceptions`](https://github.com/JavaWebinar/basejava/tree/da03245d2fdafa86d1f02ea242c072ca52e19f26/src/ru/javawebinar/basejava) + +**Ресурсы:** + - [Обработка ошибок. Исключения](https://youtu.be/rjjyV7YGndc) + - [Исключения (Exceptions)](http://proglang.su/java/exceptions) + - [Статья про исключения](http://developer.alexanderklimov.ru/android/java/exception.php) + - Про исключения также можно почитать в книге Джошуа Блоха - ["Java. Эффективное программирование"](https://www.ozon.ru/context/detail/id/21724143/) + - [Руководство по конструкторам](https://topjava.ru/blog/rukovodstvo-po-konstruktoram-v-java) + - [Ключевые слова: this, super](http://info.javarush.ru/grishin/2015/03/31/Разница-между-ключевыми-словами-this-и-super-в-Java.html) + - **Дополнительно:** + - [Exceptions](https://docs.oracle.com/javase/tutorial/essential/exceptions/) + - [Checked vs unchecked exception explanation](https://stackoverflow.com/questions/6115896/java-checked-vs-unchecked-exception-explanation) + +![image](https://cloud.githubusercontent.com/assets/18701152/15581283/4c2f5348-2374-11e6-8fd2-e4de02d2c389.png) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Reflection. Аннотации. Модульное тестирование](https://drive.google.com/open?id=0B_4NpoQW1xfpT0dGZWlJbnN3bU0) +**Коммиты:** + - [`Lesson04 Reflection and JUnit`](https://github.com/JavaWebinar/basejava/tree/c77bb7c73022fa411262c1da56953f3ef3ca3cc7) + +**Ресурсы:** + - [Руководство по аннотациям в Java](https://topjava.ru/blog/rukovodstvo-po-annotatsiyam-v-java-i-mekhanizmu-ikh-raboty) (`для общего знакомства. Не сидите долго на этой теме`) + - [Reflection для начинающих](https://youtu.be/XJQuBXWADZg) (youtube) + - [Руководство по Java Reflection API](http://javadevblog.com/polnoe-rukovodstvo-po-java-reflection-api-refleksiya-na-primerah.html) + - [Java Reflection Example Tutorial](https://www.journaldev.com/1789/java-reflection-example-tutorial) + - **Дополнительно:** + - [The Reflection API](https://docs.oracle.com/javase/tutorial/reflect/) + - [What is reflection and why is it useful?](https://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful) +> В нашем проекте Reflection используют JUnit и будут использовать библиотеки работы с XML и JSON + - [Фреймворк для модульного тестирования JUnit](http://junit.org/) + - [Тестирование с помощью JUnit (Test Case)](http://web.archive.org/web/20190829153452/http://www.javenue.info/post/19) + - [Тестирование кода Java с помощью фреймворка JUnit](https://www.youtube.com/watch?v=z9jEVLCF5_w) (youtube) + +## Домашнее задание HW4 +Часть I: +- В `MainReflection` вызовите у `Resume`, через отражение, метод `toString`. Выведите результат на консоль (освойте основы рефлексии на уровне, достаточном для выполнения задания - сильно не углубляйтесь) +- Реализуйте тестовые классы с помощью `JUnit 4`: `AbstractArrayStorageTest`, `ArrayStorageTest` и `SortedArrayStorageTest` +- Тестовые классы поместите в пакет `junut4` +- Необходимо написать тесты для всех public-методов, которые проверяли бы как их штатную работу, так и все выкидываемые ими икспешены + +Часть II (приступайте только после проверки первой части наставником): +- [Адаптируйте](https://topjava.ru/blog/migratsiya-s-junit4-na-junit5) классы `AbstractArrayStorageTest`, `ArrayStorageTest` и `SortedArrayStorageTest` под `JUnit 5` +- Добавьте зависимости для `JUnit 5`: нажмите `Ctrl + Alt + Shift + S` и добавьте в `Modules` актуальную версию `junit-jupiter` (во вкладке `Dependencies` нажмите `+ -> Library... -> From Maven...`) +- Тестовые классы поместите в пакет `junut5` + +## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Подсказки по HW4 +- Используйте в `AbstractArrayStorageTest` конструктор для инициализации поля `Storage storage`, а в его наследниках добавьте конструкторы, которые будут вызывать `super()` с нужным хранилищем +- `SortedArrayStorageTest` должен создавать экземпляр `SortedArrayStorage`, а `ArrayStorageTest` экземпляр `ArrayStorage` +- Тестировать правильность сортировки не надо +- Во всех тестах проверяйте `Resume` целиком. Проверки только `uuid` недостаточно +- Иерархия наследования тестовых классов должна совпадать с иерархией тестируемых +- Логика реализации теста на переполнение массива (`StorageException`): + - заполняем массив, но не вызываем у него переполнение + - если при заполнении вылетит исключение, то тест должен провалиться (используйте `Assert.fail()` [1](https://www.baeldung.com/junit-fail), [2](https://stackoverflow.com/questions/3869954/whats-the-actual-use-of-fail-in-junit-test-case)) + - в `fail()` выводите сообщение о том, что переполнение произошло раньше времени + - тест считается успешно пройденным, когда переполнение происходит при попытке добавить в полностью заполненный массив еще одно резюме +- Если при запуске тестового класса возникает ошибка `Test class should have exactly one public zero-argument constructor`, то нажмите два раза Shift и напишите `Edit Configurations`. В открывшейся вкладке `Run/Debug Configurations`, удалите в левой панели все запускаемые с JUnit классы diff --git a/lesson/lesson05.md b/lesson/lesson05.md new file mode 100644 index 00000000..234dd483 --- /dev/null +++ b/lesson/lesson05.md @@ -0,0 +1,45 @@ + +# Пятое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор домашнего задания](https://drive.google.com/open?id=0B_4NpoQW1xfpN2J2bmxyV3dXME0) +**Коммиты:** +- [`lesson05 HW04`](https://github.com/JavaWebinar/basejava/tree/4127131819b6385602017f59ca1269c8638ec892) + +> - В коммите содержится ошибка: в методе `AbstractArrayStorageTest.saveOverflow` цикл идет до `STORAGE_LIMIT + 1` включительно, а надо до `STORAGE_LIMIT` +> - Исправил `AbstractStorageTest.updateNotExist` + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Контейнеры/коллекции](https://drive.google.com/file/d/0B_4NpoQW1xfpc21aYXY4WW9CMHc) +**Коммиты:** + - [`Lesson05 Static initializer block and Collections`](https://github.com/JavaWebinar/basejava/tree/6def59a3c6e1a20804d9414f95240f2b973a6ba6) + +**Ресурсы:** +- [Контейнеры/коллекции](http://en.wikipedia.org/wiki/Java_collections_framework) +- [List, Set, Map, Queue, Iterator, ListIterator](http://www.intuit.ru/studies/courses/16/16/lecture/27131?page=2) +- [Рекомендации Oracle по выбору между ArrayList и LinkedList](https://topjava.ru/blog/vybor-mezhdu-arraylist-i-linkedlist) +- [Структуры данных в картинках](http://habrahabr.ru/users/tarzan82/topics/) +- [Подробный разбор класса HashMap](https://javarush.ru/groups/posts/2496-podrobnihy-razbor-klassa-hashmap) +- [Инициализация полей в Java](https://web.archive.org/web/20211205113623/http://www.quizful.net/post/java-fields-initialization) +- [Java собеседование по коллекциям](http://habrahabr.ru/post/162017/) +- [Часто задаваемые на собеседованиях вопросы по классам коллекциям в Java](http://info.javarush.ru/translation/2013/10/08/Часто-задаваемые-на-собеседованиях-вопросы-по-классам-коллекциям-в-Java-Часть-2-.html#1) +- [Собеседование по Java — коллекции](http://javastudy.ru/interview/collections/) +- [Collection.toArray(new T[0]) or Collection.toArray(new T[size]), that's the question](https://shipilev.net/blog/2016/arrays-wisdom-ancients) + +## Домашнее задание + +Часть I: +- реализуйте `ListStorage` и `ListStorageTest` +- создайте новый общий класс `AbstractStorage` +- вынесите в `AbstractStorage` весь общий код из всех его наследников, исключив тем самым его дублирование + +Часть II (приступать только после проверки первой части наставником) +- Реализуйте подкласс `MapStorage` и `MapStorageTest` + +Выбор коллекций, которые вы будете использовать для реализации классов, за вами +- [Шаблонный метод (шаблон проектирования)](https://ru.wikipedia.org/wiki/Шаблонный_метод_(шаблон_проектирования)) +> Поведенческий шаблон проектирования, определяющий основу алгоритма и позволяющий наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом + +В итоге у вас должна получиться подобная иерархия наследования классов +![image](https://user-images.githubusercontent.com/29703461/34365360-6dae30b2-eaa0-11e7-89d2-e7630ae73827.png) + +### Замечания к выполнению домашнего задания +- int size и STORAGE_LIMIT относятся только к массивам, в List и Map нет необходимости их использовать, будем считать их условно безразмерными diff --git a/lesson/lesson06.md b/lesson/lesson06.md new file mode 100644 index 00000000..29ccf173 --- /dev/null +++ b/lesson/lesson06.md @@ -0,0 +1,54 @@ + +# Шестое занятие +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор домашнего задания](https://drive.google.com/open?id=0B_4NpoQW1xfpUFJpRVZvNVVpeDg) +**Коммиты:** +- [`lesson06 HW05`](https://github.com/JavaWebinar/basejava/tree/82748583a0454aa3dd2cbf38d83de1cb49fa3ee3) + +**Ресурсы:** +- [Автоупаковка и распаковка в Java](https://habrahabr.ru/post/329498/) +- [Преобразования Integer и int](https://habrahabr.ru/post/104231/) +- [Класс-обертка](https://www.youtube.com/watch?v=T99Dpp29jrU) (youtube) +- **Дополнительно:** + - [Autoboxing and Unboxing](https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html) + - [Why do we use autoboxing and unboxing in Java?](https://stackoverflow.com/questions/27647407/why-do-we-use-autoboxing-and-unboxing-in-java) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. Iterator / Iterable. Вложенные, внутренние, локальные и анонимные классы](https://drive.google.com/file/d/1htZCFoU8j47a00yy-OOvnC27Ktmn1_Hz) +**Коммиты:** +- [`Lesson06 Iterator, Comparator and Inner Classes`](https://github.com/JavaWebinar/basejava/tree/e7531643b410435c07a998a1428fb9a4de2d30bb/src/ru/javawebinar/basejava) + +**Ресурсы:** +- [Паттерн проектирования Итератор](https://web.archive.org/web/20211105130819/https://refactoring.guru/ru/design-patterns/iterator/java/example) +- [Iterator / Iterable](http://www.javenue.info/post/101) +- [Iterator in Java](https://techjitendra.wordpress.com/2019/09/16/java-iterator/) +- [Интерфейсы Comparable и Comparator](https://metanit.com/java/tutorial/5.6.php) +- [Nested (static) классы в Java](https://www.youtube.com/watch?v=svOwVvSWeus) (youtube) +- [Inner (non-static) классы в Java](https://www.youtube.com/watch?v=LflAy_LOwwQ) (youtube) +- [Анонимные классы в Java](https://www.youtube.com/watch?v=P3uicghNPLg) (youtube) +- [Вложенные классы в Java](https://habrahabr.ru/post/342090/) +- [Вложенные, внутренние, локальные и анонимные классы](http://pr0java.blogspot.ru/2015/08/1.html) +- [Локальные и анонимные классы](http://easy-code.ru/lesson/local-anonymous-nested-classes-java) +- [Вложенные, внутренние, локальные и анонимные классы [eng]](https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. Новое в Java 8](https://drive.google.com/open?id=0B_4NpoQW1xfpcVJFa2ljeEloTXc) +**Коммиты:** +- [`Lesson06 Lambda`](https://github.com/JavaWebinar/basejava/blob/7a80322a4861ccc1e1eacaef2aac078820699667/src/ru/javawebinar/basejava/storage/SortedArrayStorage.java) + +**Ресурсы:** +- [Нововведения в java 8](https://habrahabr.ru/post/216431/) +- [Лямбда-выражения в Java 8](https://www.youtube.com/watch?v=DNC6Lknn2AE) (youtube) +- [Функциональный интерфейс](https://www.youtube.com/watch?v=Czkk1Kgqxjs&list=PLtNPgSbW9TX5IQAKzgrJnaayjaDoCjkio&index=11&t=217s) (youtube) +- [Лямбды в Java 8](https://habrahabr.ru/post/224593/) +- **Дополнительно:** + - [Java 8 Functional Interfaces](https://www.journaldev.com/2763/java-8-functional-interfaces) + - [Lambda expressions](https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html) + + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Домашнее задание HW6](https://drive.google.com/open?id=0B_4NpoQW1xfpbm9PMXFDN0RuR1k) + +- Рефакторинг: + - метод `saveOverflow()` должен исполняться только для массивов + - в конструктор `Resume` добавьте второй параметр — `fullName` + - во всех реализациях `Storage` замените метод `Resume[] getAll()` на `List getAllSorted()` +- Подумайте, что еще, может выступать в качестве `search key` (в предыдущем дз это был `uuid`) в реализации на основе `Map` (не путайте `key` и `search key`: `key` - это ключ в мапе, а `search key` - используется для поиска по мапе). Выразите свои идеи в коде (в итоге у вас в проекте должны быть два класса, реализованных на основе мапы) +- Реализуйте для getAllSorted() компаратор, **используя статические методы интерфейса [Comparator](https://www.baeldung.com/java-8-comparator-comparing) и лямбда-выражение**: если `fullName` разных людей совпадает, то сортируйте дополнительно по uuid +- Из-за того, что количество тестовых классов растет, воспользуйтесь [аннотациями](http://javastudy.ru/junit/junit-suite-tests/) JUnit, которые помогут упростить их запуск (для JUnit5 (по желанию) нажмите Ctrl + Alt + Shift + S и добавьте в dependencies (add -> library -> from maven) "platform-suite"). Отформатируйте класс-запуска тестов в соответствии с [этой](https://drive.google.com/file/d/1XHFbxNLekyAWCPJROPJcxmJydjg0K3eH/view?usp=sharing) картинкой diff --git a/lesson/lesson07.md b/lesson/lesson07.md new file mode 100644 index 00000000..9e3affb2 --- /dev/null +++ b/lesson/lesson07.md @@ -0,0 +1,67 @@ + +# Седьмое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор домашнего задания](https://drive.google.com/open?id=0B_4NpoQW1xfpT1BwLUNBanVfd1E) +**Коммиты:** +- [`Lesson07_HW06 test refactoring`](https://github.com/JavaWebinar/basejava/tree/b47cadba8f2fb2da61ef6b9f6b245f5c358ea5d8/test/ru/javawebinar/basejava/storage) +- [`Lesson07_HW06 add fullName`](https://github.com/JavaWebinar/basejava/tree/fb608dd824abda1f15bbc437e4d0d5e094fc1680) +- [`Lesson07_HW06 getAllSorted`](https://github.com/JavaWebinar/basejava/tree/bd8e5f4f4582c9f65e1d6a82da1311d6b0efe294) +- [`Lesson07_HW06 mapStorage`](https://github.com/JavaWebinar/basejava/tree/6d0dbdc64e257452662d65f76edf6d9d07328a79) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. Параметризация. Стирание типов](https://drive.google.com/open?id=0B_4NpoQW1xfpbXotWEFrYVVGUWc) +**Коммиты:** +- [`Lesson07 generic`](https://github.com/JavaWebinar/basejava/tree/1cb2a6bc0bbbb43285b8ca6b297588e9984fa84b/src/ru/javawebinar/basejava/storage) + +**Ресурсы:** +- [Погружаемся в Java Generics](https://habr.com/ru/company/sberbank/blog/416413/) +- [Дженерики (Java, обучающая статья)](http://www.quizful.net/post/java-generics-tutorial) +- [Обобщения (Generic)](http://developer.alexanderklimov.ru/android/java/generic.php) +- [Ограничения](http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html) +- **Дополнительно** + - [Java Generics Example Tutorial](https://www.journaldev.com/1663/java-generics-example-method-class-interface) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. Логирование](https://drive.google.com/open?id=0B_4NpoQW1xfpM1J5NkVqNHd1MlU) +**Коммиты:** +- [`Lesson07 logging`](https://github.com/JavaWebinar/basejava/blob/63674b7f246bf6bc4e509cc1241c7b6340477d18/src/ru/javawebinar/basejava/storage/AbstractStorage.java) + +**Ресурсы:** +- [Log4J (Apache logging)](https://logging.apache.org/) +- [Java Logging API - Tutorial](http://www.vogella.com/tutorials/Logging/article.html) +- [Логирование в Java / quick start](https://habrahabr.ru/post/130195/) +- [Ведение лога приложения](http://skipy.ru/useful/logging.html) +- [Java Logging: история кошмара](http://habrahabr.ru/post/113145/) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [3. Синглтон. Enum](https://drive.google.com/open?id=0B_4NpoQW1xfpZ3lmWVhUSXprQXc) +**Коммиты:** +- [`Lesson07 enum`](https://github.com/JavaWebinar/basejava/tree/a1fe80b00444b6c8d8af149c5e82137c312fee22/src/ru/javawebinar/basejava) + +**Ресурсы:** +- [Одиночка (шаблон проектирования)](https://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)) +- [Перечисляемые типы (enum) в Java](http://easy-code.ru/lesson/enum-types-java) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Домашнее задание:](https://drive.google.com/open?id=0B_4NpoQW1xfpVjhZTzhqemlYZUU) +[Доменный объект](https://ru.wikipedia.org/wiki/Доменный_объект) + +- Начните выполнение ДЗ с рисования UML-диаграммы классов модели, описывающих резюме. Покажите ее скрин наставнику +- Сделать объектную модель резюме (диаграмма и классы) [**Образец резюме**](http://javaops-demo.ru/basejava/resume?uuid=11111111-1111-1111-1111-111111111111&action=view&theme=light) + - Resume - главный класс. Делать только классы, включаемые в Resume (тип [отношения](https://github.com/ichimax/Java-Interview-Questions/blob/master/Questions/1.%20OOP.md#Типы-отношений-между-классами) - композиция) + - Схожие по структуре и функциональности сущности делаем одним классом + - Модель максимально упрощаем, и храним в ней только необходимые данные, а также функционал для вывода и редактирования резюме + - В модели резюме должны быть представлены контакты и следующие секции: + - PERSONAL("Личные качества") + - OBJECTIVE("Позиция") + - ACHIEVEMENT("Достижения") + - QUALIFICATIONS("Квалификация") + - EXPERIENCE("Опыт работы") + - EDUCATION("Образование") + - В секциях Достижения и Квалификация хранить список строк + - Учесть в классах модели, что обработка резюме (вывод в html, сохранение, чтение) будет происходить следующим образом: +обработка `fullName`, цикл обработки по контактам, цикл обработки по секциям (для секций использовать полиморфизм, как для фигур: круг, квадрат...) + - При добавлении / удалении новых видов контактов (например домашний телефон) или разделов изменения в коде (и БД) должны быть минимальны +- **ПРОВЕРЬТЕ свою модель: создайте класс ResumeTestData с методом main, а в нем объект `Resume` и заполните все его разделы данными, взятыми из [**Образца резюме**](http://javaops-demo.ru/basejava/resume?uuid=11111111-1111-1111-1111-111111111111&action=view&theme=light). Выведите все секции на консоль** +- **Не размещайте в AbstractStorageTest код, связанный с заполнением резюме данными. Делайте это в ResumeTestData** + +#### Инструменты для рисования UML-диаграмм: + +- Любой UML-редактор, например, [draw.io](http://www.draw.io), [yEd](https://www.yworks.com/) и тд +- Нарисовать на бумаге/доске и прислать фотку diff --git a/lesson/lesson08.md b/lesson/lesson08.md new file mode 100644 index 00000000..2488fe09 --- /dev/null +++ b/lesson/lesson08.md @@ -0,0 +1,31 @@ + +# Восьмое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор Домашнего Задания-7](https://drive.google.com/open?id=0B_4NpoQW1xfpSXBDR3NndlFXSFE) +[см. коммит Lesson08 HW07 model implementation](https://github.com/JavaWebinar/basejava/tree/8ba1997667b33253df132eb5aef1fc618298687b/src/ru/javawebinar/basejava/model) + +- Объектная модель резюме + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. Работа с датами и временем.](https://drive.google.com/open?id=0B_4NpoQW1xfpV3hZMk85djRfeVk) +[см. коммит Lesson08 DateTime api ](https://github.com/JavaWebinar/basejava/tree/f4844c291cf82387a14088ab3eed112b3102a607/src/ru/javawebinar/basejava) + +- Основы API Time для Java +- Класс Date, Calendar, TimeZone +- Java – Convert date and time between timezone +- Joda Time library +- Java 8 Date API + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. Работа с файлами и ресурсами.](https://drive.google.com/open?id=0B_4NpoQW1xfpWjJFazJQT0Y2SHc) +[см. коммит Lesson08 File and Resources ](https://github.com/JavaWebinar/basejava/blob/c4011b8d0a07aa0cbc07731809b6b0de61cd767b/src/ru/javawebinar/basejava/MainFile.java) + + - File. Работа с файловой системой. + - Работа с ресурсами. Правильно освобождаем ресурсы в Java + - Java 7 try-with-resources + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Домашнее задание:](https://drive.google.com/open?id=0B_4NpoQW1xfpRV8xMnpDV0VBUGc) +[см. коммит Lesson08 HW08 ](https://github.com/JavaWebinar/basejava/tree/126be641f9cf8202956817d26279a7af0cdf6845/src/ru/javawebinar/basejava) + +1) Переделайте модель резюме: учесть, что на одной работе (в одном учебном заведении) можно работать/учиться в разные периоды. При этом имя организации и ссылка на сайт не должны дублироваться +2) Сделайте рекурсивный обход и вывод имени файлов в каталогах и подкаталогах (корневой каталог- ваш проект) +3) Реализуйте в `ResumeTestData` метод, который будет принимать uuid и fullName, создавать резюме, заполнять его данными (все секции резюме должны быть заполнены) и возвращать для тестирования в `AbstractStorageTest`. Используйте его для всех резюме, создаваемых в AbstractStorageTest +4) Реализуйте `AbstractFileStorage`, базовый класс для хранения резюме в файлах diff --git a/lesson/lesson09.md b/lesson/lesson09.md new file mode 100644 index 00000000..761138be --- /dev/null +++ b/lesson/lesson09.md @@ -0,0 +1,41 @@ + +# Девятое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор Домашнего Задания](https://drive.google.com/open?id=0B_4NpoQW1xfpeENDOVdQbUpIWEU) +>Для создания и заполнения данными резюме из класса AbstractStorageTest используйте ResumeTestData. Не делайте это в AbstractStorageTest! + +**Коммиты:** +- [`Lesson09 HW08`](https://github.com/JavaWebinar/basejava/tree/150e15f99c35d53e0c43c9f64d7833b5e7184768) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. Ввод/вывод](https://drive.google.com/open?id=0B_4NpoQW1xfpZHk3TnYyaDRjY3M) + +**Ресурсы:** +- Пакет java.io +- Паттерн Декоратор. +- Классы Reader и Writer. + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. Сериализация](https://drive.google.com/open?id=0B_4NpoQW1xfpb0dRNjI1S2tOUjA) +**Коммиты:** +- [`Lesson09 ObjectStreamStorage`](https://github.com/JavaWebinar/basejava/tree/7a80d1d7feba08d433e55417bfd26ac0b3fa5298) + +**Ресурсы:** +- Сериализация объектов (serialization) +- Реализация Storage используя сериализацию. +- Сериализация: [1](https://www.youtube.com/watch?v=dBcqizwOWLg), [2](https://www.youtube.com/watch?v=nr4_JRKCGBU) (youtube) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [3. NIO](https://drive.google.com/open?id=0B_4NpoQW1xfpMzBqSWI3eEI2RGs) +**Коммиты:** +- [`Lesson09 AbstractPathStorage`](https://github.com/JavaWebinar/basejava/commit/4b37c38fb980e315c5ec5f1b2b868fbb5935fe6d) + +**Ресурсы:** +- NIO Java 7 +- Чтения строк из файла + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [4. Основы Java 8 Stream API](https://drive.google.com/open?id=0B_4NpoQW1xfpMHd6VDJjS28tRmM) +**Ресурсы:** +- Потоки + +## Домашнее задание +- Сделать рекурсивный вывод каталогов и файлов с отступами +- Реализовать `ObjectStreamPathStorage` (через `java.nio.file.Path`) и добавить `ObjectStreamPathStorageTest` +- Сделать реализации `Storage` сохранения в файл через `File` и `Path` с возможностью выбора стратегии сериализации (посмотрите на [паттерн стратегия](https://refactoring.guru/ru/design-patterns/strategy)). Кроме сохранения через `ObjectOutputStream/ObjectInputStream` у нас будут еще несколько вариантов сериализации. Сделать тесты для тестирования сохранения через `ObjectOutputStream/ObjectInputStream` для `File` и `Path`. diff --git a/lesson/lesson10.md b/lesson/lesson10.md new file mode 100644 index 00000000..9febd7e9 --- /dev/null +++ b/lesson/lesson10.md @@ -0,0 +1,45 @@ + +# Десятое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор домашнего задания](https://drive.google.com/open?id=0B_4NpoQW1xfpZDVJdGlDRlBlUEU) +**Коммиты:** +- [`Lesson10 HW09`](https://github.com/JavaWebinar/basejava/tree/cf532714164239d7d99909f92ba52cb79cb0694a) + +**Ресурсы:** +- [Паттерн - Стратегия](https://www.youtube.com/watch?v=rsB2exGsR4I) +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. Формат XML. Работа с XML в Java](https://drive.google.com/open?id=0B_4NpoQW1xfpUEtzQjhtQ0c3cFU) +**Коммиты:** +- [`Lesson10 xml`](https://github.com/JavaWebinar/basejava/tree/c36b41e468df8a82bb1e8ba668f3d00e76989fd9) + +>В коде проекта используется JDK 8. Если у вас JDK9+, в проект необходимо включить [дополнительные Java EE зависимости, исключенные в JDK 9](https://openjdk.org/jeps/320) +> - [jaxb-impl](https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/4.0.6/jaxb-impl-4.0.6.jar) +> - [jaxb-core](https://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-core/4.0.6/jaxb-core-4.0.6.jar) +> - [jakarta.xml.bind-api](https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/4.0.4/jakarta.xml.bind-api-4.0.4.jar) +> - [jakarta.activation-api](https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api/2.1.4/jakarta.activation-api-2.1.4.jar) +> - [istack-commons-runtime](https://repo1.maven.org/maven2/com/sun/istack/istack-commons-runtime/4.2.0/istack-commons-runtime-4.2.0.jar) + +Подключение библиотек к проекту есть в видео-уроке + +**Ресурсы:** +- XML формат и технологии +- Wiki: XML, XSL , DOM, SAX, StAX, JAXB +- Работа с XML в Java. Реализация хранения в XML. + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. JSON](https://drive.google.com/open?id=0B_4NpoQW1xfpRUlvMU54a2hMR3c) +**Коммиты:** +- [`Lesson10 json`](https://github.com/JavaWebinar/basejava/tree/ba409e3666f1a5086182a736784c4362a1979b7f) + +**Ресурсы:** +- JSON. JSON в JavaScript +- Работа с JSON в Java: Google GSON и Jackson. Реализация хранения в JSON +- [Введение в JSON](https://www.youtube.com/watch?v=syuIHCMHQgc) (youtube) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [3. DataInputStream / DataOutputStream](https://drive.google.com/open?id=0B_4NpoQW1xfpczVtenBCSDlKWU0) +**Коммиты:** +- [`Lesson10 DataStream`](https://github.com/JavaWebinar/basejava/tree/6f699cb5d804b3d033a06cc1173cd1076b0553f9) + +**Ресурсы:** +- [Руководство по switch-выражениям в Java](https://topjava.ru/blog/polnoye-rukovodstvo-po-switch-v-java) + +## Домашнее задание +- Сделать и протестировать реализацию `DataStreamSerializer` diff --git a/lesson/lesson11.md b/lesson/lesson11.md new file mode 100644 index 00000000..963c00b5 --- /dev/null +++ b/lesson/lesson11.md @@ -0,0 +1,39 @@ +# Одиннадцатое занятие + +## Разбор Домашнего Задания-10 будет на следующем уроке + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. Многопоточность. Параллельное выполнение.](https://drive.google.com/open?id=0B_4NpoQW1xfpSmVjRzl6c3ctTTA) +[см. коммит Lesson11](https://github.com/JavaWebinar/basejava/blob/6a626f61722af844663860d1af284c53a9adf423/src/ru/javawebinar/basejava/MainConcurrency.java) + +![Закон Мура](https://www.karlrupp.net/wp-content/uploads/2015/06/40-years-processor-trend.png) +- Закон Мура +- Закон Амдала +- [Фундаментальный поворот к параллелизму в программировании](https://habrahabr.ru/post/145432/) + +![Concurrent vs Parallel](https://joearms.github.io/images/con_and_par.jpg) + +## Потоки. Синхронизация +- [Многопоточность в Java](https://topjava.ru/blog/mnogopotochnost-v-java-chast1) (цикл статей) +- Потоки выполнения. Синхронизация. +- Методы wait(), notify(), notifyAll() класса Object +- [Жизненный цикл потока в Java](https://nuancesprog.ru/p/10254/) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. Ленивая инициализация, JMM.](https://drive.google.com/file/d/1kAoLlGhsHAyl_Vtak5R_VuNiQp5cYUx3) +[см. коммит Lesson11](https://github.com/JavaWebinar/basejava/blob/6a626f61722af844663860d1af284c53a9adf423/src/ru/javawebinar/basejava/LazySingleton.java) + +- Параллелизм в Java +- Реализация Singleton в JAVA +- Double checked locking +- Java Memory Model. final, volatile +- Initialization-on-demand holder idiom + +### Ресурсы +- Алексей Владыкин, Основы многопоточность в Java +- Виталий Чибриков, Java. Многопоточность +- Computer Science Center, курс Параллельное программирование +- Юрий Ткач, курс Advanced Java - Concurrency +- Головач, курс Java Multithreading + +## Домашнее задание +- Реализовать deadlock +- Взаимная блокировка diff --git a/lesson/lesson12.md b/lesson/lesson12.md new file mode 100644 index 00000000..dcc2ee05 --- /dev/null +++ b/lesson/lesson12.md @@ -0,0 +1,48 @@ + +# Двенадцатое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор Домашнего Задания-11](https://drive.google.com/open?id=0B_4NpoQW1xfpcWNMeHQ1Y0JoaUU) +[см. коммит Lesson12 HW11](https://github.com/JavaWebinar/basejava/blob/50388920c5e29e70208df572dc34208b46bcdd1a/src/ru/javawebinar/basejava/MainConcurrency.java) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Concurrency](https://drive.google.com/open?id=0B_4NpoQW1xfpRkdBLW81a1AtWDg) +[см. коммит Lesson12 Concurrency](https://github.com/JavaWebinar/basejava/blob/a34c2eec5a4b96d7ef7cd1fce140b0398e00a197/src/ru/javawebinar/basejava/MainConcurrency.java) + +- Обзор java.util.concurrent.* +- Compare-and-swap +- Справочник по синхронизаторам java.util.concurrent.* +- Использование ThreadLocal переменных + +> Замечания по видео: + + ThreadLocal DATE_FORMAT = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); + }; + }; + +можно написать через лямбду: + + ThreadLocal.withInitial(() -> new SimpleDateFormat("dd.MM.yyyy HH:mm:ss")); + +А лучше использовать потокобезопасный `DateTimeFormatter` Java 8 Time API: + + DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); + + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор Домашнего Задания-10](https://drive.google.com/open?id=0B_4NpoQW1xfpY3d6R204ZXplb00) +[см. коммит Lesson12 HW10](https://github.com/JavaWebinar/basejava/tree/4e75634fa4670a71a60f5643fa995295c4fb959d/src/ru/javawebinar/basejava) + +## Домашнее задание: +- Установить PostgreSQL +- Посмотреть на реляционные базы данных и SQL: + - Введение в базы данных + - Основы SQL +- **Java 8 Streams**: + - реализуйте метод `int minValue(int[] nums)` через стрим + + Метод принимает массив цифр от 1 до 9. Он должен вернуть число, состоящее из уникальных цифр. Например, для {1, 2, 3, 3, 2, 3} вернет 123, а для {9, 8} вернет 89. Не используйте преобразование в строку и обратно. + + - реализуйте метод `List oddOrEven(List nums)` + + В качестве исходных данных используйте массив из предыдущего метода. Если сумма всех чисел нечетная - удалить все нечетные, если четная - удалить все четные. Сложность алгоритма должна быть O(N). С помощью Optional - решение в один стрим diff --git a/lesson/lesson13.md b/lesson/lesson13.md new file mode 100644 index 00000000..1b23e1e2 --- /dev/null +++ b/lesson/lesson13.md @@ -0,0 +1,48 @@ +# Тринадцатое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. Базы данных. Реляционные СУБД. PostgreSQL](https://drive.google.com/open?id=0B_4NpoQW1xfpOHFGQTUydzdKaFE) +**Коммиты:** + +- [`Lesson13 Init DB`](https://github.com/JavaWebinar/basejava/blob/79f4e1d3ecc9ce306504a991fcca00c81c992f8c/config/init_db.sql) + +**Ресурсы:** +- [DB-Engines Ranking](http://db-engines.com/en/ranking) +- [Реляционная СУБД](https://ru.wikipedia.org/wiki/Реляционная_СУБД) (wiki) +- [Введение в базы данных](http://www.codenet.ru/progr/vbasic/vb_db/1.php) +- [Реляционные базы vs NoSQL](http://habrahabr.ru/post/103021). SQL. Денормализация. PK, FK, Cascade +- [PostgreSQL: надёжность](https://ru.wikipedia.org/wiki/PostgreSQL#Качество_исходного_кода) +- [Работа с базами данных из IDEA](https://habrahabr.ru/company/JetBrains/blog/204064) +- [IDEA Database tools](https://www.jetbrains.com/datagrip/features) +- [Как работает реляционная БД](https://habrahabr.ru/company/mailru/blog/266811) +- [SQL ключи во всех подробностях](https://habrahabr.ru/company/oleg-bunin/blog/348172) +- [Книги по postgreSQL](https://postgrespro.ru/education/books) +- [Интерактивная обучалка по postgreSQL](https://www.pgexercises.com/) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. Конфигурирование данных в Java проекте](https://drive.google.com/open?id=0B_4NpoQW1xfpQUpkVTJiQnpBNnM) +**Коммиты:** + +[`Lesson13 properties`](https://github.com/JavaWebinar/basejava/tree/25f4dd3b23790cc74c30d3703b16fa6af09c3905) + +**Ресурсы:** + +- [Properties sample](https://www.mkyong.com/java/java-properties-file-examples) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [3.Подключение DB в проект](https://drive.google.com/open?id=0B_4NpoQW1xfpWVVSOURIeDNEMUk) +**Коммиты:** + +[`Lesson13 SqlStorage`](https://github.com/JavaWebinar/basejava/tree/62705ea7e24dda66647b47971f83f1507dd80016) + +**Ресурсы:** + +- [JDBC](http://ru.wikipedia.org/wiki/Java_Database_Connectivity) +- [JDBC Architecture](http://www.developersbook.com/jdbc/interview-questions/jdbc-interview-questions-faqs.php) +- [Книга: Семь баз данных за семь недель. Введение в современные базы данных и идеологию NoSQL](http://www.ozon.ru/context/detail/id/19383907) +- [Работа с базами данных с помощью JDBC драйвера](https://devcolibri.com/работа-с-бд-mysql-postgresql-с-помощью-jdbc-драйвера) +- [Уроки по JDBC](https://www.youtube.com/playlist?list=PLIU76b8Cjem5qdMQLXiIwGLTLyUHkTqi2) + +### ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW13 +- Доделать `SqlStorage` без контактов и секций +- Для работы с DB надо в lib и проект добавить [драйвер базы данных](https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.1/) +- Запустить `SqlStorageTest` (в `AbstractStorageTest` контакты и секции закоменченны), креденшелы к базе взять из `Config` +- Вынести общий код (`getConnection(), prepareStatement, catch SQLException`) в класс `SqlHelper` +(https://dzone.com/articles/removing-duplicate-code-with-lambda-expressions) diff --git a/lesson/lesson14.md b/lesson/lesson14.md new file mode 100644 index 00000000..8ffe1f28 --- /dev/null +++ b/lesson/lesson14.md @@ -0,0 +1,30 @@ + +# Четырнадцатое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор Домашнего Задания-13](https://drive.google.com/open?id=0B_4NpoQW1xfpREpRYm5ZLWN2RWc) +[см. коммит Lesson14 HW13](https://github.com/JavaWebinar/basejava/tree/aa4dd3537275cc3be0d68aeb902d28c0ef94e747) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. JOIN](https://drive.google.com/open?id=0B_4NpoQW1xfpT3R6WFBBbmVGXzA) +[см. коммит Lesson14 JOIN](https://github.com/JavaWebinar/basejava/blob/57c5687e276d4fb3bfcf8d7b0c7b301db1a0095b/src/ru/javawebinar/basejava/storage/SqlStorage.java) +- LEFT, RIGHT, INNER JOIN +- [SQL Join](https://www.youtube.com/watch?v=EHvzvwAv7RU&index=1&list=PLY7PmJJFH5nT-lbFKxfbp3rw5BBuq5Azo) (youtube) +- Добавляем в `SqlStorage` контакты + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. Транзакции](https://drive.google.com/open?id=0B_4NpoQW1xfpTm43Z2hnZkV4c2M) +[см. коммит Lesson14 Transaction_Batch](https://github.com/JavaWebinar/basejava/tree/0901c3a80ce8150524f2513c7ba148fdd03e49b2/src/ru/javawebinar/basejava) +- Транзакция. ACID. Уровни изоляции транзакций. +- Уровни изоляции транзакций в SQL +- Добавляем в `SqlStorage` транзакции +- Batch execute. + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [3. Установка/запуск Tomcat](https://drive.google.com/open?id=0B_4NpoQW1xfpZU9QQ25VTkRmSjg) +- Скачать и установить Tomcat 8. Устанавливать лучше простым копированием из архива в каталог (в том числе и для unix). Следите чтобы в пути не было пробелов и национальных букв. +- Для доступа к Tomсat Manager добавьте в конфигурацию Tomcat `TOMCAT_HOME\conf\tomcat-users.xml` права: +``` + +``` +- Запуск из `TOMCAT_HOME\bin\`: `catalina.bat start` + +## Домашнее задание HW14 +- Закончить реализацию `SqlStorage` с контактами +- Выделить общие части ( DRY ) diff --git a/lesson/lesson15.md b/lesson/lesson15.md new file mode 100644 index 00000000..c618959f --- /dev/null +++ b/lesson/lesson15.md @@ -0,0 +1,31 @@ +# Пятнадцатое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор Домашнего Задания-14](https://drive.google.com/open?id=0B_4NpoQW1xfpY1hTY282dzhuOFU) +[см. коммит Lesson15 HW14](https://github.com/JavaWebinar/basejava/tree/02aee9744d7512dfa9ffbebe00ad415ffe5f71ea) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. HTML, Tomcat](https://drive.google.com/open?id=0B_4NpoQW1xfpZk1pQ1h4dEJBVEE) +[см. коммит Lesson15 web](https://github.com/JavaWebinar/basejava/tree/2fe01af02b7ba82c3f0c8fa29dc3effb5b575531/src/ru/javawebinar/basejava) + +- Протокол HTTP. Смотрим [демо приложение](https://javaops-demo.ru/topjava/login) в Chrome -> Инструменты разработчика +- Добавление в проект Web Facet. web.xml. Постороение/cтруктура WAR. Статические ресурсы. +- Настройка и деплой в Tomcat. Tomcat manager. +- Запуск Tomcat из IDEA. Динамическое обновление без передеплоя. + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. Сервлеты](https://drive.google.com/open?id=0B_4NpoQW1xfpUWw3NWo0SVFBRjg) +[см. коммит Lesson15 static_content](https://github.com/JavaWebinar/basejava/tree/e9a4a68e8e360f9cbcd3ff12d27876cee1b9f8cd/src/ru/javawebinar/basejava/web) + +[см. коммит Lesson15 servlets](https://github.com/JavaWebinar/basejava/tree/4d1043a3a45d27eda11fdc9c68ac46aa68fdd563) + +- Создаем Servlet. Параметры. Кодировка. +- Дополнительно: + - How do servlets work? + - Язык программирования Java: введение в сетевое программирование + - Основы работы с HTML + - Учебник HTML + - [Ссылки по HTML, JavaScript, CSS](https://github.com/JavaOPs/topjava#html-javascript-css) + +## Домашнее задание HW15 +- Сделать реализацию `SqlStorage.getAllSorted` через 2 отдельных запроса: отдельно резюме и отдельно контакты. +- Добавить в реализацию `SqlStorage` и в базу секции (кроме `OrganizationSection`). Для `ListSection` склеиваем строки через `\n`. +- Сделать отображение таблицы резюме в сервлете (табл resume, т.е. только uuid и fullName). + - HTML таблицы diff --git a/lesson/lesson16.md b/lesson/lesson16.md new file mode 100644 index 00000000..22fdc4aa --- /dev/null +++ b/lesson/lesson16.md @@ -0,0 +1,37 @@ +# Шестнадцатое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор Домашнего Задания-15. DB](https://drive.google.com/open?id=0B9Ye2auQ_NsFS0J4TEN2cjdtWjQ) +[см. коммит Lesson16 HW16 DB](https://github.com/JavaWebinar/basejava/tree/39775ee817be0da26ce111db9ba475bfd97b5a4c) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор Домашнего Задания-15. Servlet](https://drive.google.com/open?id=0B_4NpoQW1xfpZWVSX0tCTjRiU28) +[см. коммит Lesson16 HW16 servlet](https://github.com/JavaWebinar/basejava/tree/46a5500bc1060ca7ab90ceb4de7979d0cefa3824) + +- Почему вы никогда не должны использовать MongoDB +- Жизненный цикл сервлета +- Tomcat maxThreads configuration +- [Веб-приложение с Java Servlets](https://tproger.ru/translations/building-a-web-app-with-java-servlets/) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. JSP](https://drive.google.com/open?id=0B_4NpoQW1xfpQ2hYRWJ2TWd2QjA) +[см. коммит Lesson16 jsp](https://github.com/JavaWebinar/basejava/tree/b29ed85e8a99432de317dcae0780ecedc37981ac) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. include](https://drive.google.com/open?id=0B_4NpoQW1xfpRy1DbWhRVXhTbHc) +[см. коммит Lesson16 include](https://github.com/JavaWebinar/basejava/tree/28f305b52abb96f237b4e30447b102f9b67d12a5/web/WEB-INF/jsp) + +- Что такое JSP. Wiki JSP +- Predefined Variables in JSP +- Стандартные элементы action +- How to use relative paths in JSP +- [Отличие Redirect от Forward](https://stackoverflow.com/questions/2047122/requestdispatcher-forward-vs-httpservletresponse-sendredirect) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [3. JSTL](https://drive.google.com/open?id=0B_4NpoQW1xfpSHdUNE9TZWNJV1k) +[см. коммит Lesson16 jstl](https://github.com/JavaWebinar/basejava/blob/a909d0854c47753d8f278a9d6e930411992762ac/web/WEB-INF/jsp/list.jsp) + +- JSTL +- JSTL для написания JSP страниц + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [4. CRUD](https://drive.google.com/open?id=0B_4NpoQW1xfpak9nZS1BXzBTbEU) +[см. коммит Lesson16 crud](https://github.com/JavaWebinar/basejava/tree/3e07257a33d1ba51508e315d6021aa1b78849fca) + +## Домашнее задание HW16 +- Доделать логику сервлета +- Дополнить отображение и редактирование JSP секциями diff --git a/lesson/lesson17.md b/lesson/lesson17.md new file mode 100644 index 00000000..3bb20063 --- /dev/null +++ b/lesson/lesson17.md @@ -0,0 +1,36 @@ +# Семнадцатое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор Домашнего Задания-16](https://drive.google.com/open?id=0B_4NpoQW1xfpR2U1OUJEM0hzc1k) +[см. коммит Lesson17 HW16](https://github.com/JavaWebinar/basejava/tree/dc678d613ecdf18d9973e7464ddc997ad316c22f) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Разбор Домашнего Задания-16 добавление резюме](https://drive.google.com/open?id=0B_4NpoQW1xfpQ1d3VmN1RHA1Q1k) +[см. коммит Lesson17 HW16_add_resume](https://github.com/JavaWebinar/basejava/tree/10c521a8d412b3a4b3256d3044504fb269e16a26) + +> Вы можете улучшить внешний вид своего приложения (это не обязательная опция - по желанию), используя готовые [css](https://github.com/JavaWebinar/basejava/tree/master/web/css). В итоге ваше приложение может выглядеть аналогично [этому](http://javaops-demo.ru/basejava/resume?uuid=11111111-1111-1111-1111-111111111111&action=view&theme=light). + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Настройка хостинга и деплой на сервер +Сервис Heroku стал платным, лучший вариант - развернуть собственный сервер, стоимость в минимальной конфигурации - от 130 руб./месяц (можно взять с запасом RAM 1 или 2GB). Вы учитесь азам администрирования Linux, что очень пригодиться на работе, можете размещать там резюме и все ваши проекты и обязательно указываете в резюме ссылки на свои задеплоенные проекты. + +- [Курс Startup](https://javaops.ru/view/startup) +- Открытое занятие: [настройка хостинга и деплой на сервер](https://github.com/JavaOPs/startup) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [2. Classloader](https://drive.google.com/open?id=0B_4NpoQW1xfpQnJQZ0d2ajJNWlU) +- Загрузка классов в Java +- Apache Tomcat Class Loader + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [3. Вебинар "Осваиваем Java Spring/JPA Enterprise"](https://drive.google.com/file/d/0B9Ye2auQ_NsFY1ZDNXRCd1NCTG8/edit?resourcekey=0-NKNOHbTWXnsZtbe5_8B6Bg) +- Слайды презентации +- [Как стать профессиональным Java разработчиком](https://www.youtube.com/watch?v=ft0Nj8Cm9kk) +- Из юниоров в разработчики: получаем первую работу +- [Java Technology Report 2021](https://www.jrebel.com/blog/2021-java-technology-report) +- [The State of Developer Ecosystem 2020](https://www.jetbrains.com/lp/devecosystem-2020/java/) +- [JVM Ecosystem Report 2021](https://snyk.io/jvm-ecosystem-report-2021/) +- [Быть программистом: от детства к зрелости](https://www.youtube.com/watch?v=D5Hej0TyLaU) +- Ссылки по темам интервью, тестовое интервью +- [Литература](https://javaops.ru/view/books) + +#### Java Enterprise project Topjava +- Стажировка Spring/JPA Enterprise (Topjava) +- Ссылки по темам интервью, тестовое интервью +- Составление резюме, подготовка к интервью, поиск работы +- [Как стать профессиональным Java разработчиком (Яков Фaйн)](https://www.youtube.com/watch?v=ft0Nj8Cm9kk)