diff --git a/lesson/lesson01.md b/lesson/lesson01.md new file mode 100644 index 0000000..3bd9043 --- /dev/null +++ b/lesson/lesson01.md @@ -0,0 +1,113 @@ +# Первое занятие + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [Видеообзор курса Basejava](https://www.youtube.com/watch?v=0ydTRfKS9yY) + +### Подготовка рабочего окружения +- Установите [JDK8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) (выбрать Accept License Agreement) +- Установите систему управления версиями [Git](http://git-scm.com/downloads) +- Создайте аккаунт на [GitHub](https://github.com/) +- Для удобной навигации по файлам на GitHub установите расширение для браузера [Octotree](https://habrahabr.ru/post/223527/) +- Установите [IntelliJ IDEA Community](http://www.jetbrains.com/idea/download/index.html) (Ultimate-версия понадобится позже, при работе с базой данных и web) +> Для версии Ultimate дается 30 дней бесплатного использования. Но в качестве подарка, каждому участнику курса, мы выдаем единоразово купон на 6 месяцев + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. [Разработка ПО](https://drive.google.com/open?id=0B_4NpoQW1xfpVjZUTEpvVUN1TTA) +- [Мифический человеко-месяц](https://ru.wikipedia.org/wiki/Мифический_человеко-месяц) +- [Подборка книг для руководителей в сфере IT](https://habr.com/ru/company/skyeng/blog/465215/) +- [Размеры проектов в количестве строк кода](https://www.freecodecamp.org/news/the-biggest-codebases-in-history-a128bb3eea73) +- [Соглашения по оформлению кода](https://topjava.ru/blog/google-java-style-guide) +- [Методологии разработки ПО](https://dou.ua/forums/topic/14015/) +- [Ещё раз про семь основных методологий разработки](https://habrahabr.ru/company/edison/blog/269789/) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Обзор инструментов и технологий](https://drive.google.com/file/d/0B_4NpoQW1xfpTXJYU2xZbjN2d2M) +- [Популярность Java-технологий в 2019 году](https://topjava.ru/blog/sostoyanie-java-v-2019-godu) +- [Java Technology Report 2020](https://www.jrebel.com/blog/2020-java-technology-report) +- [The State of Developer Ecosystem 2020](https://www.jetbrains.com/lp/devecosystem-2020/java/) +- [JVM Ecosystem Report 2020](https://snyk.io/wp-content/uploads/jvm_2020.pdf) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. [Обзор языка Java](https://drive.google.com/open?id=0B_4NpoQW1xfpTU5SSElhUjlGNnc) + +![jvm](https://cloud.githubusercontent.com/assets/18701152/15219296/e6c67e86-186b-11e6-986f-651a87deec6c.png) + +- [Java](http://ru.wikipedia.org/wiki/Java), [JVM](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) +- [Что такое JRE? Введение в среду выполнения Java](https://topjava.ru/blog/what-is-the-jre) +- [Что такое Java? История создания](http://www.intuit.ru/studies/courses/16/16/lecture/27105) +- [Programming languages TIOBE Index](http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html) +- [Java Microbenchmark JMH](http://openjdk.java.net/projects/code-tools/jmh/) (используем на курсе [MasterJava](https://github.com/JavaWebinar/masterjava#Занятие-2)) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 4. [Системы управления версиями. Git](https://drive.google.com/file/d/0B9Ye2auQ_NsFSUNrdVc0bDZuX2s) + +![image](https://cloud.githubusercontent.com/assets/18701152/15219746/9295a2fe-186d-11e6-876b-c61cc9be71e4.png) + +- [Система управления версиями (VCS)](https://ru.wikipedia.org/wiki/Система_управления_версиями) +- [Сравнение разных VCS](https://biz30.timedoctor.com/ru/cистема-контроля-версий/) +- [Видео-уроки по 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 репозиторий с названием `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`, который вы скачали ранее к себе на компьютер: + +![newproject](https://user-images.githubusercontent.com/29703461/88058015-95008580-cb6b-11ea-9b7c-65843b859988.png) + +![next](https://user-images.githubusercontent.com/29703461/88057628-055ad700-cb6b-11ea-9c59-72bb538e2541.png) + +![next1](https://user-images.githubusercontent.com/29703461/88058925-d2b1de00-cb6c-11ea-9d0b-83c771899457.png) + +![finish](https://user-images.githubusercontent.com/29703461/88059306-579cf780-cb6d-11ea-8094-bbf87474a127.png) + +- Реализуйте методы `save, get, delete, clear, getAll, size` в классе `ArrayStorage`, организовав хранение резюме в массиве +- Храните все резюме в начале `storage` (без пустот в виде `null`), чтобы не перебирать каждый раз все 10_000 элементов +- При реализации метода `delete` учитывайте, что после удаления резюме между оставшимися резюме не должно быть пустых ячеек, заполненных null +``` +Схема хранения резюме в массиве storage (в элементах от 0 до size-1 отсутствуют null): + +r1, r2, r3,..., rn, null, null,..., null +<----- size -----> +<------- storage.length (10000) -------> +``` +- Проверьте вашу реализацию с помощью классов `MainArray.main()` и `MainTestArrayStorage.main()` +- Изучите дополнительные материалы по IntelliJ IDEA: + - [Idea Wiki](https://github.com/JavaOPs/topjava/wiki/IDEA) + - [Отладка Java кода в IDEA. Основные возможности отладчика](https://youtu.be/Z1BQsf0A4xY) + - [Эффективная работа с кодом в IntelliJ IDEA](https://www.youtube.com/watch?v=tpv5n2jWHlw) + - [Эффективная работа в IDEA](https://www.youtube.com/watch?v=_rj7dx6c5R8) + +### Вопросы по HW1 + > Не могу запустить программу, да и рядом с классами появился какой-то значок + + ![badsrc](https://user-images.githubusercontent.com/29703461/38277015-9cd9155e-379f-11e8-9cd4-a9182a005e9a.png) + - Проблема в том, что 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/) +### Советы по обучению + - Учитесь грамотно формулировать проблему: "у меня не работает" может иметь тысячи причин. В процессе формулирования часто приходит ее решение + - Учитесь исследовать проблему. Внимательное чтение логов и умение дебажить — основные навыки разработчика. В логах необходимо читать верхнюю часть самого нижнего иксепшена. Именно там находится причина возникшей ошибки + - Грамотно распределяйте время для каждой проблемы. Не впадайте в крайности: сразу бросаться за помощью или биться над ней часами. Подходите к ее решению разумно + - Получайте в процессе решения обратную связь, что бы убедиться в правильности выбранного направления + - [Советы новичкам](http://blog.csssr.ru/2016/09/19/how-to-be-a-beginner-developer) diff --git a/lesson/lesson02.md b/lesson/lesson02.md new file mode 100644 index 0000000..b45a59b --- /dev/null +++ b/lesson/lesson02.md @@ -0,0 +1,61 @@ + +# Второе занятие +> разбор 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) + - [Объектно-ориентированное программирование](https://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование) (wiki) + - [Объектно-ориентированное программирование (перевод статьи)](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) +- **Дополнительно:** + - [Зачем нам ООП и что это такое?](https://habrahabr.ru/post/148015/) + - [Николай Алименков — Парадигмы ООП](https://www.youtube.com/watch?v=G6LJkWwZGuc) (youtube) + - [Object-Oriented Programming Concepts](https://docs.oracle.com/javase/tutorial/java/concepts/index.html) + - [Classes and Objects](https://docs.oracle.com/javase/tutorial/java/javaOO/index.html) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. [Структура памяти: куча, стек, регистры, константы](https://drive.google.com/open?id=0B_4NpoQW1xfpZHRnTEhNWmk5Xzg) + - [Что такое Heap и Stack память в Java?](https://javadevblog.com/chto-takoe-heap-i-stack-pamyat-v-java.html) + - [Стек](https://ru.wikipedia.org/wiki/Стек) (wiki) + - [От Java-кода к Java-куче](https://www.ibm.com/developerworks/ru/library/j-codetoheap/index.html) + - [Java Heap Space vs Stack – Memory Allocation in Java](https://www.journaldev.com/4098/java-heap-space-vs-stack-memory) + - [Основы Java garbage collection](https://youtu.be/3TROgt7ncMo?t=51) (youtube) + - **Дополнительно:** + - [Из каких частей состоит память java процесса](http://habrahabr.ru/post/117274/) + - [Permanent область памяти](http://www.javaspecialist.ru/2011/04/permanent.html) + - [Java thread stack](http://www.javaspecialist.ru/2011/04/java-thread-stack.html) + - [Размер 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) + - [Пакеты](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)` +- Сделайте проверки в: + - `get`, `update`, `delete` на наличие резюме в `storage` + - `save` на отсутствие резюме в `storage` + - `save` на переполнение `storage` +- Выводите в консоль информативные предупреждения для указанных выше проверок +- Устраните дублирование кода в `ArrayStorage` +- Выберите в классе `java.util.Arrays` подходящие методы для реализации `clear()` и `getAll()` diff --git a/lesson/lesson03.md b/lesson/lesson03.md new file mode 100644 index 0000000..7ff4fb0 --- /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](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://ru.stackoverflow.com/questions/235352/Отличия-абстрактного-класса-от-интерфейса-abstract-class-and-interface) +- **Дополнительно:** + - [Что такое полиморфизм?](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://habrahabr.ru/post/168195/) + - [История эволюции интерфейсов в 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) +- [Временная сложность алгоритма](https://ru.wikipedia.org/wiki/Временная_сложность_алгоритма) (wiki) +- [Вычислительная сложность](https://ru.wikipedia.org/wiki/Вычислительная_сложность) (wiki) +- [Алгоритмы и структуры данных для начинающих: сложность алгоритмов](https://tproger.ru/translations/algorithms-and-data-structures) +- [Time complexity](https://drive.google.com/file/d/0B9Ye2auQ_NsFNEJWRFJkVDA3TkU/view) +- [Бинарное дерево поиска](https://www.youtube.com/watch?time_continue=447&v=HBMlhZAOhoI) (youtube) +- **Дополнительно** + - Легко написанная книга по алгоритмам и их сложности [Грокаем алгоритмы](https://www.ozon.ru/context/detail/id/139296295/) + +## ![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) + +**Ресурсы:** + - [Паттерн проектирования — Шаблонный метод](https://ru.wikipedia.org/wiki/Шаблонный_метод_(шаблон_проектирования)) (wiki) + - [Шаблонный метод (Template Method)](https://youtu.be/mNcmp-Msi6U) (youtube) + - [Шаблонный метод](https://refactoring.guru/ru/design-patterns/template-method/java/example) + - **Дополнительно** + - Книга из известной серии Head First — [Паттерны проектирования](https://www.ozon.ru/context/detail/id/144233005/?_bctx=CAgQver7Bg) + +## ![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 0000000..b4ce372 --- /dev/null +++ b/lesson/lesson04.md @@ -0,0 +1,70 @@ + +# Четвертое занятие + +## ![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](http://www.skipy.ru/technics/encodings.html) +- [Ошибки при использовании строк](http://www.skipy.ru/technics/strings.html) +- [Обработка строк в Java](https://habrahabr.ru/post/260767/) +- **Дополнительно:** + - [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) + - [String literal pool](http://java67.blogspot.ru/2014/08/difference-between-string-literal-and-new-String-object-Java.html) + +## ![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) + +**Ресурсы:** + - [Исключения (Exceptions)](http://proglang.su/java/exceptions) + - [Статья про исключения](http://developer.alexanderklimov.ru/android/java/exception.php) + - Про исключения также можно почитать в книге Джошуа Блоха - ["Java. Эффективное программирование"](https://www.ozon.ru/context/detail/id/21724143/) + - [Конструктор](http://info.javarush.ru/javarush_articles/2015/12/04/Конструкторы-классов-Java-JDK-1-5-.html) + - [Ключевые слова: 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 8 аннотации](https://urvanov.ru/2016/03/30/java-8-аннотации/) + - [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 — Что почитать по jUnit-тестам](https://i-http.ru/junit-chto-pochitat-po-junit-testam/) + - [Тестирование с помощью 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 +- Реализуйте тесты: `AbstractArrayStorageTest`, `ArrayStorageTest` и `SortedArrayStorageTest` +- В `MainReflection` вызовите у Resume, через отражение, метод `toString`. Выведите результат на консоль + +## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Подсказки по HW4 +- `SortedArrayStorageTest` должен запускаться с `SortedArrayStorage` +- `ArrayStorageTest` c `ArrayStorage` +- тестировать правильность сортировки не надо +- иерархия наследования тестовых классов должна совпадать с иерархией тестируемых +- логика реализации теста на переполнение массива (`StorageException`): + - заполняем массив, но не вызываем у него переполнение + - если при заполнении вылетит исключение, то тест должен провалиться (см. [`Assert.fail()`](https://stackoverflow.com/questions/3869954/whats-the-actual-use-of-fail-in-junit-test-case)) + - в fail() выводите сообщение о том, что переполнение произошло раньше времени + - тест считается успешно пройденным, когда переполнение происходит при попытке добавить в полностью заполненный массив еще одно резюме +- добавьте конструктор в `AbstractArrayStorageTest`, который инициализирует `Storage storage`, а в наследниках добавьте конструкторы, которые будут вызывать `super()` с нужным хранилищем diff --git a/lesson/lesson05.md b/lesson/lesson05.md new file mode 100644 index 0000000..4fcb636 --- /dev/null +++ b/lesson/lesson05.md @@ -0,0 +1,44 @@ + +# Пятое занятие + +## ![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` + +## ![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) +- [Структуры данных в картинках](http://habrahabr.ru/users/tarzan82/topics/) +- [Внутренняя работа HashMap в Java](https://habr.com/post/421179/) +- [Инициализация полей в Java](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 нет необходимости их использовать, будем считать их условно безразмерными +- при поиске uuid не надо использовать методы, который сравнивают объекты Resume по equals, в следующих уроках добавим еще поля в Resume и в equals и данный вариант не подойдет diff --git a/lesson/lesson06.md b/lesson/lesson06.md new file mode 100644 index 0000000..7fda546 --- /dev/null +++ b/lesson/lesson06.md @@ -0,0 +1,55 @@ + +# Шестое занятие +## ![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://refactoring.guru/ru/design-patterns/iterator/java/example) +- [Iterator / Iterable](http://www.javenue.info/post/101) +- [Iterator in Java](https://www.journaldev.com/13460/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://geekbrains.ru/posts/java_interfaces) +- [Лямбды в Java 8](https://habrahabr.ru/post/224593/) +- [Компараторы](https://www.baeldung.com/java-8-comparator-comparing) +- **Дополнительно:** + - [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` - используется для поиска по мапе). Выразите свои идеи в коде (в итоге у вас в проекте должны быть два класса, реализованных на основе мапы) +- Переделайте компаратор, учтя тот случай, что `fullName` разных людей может совпадать +- Из-за того, что количество тестовых классов растет, воспользуйтесь [аннотациями](http://javastudy.ru/junit/junit-suite-tests/) JUnit, которые помогут упростить их запуск (только для JUnit4). Форматируйте класс-запуска тестов в соответствии с [этой](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 0000000..497bffc --- /dev/null +++ b/lesson/lesson07.md @@ -0,0 +1,66 @@ + +# Седьмое занятие + +## ![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, обучающая статья)](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-диаграммы классов модели, описывающих резюме. Покажите ее наставнику +- Сделать объектную модель резюме (диаграмма и классы). [**Образец резюме**](https://javawebinar.github.io) + - 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` и заполните все его разделы данными, взятыми из [**Образца резюме**](https://javawebinar.github.io). Выведите все секции на консоль** +- **Не размещайте в 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 0000000..992a8b8 --- /dev/null +++ b/lesson/lesson08.md @@ -0,0 +1,30 @@ + +# Восьмое занятие + +## ![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) + +- Класс 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 0000000..761138b --- /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 0000000..62d5ade --- /dev/null +++ b/lesson/lesson10.md @@ -0,0 +1,33 @@ + +# Десятое занятие + +## ![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) + +**Ресурсы:** +- 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) + +## Домашнее задание +- Сделать и протестировать реализацию `DataStreamSerializer` diff --git a/lesson/lesson11.md b/lesson/lesson11.md new file mode 100644 index 0000000..b58227a --- /dev/null +++ b/lesson/lesson11.md @@ -0,0 +1,38 @@ +# Одиннадцатое занятие + +## Разбор Домашнего Задания-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) + +## Потоки. Синхронизация +- Потоки выполнения. Синхронизация. +- Методы 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 0000000..2317c9a --- /dev/null +++ b/lesson/lesson12.md @@ -0,0 +1,47 @@ + +# Двенадцатое занятие + +## ![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: + 1) реализовать метод через стрим `int minValue(int[] values)`. +Метод принимает массив цифр от 1 до 9, надо выбрать уникальные и вернуть минимально возможное число, составленное из этих уникальных цифр. Не использовать преобразование в строку и обратно. Например {1,2,3,3,2,3} вернет 123, а {9,8} вернет 89 + + 2) реализовать метод `List oddOrEven(List integers)` +если сумма всех чисел нечетная - удалить все нечетные, если четная - удалить все четные. Сложность алгоритма должна быть O(N). +Optional - решение в один стрим. diff --git a/lesson/lesson13.md b/lesson/lesson13.md new file mode 100644 index 0000000..3a4fc3e --- /dev/null +++ b/lesson/lesson13.md @@ -0,0 +1,49 @@ +# Тринадцатое занятие + +## ![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) +- Конфигурирование DB и каталога хранения + +## ![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 0000000..8ffe1f2 --- /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 0000000..ff3cc09 --- /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. Смотрим демо приложение в 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 0000000..8a9b90d --- /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 0000000..9b0ccc8 --- /dev/null +++ b/lesson/lesson17.md @@ -0,0 +1,27 @@ +# Семнадцатое занятие + +## ![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) + +## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) [1. Деплой в Heroku](https://drive.google.com/open?id=0B_4NpoQW1xfpS2JSSDByQ2xGWm8) +[см. коммит Lesson17 DB_credentials_as_resources](https://github.com/JavaWebinar/basejava/tree/9b8552f6957ae48440685cba5a24afd592e60fba) +- Deployment with the Heroku CLI +- для доступа к удаленной БД используйте следующие настройки SSL `ssl=true&sslmode=verify-ca&sslfactory=org.postgresql.ssl.NonValidatingFactory` + +## ![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 String/JPA Enterprise"](https://drive.google.com/file/d/0B9Ye2auQ_NsFY1ZDNXRCd1NCTG8) +- [Слайды вебинара](https://goo.gl/XNVOj4) +- Из юниоров в разработчики: получаем первую работу +- Java Tools and Technologies Landscape Report 2016 + +#### Java Enterprise project Topjava +- Стажировка Spring/JPA Enterprise (Topjava) +- Ссылки по темам интервью, тестовое интервью +- Составление резюме, подготовка к интервью, поиск работы +- [Как стать профессиональным Java разработчиком (Яков Фaйн)](https://www.youtube.com/watch?v=ft0Nj8Cm9kk)