From dab59f5bc9f5088b117de852c4192c0b72fef00d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 23 Feb 2016 03:41:46 +0300 Subject: [PATCH 001/936] Update topjava templates --- resources/fragments.html | 12 +- resources/mails/topjava_entrance.html | 13 ++ resources/mails/topjava_info.html | 226 ++++++++++++++++++++++ resources/mails/topjava_registration.html | 13 ++ topjava2.md | 5 +- 5 files changed, 262 insertions(+), 7 deletions(-) create mode 100644 resources/mails/topjava_entrance.html create mode 100644 resources/mails/topjava_info.html create mode 100644 resources/mails/topjava_registration.html diff --git a/resources/fragments.html b/resources/fragments.html index 1cdd5f6..953e223 100644 --- a/resources/fragments.html +++ b/resources/fragments.html @@ -2,10 +2,10 @@ - - - - + + + + - - + + diff --git a/resources/mails/topjava_entrance.html b/resources/mails/topjava_entrance.html new file mode 100644 index 0000000..042e7d2 --- /dev/null +++ b/resources/mails/topjava_entrance.html @@ -0,0 +1,13 @@ + + + + Вступительное занятие проекта 'Java Enterprise (Topjava)' + +

+ Здравствуй!
+

+

Спасибо за интерес к проекту Java Enterprise (Topjava):

+
+

+

+ \ No newline at end of file diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html new file mode 100644 index 0000000..20c9f9d --- /dev/null +++ b/resources/mails/topjava_info.html @@ -0,0 +1,226 @@ + + +разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с + использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), + REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
+

На бесплатном вступительном занятии подробно + разбирается работа с проектом в системе управления версиями Git. На занятиях я последовательно разрабатываю + приложение с объяснениями и теоретическим материалом по всем темам проекта. + Домашние задания выполняются вами по темам занятий и являются частью проекта. На заключительном занятии каждый участник деплоит свой + проект из github в облачный сервис Heroku. +

+

Требования к участникам:

+На проекте мы не проходим синтаксис java: предполагается, что вы уже знаете, что такое классы, конструкторы, аннотации, анонимные классы, исключения и пр. +Также необходим некоторый опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на первом занятии, кратко повторяя основы. +Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно, но не принципиально. Весь "Enterprise": Maven, Git (в том объеме, который нам нужен), Spring, Hibernate, REST даются с азов.
+Т.е. никаких специальных знаний Java EE не требуется. +
+

Основные достоинста проекта, взятые из отзывов участников:

+

Максимальный охват

+Самые важные и необходимые Java разработчику темы, API, фреймворки, инструменты в одном курсе. +Насыщенное и структурированное изложение как дополнение к проекту. +Изложение материала "без воды" нацелено на практическое использование и дополняется материалом для самостоятельной +проработки. Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, в связке, как +дополнения к созданию единого работающего приложения. +Усвоение и понимание материала увеличивается в разы. + +

Последовательная возрастание сложности с нуля

+Сложность проекта возрастает постепенно, с кода "Hello Topjava" в main() вступительного задания до финальной версии. +Слон съедается по кусочкам. + +

Совместная разработка

+Участники на протяжении всего курса работают с кодом проекта. Выполнение домашних заданий закрепляет полученные знания. +В результате проект становится "Вашим". + +

Поддержка группы и преподавателя

+Общение по любым вопросам: git, IDEA, домашние задания, зарплаты программиста, java консультации, архитектура, трудоустройство, вакансии, новости IT и пр. + +

Доступность и структурированность материалов

+Все видео доступно для просмотра онлайн и скачивания. Записи разбиты по темам +и тщательно отредактированы. Большое количество подобранных ресурсов для углубления в детали. + +

Оптимальное подобранное время

+Занятия проходят раз в неделю, оптимальное время необходимое для проработки пройденных тем и выполнения домашнего задания. + +

Ревью Вашего кода.

+Вы увидите именно свои ошибки в стиле, структурах данных, алгоритмах, кодировании. +Опыт равноценен нескольким годам работы разработчиком java. + +

Помощь в составлении резюме и с трудоустройством.

+Ваши формы соискателя я рассылаю всем знакомым HR, уже есть случаи трудоустройства выпускников. +Также в группе происходит активное общение на эту тему, выпускники делятся своим опытом трудоустройства, публикуют вакансии со своей работы. +

После проекта в твоем резюме появится раздел в опыте работы:

+Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей +на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API: + +

На проекте

+ +
+

Расписание занятий по проекту Java Enterprise (Topjava)

+Рассылка происходит по четвергам, для участников с проверкой домашнего задания желательно присылать ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. + + + + + + + + + + + + +
+

+ Для участия необходимо послать мне запрос в skype: grigory.kislin с пометкой topjava.
+ После этого можно оплачивать участие любым удобным способом.
+

+Если у тебя есть подписка на проект JavaRush, свяжись со мной отдельно.
+В конце вводного занятия есть ресурсы для лучшего усвоения всех тем проекта. +

+ Добавляйся в группу VK
+ До встречи на проекте! +

+
+ \ No newline at end of file diff --git a/resources/mails/topjava_registration.html b/resources/mails/topjava_registration.html new file mode 100644 index 0000000..540173a --- /dev/null +++ b/resources/mails/topjava_registration.html @@ -0,0 +1,13 @@ + + + + Регистрация на проект 'Java Enterprise (Topjava)' + +

+ Здравствуй!
+

+

Спасибо за регистрацию на проект Java Enterprise (Topjava):

+
+

+

+ \ No newline at end of file diff --git a/topjava2.md b/topjava2.md index 4ed18f0..ad0195f 100644 --- a/topjava2.md +++ b/topjava2.md @@ -242,4 +242,7 @@ http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-featur -org.springframework.web.servlet.DispatcherServlet.getHandler #1115 \ No newline at end of file +org.springframework.web.servlet.DispatcherServlet.getHandler #1115 + +## stormpath +https://devcenter.heroku.com/articles/stormpath From a77cf02feba8b5ad9586c02885e631f63156c8cf Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 23 Feb 2016 03:55:51 +0300 Subject: [PATCH 002/936] Update topjava info --- resources/mails/topjava_info.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 20c9f9d..1e9c8f3 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -94,8 +94,8 @@

На проекте


-

Расписание занятий по проекту Java Enterprise (Topjava)

-Рассылка происходит по четвергам, для участников с проверкой домашнего задания желательно присылать ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. +

Расписание занятий проекта:

+рассылка занятий происходит по четвергам, для участников с проверкой домашнего задания желательно присылать ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. +
+

Top Java Enterprise:
наиболее + востребованные технологии /инструменты /фреймворки Java Enterprise.

+

Старт 26.05.2016 (по четвергам с конца мая).

Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins
Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе From 5b485d0777b23693667fcb581b425ab270df917d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 16 Mar 2016 13:37:06 +0300 Subject: [PATCH 027/936] Update my story --- resources/story/story4.html | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/resources/story/story4.html b/resources/story/story4.html index bf06d2c..1fb4020 100644 --- a/resources/story/story4.html +++ b/resources/story/story4.html @@ -26,9 +26,9 @@

Начало

- Программировать я начал в школе на Электроника - МК-61, целых 105 иструкций. В журналах "Наука и жизнь", "Техника Молодежи" были програмки игр умещающиеся в - 96 инструкций БЗ-34, например посадка на Луну. + Программировать я начал в школе на Электронике + МК-61, целых 105 иструкций. В журналах "Наука и жизнь", "Техника Молодежи" были программки игр, умещающиеся в + 96 инструкций БЗ-34, например, посадка на Луну. В ИТМО на 2-м курсе повезло работать в студенческом научном обществе: перфокарты, Fortran-4, EC-1045. А в конце 80х - начале 90х случилось чудо: на кафедре появилось две IBM XT: 20M HDD, 640K @@ -44,14 +44,14 @@

Начало

Встреча с Java

Возвратиться в программирование в 2005 году после 8 лет работы в Alcatel инженером по тестированию телефонной - станции было нелегко: взяли в Siemens на java как специалиста по предметной обасти. Причем, пока ждал ответ от - Siemens, пришлось отказался от пеерхода внутри Alcatel на вакансию программиста C++. + станции было нелегко: взяли в Siemens на java как специалиста по предметной обасти. Причем, пока ждал ответа от + Siemens, пришлось отказаться от перехода внутри Alcatel на вакансию программиста C++. По java за спиной был только прочитанный курс intuit: программирование на Java. До сих пор в своем курсе Практика Java. Разработка Web приложения много тем беру оттуда. Взяли меня на уровне с другими 5-ю разработчиками, совсем не новичками. Догонять пришлось много, - первые 2 года читал запоем все что попадалось по java, паттернам и разработке. + первые 2 года читал запоем все, что попадалось по java, паттернам и разработке.

  • знание предметной области - плюс;
  • @@ -65,10 +65,10 @@

    Жизнь — как вождение велосипеда. Чтобы

Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!

- "Алиса в Зазеркалье", Льюиса Кэрролл + Льюиса Кэрролл "Алиса в Зазеркалье"
Ушел из Siemens после 2 с небольшим лет, как только перерос их велосипеды (незадолго до меня они перешли с - собственной RDBMS на Oracle, сборка была через make, в проекте не было ни одной сторонней библиотеки) и понял + собственной RDBMS на Oracle, сборка была через make, в проекте не было ни одной сторонней библиотеки) и понял, как это нужно делать. Как раз в Россию пришла программа бонусов за инновации - заработал на ней 2 поощрительных рюкзака, вместо 3-го наградили поездкой в Вену, где @@ -83,11 +83,11 @@

Нужно бежать со всех ног, чтобы только ост работе. В любой работе есть рутина, багфикс, не очень привлекательные задачи, а иногда и просто - отсутствие всякого желания. Это проходит. Не подавайтесь сиюминутным эмоциям, смена работы должно быть взвешенное, созревшее решение. Также был свидетелем, когда - новички уходили на 2й -3й день, расцениваю это как сдача перед первыми же трудностями. + новички уходили на 2й -3й день, расцениваю это как сдачу перед первыми же трудностями.

    -
  • работать должно быть интересно (если смотреть с отстраненно, с перспективой);
  • -
  • если вам не нравятся кривые решения, прежде чем уйти попробуйте пробить свои; +
  • работать должно быть интересно (если смотреть отстраненно, с перспективой);
  • +
  • если вам не нравятся кривые решения, прежде чем уйти, попробуйте пробить свои;
  • иногда есть возможность поменять проект (стек технологий) внутри одной компании;
  • если вы таки решились поменять работу - не дайте себя уговорить остаться;
  • наконец: уходить надо вовремя.
  • @@ -96,7 +96,7 @@

    Нужно бежать со всех ног, чтобы только ост

    Тренер Java

    Работы бывают разные: расслабление и застой, если сам не находишь себе достойных занятий (особенно в конторах, где программирование непрофильное или новички в бизнесе) или впахивание с ежедневными стэндапами. - Для самообразования лучше первые, для получения насыщенного опыта - вторые. Работая расслаблено задумался о + Для самообразования лучше первые, для получения насыщенного опыта - вторые. Работая расслаблено, задумался о написании курса по Java. И вскоре после этого в "Мой Круг" пришло предложение попреподавать в СПб в платном учебном центре. В результате согласился и с октября 2013 г. провел несколько очных выпусков своего курса "Практика Java. Разработки @@ -115,9 +115,9 @@

    Светлое настоящее

    Сейчас идет 6-й выпуск проекта Topjava, в команде slack обучается 115 человек. На сегодняшний день это мой самый востребованный проект и самые востребованные на рынке Java фреймворки, здесь можно почитать отзывы выпускников. - Но работа над проектом не останавливается: дорабатываются видео, рефакторится код. На днях запускаю очередной (7-й) - совмещенный с рассылкой вебинар "Практика Java. Разработки Web - приложения". + Но работа над проектом не останавливается: дорабатываются видео, рефакторится код. 25.03 запускаю очередной (7-й) + совмещенный с рассылкой вебинар-интенсив "Практика Java. Разработка Web + приложения" (2 раза в неделю). В ближайших планах обновить вебинар Веб-сервисы. SOA-based архитектура, дополнив его микросервисами. Также разрабатываю проект Topjava-2: Spring Boot, Светлое настоящее

href="http://nginx.org/ru/">nginx, авторизация по OAuth2, асинхронность, Guava и пока еще не выбрал UI, склоняюсь к Sencha GXT/GWT. - Конечно же стараюсь содействовать трудоустройству + Конечно же, стараюсь содействовать трудоустройству своих выпускников.
- Приглашаю к участию в проектах (следующий набор Topjava 26.05) и любым вариантам + Приглашаю к участию в проектах (интенсив "Разработка Web приложения" с 25.03 и следующий набор Java Enterprise Topjava 26.05) и готов к любым вариантам сотрудничества.
email: gkislin@yandex.ru
From 4ef40ccf3d3a086e2966855986daeba12f60b316 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 16 Mar 2016 14:40:18 +0300 Subject: [PATCH 028/936] Update info --- resources/view/index.html | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index a116a39..b2f62ae 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -85,7 +85,7 @@

Помощь в составлении резю

  • -

    После проекта в твоем резюме появится раздел в опыте работы:

    +

    После проекта topjava в твоем резюме появится раздел в опыте работы:

    Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей на стеке: Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API

  • -

    Top Java Enterprise:
    наиболее - востребованные технологии /инструменты /фреймворки Java Enterprise.

    -

    Старт 26.05.2016 (по четвергам с конца мая).

    +

    Top Java Enterprise:
    наиболее + востребованные технологии /инструменты /фреймворки Java Enterprise.

    +

    Старт 26.05.2016 (по четвергам с конца мая).

    Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins
    Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе ролей

    +
    +

    Практика Java. Разработка Web приложения:
    + Интенсив: 10 занятий 2 раза в неделю.

    +

    Старт 25.03.2016 по вторникам и пятницам с 20.00 (GMT+3, Москва).

    +

    Объектная модель, коллекции, система ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, SQL, персистентность в базу данных (PostgreSQL), сервлеты, JSP/JSTL, веб-контейнер Tomcat, HTML, модульные тесты JUnit, java.util.Logging, система контроля версий Git.

    +
    - +
    From b2992885cb370e17a551f2af4d1cee07e7e78e4a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 16 Mar 2016 19:16:03 +0300 Subject: [PATCH 029/936] Add yandex counter Add mail story notify --- resources/mails/story_notify.html | 31 ++++++++++++++++++++++++ resources/static/img/IvanVinogradov.jpg | Bin 0 -> 26396 bytes resources/story.html | 28 ++++++++++++++++++++- resources/view/fragments.html | 31 +++++++++++++++++++++++- resources/view/index.html | 1 + 5 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 resources/mails/story_notify.html create mode 100644 resources/static/img/IvanVinogradov.jpg diff --git a/resources/mails/story_notify.html b/resources/mails/story_notify.html new file mode 100644 index 0000000..3443bab --- /dev/null +++ b/resources/mails/story_notify.html @@ -0,0 +1,31 @@ + + + + + + Наши истории (делимся опытом и успехом) + +

    + Здравствуй!
    +

    +

    + У нас появились первые истории! +

    +

    +Я добавил еще свою и спасибо всем, кто откликнулся!!! Много кто еще или собирается написать, или ждет окончания испытательного срока. +Пишите!! Думаю что это будет полезно как автору - переосмыслить свой опыт, так и конечно же тем, кто ищет работу или делает первые шаги в карьере. +А может даже и не первые:) +

    +

    +Свои новости написал в конце своей истории: 25.03 запускаю совмещенный с рассылкой вебинар-интенсив Практика Java. Разработка Web +приложения (2 раза в неделю) и 26.05 будет следующий (7й) выпуск Topjava Enterprise. В ближайших планах обновить вебинар Веб-сервисы. SOA-based + архитектура, дополнив его микросервисами и разрабатываю проект Topjava-2: Spring Boot, H2, Thymleaf, AWS, nginx, +авторизация по OAuth2, асинхронность, Guava, ... +

    +Участники Topjava, уделите, пожалуйста, 5-10 минут своей жизни на этот опросник - это очень поможет нам улучшать курс TopJava и другие курсы. +

    +

    + \ No newline at end of file diff --git a/resources/static/img/IvanVinogradov.jpg b/resources/static/img/IvanVinogradov.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa264bafd946a293f060ae2d89fcffa68ea98ad1 GIT binary patch literal 26396 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 WdO~3$(IC9LvVKf*$@wvr<^S1hz+C?T literal 0 HcmV?d00001 diff --git a/resources/story.html b/resources/story.html index 0a39ec6..301be9e 100644 --- a/resources/story.html +++ b/resources/story.html @@ -43,9 +43,35 @@

    Каждое утро я просыпался с Иван Виноградов, 04/03/2016
    - Ждем истории по окончанию испытательных сроков: Тимур, Максим, Андрей, Дмитрий, Евгений, Алексей, ... + Ждем истории по окончанию испытательных сроков: Тимур, Максим, Андрей, Дмитрий, Евгений, Алексей, Азер, ...
    + + \ No newline at end of file diff --git a/resources/view/fragments.html b/resources/view/fragments.html index 7287352..2d053e4 100644 --- a/resources/view/fragments.html +++ b/resources/view/fragments.html @@ -22,7 +22,6 @@ - @@ -32,4 +31,34 @@ + + + + \ No newline at end of file diff --git a/resources/view/index.html b/resources/view/index.html index b2f62ae..00d7742 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -121,4 +121,5 @@

    Старт 25.03.2016 по вторникам и пятницам с 20.0 + \ No newline at end of file From b3f36edc57f42020c03aab68361e20b36fc5dcec Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 16 Mar 2016 20:03:04 +0300 Subject: [PATCH 030/936] Change basejava register --- resources/mails/basejava_register.html | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index f3db605..a007965 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -10,11 +10,15 @@

    До начала занятий необходимо установить ПО и подготовится по вступительному занятию.

    +

    + Стоимость участия: 6900 руб. (97$) без проверки домашних заданий и 15900 руб. (224$) с проверкой.
    + Варианты оплаты.
    +

    + Добавляйся в группу VK
    Всего наилучшего и до встречи на проекте!

    From 2b76003d6f62fecc00d0672c42407fe8fe43ddea Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Mar 2016 14:49:15 +0300 Subject: [PATCH 031/936] Add lessons --- resources/mails/lesson/lesson01.html | 34 ++++++++++++++++++++++++++++ resources/mails/lesson/lesson02.html | 24 ++++++++++++++++++++ resources/mails/lesson/lesson03.html | 23 +++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 resources/mails/lesson/lesson01.html create mode 100644 resources/mails/lesson/lesson02.html create mode 100644 resources/mails/lesson/lesson03.html diff --git a/resources/mails/lesson/lesson01.html b/resources/mails/lesson/lesson01.html new file mode 100644 index 0000000..70d1dd6 --- /dev/null +++ b/resources/mails/lesson/lesson01.html @@ -0,0 +1,34 @@ + + + + Первое занятие проекта Java Enterprise (Topjava) + + +

    + Здравствуй firstName! +

    +Поздравляю тебя с первым занятием нашего + проекта.
    +

    + Здесь я буду вести проект паралельно с вами.
    + Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
    + В случае проблем с накаткой патчей в вашу ветку master всегда можно взять код, на который патчи будут ложиться без проблем, + например UserMealsUtil в формате Raw.
    + Занятия буду выкладывать в каталог doc и ветке doc проекта.
    +

    +

    + Если Google Drive отказывает в доступе к материалам урока: +

      +
    • попробуй выйти из google аккаунта и снова зайти;
    • +
    • попробуй зайти в google аккаунт в приватном окне Ctrl+Shift+N в хроме, Ctrl+Shift+P в FF;
    • +
    • напиши мне в личку в skype.
    • +
    +

    +

    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 08.03.
    + Удачи в освоении материалов и выполнении задания! +

    +

    +

    + + \ No newline at end of file diff --git a/resources/mails/lesson/lesson02.html b/resources/mails/lesson/lesson02.html new file mode 100644 index 0000000..8c5b38c --- /dev/null +++ b/resources/mails/lesson/lesson02.html @@ -0,0 +1,24 @@ + + + + Второе занятие проекта Java Enterprise (Topjava) + + +

    + Здравствуй firstName! +

    +Готово второе достаточно сложное занятие нашего проекта "Каркас приложения, добавление Spring".
    +

    + Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
    + В случае проблем с накаткой патчей в вашу смотрите в Git + Wiki "Patch не накатывается (предлагает merge)". +

    +

    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 15.03.
    + Удачи в освоении материалов и выполнении этого важного задания! +

    +

    +

    + + \ No newline at end of file diff --git a/resources/mails/lesson/lesson03.html b/resources/mails/lesson/lesson03.html new file mode 100644 index 0000000..2e8ff81 --- /dev/null +++ b/resources/mails/lesson/lesson03.html @@ -0,0 +1,23 @@ + + + + Второе занятие проекта Java Enterprise (Topjava) + + +

    + Здравствуй firstName! +

    +Третье занятие нашего проекта: тестирование, JUnit и начинаем работать с DB.
    +Если с SQL и RDBMS не работали- прочтите основы по ссылкам. +

    + Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
    + Обсуждение урока и ДЗ в slack #lesson03 +

    +

    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 24.03.
    + Удачи в освоении материалов и выполнении этого важного задания! +

    +

    +

    + + \ No newline at end of file From 49b1951159498ebe4e939ce665827bd4af106851 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Mar 2016 14:53:24 +0300 Subject: [PATCH 032/936] Update lesson03 --- resources/mails/lesson/lesson03.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/lesson/lesson03.html b/resources/mails/lesson/lesson03.html index 2e8ff81..eeea19f 100644 --- a/resources/mails/lesson/lesson03.html +++ b/resources/mails/lesson/lesson03.html @@ -1,7 +1,7 @@ - Второе занятие проекта Java Enterprise (Topjava) + Третье занятие проекта TopJava Enterprise

    From 394bc404f58dfa5896043be336b6d2484a764e53 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Mar 2016 16:56:33 +0300 Subject: [PATCH 033/936] Update basejava_registry --- resources/mails/basejava_register.html | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index a007965..c351313 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -12,11 +12,21 @@ Спасибо за регистрацию на проекте Практика Java. Разработка Web приложения!
    Занятия будут проходить интенсивно: 2 раза в неделю, старт 25.03.

    -

    До начала занятий необходимо установить ПО и подготовится по вступительному занятию.

    + Требование к участникам: + насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и + самые необходимые разделы Java API, включая работу с базой данных (JDBC API) и написние веб-приложения + (Tomcat/ Servlets/ JSP/ JSTL). Знание SQL, HTML желательно. Должно присутствовать желание изучать простые темы (например типы данных) + самостоятельно по ссылкам курса. На занятиях мы учимся программировать на примере создания проекта, я + объясняю основы конкретных Java API, в программе есть достаточно много ссылок на курс Программирование + на Java" на intuit. Если у Вас опыта в программировании немного, рекомендую прочитать его до курса. + Или будте готовы к тому, чтобы проработывать его вместе с темами наших занятий. Для полного усвоения + материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. +

    +

    До начала занятий необходимо установить ПО и подготовится по вступительному занятию.

    Стоимость участия: 6900 руб. (97$) без проверки домашних заданий и 15900 руб. (224$) с проверкой.
    - Варианты оплаты.
    + Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать курс.

    Добавляйся в группу VK
    From 1e71cb32ae728ec49fe1381e1f68ef304a9dc3f6 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Mar 2016 17:00:32 +0300 Subject: [PATCH 034/936] fix template --- resources/mails/basejava_register.html | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index c351313..6a4c8a2 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -31,7 +31,6 @@

    Спасибо за регистрацию на проекте Практика Java. Разработка Web приложения!
    -Старт проекта будет по мере набора группы.
    -Буду делать рассылку и держать в курсе. +Занятия будут проходить интенсивно: 2 раза в неделю, старт 25.03.

    До начала занятий необходимо установить Добавляйся в группу VK
    Всего наилучшего и до встречи на проекте!
    -

    Ответы на вопросы.

    From 4514d46265ab10b45f2a4586f307022a27d7f433 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Mar 2016 17:12:24 +0300 Subject: [PATCH 035/936] fix template --- resources/mails/basejava_register.html | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 6a4c8a2..f588933 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -15,11 +15,10 @@

    Требование к участникам: насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и - самые необходимые разделы Java API, включая работу с базой данных (JDBC API) и написние веб-приложения - (Tomcat/ Servlets/ JSP/ JSTL). Знание SQL, HTML желательно. Должно присутствовать желание изучать простые темы (например типы данных) - самостоятельно по ссылкам курса. На занятиях мы учимся программировать на примере создания проекта, я - объясняю основы конкретных Java API, в программе есть достаточно много ссылок на курс Программирование - на Java" на intuit. Если у Вас опыта в программировании немного, рекомендую прочитать его до курса. + самые необходимые разделы Java API, включая работу с базой данных (JDBC API) и написние веб-приложения (Tomcat/ Servlets/ JSP/ JSTL), поэтому знание SQL и HTML желательно. + Должно присутствовать желание изучать простые темы (например типы данных) самостоятельно по ссылкам курса. + Все темы курса являются частью проекта, в материалах есть достаточно много ссылок на курс Программирование + на Java на intuit. Если у Вас опыта с Java немного, рекомендую прочитать его до курса. Или будте готовы к тому, чтобы проработывать его вместе с темами наших занятий. Для полного усвоения материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА.

    From 424dd0ce8a3b118a1b39dc27d8161ee75e19528b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Mar 2016 18:15:30 +0300 Subject: [PATCH 036/936] Add 5th story --- .../img/{ => portrait}/GrigoryKislin.jpg | Bin .../img/{ => portrait}/IvanVinogradov.jpg | Bin resources/static/img/portrait/LevH.png | Bin 0 -> 63393 bytes resources/story.html | 4 + resources/story/story1.html | 2 +- resources/story/story5.html | 97 ++++++++++++++++++ 6 files changed, 102 insertions(+), 1 deletion(-) rename resources/static/img/{ => portrait}/GrigoryKislin.jpg (100%) rename resources/static/img/{ => portrait}/IvanVinogradov.jpg (100%) create mode 100644 resources/static/img/portrait/LevH.png create mode 100644 resources/story/story5.html diff --git a/resources/static/img/GrigoryKislin.jpg b/resources/static/img/portrait/GrigoryKislin.jpg similarity index 100% rename from resources/static/img/GrigoryKislin.jpg rename to resources/static/img/portrait/GrigoryKislin.jpg diff --git a/resources/static/img/IvanVinogradov.jpg b/resources/static/img/portrait/IvanVinogradov.jpg similarity index 100% rename from resources/static/img/IvanVinogradov.jpg rename to resources/static/img/portrait/IvanVinogradov.jpg diff --git a/resources/static/img/portrait/LevH.png b/resources/static/img/portrait/LevH.png new file mode 100644 index 0000000000000000000000000000000000000000..e5153fe39c116c0ea4fbb1d894877de140ec6160 GIT binary patch literal 63393 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 exBIUjKmG?@oMbACSDyX=0000q{g literal 0 HcmV?d00001 diff --git a/resources/story.html b/resources/story.html index 301be9e..10d1f20 100644 --- a/resources/story.html +++ b/resources/story.html @@ -26,6 +26,10 @@
    - +

    В данный момент я работаю в западной корпорации на должности ИТ-администратора: системы коммуникаций на базе Asterisk (офисная телефония, центры обработки вызовов итд), также занимаюсь системами виртуализации и базами diff --git a/resources/story/story5.html b/resources/story/story5.html new file mode 100644 index 0000000..756f3e7 --- /dev/null +++ b/resources/story/story5.html @@ -0,0 +1,97 @@ + + + + + + + + + Истории + + + + + + + +

    +
    + +

    + Добрый день. +

    +

    + По просьбе коллеги, решил написать свою историю трудоустройства программистом. +

    +

    Обучение

    +

    + До того как стать программистом, + я работал проектировщиком сетей связи. Но решил стать программистом, т.к. идея автоматизации разных процессов + мне показалось очень заманчивой. Сначала решил изучать C++, скачал пару задачников по С++. И увидел ссылку на + сервис JavaRush, на тот момент сервис содержал всего 15 уровней и не требовал денег за его использование. Я + прошел пару уровней и решил изучать Java, этот язык показался мне более читабельным и лаконичным. Когда я дошел + до 15 уровня, остальные еще разрабатывались, но я решил купить подписку в надежде, что это хоть как то поможет и + развитию сервиса. Я выполнял задания с Javarush, изучал HTML, CSS, Javascript и jQuery на codecademy. Позже, при поиске разных + курсов, я наткнулся на школу разработки в Digital Design. Я подал заявку. +

    +

    Digital Design

    +

    + Первую часть курса школы включала в себя изучение Java Core. Вторая часть предполагала - реальный проект (что-то + наподобие TopJava, но большую часть изучали сами, по примерам и туториалам). С Core проблем не было, но вот + переварить все, что включал "реальный проект" стало не просто. Стек технологий требовал много времени на + изучение jQuery и jQuery Plugins, Spring, Hibernate, Jetty, еще предстояло разобраться с svn и maven. + Предполагалась разработка приложения, позволяющего упростить управление проектами для менеджеров, учитывать + уровень загрузки членов команды на разных проектах и т.д. В итоге получился мало-функциональный макет. Но три + человека, включая меня, все-таки успешно закончили школу разработки. +

    +

    + Следующим этапом стала стажировка. Там приходилось работать за еду в прямом смысле - оплачивали только обед. Я + начал делать свой собственный проект. Решил разработать каталог-партнёрку, на нем планировалось даже немного + подзаработать. Так я начал делать свой проект с таким же стеком, что и школе разработки. В это же время начал + ходить по собеседованиям. Кстати, одним из плюсов моего резюме оказался собственный проект, который + разворачивался на Amazon EC2. +

    +

    + Проект я доделать не успел т.к. посетив 4-5 собеседований, я получил два предложения. Общее время, потраченное + на подготовку и трудоустройство, составляло 4-5 месяцев. Три из них я по 8 часов в день ходил на стажировку. +

    +

    TopJava

    +

    + После полутора лет коммерческой разработки и использования фреймворков компании, решил обновить свои знания по + OpenSource технологиям. Проект TopJava для этого подошел идеально. Я узнал новые возможности Java 8, поработал + со основными модулями Srping'а , использовал Hibernate и eCache. Для UI использовал Bootstrap и jQuery plugins. + Вобщем прошел весь путь от создания скелета приложения и его реализации до его финального деплоя в heroku. Думаю, этот проект - одна из причин, по которой я успешно сменю + работу. Но это тема для другой истории.:) +

    +

    + Главное верить в свои силы:) . +

    +
    + Лев Хачересьянц, 16/03/2016 +
    + К списку историй +
    +
    + + + + + + + + + + + + + \ No newline at end of file From 2909f182f81ea0ff3483fed5191e3f40910c0b75 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Mar 2016 21:59:03 +0300 Subject: [PATCH 037/936] Update mail templates --- resources/mails/basejava_register.html | 13 +++++-- resources/mails/basejava_register_info.html | 43 +++++++++++++++++++++ resources/mails/masterjava_register.html | 2 +- resources/mails/topjava_info.html | 2 +- 4 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 resources/mails/basejava_register_info.html diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index f588933..7aecd99 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -10,7 +10,9 @@

    Спасибо за регистрацию на проекте Практика Java. Разработка Web приложения!
    -Занятия будут проходить интенсивно: 2 раза в неделю, старт 25.03.
    +Интенсив начинется 25.03. Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут + доступны в записи. +

    Требование к участникам: @@ -22,13 +24,16 @@ Или будте готовы к тому, чтобы проработывать его вместе с темами наших занятий. Для полного усвоения материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА.

    -

    До начала занятий необходимо установить ПО и подготовится по вступительному занятию.

    +Т.е. это будет курс либо для программистов, желающих перейти Java, либо для людей, у который уже есть практический опыт с +Java.
    +До начала занятий необходимо установить ПО и подготовится по вступительному занятию.

    Стоимость участия: 6900 руб. (97$) без проверки домашних заданий и 15900 руб. (224$) с проверкой.
    - Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать курс.
    + Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать + курс.

    -Добавляйся в группу VK
    +Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    Всего наилучшего и до встречи на проекте!

    Ответы на вопросы.

    diff --git a/resources/mails/basejava_register_info.html b/resources/mails/basejava_register_info.html new file mode 100644 index 0000000..9e64042 --- /dev/null +++ b/resources/mails/basejava_register_info.html @@ -0,0 +1,43 @@ + + + + + + Старт интенсива "Практика Java. Разработка Web приложения". + +

    + Здравствуй firstName!
    +

    +

    + Раз сообщить, что 25.03 начинается интесив Практика Java. Разработка Web + приложения.
    + Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут + доступны в записи. +

    +

    + Требование к участникам: + насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и + самые необходимые разделы Java API, включая работу с базой данных (JDBC API) и написние веб-приложения (Tomcat/ + Servlets/ JSP/ JSTL), поэтому знание SQL и HTML желательно. + Должно присутствовать желание изучать простые темы (например типы данных) самостоятельно по ссылкам курса. + Все темы курса являются частью проекта, в материалах есть достаточно много ссылок на курс Программирование + на Java на intuit. Если у Вас опыта с Java немного, рекомендую прочитать его до курса. + Или будте готовы к тому, чтобы проработывать его вместе с темами наших занятий. Для полного усвоения + материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. +

    +Т.е. это будет курс либо для программистов, желающих перейти Java, либо для людей, у который уже есть практический опыт с +Java.
    +До начала занятий необходимо установить ПО и подготовится по вступительному занятию. +

    + Стоимость участия: 6900 руб. (97$) без проверки домашних заданий и 15900 руб. (224$) с проверкой.
    + Как обычно участникам моих курсов - скидка.
    + Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать + курс. +

    + +Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    +Всего наилучшего и до встречи на проекте!
    +

    Ответы на вопросы.

    +

    + \ No newline at end of file diff --git a/resources/mails/masterjava_register.html b/resources/mails/masterjava_register.html index 24a92e7..af4253d 100644 --- a/resources/mails/masterjava_register.html +++ b/resources/mails/masterjava_register.html @@ -12,7 +12,7 @@ Спасибо за регистрацию на проекте Веб-сервисы. SOA-based (Microservices) архитектура!
    Я собираюсь его переработать, старт будет по готовности и по мере набора группы.
    Буду делать рассылку и держать в курсе. -Добавляйся в группу VK
    +Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    До встречи на проекте!

    Ответы на вопросы.

    diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 999c8c9..62e7c16 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -245,7 +245,7 @@

    Еще есть возможность принять участие в эт В конце вводного занятия есть ресурсы для подготовки.

    - Добавляйся в группу VK
    + Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    До встречи на проекте!

    From 51882593d8db5054681777330000cf671d249a8e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Mar 2016 23:36:19 +0300 Subject: [PATCH 038/936] Update mail templates --- resources/mails/basejava_register_info.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/mails/basejava_register_info.html b/resources/mails/basejava_register_info.html index 9e64042..fc05fa1 100644 --- a/resources/mails/basejava_register_info.html +++ b/resources/mails/basejava_register_info.html @@ -3,7 +3,7 @@ - Старт интенсива "Практика Java. Разработка Web приложения". + 25.03 начало интенсива "Практика Java. Разработка Web приложения".

    Здравствуй firstName!
    @@ -24,11 +24,11 @@ href="http://www.intuit.ru/studies/courses/16/16/info">Программирование на Java на intuit. Если у Вас опыта с Java немного, рекомендую прочитать его до курса. Или будте готовы к тому, чтобы проработывать его вместе с темами наших занятий. Для полного усвоения - материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. + материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА.
    + Т.е. это будет курс либо для программистов, желающих перейти Java, либо для людей, у который уже есть практический опыт с Java.

    -Т.е. это будет курс либо для программистов, желающих перейти Java, либо для людей, у который уже есть практический опыт с -Java.
    -До начала занятий необходимо установить ПО и подготовится по вступительному занятию. +До начала занятий необходимо установить ПО и подготовится по вступительному занятию.
    +Я обновил его актуальной ссылкой на будующий проект курса.

    Стоимость участия: 6900 руб. (97$) без проверки домашних заданий и 15900 руб. (224$) с проверкой.
    Как обычно участникам моих курсов - скидка.
    From e93f8a3aa029fa173493a225bca4f9ab2c1c26e7 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 18 Mar 2016 00:28:55 +0300 Subject: [PATCH 039/936] Update mail templates --- resources/mails/basejava_register.html | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 7aecd99..a18412d 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -13,7 +13,6 @@ Интенсив начинется 25.03. Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут доступны в записи.

    -

    Требование к участникам: насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и From f4c9d8cd69c171f7035485a9f7234f8620dbc99d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 18 Mar 2016 21:44:53 +0300 Subject: [PATCH 040/936] Add registerType in sending group mail --- .../java/ru/javaops/repository/UserRepository.java | 5 +++++ src/main/java/ru/javaops/service/GroupService.java | 14 +++++++++----- src/main/java/ru/javaops/service/UserService.java | 6 +++--- .../java/ru/javaops/service/UserServiceImpl.java | 11 ++++++----- src/main/java/ru/javaops/web/MailController.java | 6 ++++-- src/main/java/ru/javaops/web/UserController.java | 2 +- .../java/ru/javaops/service/MailServiceTest.java | 2 +- 7 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/javaops/repository/UserRepository.java b/src/main/java/ru/javaops/repository/UserRepository.java index 86a4a73..dc26159 100644 --- a/src/main/java/ru/javaops/repository/UserRepository.java +++ b/src/main/java/ru/javaops/repository/UserRepository.java @@ -4,6 +4,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.transaction.annotation.Transactional; +import ru.javaops.model.RegisterType; import ru.javaops.model.User; import java.util.Set; @@ -18,6 +19,10 @@ public interface UserRepository extends JpaRepository { " WHERE ug.group.name=:groupName AND ug.user.active=TRUE") Set findByGroupName(@Param("groupName") String groupName); + @Query("SELECT DISTINCT(ug.user) FROM UserGroup ug " + + " WHERE ug.registerType=:registerType AND ug.group.name=:groupName AND ug.user.active=TRUE") + Set findByGroupNameAndRegisterType(@Param("groupName") String groupName, @Param("registerType") RegisterType registerType); + @Query("SELECT ug.user FROM UserGroup ug WHERE ug.user.email=:email AND ug.group.id=:groupId") User findByEmailAndGroupId(@Param("email") String email, @Param("groupId") int groupId); diff --git a/src/main/java/ru/javaops/service/GroupService.java b/src/main/java/ru/javaops/service/GroupService.java index 6acb4ce..eaf65ec 100644 --- a/src/main/java/ru/javaops/service/GroupService.java +++ b/src/main/java/ru/javaops/service/GroupService.java @@ -133,22 +133,26 @@ private static Group getGroupByProjectAndType(Collection groups, String p return group.get(); } - public Set filterUserByGroupNames(String includes, String excludes) { + public Set filterUserByGroupNames(String includes, String excludes, RegisterType registerType) { final List groups = getAll(); - Set includeUsers = filterUserByGroupNames(groups, includes); + Set includeUsers = filterUserByGroupNames(groups, includes, registerType); if (StringUtils.isNoneEmpty(excludes)) { - Set excludeUsers = filterUserByGroupNames(groups, excludes); + Set excludeUsers = filterUserByGroupNames(groups, excludes, null); includeUsers.removeAll(excludeUsers); } return includeUsers; } - private Set filterUserByGroupNames(List groups, String groupNames) { + private Set filterUserByGroupNames(List groups, String groupNames, RegisterType registerType) { List> predicates = getMatcher(groupNames); // filter users by predicates return groups.stream().filter(group -> predicates.stream().anyMatch(p -> p.test(group.getName()))) - .flatMap(group -> userService.findByGroupName(group.getName()).stream()) + .flatMap(group -> + (registerType == null ? + userService.findByGroupName(group.getName()) : + userService.findByGroupNameAndRegisterType(group.getName(), registerType) + ).stream()) .collect(Collectors.toSet()); } diff --git a/src/main/java/ru/javaops/service/UserService.java b/src/main/java/ru/javaops/service/UserService.java index 78beffb..ff0f04f 100644 --- a/src/main/java/ru/javaops/service/UserService.java +++ b/src/main/java/ru/javaops/service/UserService.java @@ -1,9 +1,9 @@ package ru.javaops.service; +import ru.javaops.model.RegisterType; import ru.javaops.model.User; import ru.javaops.to.UserToExt; -import java.util.Collection; import java.util.Set; /** @@ -14,14 +14,14 @@ public interface UserService { void deleteByEmail(String email); - Collection getGroup(String groupName); - User findExistedByEmail(String email); User findByEmail(String email); Set findByGroupName(String email); + Set findByGroupNameAndRegisterType(String groupName, RegisterType registerType); + User findByEmailAndGroupId(String email, int groupId); void save(User u); diff --git a/src/main/java/ru/javaops/service/UserServiceImpl.java b/src/main/java/ru/javaops/service/UserServiceImpl.java index 911cce4..6489e76 100644 --- a/src/main/java/ru/javaops/service/UserServiceImpl.java +++ b/src/main/java/ru/javaops/service/UserServiceImpl.java @@ -8,12 +8,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.javaops.LoggedUser; +import ru.javaops.model.RegisterType; import ru.javaops.model.User; import ru.javaops.repository.UserRepository; import ru.javaops.to.UserToExt; import ru.javaops.util.UserUtil; -import java.util.Collection; import java.util.Set; import static com.google.common.base.Preconditions.checkNotNull; @@ -55,10 +55,6 @@ public void deleteByEmail(String email) { } } - public Collection getGroup(String groupName) { - return userRepository.findByGroupName(groupName); - } - @Override public User findByEmail(String email) { return userRepository.findByEmail(email.toLowerCase()); @@ -73,6 +69,11 @@ public Set findByGroupName(String groupName) { return userRepository.findByGroupName(groupName); } + @Override + public Set findByGroupNameAndRegisterType(String groupName, RegisterType registerType) { + return userRepository.findByGroupNameAndRegisterType(groupName, registerType); + } + @Override public void save(User u) { userRepository.save(u); diff --git a/src/main/java/ru/javaops/web/MailController.java b/src/main/java/ru/javaops/web/MailController.java index 77ca9ff..b423029 100644 --- a/src/main/java/ru/javaops/web/MailController.java +++ b/src/main/java/ru/javaops/web/MailController.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import ru.javaops.model.RegisterType; import ru.javaops.model.User; import ru.javaops.service.GroupService; import ru.javaops.service.MailService; @@ -51,9 +52,10 @@ public ResponseEntity sendToProjectByGroupType(@Param(" @RequestMapping(value = "/to-groups", method = POST) public ResponseEntity sendToGroup(@Param("template") String template, @Param("includes") String includes, - @RequestParam(value = "excludes", required = false) String excludes) { + @RequestParam(value = "excludes", required = false) String excludes, + @RequestParam(value = "reg-type", required = false) RegisterType registerType) { - Set users = groupService.filterUserByGroupNames(includes, excludes); + Set users = groupService.filterUserByGroupNames(includes, excludes, registerType); MailService.GroupResult groupResult = mailService.sendToUserList(template, users); return new ResponseEntity<>(groupResult, groupResult.isOk() ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR); } diff --git a/src/main/java/ru/javaops/web/UserController.java b/src/main/java/ru/javaops/web/UserController.java index dddc023..c2186cb 100644 --- a/src/main/java/ru/javaops/web/UserController.java +++ b/src/main/java/ru/javaops/web/UserController.java @@ -40,7 +40,7 @@ public void delete(@Param("email") String email) { @RequestMapping(value = "/group", method = POST) public Collection getGroup(@Param("group") String group) { // TODO make json projection - return userService.getGroup(group); + return userService.findByGroupName(group); } @RequestMapping(value = "/pay", method = POST) diff --git a/src/test/java/ru/javaops/service/MailServiceTest.java b/src/test/java/ru/javaops/service/MailServiceTest.java index 3a53070..1be7624 100644 --- a/src/test/java/ru/javaops/service/MailServiceTest.java +++ b/src/test/java/ru/javaops/service/MailServiceTest.java @@ -18,7 +18,7 @@ public class MailServiceTest extends ApplicationAbstractTest { @Test public void testGetContent() throws Exception { - String content = mailService.getContent("topjva_fill_form", + String content = mailService.getContent("basejava_register", ImmutableMap.of("user", UserTestData.USER, "template", "topjava_register", "participation", "REGISTRATION", "result", "OK", "activationKey", "activationKey")); System.out.println("\n+++++"); System.out.println(Util.getTitle(content)); From 5333e0eea0e4456ede3049087ce4dedc97317e9f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 18 Mar 2016 22:52:19 +0300 Subject: [PATCH 041/936] Update basejava register --- resources/mails/basejava_for_topjava.html | 38 +++++++++++++++++++++ resources/mails/basejava_register.html | 26 ++++++++------ resources/mails/basejava_register_info.html | 6 ++-- 3 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 resources/mails/basejava_for_topjava.html diff --git a/resources/mails/basejava_for_topjava.html b/resources/mails/basejava_for_topjava.html new file mode 100644 index 0000000..22654e7 --- /dev/null +++ b/resources/mails/basejava_for_topjava.html @@ -0,0 +1,38 @@ + + + + + + Информация: 25.03 начало интенсива "Практика Java. Разработка Web приложения". + +

    + Здравствуй firstName!
    +

    +

    25.03 стартует очередной (7-й) выпуск еще одного моего тренинга: Практика Java. Разработка Web приложения.
    + Занятия будут проходить в интенсивном режиме: 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут + доступны в записи. Этот проект не так сильно проработат, как Topjava, поэтому будет проходить как вебинар, совмещенный с рассылкой.
    +

    +Организационные моменты: следующий выпуск topjava начнется 26.05, для тебя повторное участие бесплатное.
    +"Практика Java. Разработка Web приложения" также будет еще проводится, точную дату следующего старта пока сказать не могу. +Если у тебя есть пробелы в базовых вещах: организация памяти в Java, коллекции, дженерики, внутренние и вложенные классы, многопоточность, сервлеты, JDBC, объектная модель, +которые не дают тебе полноценно проходить курс Topjava, можно сделать паузу до 26.05 и принять участие в этом интенсиве. Или можно будет пройти этот курс уже после Topjava (таких примерно 10% участников Topjava). +

    + Требование к участникам: + насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и + самые необходимые разделы Java API, включая работу с базой данных (JDBC API) и написние веб-приложения (Tomcat/ + Servlets/ JSP/ JSTL), поэтому знание SQL и HTML желательно. Все темы курса являются частью проекта, в материалах есть достаточно много ссылок на курс Программирование + на Java на intuit. Если у Вас опыта с Java немного, рекомендую прочитать его до курса. + Или будте готовы к тому, чтобы прорабатывать его вместе с темами наших занятий. Для полного усвоения + материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. + Т.е. это будет тренинг либо для программистов, желающих перейти на Java, либо для людей, у который уже есть практический опыт с Java. +

    +Вступительное занятие, кроме установки ПО и Git, состоит из подтягивания проекта.
    +

    + Стоимость участия: 6900 руб. (100$) без проверки домашних заданий и 15900 руб. (230$) с проверкой.
    + Для тебя скидка 700 руб (90$) без ДЗ и 1500 руб.(209$) с ДЗ.
    + По всем вопросам пишите в личку в skype (или slack). +

    +

    Ответы на вопросы.

    +

    + \ No newline at end of file diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index a18412d..9b1c2af 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -9,23 +9,27 @@ Здравствуй firstName!

    -Спасибо за регистрацию на проекте Практика Java. Разработка Web приложения!
    -Интенсив начинется 25.03. Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут + Спасибо за регистрацию на проекте Практика Java. Разработка Web + приложения!
    + Интенсив начинется 25.03. Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, + все материалы будут доступны в записи.

    Требование к участникам: - насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и - самые необходимые разделы Java API, включая работу с базой данных (JDBC API) и написние веб-приложения (Tomcat/ Servlets/ JSP/ JSTL), поэтому знание SQL и HTML желательно. + насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и + самые необходимые разделы Java API, включая работу с базой данных (JDBC API) и написние веб-приложения (Tomcat/ + Servlets/ JSP/ JSTL), поэтому знание SQL и HTML желательно. Должно присутствовать желание изучать простые темы (например типы данных) самостоятельно по ссылкам курса. - Все темы курса являются частью проекта, в материалах есть достаточно много ссылок на курс Программирование - на Java на intuit. Если у Вас опыта с Java немного, рекомендую прочитать его до курса. - Или будте готовы к тому, чтобы проработывать его вместе с темами наших занятий. Для полного усвоения - материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. + Все темы курса являются частью проекта, в материалах есть достаточно много ссылок на курс Программирование + на Java на intuit. Если у Вас опыта с Java немного, рекомендую прочитать его до курса. + Или будте готовы к тому, чтобы прорабатывать его вместе с темами наших занятий. Для полного усвоения + материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. + Т.е. это будет тренинг либо для программистов, желающих перейти на Java, либо для людей, у который уже есть практический опыт с Java.

    -Т.е. это будет курс либо для программистов, желающих перейти Java, либо для людей, у который уже есть практический опыт с -Java.
    -До начала занятий необходимо установить ПО и подготовится по вступительному занятию. +До начала занятий необходимо установить ПО и подготовится по вступительному + занятию.

    Стоимость участия: 6900 руб. (97$) без проверки домашних заданий и 15900 руб. (224$) с проверкой.
    Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать diff --git a/resources/mails/basejava_register_info.html b/resources/mails/basejava_register_info.html index fc05fa1..32da520 100644 --- a/resources/mails/basejava_register_info.html +++ b/resources/mails/basejava_register_info.html @@ -23,9 +23,9 @@ Все темы курса являются частью проекта, в материалах есть достаточно много ссылок на курс Программирование на Java на intuit. Если у Вас опыта с Java немного, рекомендую прочитать его до курса. - Или будте готовы к тому, чтобы проработывать его вместе с темами наших занятий. Для полного усвоения - материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА.
    - Т.е. это будет курс либо для программистов, желающих перейти Java, либо для людей, у который уже есть практический опыт с Java. + Или будте готовы к тому, чтобы прорабатывать его вместе с темами наших занятий. Для полного усвоения + материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. + Т.е. это будет тренинг либо для программистов, желающих перейти на Java, либо для людей, у который уже есть практический опыт с Java.

    До начала занятий необходимо установить ПО и подготовится по вступительному занятию.
    Я обновил его актуальной ссылкой на будующий проект курса. From 4f0b638a27b4ee0bbfe3dfbf5a471461e2ed048f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 18 Mar 2016 23:08:34 +0300 Subject: [PATCH 042/936] Update basejava register --- resources/mails/basejava_for_topjava.html | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/resources/mails/basejava_for_topjava.html b/resources/mails/basejava_for_topjava.html index 22654e7..4cdaaf8 100644 --- a/resources/mails/basejava_for_topjava.html +++ b/resources/mails/basejava_for_topjava.html @@ -8,17 +8,19 @@

    Здравствуй firstName!

    -

    25.03 стартует очередной (7-й) выпуск еще одного моего тренинга: Практика Java. Разработка Web приложения.
    +

    25.03 стартует очередной (7-й) выпуск еще одного моего тренинга: Практика Java. Разработка Web приложения. +

    +

    Занятия будут проходить в интенсивном режиме: 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут - доступны в записи. Этот проект не так сильно проработат, как Topjava, поэтому будет проходить как вебинар, совмещенный с рассылкой.
    + доступны в записи. Этот проект не так сильно проработат, как Topjava, поэтому будет проходить как вебинар, совмещенный с рассылкой.

    -Организационные моменты: следующий выпуск topjava начнется 26.05, для тебя повторное участие бесплатное.
    -"Практика Java. Разработка Web приложения" также будет еще проводится, точную дату следующего старта пока сказать не могу. +

    Организационные моменты

    +Следующий выпуск topjava начнется 26.05, для тебя повторное участие бесплатное.
    +"Разработка Web приложения" также будет еще проводится, точную дату следующего старта пока сказать не могу.
    Если у тебя есть пробелы в базовых вещах: организация памяти в Java, коллекции, дженерики, внутренние и вложенные классы, многопоточность, сервлеты, JDBC, объектная модель, которые не дают тебе полноценно проходить курс Topjava, можно сделать паузу до 26.05 и принять участие в этом интенсиве. Или можно будет пройти этот курс уже после Topjava (таких примерно 10% участников Topjava). -

    - Требование к участникам: - насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и +

    Требование к участникам:

    +Насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и самые необходимые разделы Java API, включая работу с базой данных (JDBC API) и написние веб-приложения (Tomcat/ Servlets/ JSP/ JSTL), поэтому знание SQL и HTML желательно. Все темы курса являются частью проекта, в материалах есть достаточно много ссылок на курс Программирование @@ -29,9 +31,8 @@

    Вступительное занятие, кроме установки ПО и Git, состоит из подтягивания проекта.

    - Стоимость участия: 6900 руб. (100$) без проверки домашних заданий и 15900 руб. (230$) с проверкой.
    - Для тебя скидка 700 руб (90$) без ДЗ и 1500 руб.(209$) с ДЗ.
    - По всем вопросам пишите в личку в skype (или slack). + Стоимость участия со скидкой участника: 6200 руб. (90$) без проверки домашних заданий и 14400 руб. (209$) с проверкой. + По всем вопросам пиши в личку в skype (или slack).

    Ответы на вопросы.

    From 527ed781f4c4a65f8e9adbcf612a571054d2c5a8 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 18 Mar 2016 23:09:47 +0300 Subject: [PATCH 043/936] Update basejava register --- resources/mails/basejava_for_topjava.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/mails/basejava_for_topjava.html b/resources/mails/basejava_for_topjava.html index 4cdaaf8..088c600 100644 --- a/resources/mails/basejava_for_topjava.html +++ b/resources/mails/basejava_for_topjava.html @@ -28,8 +28,9 @@

    Требование к участникам:

    Или будте готовы к тому, чтобы прорабатывать его вместе с темами наших занятий. Для полного усвоения материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. Т.е. это будет тренинг либо для программистов, желающих перейти на Java, либо для людей, у который уже есть практический опыт с Java. -

    +

    Вступительное занятие, кроме установки ПО и Git, состоит из подтягивания проекта.
    +

    Стоимость участия со скидкой участника: 6200 руб. (90$) без проверки домашних заданий и 14400 руб. (209$) с проверкой. По всем вопросам пиши в личку в skype (или slack). From 4c3a136a4e6e7a3c8b16c401791cc5a47ab44296 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 19 Mar 2016 01:59:41 +0300 Subject: [PATCH 044/936] Update readme.md --- readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 972a1d3..9485d5e 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,7 @@ ## Разработка сайта для Java проектов http://javaops.ru +[![Codacy Badge](https://api.codacy.com/project/badge/grade/300abd4332374403bec8fac9499b1127)](https://www.codacy.com/app/gkislin/javaops) + ### Стек: - Spring Boot - H2 @@ -36,4 +38,4 @@ - профиль **dev** - `jdbc:h2:tcp://localhost:9092/mem:javaops` - - Общение в https://javaops.slack.com/messages/javaops_ru/ \ No newline at end of file + - Общение в https://javaops.slack.com/messages/javaops_ru/ From 5ae1ebdcf0ac79ba90c0ba4b08317b4891988f7d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 19 Mar 2016 02:15:48 +0300 Subject: [PATCH 045/936] Fix codacy issue --- src/main/java/ru/javaops/LoggedUser.java | 2 +- .../ru/javaops/config/MailAsyncConfig.java | 1 - .../exception/GlobalExceptionHandler.java | 6 ++-- src/main/java/ru/javaops/model/MailCase.java | 36 +++++++++++++------ src/main/java/ru/javaops/model/Payment.java | 18 +++++----- src/main/java/ru/javaops/model/User.java | 24 +++++++++++++ src/main/java/ru/javaops/model/UserGroup.java | 28 +++++++++------ .../java/ru/javaops/service/MailService.java | 6 ++-- .../java/ru/javaops/web/ErrorController.java | 2 +- 9 files changed, 85 insertions(+), 38 deletions(-) diff --git a/src/main/java/ru/javaops/LoggedUser.java b/src/main/java/ru/javaops/LoggedUser.java index 62d185f..dbba319 100644 --- a/src/main/java/ru/javaops/LoggedUser.java +++ b/src/main/java/ru/javaops/LoggedUser.java @@ -10,7 +10,7 @@ * GKislin */ public class LoggedUser extends org.springframework.security.core.userdetails.User { - static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; private int id; diff --git a/src/main/java/ru/javaops/config/MailAsyncConfig.java b/src/main/java/ru/javaops/config/MailAsyncConfig.java index b98ccb5..53ee66b 100644 --- a/src/main/java/ru/javaops/config/MailAsyncConfig.java +++ b/src/main/java/ru/javaops/config/MailAsyncConfig.java @@ -7,7 +7,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; diff --git a/src/main/java/ru/javaops/config/exception/GlobalExceptionHandler.java b/src/main/java/ru/javaops/config/exception/GlobalExceptionHandler.java index f22f588..53d138d 100644 --- a/src/main/java/ru/javaops/config/exception/GlobalExceptionHandler.java +++ b/src/main/java/ru/javaops/config/exception/GlobalExceptionHandler.java @@ -22,20 +22,20 @@ public class GlobalExceptionHandler { @ExceptionHandler(NoHandlerFoundException.class) @Order(Ordered.LOWEST_PRECEDENCE - 1) - ModelAndView noHandlerFoundHandler() throws Exception { + public ModelAndView noHandlerFoundHandler() throws Exception { return processException("Неверный запрос"); } @ExceptionHandler(IllegalArgumentException.class) @Order(Ordered.LOWEST_PRECEDENCE - 1) - ModelAndView illegalArgumentHandler(HttpServletRequest req, Exception e) throws Exception { + public ModelAndView illegalArgumentHandler(HttpServletRequest req, Exception e) throws Exception { log.error("Illegal params in request" + req.getRequestURL(), e); return processException(e.getMessage() == null ? "Неверные параметры запроса" : e.getMessage()); } @ExceptionHandler(Throwable.class) @Order(Ordered.LOWEST_PRECEDENCE) - ModelAndView defaultHandler(HttpServletRequest req, Throwable e) throws Exception { + public ModelAndView defaultHandler(HttpServletRequest req, Throwable e) throws Exception { log.error("Exception at request " + req.getRequestURL(), e); return processException(Throwables.getRootCause(e).getMessage()); } diff --git a/src/main/java/ru/javaops/model/MailCase.java b/src/main/java/ru/javaops/model/MailCase.java index 7d1fac4..26fe7be 100644 --- a/src/main/java/ru/javaops/model/MailCase.java +++ b/src/main/java/ru/javaops/model/MailCase.java @@ -14,16 +14,6 @@ @Entity @Table(name = "mail_case") public class MailCase extends BaseEntity { - protected MailCase() { - } - - public MailCase(User user, String template, String result) { - this.user = user; - this.template = template; - this.result = result; - this.datetime = new Date(); - } - @Column(name = "datetime", columnDefinition = "TIMESTAMP DEFAULT NOW()", nullable = false) @NotNull private Date datetime; @@ -41,4 +31,30 @@ public MailCase(User user, String template, String result) { @Column(name = "result", nullable = false) @NotNull private String result; + + protected MailCase() { + } + + public MailCase(User user, String template, String result) { + this.user = user; + this.template = template; + this.result = result; + this.datetime = new Date(); + } + + public Date getDatetime() { + return datetime; + } + + public User getUser() { + return user; + } + + public String getTemplate() { + return template; + } + + public String getResult() { + return result; + } } diff --git a/src/main/java/ru/javaops/model/Payment.java b/src/main/java/ru/javaops/model/Payment.java index 04ffa4f..c188329 100644 --- a/src/main/java/ru/javaops/model/Payment.java +++ b/src/main/java/ru/javaops/model/Payment.java @@ -10,15 +10,6 @@ @Entity @Table(name = "payment") public class Payment extends BaseEntity { - public Payment() { - } - - public Payment(int sum, Currency currency, String comment) { - this.sum = sum; - this.currency = currency; - this.comment = comment; - } - @Column(name = "date") private LocalDate date = LocalDate.now(); @@ -36,4 +27,13 @@ public Payment(int sum, Currency currency, String comment) { public String toString() { return "Payment(" + sum + currency + ':' + comment + ')'; } + + public Payment() { + } + + public Payment(int sum, Currency currency, String comment) { + this.sum = sum; + this.currency = currency; + this.comment = comment; + } } diff --git a/src/main/java/ru/javaops/model/User.java b/src/main/java/ru/javaops/model/User.java index f3778cb..895ecfc 100644 --- a/src/main/java/ru/javaops/model/User.java +++ b/src/main/java/ru/javaops/model/User.java @@ -191,6 +191,30 @@ public String getSkype() { return skype; } + public String getWebsite() { + return website; + } + + public String getCompany() { + return company; + } + + public String getGithub() { + return github; + } + + public String getVk() { + return vk; + } + + public Date getRegisteredDate() { + return registeredDate; + } + + public Date getActivatedDate() { + return activatedDate; + } + @Override public String toString() { return "User (" + diff --git a/src/main/java/ru/javaops/model/UserGroup.java b/src/main/java/ru/javaops/model/UserGroup.java index 78db541..690e097 100644 --- a/src/main/java/ru/javaops/model/UserGroup.java +++ b/src/main/java/ru/javaops/model/UserGroup.java @@ -13,16 +13,6 @@ @Table(name = "user_group", uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "group_id"}, name = "user_group_unique_idx")}) public class UserGroup extends BaseEntity { - public UserGroup() { - } - - public UserGroup(User user, Group group, RegisterType type, String channel) { - this.user = user; - this.group = group; - this.registerType = type; - this.channel = channel; - } - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) @OnDelete(action = OnDeleteAction.CASCADE) @@ -48,6 +38,16 @@ public UserGroup(User user, Group group, RegisterType type, String channel) { @OnDelete(action = OnDeleteAction.CASCADE) private Payment payment; + public UserGroup() { + } + + public UserGroup(User user, Group group, RegisterType type, String channel) { + this.user = user; + this.group = group; + this.registerType = type; + this.channel = channel; + } + public String getChannel() { return channel; } @@ -75,4 +75,12 @@ public void setPayment(Payment payment) { public void setParticipationType(ParticipationType participationType) { this.participationType = participationType; } + + public ParticipationType getParticipationType() { + return participationType; + } + + public Payment getPayment() { + return payment; + } } diff --git a/src/main/java/ru/javaops/service/MailService.java b/src/main/java/ru/javaops/service/MailService.java index 7ea6f67..9e673b7 100644 --- a/src/main/java/ru/javaops/service/MailService.java +++ b/src/main/java/ru/javaops/service/MailService.java @@ -239,9 +239,9 @@ public String toString() { } public static class GroupResult { - final int success; - final List failed; - final String failedCause; + private final int success; + private final List failed; + private final String failedCause; public GroupResult(@JsonProperty("success") int success, @JsonProperty("failed") List failed, @JsonProperty("failedCause") String failedCause) { this.success = success; diff --git a/src/main/java/ru/javaops/web/ErrorController.java b/src/main/java/ru/javaops/web/ErrorController.java index 32cf71d..e5a784a 100644 --- a/src/main/java/ru/javaops/web/ErrorController.java +++ b/src/main/java/ru/javaops/web/ErrorController.java @@ -38,7 +38,7 @@ public String getErrorPath() { } @RequestMapping(ERROR_PATH) - String error(HttpServletRequest request, Model model) { + public String error(HttpServletRequest request, Model model) { Map errorMap = errorAttributes.getErrorAttributes(new ServletRequestAttributes(request), false); model.addAllAttributes(errorMap); return "exception"; From 8494f14e2a26fe4239e71778062412ca4172fd50 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 19 Mar 2016 03:22:15 +0300 Subject: [PATCH 046/936] Fix codacy issue --- src/main/java/ru/javaops/model/Group.java | 8 ++++++++ src/main/java/ru/javaops/model/Payment.java | 16 ++++++++++++++++ .../java/ru/javaops/service/MailService.java | 6 +++--- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/javaops/model/Group.java b/src/main/java/ru/javaops/model/Group.java index ac37c31..9f7bf54 100644 --- a/src/main/java/ru/javaops/model/Group.java +++ b/src/main/java/ru/javaops/model/Group.java @@ -41,6 +41,14 @@ public GroupType getType() { return type; } + public LocalDate getStartDate() { + return startDate; + } + + public LocalDate getEndDate() { + return endDate; + } + @Override public String toString() { return "Group{" + diff --git a/src/main/java/ru/javaops/model/Payment.java b/src/main/java/ru/javaops/model/Payment.java index c188329..5c31c84 100644 --- a/src/main/java/ru/javaops/model/Payment.java +++ b/src/main/java/ru/javaops/model/Payment.java @@ -36,4 +36,20 @@ public Payment(int sum, Currency currency, String comment) { this.currency = currency; this.comment = comment; } + + public LocalDate getDate() { + return date; + } + + public int getSum() { + return sum; + } + + public Currency getCurrency() { + return currency; + } + + public String getComment() { + return comment; + } } diff --git a/src/main/java/ru/javaops/service/MailService.java b/src/main/java/ru/javaops/service/MailService.java index 9e673b7..43c3391 100644 --- a/src/main/java/ru/javaops/service/MailService.java +++ b/src/main/java/ru/javaops/service/MailService.java @@ -199,7 +199,7 @@ private GroupResult buildWithFailure(String cause) { return new GroupResult(success, failed, cause); } - boolean accept(String email, Future future) { + private boolean accept(String email, Future future) { try { final String result = future.get(); if (isOk(result)) { @@ -224,8 +224,8 @@ String getContent(String template, final Map params) { } public static class MailResult { - final String email; - final String result; + private final String email; + private final String result; public MailResult(@JsonProperty("email") String email, @JsonProperty("result") String result) { this.email = email; From 31445c6f7fb67d3f80765efd0d3e58670e5420ee Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 19 Mar 2016 23:39:27 +0300 Subject: [PATCH 047/936] Fix my story --- resources/story/story4.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/story/story4.html b/resources/story/story4.html index 1fb4020..a573049 100644 --- a/resources/story/story4.html +++ b/resources/story/story4.html @@ -24,7 +24,7 @@

    - +

    Начало

    Программировать я начал в школе на Электронике МК-61, целых 105 иструкций. В журналах "Наука и жизнь", "Техника Молодежи" были программки игр, умещающиеся в From 0d7f489cf6a571754e3c366d2d8eb6228f7d0588 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 21 Mar 2016 18:55:40 +0300 Subject: [PATCH 048/936] Update webapp start date --- resources/mails/basejava_for_topjava.html | 4 ++-- resources/mails/basejava_register.html | 2 +- resources/mails/basejava_register_info.html | 4 ++-- resources/mails/story_notify.html | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/mails/basejava_for_topjava.html b/resources/mails/basejava_for_topjava.html index 088c600..e9687a2 100644 --- a/resources/mails/basejava_for_topjava.html +++ b/resources/mails/basejava_for_topjava.html @@ -3,12 +3,12 @@ - Информация: 25.03 начало интенсива "Практика Java. Разработка Web приложения". + Информация: 29.03 начало интенсива "Практика Java. Разработка Web приложения".

    Здравствуй firstName!

    -

    25.03 стартует очередной (7-й) выпуск еще одного моего тренинга: Практика Java. Разработка Web приложения. +

    29.03 стартует очередной (7-й) выпуск еще одного моего тренинга: Практика Java. Разработка Web приложения.

    Занятия будут проходить в интенсивном режиме: 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 9b1c2af..50b8f04 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -11,7 +11,7 @@

    Спасибо за регистрацию на проекте Практика Java. Разработка Web приложения!
    - Интенсив начинется 25.03. Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, + Интенсив начинется 29.03. Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут доступны в записи.

    diff --git a/resources/mails/basejava_register_info.html b/resources/mails/basejava_register_info.html index 32da520..7253acd 100644 --- a/resources/mails/basejava_register_info.html +++ b/resources/mails/basejava_register_info.html @@ -3,13 +3,13 @@ - 25.03 начало интенсива "Практика Java. Разработка Web приложения". + 29.03 начало интенсива "Практика Java. Разработка Web приложения".

    Здравствуй firstName!

    - Раз сообщить, что 25.03 начинается интесив Практика Java. Разработка Web + Раз сообщить, что 29.03 начинается интесив Практика Java. Разработка Web приложения.
    Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут доступны в записи. diff --git a/resources/mails/story_notify.html b/resources/mails/story_notify.html index 3443bab..dc65910 100644 --- a/resources/mails/story_notify.html +++ b/resources/mails/story_notify.html @@ -17,7 +17,7 @@ А может даже и не первые:)

    -Свои новости написал в конце своей истории: 25.03 запускаю совмещенный с рассылкой вебинар-интенсив Практика Java. Разработка Web +Свои новости написал в конце своей истории: 29.03 запускаю совмещенный с рассылкой вебинар-интенсив Практика Java. Разработка Web приложения (2 раза в неделю) и 26.05 будет следующий (7й) выпуск Topjava Enterprise. В ближайших планах обновить вебинар Веб-сервисы. SOA-based архитектура, дополнив его микросервисами и разрабатываю проект Topjava-2: Spring Boot, H2, Thymleaf, Date: Tue, 22 Mar 2016 13:52:13 +0300 Subject: [PATCH 049/936] Update basejava template --- resources/mails/basejava_register_info.html | 35 +++++++-------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/resources/mails/basejava_register_info.html b/resources/mails/basejava_register_info.html index 7253acd..9553581 100644 --- a/resources/mails/basejava_register_info.html +++ b/resources/mails/basejava_register_info.html @@ -3,34 +3,23 @@ - 29.03 начало интенсива "Практика Java. Разработка Web приложения". + Информация по проекту "Практика Java. Разработка Web приложения".

    Здравствуй firstName!

    +Текущая информация по проекту "Практика Java. Разработка Web приложения": +
      +
    • + Обновилось вступительное задание: добавил видео "Литература по + Java и разработке ПО" и "Обзор языка Java". +
    • +
    • Оплатившим участникам начал раздавать учебные ключи к IDEA и доступ к материалам на Google Drive.
    • +
    • В пятницу будет рассылка по 1-му уроку, первый вебинар будет 29.03 (во вторник) в 20.00 (Москва, GMT+3)
    • +
    +Если вы решили участвовать в проекте - поспешите.

    - Раз сообщить, что 29.03 начинается интесив Практика Java. Разработка Web - приложения.
    - Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут - доступны в записи. -

    -

    - Требование к участникам: - насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и - самые необходимые разделы Java API, включая работу с базой данных (JDBC API) и написние веб-приложения (Tomcat/ - Servlets/ JSP/ JSTL), поэтому знание SQL и HTML желательно. - Должно присутствовать желание изучать простые темы (например типы данных) самостоятельно по ссылкам курса. - Все темы курса являются частью проекта, в материалах есть достаточно много ссылок на курс Программирование - на Java на intuit. Если у Вас опыта с Java немного, рекомендую прочитать его до курса. - Или будте готовы к тому, чтобы прорабатывать его вместе с темами наших занятий. Для полного усвоения - материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. - Т.е. это будет тренинг либо для программистов, желающих перейти на Java, либо для людей, у который уже есть практический опыт с Java. -

    -До начала занятий необходимо установить ПО и подготовится по вступительному занятию.
    -Я обновил его актуальной ссылкой на будующий проект курса. -

    - Стоимость участия: 6900 руб. (97$) без проверки домашних заданий и 15900 руб. (224$) с проверкой.
    + Стоимость участия: 6900 руб. без проверки домашних заданий и 15900 руб. с проверкой.
    Как обычно участникам моих курсов - скидка.
    Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать курс. From 8451c52c1e3623e51fc498e0b31cb048550249bb Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 22 Mar 2016 13:59:19 +0300 Subject: [PATCH 050/936] Update basejava template --- resources/mails/basejava_register_info.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/basejava_register_info.html b/resources/mails/basejava_register_info.html index 9553581..1ea645f 100644 --- a/resources/mails/basejava_register_info.html +++ b/resources/mails/basejava_register_info.html @@ -15,7 +15,7 @@ Java и разработке ПО" и "Обзор языка Java".

  • Оплатившим участникам начал раздавать учебные ключи к IDEA и доступ к материалам на Google Drive.
  • -
  • В пятницу будет рассылка по 1-му уроку, первый вебинар будет 29.03 (во вторник) в 20.00 (Москва, GMT+3)
  • +
  • 25.03 (в эту пятницу) будет рассылка по 1-му уроку, первый вебинар будет 29.03 (во вторник) в 20.00 (Москва, GMT+3)
  • Если вы решили участвовать в проекте - поспешите.

    From b4fd992b9bcaddd8a0dcc5d83706d8ec5853e659 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 22 Mar 2016 14:53:38 +0300 Subject: [PATCH 051/936] Update basejava register --- resources/mails/basejava_register.html | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 50b8f04..4328515 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -11,9 +11,8 @@

    Спасибо за регистрацию на проекте Практика Java. Разработка Web приложения!
    - Интенсив начинется 29.03. Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, - все материалы будут - доступны в записи. + Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут доступны в записи. + В эту пятницу (25.03) будет рассылка по первому уроку, вебинары начнутся со вторника (29.03).

    Требование к участникам: @@ -30,10 +29,10 @@

    До начала занятий необходимо установить ПО и подготовится по вступительному занятию. -

    - Стоимость участия: 6900 руб. (97$) без проверки домашних заданий и 15900 руб. (224$) с проверкой.
    + + Стоимость участия: 6900 руб. без проверки домашних заданий и 15900 руб. с проверкой.
    Добавляйтесь в skype: grigory.kislin, после этого можно
    оплачивать - курс. + курс. Можно оплачивать в USD по текущему курсу.

    Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    From 247111bafcd8775c33bdc90dabdb78ff4d15e18b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 22 Mar 2016 14:57:18 +0300 Subject: [PATCH 052/936] Update basejava register --- resources/mails/basejava_register.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 4328515..9b42d3e 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -27,12 +27,12 @@ материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. Т.е. это будет тренинг либо для программистов, желающих перейти на Java, либо для людей, у который уже есть практический опыт с Java.

    -До начала занятий необходимо установить ПО и подготовится по вступительному - занятию. - +

    +До начала занятий необходимо установить ПО и подготовится по вступительному занятию. +

    Стоимость участия: 6900 руб. без проверки домашних заданий и 15900 руб. с проверкой.
    - Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать - курс. Можно оплачивать в USD по текущему курсу. + Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать курс.
    + В USD можно оплачивать по текущему курсу.

    Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    From 8e8c525f9014e7489f978418affb96c6d6d42f13 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 22 Mar 2016 14:58:12 +0300 Subject: [PATCH 053/936] Update basejava register --- resources/mails/basejava_register.html | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 9b42d3e..8f4e59c 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -30,6 +30,7 @@

    До начала занятий необходимо установить ПО и подготовится по вступительному занятию.

    +

    Стоимость участия: 6900 руб. без проверки домашних заданий и 15900 руб. с проверкой.
    Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать курс.
    В USD можно оплачивать по текущему курсу. From cff9d12d086c0500e2b307280d5e183b232e71a2 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 22 Mar 2016 15:36:40 +0300 Subject: [PATCH 054/936] Add template to pay --- src/main/java/ru/javaops/web/UserController.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/javaops/web/UserController.java b/src/main/java/ru/javaops/web/UserController.java index c2186cb..82a7671 100644 --- a/src/main/java/ru/javaops/web/UserController.java +++ b/src/main/java/ru/javaops/web/UserController.java @@ -11,6 +11,7 @@ import ru.javaops.model.Payment; import ru.javaops.model.User; import ru.javaops.service.GroupService; +import ru.javaops.service.MailService; import ru.javaops.service.UserService; import java.util.Collection; @@ -29,6 +30,9 @@ public class UserController { @Autowired private UserService userService; + @Autowired + private MailService mailService; + @Autowired private GroupService groupService; @@ -44,8 +48,11 @@ public Collection getGroup(@Param("group") String group) { } @RequestMapping(value = "/pay", method = POST) - public void pay(@Param("project") String project, @Param("email") String email, - @Param("sum") int sum, @Param("currency") Currency currency, @Param("comment") String comment, @RequestParam(value = "type", required = false) ParticipationType participationType) { + public String pay(@Param("project") String project, @Param("email") String email, + @Param("sum") int sum, @Param("currency") Currency currency, @Param("comment") String comment, + @RequestParam(value = "type", required = false) ParticipationType participationType, + @RequestParam(value = "template", required = false) String template) { groupService.pay(email.toLowerCase(), project, new Payment(sum, currency, comment), participationType); + return (template == null) ? "Paid" : mailService.sendToUser(template, email); } } From 67e87b0d3c9f2b7189af470505b7f07f9a8af44a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 24 Mar 2016 15:46:04 +0300 Subject: [PATCH 055/936] add lesson04 --- resources/mails/lesson/lesson04.html | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 resources/mails/lesson/lesson04.html diff --git a/resources/mails/lesson/lesson04.html b/resources/mails/lesson/lesson04.html new file mode 100644 index 0000000..3b918c4 --- /dev/null +++ b/resources/mails/lesson/lesson04.html @@ -0,0 +1,26 @@ + + + + Четвертое занятие проекта TopJava Enterprise + + +

    + Здравствуй firstName! +

    +

    +Четвертое занятие нашего проекта: популирование данных через Spring, JPA/ Hibernate, HSQLDB. +

    +Из за бага вставки в HSQLDB исправил в последнем патче версию hsqldb с 2.3.3 на 2.3.2. Если патч уже накатили, можете только у себя поправить. +Материалов по JPA огромное количество. Чтобы не утонуть- не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW04. +

    + Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
    + Обсуждение урока и ДЗ в slack #lesson04 +

    +

    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 29.03.
    + Удачи в освоении материалов и выполнении этого важного задания! +

    +

    +

    + + \ No newline at end of file From 072a3a66b7951f61e7b168d4a783ae9d56527467 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 24 Mar 2016 15:53:15 +0300 Subject: [PATCH 056/936] fix lesson04 --- resources/mails/lesson/lesson04.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/lesson/lesson04.html b/resources/mails/lesson/lesson04.html index 3b918c4..fde5eb1 100644 --- a/resources/mails/lesson/lesson04.html +++ b/resources/mails/lesson/lesson04.html @@ -8,7 +8,7 @@ Здравствуй firstName!

    -Четвертое занятие нашего проекта: популирование данных через Spring, JPA/ Hibernate, HSQLDB. +Четвертое занятие нашего проекта: популирование данных через Spring, JPA/ Hibernate, HSQLDB.

    Из за бага вставки в HSQLDB исправил в последнем патче версию hsqldb с 2.3.3 на 2.3.2. Если патч уже накатили, можете только у себя поправить. Материалов по JPA огромное количество. Чтобы не утонуть- не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW04. From ffa094584f94c283986f1561e381bc40256b60fa Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Mar 2016 01:42:38 +0300 Subject: [PATCH 057/936] Add graduation --- resources/mails/topjava_graduation.html | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 resources/mails/topjava_graduation.html diff --git a/resources/mails/topjava_graduation.html b/resources/mails/topjava_graduation.html new file mode 100644 index 0000000..1cf4fe9 --- /dev/null +++ b/resources/mails/topjava_graduation.html @@ -0,0 +1,27 @@ + + + + Выпускной проект тренинга 'Java Enterprise (TopJava)' + +

    + Здравствуй firstName!
    +

    +От участников были и есть жалобы, что новая информация плохо оседает в голове, когда дается в виде патчей. +И чтобы она надолго усваивалась были пожелания делать это вам самостоятельно. +

    +Поэтому у меня повилась идея выпускного проекта, сделанного на нашем стеке. +

    +Вы сможете занести этот проект в свое портфолио и резюме как собственный, без всяких оговорок. +Ревью проекта входит в продписку с проверкой домашних заданий (ревьюится один раз). Проект можно делать в процессе topjava и еще 2 недели после его окончания. +Авторы лучших выпускных проектов будут иметь дополнительные преимущества в трудоустройстве. +

    +"Как лучше сделать и почему не работает" подсказок с моей стороны не будет. Представьте, что это ваше тестовое задание на работу. +И лучше не делиться своим кодом, иначе вы оказываете медвежью услугу. Но общие вопросы по технологиям конечно задавать можно и нужно в +канале #graduation +

    +

    + Желаю хорошего кодинга! +

    +

    +

    + \ No newline at end of file From 8c0de8ff835f7681039b2f13a02a79c5c0b9b0b9 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Mar 2016 01:54:40 +0300 Subject: [PATCH 058/936] Add story6 --- resources/story.html | 4 +++ resources/story/story6.html | 68 +++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 resources/story/story6.html diff --git a/resources/story.html b/resources/story.html index 10d1f20..74a1292 100644 --- a/resources/story.html +++ b/resources/story.html @@ -26,6 +26,10 @@

    Наши истории

    +

    Главное - верить в свои силы.

    Лев Хачересьянц, 16/03/2016 diff --git a/resources/story/story6.html b/resources/story/story6.html new file mode 100644 index 0000000..ec51998 --- /dev/null +++ b/resources/story/story6.html @@ -0,0 +1,68 @@ + + + + + + + + + Истории + + + + + + + + +
    +

    Как я стал Java-разработчиком

    +

    + После окончания технического университета в течение около 10-ти лет я работал разработчиком электронной аппаратуры. + Сначала я разрабатывал схемы и печатные платы, писал программы для микроконтроллеров на Ассемблере и Си. + Потом на работе потребовалось создавать простейшие дескоптные приложения на С++ и С#, я стал изучать эти языки и писать такие приложения. + Далее я заинтересовался веб-приложениями, открыл для себя язык Java и начал изучать его по книгам и статьям из интернета. + Изучая Java я осознал, что технологий на этой платформе очень много и мне как новичку было непросто разобраться, что изучать сначала, а что потом, и я решил, что без курсов мне не обойтись. +

    +

    + Нашел в интернете очный курс для начинающих Java-разработчиков и записался на него. + Преподавал на курсе Григорий Кислин. Мне очень понравилось, как Григорий подает материал. На его курсе было максимальное количество практики, мы создавали и в итоге создали настоящее, актуальное веб-приложение. + Каждый урок был записан на видео, которое я потом пересматривал, а некоторые фрагменты не по одному разу. + После окончания этого курса Григорий предложил пройти обучение на еще одном его курсе TopJava в формате вебинара и я, конечно, согласился. + Этот курс Григорий проводил в похожем формате и после окончания этого курса я получил легко масштабируемое приложение enterprise-уровня. +

    +

    + Далее так сложилось, что на моей работе потребовалось создать небольшое веб-приложение. + Знаний и навыков, приобретенных на этих двух курсах мне хватило, чтобы я создал такое приложение. + После этого я разместил свое резюме на нескольких сайтах, и через некоторое время мне предложили работу в крупной компании. + Я сходил на собеседование, успешно его прошел, устроился работать и на данный момент работаю в этой компании уже более полугода. +

    +
    + Максим, 28/03/2016 +
    + К списку историй +
    +
    + + + + + + + + + + + + + \ No newline at end of file From 872d6d0f1af84cc8f40233fd11f2474d324edd7d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Mar 2016 02:02:58 +0300 Subject: [PATCH 059/936] update templates --- resources/mails/topjava_graduation.html | 15 ++++++++------- resources/story.html | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/resources/mails/topjava_graduation.html b/resources/mails/topjava_graduation.html index 1cf4fe9..710cc89 100644 --- a/resources/mails/topjava_graduation.html +++ b/resources/mails/topjava_graduation.html @@ -11,16 +11,17 @@

    Поэтому у меня повилась идея выпускного проекта, сделанного на нашем стеке.

    -Вы сможете занести этот проект в свое портфолио и резюме как собственный, без всяких оговорок. -Ревью проекта входит в продписку с проверкой домашних заданий (ревьюится один раз). Проект можно делать в процессе topjava и еще 2 недели после его окончания. -Авторы лучших выпускных проектов будут иметь дополнительные преимущества в трудоустройстве.

    -"Как лучше сделать и почему не работает" подсказок с моей стороны не будет. Представьте, что это ваше тестовое задание на работу. -И лучше не делиться своим кодом, иначе вы оказываете медвежью услугу. Но общие вопросы по технологиям конечно задавать можно и нужно в -канале #graduation + "Как лучше сделать и почему не работает" подсказок с моей стороны не будет. Представьте, что это ваше тестовое задание на работу. + И лучше не делиться своим кодом, иначе вы оказываете медвежью услугу. Но общие вопросы по технологиям конечно задавать можно и нужно в + канале #graduation

    +Далее вы сможете занести этот проект в свое портфолио и резюме как собственный, без всяких оговорок. +Ревью проекта входит в продписку с проверкой домашних заданий (ревьюится один раз). Проект можно делать в процессе topjava и еще 2 недели после его окончания. +Авторы лучших выпускных проектов будут иметь дополнительные преимущества в трудоустройстве.

    - Желаю хорошего кодинга! + Еще: у нас новые истории выпускников!
    + Желаю хорошего кодинга и, конечно же, после трудоустройства и прохождения испытательного срока - жду ваших историй!

    diff --git a/resources/story.html b/resources/story.html index 74a1292..305f6c6 100644 --- a/resources/story.html +++ b/resources/story.html @@ -51,7 +51,7 @@

    Каждое утро я просыпался с Иван Виноградов, 04/03/2016

    - Ждем истории по окончанию испытательных сроков: Тимур, Максим, Андрей, Дмитрий, Евгений, Алексей, Азер, ... + Ждем истории по окончанию испытательных сроков: Тимур, Андрей, Дмитрий, Евгений, Алексей, Азер, ...
    From ed00f8b1baa1020258f69edc82531b7e367a2dee Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Mar 2016 02:05:56 +0300 Subject: [PATCH 060/936] update templates --- resources/mails/topjava_graduation.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava_graduation.html b/resources/mails/topjava_graduation.html index 710cc89..832fcaf 100644 --- a/resources/mails/topjava_graduation.html +++ b/resources/mails/topjava_graduation.html @@ -21,7 +21,7 @@ Авторы лучших выпускных проектов будут иметь дополнительные преимущества в трудоустройстве.

    Еще: у нас новые истории выпускников!
    - Желаю хорошего кодинга и, конечно же, после трудоустройства и прохождения испытательного срока - жду ваших историй! + Желаю хорошего кодинга и, конечно же, после трудоустройства и прохождения испытательного срока, буду ждать ваших историй!

    From 30d9cd3760b90427b7134e27e1679a59167dcf6a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Mar 2016 02:22:05 +0300 Subject: [PATCH 061/936] update story6 --- resources/story/story6.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/story/story6.html b/resources/story/story6.html index ec51998..c184dc6 100644 --- a/resources/story/story6.html +++ b/resources/story/story6.html @@ -36,7 +36,7 @@

    Как я стал Java-разработчиком

    Нашел в интернете очный курс для начинающих Java-разработчиков и записался на него. Преподавал на курсе Григорий Кислин. Мне очень понравилось, как Григорий подает материал. На его курсе было максимальное количество практики, мы создавали и в итоге создали настоящее, актуальное веб-приложение. Каждый урок был записан на видео, которое я потом пересматривал, а некоторые фрагменты не по одному разу. - После окончания этого курса Григорий предложил пройти обучение на еще одном его курсе TopJava в формате вебинара и я, конечно, согласился. + После окончания этого курса Григорий предложил пройти обучение на еще одном его курсе TopJava в формате вебинара1 и я, конечно, согласился. Этот курс Григорий проводил в похожем формате и после окончания этого курса я получил легко масштабируемое приложение enterprise-уровня.

    From 93fdd1902a40e9af52a4cc92e597d6e2f5099c3d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Mar 2016 14:07:44 +0300 Subject: [PATCH 062/936] Add basejava reminder --- resources/mails/basejava_reminder.html | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 resources/mails/basejava_reminder.html diff --git a/resources/mails/basejava_reminder.html b/resources/mails/basejava_reminder.html new file mode 100644 index 0000000..d5e74f4 --- /dev/null +++ b/resources/mails/basejava_reminder.html @@ -0,0 +1,39 @@ + + + + + + Завтра (29.03) - начало вебинаров 'Практика Java. Разработка Web приложения'. + +

    + Здравствуй firstName!
    +

    +

    + Напоминаю, что завтра, 29.03 в 20.00 Москвы (GMT+3) стартуют вебинары проекта 'Практика Java. Разработка Web приложения'. Для участия в вебинарах протестируйте Adobe Connect meeting. +

    +

    Напомню, что нужно сделать до вебинара во вторник:

    +
      +
    • Посмотреть видео вступительного занятия
      + (добавилось видео "Литература" и "Обзор языка Java") .
    • +
    • Поставить ПО: (Java 8, IDEA Ultimate).
    • +
    • Склонировать к себе локально проект:
      + git clone https://github.com/JavaWebinar/webapp.git
    • +
    • Открыть его в IDEA и запустить main().
    • +
    • Сделать аккаунт и репозиторий на GitHub. На первом занятии мы зальем туда твою + копию проекта. +
    • +
    +

    + Стоимость участия: 6900 руб. без проверки домашних заданий и 15900 руб. с проверкой.
    + Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать курс.
    + В USD можно оплачивать по текущему курсу. +

    + +Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    +Всего наилучшего и до встречи на проекте!
    +

    Ответы на вопросы.

    +

    +

    + \ No newline at end of file From 22d5baa74c4d5f3fbc075e39d62eaf9c032dfff9 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 30 Mar 2016 19:57:23 +0300 Subject: [PATCH 063/936] Update templates --- resources/mails/basejava/lesson01.html | 23 +++++++++++++++++++ resources/mails/mailFragments.html | 11 +++++++++ .../mails/{lesson => topjava}/lesson01.html | 0 .../mails/{lesson => topjava}/lesson02.html | 0 .../mails/{lesson => topjava}/lesson03.html | 0 .../mails/{lesson => topjava}/lesson04.html | 0 .../ru/javaops/model/ParticipationType.java | 3 ++- 7 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 resources/mails/basejava/lesson01.html rename resources/mails/{lesson => topjava}/lesson01.html (100%) rename resources/mails/{lesson => topjava}/lesson02.html (100%) rename resources/mails/{lesson => topjava}/lesson03.html (100%) rename resources/mails/{lesson => topjava}/lesson04.html (100%) diff --git a/resources/mails/basejava/lesson01.html b/resources/mails/basejava/lesson01.html new file mode 100644 index 0000000..c08c99c --- /dev/null +++ b/resources/mails/basejava/lesson01.html @@ -0,0 +1,23 @@ + + + + Первое занятие проекта "Java. Разработка Web приложения" + + +

    + Здравствуй firstName! +

    +Выложил начало первого занятия.
    +

    +После того, как сделаете свою модель, объязательно проверьте ее по всем пунктам в описании HW01.
    +Внизу есть инструменты рисования. +

    +Напомню, что ревью модели принимаю от всех участников, код классов - только от участников с проверкой ДЗ.
    +Присылать HW желательно до завтрашнего вечера.
    +

    + Оставшееся видео постараюсь выложить сегодня. И завтра-послезавтра определюсь с инструментом для вебинаров. +

    +

    +

    + + \ No newline at end of file diff --git a/resources/mails/mailFragments.html b/resources/mails/mailFragments.html index bf702fc..4b456bb 100644 --- a/resources/mails/mailFragments.html +++ b/resources/mails/mailFragments.html @@ -19,4 +19,15 @@ отписаться от рассылки

    + +
    +

    + Удачи в выполнении задания,
    + Григорий Кислин
    + skype: grigory.kislin +

    +

    + Java Online Projects +

    +
    \ No newline at end of file diff --git a/resources/mails/lesson/lesson01.html b/resources/mails/topjava/lesson01.html similarity index 100% rename from resources/mails/lesson/lesson01.html rename to resources/mails/topjava/lesson01.html diff --git a/resources/mails/lesson/lesson02.html b/resources/mails/topjava/lesson02.html similarity index 100% rename from resources/mails/lesson/lesson02.html rename to resources/mails/topjava/lesson02.html diff --git a/resources/mails/lesson/lesson03.html b/resources/mails/topjava/lesson03.html similarity index 100% rename from resources/mails/lesson/lesson03.html rename to resources/mails/topjava/lesson03.html diff --git a/resources/mails/lesson/lesson04.html b/resources/mails/topjava/lesson04.html similarity index 100% rename from resources/mails/lesson/lesson04.html rename to resources/mails/topjava/lesson04.html diff --git a/src/main/java/ru/javaops/model/ParticipationType.java b/src/main/java/ru/javaops/model/ParticipationType.java index b7cc540..658c031 100644 --- a/src/main/java/ru/javaops/model/ParticipationType.java +++ b/src/main/java/ru/javaops/model/ParticipationType.java @@ -5,5 +5,6 @@ * 02.09.2015. */ public enum ParticipationType { - HW_REVIEW + HW_REVIEW, + HELPER } From 445a5b61ecd6292085aedf0276a5cfbb1d2b4016 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 30 Mar 2016 20:11:32 +0300 Subject: [PATCH 064/936] Update templates --- resources/mails/basejava/lesson01.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/basejava/lesson01.html b/resources/mails/basejava/lesson01.html index c08c99c..54a9e6e 100644 --- a/resources/mails/basejava/lesson01.html +++ b/resources/mails/basejava/lesson01.html @@ -9,13 +9,13 @@

    Выложил начало первого занятия.

    -После того, как сделаете свою модель, объязательно проверьте ее по всем пунктам в описании HW01.
    -Внизу есть инструменты рисования. +После того, как сделаешь свою модель, объязательно проверь ее по всем пунктам в описании HW01.
    +Внизу урока есть инструменты рисования (можно через Diagrams пакета model в IDEA).

    Напомню, что ревью модели принимаю от всех участников, код классов - только от участников с проверкой ДЗ.
    Присылать HW желательно до завтрашнего вечера.

    - Оставшееся видео постараюсь выложить сегодня. И завтра-послезавтра определюсь с инструментом для вебинаров. + Оставшееся видео постараюсь выложить сегодня. И завтра-послезавтра определюсь с комнатой для вебинаров.

    From 59ac86ace004289ab1c83049b6c179677ad598c0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 30 Mar 2016 22:35:56 +0300 Subject: [PATCH 065/936] Update index --- resources/view/index.html | 42 +++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index 00d7742..dcb4100 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -15,8 +15,14 @@
    @@ -30,7 +36,8 @@

    Максимальный охват

    курсе.

  • -

    Насыщенное и структурированное изложение как дополнение к проекту

    +

    Насыщенное и структурированное изложение как дополнение к + проекту

    Изложение материала "без воды" нацелено на практическое использование и дополняется материалом для самостоятельной проработки. Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, @@ -41,7 +48,8 @@

    Насыщенное и структуриро

  • Последовательная возрастание сложности с нуля

    -

    Сложность проекта возрастает постепенно, с кода "Hello Topjava" в main() вступительного задания до финальной версии. Слон съедается по кусочкам..

    +

    Сложность проекта возрастает постепенно, с кода "Hello Topjava" в + main() вступительного задания до финальной версии. Слон съедается по кусочкам..

  • Совместная разработка

    @@ -80,18 +88,24 @@

    Ревью Вашего кода.

  • Помощь в составлении резюме и с трудоустройством.

    -

    Читайте наши истории (делимся опытом и успехом). В группе skype выпускников происходит активное общение на все темы IT, обсуждение вступительных заданий, вакансии, цены на рынке труда, события, помощь, интересные видео и пр. +

    Читайте наши истории (делимся опытом и + успехом). В группе skype выпускников происходит активное общение на все темы IT, обсуждение + вступительных заданий, вакансии, цены на рынке труда, события, помощь, интересные видео и пр. Ваши формы соискателя я рассылаю всем знакомым HR.

  • -

    После проекта topjava в твоем резюме появится раздел в опыте работы:

    -

    Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей на стеке: Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API

    +

    После проекта topjava в твоем резюме появится раздел в опыте + работы:

    +

    Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе + ролей на стеке: Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API

      -
    • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA
    • -
    • реализация и тестирование REST и AJAX контроллеров
    • -
    • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
    • -
    • твоя доработка проекта
    • +
    • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и + Spring-Data-JPA +
    • +
    • реализация и тестирование REST и AJAX контроллеров
    • +
    • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
    • +
    • твоя доработка проекта
  • @@ -102,7 +116,7 @@

    Участие в разработке Spring/JPA Enterprise приложе

    Top Java Enterprise:
    наиболее востребованные технологии /инструменты /фреймворки Java Enterprise.

    -

    Старт 26.05.2016 (по четвергам с конца мая).

    +

    Старт 26.05.2016 (по четвергам с конца мая).

    Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins
    Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе @@ -111,8 +125,10 @@

    Старт 26.05.2016 (по четвергам с конца мая).

    Практика Java. Разработка Web приложения:
    Интенсив: 10 занятий 2 раза в неделю.

    -

    Старт 25.03.2016 по вторникам и пятницам с 20.00 (GMT+3, Москва).

    -

    Объектная модель, коллекции, система ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, SQL, персистентность в базу данных (PostgreSQL), сервлеты, JSP/JSTL, веб-контейнер Tomcat, HTML, модульные тесты JUnit, java.util.Logging, система контроля версий Git.

    +

    Старт 25.03.2016 по вторникам и пятницам с 20.00 (GMT+3, Москва).

    +

    Объектная модель, коллекции, система ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, + SQL, персистентность в базу данных (PostgreSQL), сервлеты, JSP/JSTL, веб-контейнер Tomcat, HTML, + модульные тесты JUnit, java.util.Logging, система контроля версий Git.

    From 75e8392cd328511df3b29e327602b0ed15c3434b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 31 Mar 2016 19:44:44 +0300 Subject: [PATCH 066/936] Add topjava 5 lesson --- resources/mails/mailFragments.html | 2 +- resources/mails/topjava/lesson05.html | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 resources/mails/topjava/lesson05.html diff --git a/resources/mails/mailFragments.html b/resources/mails/mailFragments.html index 4b456bb..5dc30be 100644 --- a/resources/mails/mailFragments.html +++ b/resources/mails/mailFragments.html @@ -22,7 +22,7 @@

    - Удачи в выполнении задания,
    + Удачи в освоении материалов и выполнении задания,
    Григорий Кислин
    skype: grigory.kislin

    diff --git a/resources/mails/topjava/lesson05.html b/resources/mails/topjava/lesson05.html new file mode 100644 index 0000000..30d22e4 --- /dev/null +++ b/resources/mails/topjava/lesson05.html @@ -0,0 +1,24 @@ + + + + Пятое занятие проекта TopJava Enterprise + + +

    + Здравствуй firstName! +

    +

    +Готово пятое занятие нашего проекта.
    +На следующем уроке перейдем к слою web. +

    +

    + Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
    + Обсуждение урока и ДЗ в slack #lesson05 +

    +

    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 07.03
    +

    +

    +

    + + \ No newline at end of file From 75ffb3568057cc30658fff693c8a76c2bd7ceee5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 1 Apr 2016 00:25:08 +0300 Subject: [PATCH 067/936] add linkedin --- resources/mails/linkedin.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 resources/mails/linkedin.html diff --git a/resources/mails/linkedin.html b/resources/mails/linkedin.html new file mode 100644 index 0000000..9e485a4 --- /dev/null +++ b/resources/mails/linkedin.html @@ -0,0 +1,19 @@ + + + + + + Java Online Projects на LinkedIn + +

    + Здравствуй!
    +

    +Рад сообщить, что Java Online Projects появился как компания на linkedIn. +

    + Т.е теперь в своем резюме на linkedIn можно занести опыт работы с указанием компании: набирай в имени компании Java Online... и она появится в списке.
    + Пример, как можно позиционировать в резюме проект Topjava. +

    +Также напомню, что когда у тебя появится возможность поделиться своим опытом и успехом, буду рад разместить твою историю. +

    +

    + \ No newline at end of file From a9a0965a8badb8580fcbe831cacdfff975e632dc Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 1 Apr 2016 19:15:12 +0300 Subject: [PATCH 068/936] Add start basejava lesson02 --- resources/mails/basejava/lesson02_start.html | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 resources/mails/basejava/lesson02_start.html diff --git a/resources/mails/basejava/lesson02_start.html b/resources/mails/basejava/lesson02_start.html new file mode 100644 index 0000000..f2b8ee3 --- /dev/null +++ b/resources/mails/basejava/lesson02_start.html @@ -0,0 +1,26 @@ + + + + Второе занятие проекта: сегодня в 20.30 GMT+3 + + +

    + Здравствуй firstName! +

    +Добавил в первое занятие видео с объяснением объектной модели + резюме.
    +Классы мы будем делать вместе уже на вебинаре. +

    + Посмотри пожалуйста видео до начала вебинара в 20.30 +

    +

    + До встречи в комнате вебинаре Adobe (сегодня тестировали) в 20.30 ,
    + Григорий Кислин
    + skype: grigory.kislin +

    +

    + Java Online Projects +

    + + \ No newline at end of file From 7f24511f35fba846d1b1f5c450a6e0a86a5f578c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 3 Apr 2016 11:03:41 +0300 Subject: [PATCH 069/936] change register template --- resources/mails/basejava_register.html | 28 ++---------------- resources/mails/topjava_info.html | 41 ++++++++------------------ 2 files changed, 16 insertions(+), 53 deletions(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 8f4e59c..85efd10 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -11,33 +11,11 @@

    Спасибо за регистрацию на проекте Практика Java. Разработка Web приложения!
    - Занятия будут проходить 2 раза в неделю, с 20.00 (GMT+3, Москва) по вторникам и пятницам, все материалы будут доступны в записи. - В эту пятницу (25.03) будет рассылка по первому уроку, вебинары начнутся со вторника (29.03).

    -

    - Требование к участникам: - насыщенное обучение предполагает наличие опыта в программировании. На базовом курсе изучается принципы ООП и - самые необходимые разделы Java API, включая работу с базой данных (JDBC API) и написние веб-приложения (Tomcat/ - Servlets/ JSP/ JSTL), поэтому знание SQL и HTML желательно. - Должно присутствовать желание изучать простые темы (например типы данных) самостоятельно по ссылкам курса. - Все темы курса являются частью проекта, в материалах есть достаточно много ссылок на курс Программирование - на Java на intuit. Если у Вас опыта с Java немного, рекомендую прочитать его до курса. - Или будте готовы к тому, чтобы прорабатывать его вместе с темами наших занятий. Для полного усвоения - материалов выполнения домашних заданий и самостоятельная работа по ссылкам с вебинара НЕОБХОДИМА. - Т.е. это будет тренинг либо для программистов, желающих перейти на Java, либо для людей, у который уже есть практический опыт с Java. -

    -

    -До начала занятий необходимо установить ПО и подготовится по вступительному занятию. -

    -

    - Стоимость участия: 6900 руб. без проверки домашних заданий и 15900 руб. с проверкой.
    - Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать курс.
    - В USD можно оплачивать по текущему курсу. -

    - +Старт будет по мере набора группы.
    +Буду делать рассылку и держать в курсе. Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    -Всего наилучшего и до встречи на проекте!
    +До встречи на проекте!

    Ответы на вопросы.

    diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 62e7c16..2340893 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -109,7 +109,7 @@

    На проекте

    Расписание занятий проекта:

    рассылка занятий происходит по четвергам, для участников с проверкой домашнего задания желательно присылать ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. -

      25.02: Старт проекта

      +

        26.05: Старт проекта

      • Сбор группы в Slack и Skype
      • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
      • Раздача учебных лицензий JetBrains IDEA
      • @@ -117,7 +117,7 @@

        Расписание занятий проекта:

        Для участников с проверкой желательно присылать решение до вечера 01.03
      -

        03.03: 1-е занятие

        +

          02.06: 1-е занятие

        • Разбор домашнего задания вступительного занятия (вместе с Optional)
        • Обзор используемых в проекте технологий. Интеграция ПО
        • Maven
        • @@ -126,7 +126,7 @@

          Расписание занятий проекта:

        • Уровни и зависимости логгирования. JMX
        • Домашнее задание 1-го занятия (HW1 + Optional)
        -

          10.03: 2-е занятие

          +

            09.06: 2-е занятие

          • Разбор домашнего задания HW1 + Optional
          • Библиотека vs Фреймворк. Стандартные библиотеки Apache Commons, Guava
          • Слои приложения. Создание каркаса приложения
          • @@ -134,7 +134,7 @@

            Расписание занятий проекта:

          • Пояснения к HW2. Обработка Autowired
          • Домашнее задание (HW2 + Optional)
          -

            17.03: 3-е занятие

            +

              16.06: 3-е занятие

            • Разбор домашнего задания HW2 + Optional
            • Жизненный цикл Spring контекста
            • Тестирование через JUnit
            • @@ -146,7 +146,7 @@

              Расписание занятий проекта:

            • Логирование тестов
            • Домашнее задание (HW3 + Optional)
            -

              24.03: 4-е занятие

              +

                23.06: 4-е занятие

              • Разбор домашнего задания HW3 + Optional
              • Spring: инициализация и популирование DB
              • Подмена контекста при тестировании
              • @@ -154,7 +154,7 @@

                Расписание занятий проекта:

              • Поддержка HSQLDB
              • Домашнее задание (HW4 + Optional)
              -

                31.03: 5-е занятие

                +

                  30.06: 5-е занятие

                • Разбор вопросов
                • Разбор домашнего задания HW4 + Optional
                • Транзакции
                • @@ -164,7 +164,7 @@

                  Расписание занятий проекта:

                • Spring кэш
                • Домашнее задание (HW5 + Optional)
                -

                  07.04: 6-е занятие

                  +

                    07.07: 6-е занятие

                  • Разбор домашнего задания HW5 + Optional
                  • Кэш Hibernate
                  • Spring Web
                  • @@ -175,7 +175,7 @@

                    Расписание занятий проекта:

                  • Spring Internationalization
                  • Домашнее задание (HW6 + Optional)
                  -

                    14.04: 7-е занятие

                    +

                      14.07: 7-е занятие

                    • Разбор домашнего задания HW6 + Optional
                    • Автогенерация DDL по модели
                    • Тестирование Spring MVC
                    • @@ -185,7 +185,7 @@

                      Расписание занятий проекта:

                    • Тестирование через SoapUi. UTF-8
                    • Домашнее задание (HW7 + Optional)
                    -

                      21.04: 8-е занятие

                      +

                        21.07: 8-е занятие

                      • Разбор домашнего задания HW7 + Optional
                      • WebJars. jQuery и JavaScript frameworks
                      • Bootstrap
                      • @@ -194,7 +194,7 @@

                        Расписание занятий проекта:

                      • Добавление Spring Security
                      • Домашнее задание (HW8 + Optional)
                      -

                        28.04: 9-е занятие

                        +

                          28.07: 9-е занятие

                        • Разбор домашнего задания HW8 + Optional
                        • Spring Binding
                        • Spring Validation
                        • @@ -206,7 +206,7 @@

                          Расписание занятий проекта:

                        • Cookie. Session
                        • Домашнее задание (HW9 + Optional)
                        -

                          05.05: 10-е занятие

                          +

                            04.08: 10-е занятие

                          • Разбор домашнего задания HW10 + Optional
                          • Spring Security Taglib. Method Security Expressions
                          • Интерсепторы. Редактирование профиля. JSP tag files
                          • @@ -216,7 +216,7 @@

                            Расписание занятий проекта:

                          • Защита от межсайтовой подделки запросов (CSRF)
                          • Домашнее задание (HW10)
                          -

                            12.05: Заключительное занятие

                            +

                              11.08: Заключительное занятие

                            • Рефакторинг
                            • Разбор домашнего задания HW10 + Optional
                            • Деплой приложения в Heroku
                            • @@ -225,23 +225,8 @@

                              Расписание занятий проекта:

                            • Домашнее задание по проекту: составление резюме

                            -

                            - 25.02 был старт проекта Java Enterprise, розданы права на все материалы и учебные ключи JetBrains IDEA, идет - общение - в slack по вступительному занятию. -

                            -

                            - Последний срок сдачи домашнего задания (для участников с проверкой ДЗ) 01.03.
                            - Рассылка первого урока 03.03. -

                            - Следующий выпуск проекта будет только 26.05. -

                            Еще есть возможность принять участие в этом выпуске!

                            Для этого нужно послать мне сообщение в skype: grigory.kislin с пометкой topjava.
                            -

                            - Стоимость участия: 8300 руб. (110$) без проверки домашних заданий и 19500 руб. (260$) с проверкой. - Варианты оплаты.
                            -

                            - Если у тебя есть подписка на проект JavaRush, свяжись со мной отдельно.
                            + В конце вводного занятия есть ресурсы для подготовки.

                            From 8ba2f67ca66e83349c3c7fd955329bc9922c874f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 3 Apr 2016 15:10:27 +0300 Subject: [PATCH 070/936] Add template --- resources/mails/basejava/lesson02.html | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 resources/mails/basejava/lesson02.html diff --git a/resources/mails/basejava/lesson02.html b/resources/mails/basejava/lesson02.html new file mode 100644 index 0000000..0d9aa09 --- /dev/null +++ b/resources/mails/basejava/lesson02.html @@ -0,0 +1,15 @@ + + + + Второе занятие проекта "Java. Разработка Web приложения" + + +

                            + Здравствуй firstName! +

                            +Оформил материал второго занятия.
                            +Присылать HW желательно до вечера понедельника.
                            +

                            +

                            + + \ No newline at end of file From 1e82f13925d4835e08c0b3bce59980c322b73a18 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 3 Apr 2016 15:31:30 +0300 Subject: [PATCH 071/936] Apdate 6 story --- resources/story/story6.html | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/resources/story/story6.html b/resources/story/story6.html index c184dc6..4793f3d 100644 --- a/resources/story/story6.html +++ b/resources/story/story6.html @@ -26,24 +26,27 @@

                            Как я стал Java-разработчиком

                            - После окончания технического университета в течение около 10-ти лет я работал разработчиком электронной аппаратуры. - Сначала я разрабатывал схемы и печатные платы, писал программы для микроконтроллеров на Ассемблере и Си. - Потом на работе потребовалось создавать простейшие дескоптные приложения на С++ и С#, я стал изучать эти языки и писать такие приложения. - Далее я заинтересовался веб-приложениями, открыл для себя язык Java и начал изучать его по книгам и статьям из интернета. - Изучая Java я осознал, что технологий на этой платформе очень много и мне как новичку было непросто разобраться, что изучать сначала, а что потом, и я решил, что без курсов мне не обойтись. + После окончания технического университета в течение около десяти лет я работал разработчиком электронной + аппаратуры. Сначала разрабатывал схемы и печатные платы, писал программы для микроконтроллеров на Ассемблере и + Си. Потом на работе потребовалось создавать простейшие дескоптные приложения на С++ и С#, я стал изучать эти + языки и создавать такие приложения. Далее заинтересовался веб-приложениями, открыл для себя язык Java и начал + изучать его по книгам, статьям и видеозаписям из интернета. Изучая Java осознал, что технологий на базе этого + языка очень много и мне как новичку было непросто разобраться, что изучать сначала, а что потом, и я решил, что + без курсов мне не обойтись.

                            - Нашел в интернете очный курс для начинающих Java-разработчиков и записался на него. - Преподавал на курсе Григорий Кислин. Мне очень понравилось, как Григорий подает материал. На его курсе было максимальное количество практики, мы создавали и в итоге создали настоящее, актуальное веб-приложение. - Каждый урок был записан на видео, которое я потом пересматривал, а некоторые фрагменты не по одному разу. - После окончания этого курса Григорий предложил пройти обучение на еще одном его курсе TopJava в формате вебинара1 и я, конечно, согласился. - Этот курс Григорий проводил в похожем формате и после окончания этого курса я получил легко масштабируемое приложение enterprise-уровня. + Нашел в интернете очный курс для начинающих Java-разработчиков и записался на него. Преподавал на курсе Григорий + Кислин. Мне очень понравилось, как Григорий подает материал. На его курсе было очень много практики, мы + создавали и в итоге создали настоящее, актуальное веб-приложение. Каждый урок был записан на видео, которые я + потом пересматривал, а некоторые фрагменты не по одному разу. После окончания этого курса Григорий предложил + пройти обучение на еще одном его курсе TopJava и я, конечно, согласился. Этот курс Григорий проводил в похожем + формате и после его окончания было создано легко масштабируемое веб-приложение enterprise-уровня.

                            - Далее так сложилось, что на моей работе потребовалось создать небольшое веб-приложение. - Знаний и навыков, приобретенных на этих двух курсах мне хватило, чтобы я создал такое приложение. - После этого я разместил свое резюме на нескольких сайтах, и через некоторое время мне предложили работу в крупной компании. - Я сходил на собеседование, успешно его прошел, устроился работать и на данный момент работаю в этой компании уже более полугода. + Далее так сложилось, что на моей работе потребовалось создать подобное приложение. Благодаря этим курсам я + достаточно быстро справился с задачей. После этого разместил свое резюме на нескольких сайтах, и через некоторое + время мне предложили работу в крупной компании. Я успешно прошел собеседование и на данный момент работаю в этой + компании уже более полугода.


                            Максим, 28/03/2016 From ff6a8573203addba209d919c461e8db4457e42a2 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 3 Apr 2016 15:46:11 +0300 Subject: [PATCH 072/936] Update topjava register --- resources/mails/topjava_info.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 2340893..93004dc 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -8,7 +8,7 @@ подробно разбирается работа с проектом в системе управления версиями Git. На занятиях я последовательно разрабатываю приложение с объяснениями и теоретическим материалом по всем темам проекта. - Домашние задания выполняются вами по темам занятий и являются частью проекта. На заключительном занятии каждый + Домашние задания выполняются по всем темам занятий и являются частью проекта. На заключительном занятии каждый участник деплоит свой проект из github в облачный сервис Heroku.

                            @@ -225,8 +225,8 @@

                            Расписание занятий проекта:

                          • Домашнее задание по проекту: составление резюме

                          - Для этого нужно послать мне сообщение в skype: grigory.kislin с пометкой topjava.
                          - + Ближе к сроку я буду делать рассылку. + Можно также заранее послать мне сообщение в skype: grigory.kislin с пометкой topjava и после оплаты я добавлю тебя в группу проекта.
                          В конце вводного занятия есть ресурсы для подготовки.

                          From 5c5adc9d2545e3ec688deca09a572516c09055ed Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 5 Apr 2016 19:00:14 +0300 Subject: [PATCH 073/936] Add webinar start template --- resources/mails/basejava/webinar_start.html | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 resources/mails/basejava/webinar_start.html diff --git a/resources/mails/basejava/webinar_start.html b/resources/mails/basejava/webinar_start.html new file mode 100644 index 0000000..1cd612f --- /dev/null +++ b/resources/mails/basejava/webinar_start.html @@ -0,0 +1,21 @@ + + + + Вебинар "Java. Разработка Web приложения" сегодня, в 20.00 (GMT+3) + + +

                          + Здравствуй firstName! +

                          +Напоминаю, что сегодня в 20.00 (GMT+3) будет 3-е занятие "Java. Разработка Web приложения" в комнате Adobe meeting.
                          +

                          +

                          + До встречи на вебинаре,
                          + Григорий Кислин
                          + skype: grigory.kislin +

                          +

                          + Java Online Projects +

                          + + \ No newline at end of file From 04e1d9169722a36acfdef6c863c34b6dad4dc0b9 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 5 Apr 2016 19:07:31 +0300 Subject: [PATCH 074/936] Fix webinar start template --- resources/mails/basejava/webinar_start.html | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/mails/basejava/webinar_start.html b/resources/mails/basejava/webinar_start.html index 1cd612f..2f728a2 100644 --- a/resources/mails/basejava/webinar_start.html +++ b/resources/mails/basejava/webinar_start.html @@ -8,7 +8,6 @@ Здравствуй firstName!

                          Напоминаю, что сегодня в 20.00 (GMT+3) будет 3-е занятие "Java. Разработка Web приложения" в комнате Adobe meeting.
                          -

                          До встречи на вебинаре,
                          Григорий Кислин
                          From 501aab1312370ddc2db7d96574f591e534077802 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 7 Apr 2016 18:17:39 +0300 Subject: [PATCH 075/936] Add topjava lesson06 --- resources/mails/topjava/lesson06.html | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 resources/mails/topjava/lesson06.html diff --git a/resources/mails/topjava/lesson06.html b/resources/mails/topjava/lesson06.html new file mode 100644 index 0000000..fe1b352 --- /dev/null +++ b/resources/mails/topjava/lesson06.html @@ -0,0 +1,24 @@ + + + + Шестое занятие проекта TopJava Enterprise + + +

                          + Здравствуй firstName! +

                          +

                          +Готово шестое занятие нашего проекта.
                          +Начинаем изучать Spring-MVC и слой Web. +

                          +

                          + Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
                          + Обсуждение урока и ДЗ в slack #lesson06 +

                          +

                          + Домашнее задание (у кого есть проверка) желательно присылать до вечера 12.04
                          +

                          +

                          +

                          + + \ No newline at end of file From 5f2dd4857d433cfe9adc3738f680593e54c5a2d5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 8 Apr 2016 19:57:43 +0300 Subject: [PATCH 076/936] Update webinar start --- resources/mails/basejava/webinar_start.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/basejava/webinar_start.html b/resources/mails/basejava/webinar_start.html index 2f728a2..755890d 100644 --- a/resources/mails/basejava/webinar_start.html +++ b/resources/mails/basejava/webinar_start.html @@ -7,7 +7,7 @@

                          Здравствуй firstName!

                          -Напоминаю, что сегодня в 20.00 (GMT+3) будет 3-е занятие "Java. Разработка Web приложения" в комнате Adobe meeting.
                          +Напоминаю про старт в 20.00 (GMT+3) вебинара "Java. Разработка Web приложения" в комнате Adobe meeting.

                          До встречи на вебинаре,
                          Григорий Кислин
                          From c54d25a28883878cefd1d340dabaf56aa68c27ef Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 11 Apr 2016 22:27:18 +0300 Subject: [PATCH 077/936] Update index and story css Add interview --- resources/css/style.css | 5 +- resources/static/bootstrap-3.3.6/css/blog.css | 169 ++++++++++++++ resources/story.html | 84 ++++--- resources/story/story1.html | 4 +- resources/story/story2.html | 4 +- resources/story/story3.html | 4 +- resources/story/story4.html | 18 +- resources/story/story5.html | 4 +- resources/story/story6.html | 4 +- resources/vacation/technodiasoft.html | 52 +++++ resources/vacation/test.html | 48 ++++ resources/view/exception.html | 1 - resources/view/fragments.html | 11 +- resources/view/index.html | 220 +++++++++--------- 14 files changed, 451 insertions(+), 177 deletions(-) create mode 100644 resources/static/bootstrap-3.3.6/css/blog.css create mode 100644 resources/vacation/technodiasoft.html create mode 100644 resources/vacation/test.html diff --git a/resources/css/style.css b/resources/css/style.css index d3ec68e..ecf84c5 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -1,8 +1,11 @@ .box { - padding: 50px; text-align: center; vertical-align: middle; } +.pad, .box { + padding: 70px; +} + .indent-body { padding-top: 70px; } .bs-callout { padding: 5px 20px;} \ No newline at end of file diff --git a/resources/static/bootstrap-3.3.6/css/blog.css b/resources/static/bootstrap-3.3.6/css/blog.css new file mode 100644 index 0000000..cc8e4d5 --- /dev/null +++ b/resources/static/bootstrap-3.3.6/css/blog.css @@ -0,0 +1,169 @@ +/* + * Globals + */ + +body { + font-family: Georgia, "Times New Roman", Times, serif; + color: #555; +} + +h1, .h1, +h2, .h2, +h3, .h3, +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + color: #333; +} + +/* + * Override Bootstrap's default container. + */ + +@media (min-width: 1200px) { + .container { + width: 970px; + } +} + +/* + * Masthead for nav + */ + +.blog-masthead { + background-color: #428bca; + -webkit-box-shadow: inset 0 -2px 5px rgba(0, 0, 0, .1); + box-shadow: inset 0 -2px 5px rgba(0, 0, 0, .1); +} + +/* Nav links */ +.blog-nav-item { + position: relative; + display: inline-block; + padding: 10px; + font-weight: 500; + color: #cdddeb; +} + +.blog-nav-item:hover, +.blog-nav-item:focus { + color: #fff; + text-decoration: none; +} + +/* Active state gets a caret at the bottom */ +.blog-nav .active { + color: #fff; +} + +.blog-nav .active:after { + position: absolute; + bottom: 0; + left: 50%; + width: 0; + height: 0; + margin-left: -5px; + vertical-align: middle; + content: " "; + border-right: 5px solid transparent; + border-bottom: 5px solid; + border-left: 5px solid transparent; +} + +/* + * Blog name and description + */ + +.blog-header { + padding-top: 20px; + padding-bottom: 20px; +} + +.blog-title { + margin-top: 30px; + margin-bottom: 0; + font-size: 60px; + font-weight: normal; +} + +.blog-description { + font-size: 20px; + color: #999; +} + +/* + * Main column and sidebar layout + */ + +.blog-main { + font-size: 18px; + line-height: 1.5; +} + +/* Sidebar modules for boxing content */ +.sidebar-module { + padding: 15px; + margin: 0 -15px 15px; +} + +.sidebar-module-inset { + padding: 15px; + background-color: #f5f5f5; + border-radius: 4px; +} + +.sidebar-module-inset p:last-child, +.sidebar-module-inset ul:last-child, +.sidebar-module-inset ol:last-child { + margin-bottom: 0; +} + +/* Pagination */ +.pager { + margin-bottom: 60px; + text-align: left; +} + +.pager > li > a { + width: 140px; + padding: 10px 20px; + text-align: center; + border-radius: 30px; +} + +/* + * Blog posts + */ + +.blog-post { + margin-bottom: 60px; +} + +.blog-post-title { + margin-bottom: 5px; + font-size: 40px; +} + +.blog-post-meta { + margin-bottom: 20px; + color: #999; +} + +/* + * Footer + */ + +.blog-footer { + padding: 40px 0; + color: #999; + text-align: center; + background-color: #f9f9f9; + border-top: 1px solid #e5e5e5; +} + +.blog-footer p:last-child { + margin-bottom: 0; +} diff --git a/resources/story.html b/resources/story.html index 305f6c6..99c49a3 100644 --- a/resources/story.html +++ b/resources/story.html @@ -1,5 +1,5 @@ - + @@ -8,7 +8,7 @@ Истории - + @@ -22,64 +22,62 @@

    -

    Наши истории

    +
    +

    Главное - верить в свои силы.

    + Лев Хачересьянц, 16/03/2016 +

    Жизнь — как вождение велосипеда. Чтобы сохранить равновесие, ты должен двигаться.

    Кислин Григорий, 16/03/2016 diff --git a/resources/story/story1.html b/resources/story/story1.html index 2883918..6b562ae 100644 --- a/resources/story/story1.html +++ b/resources/story/story1.html @@ -24,7 +24,7 @@
    -
    -
    -

    Наши истории

    - -
    -

    Главное - верить в свои силы.

    - Лев Хачересьянц, 16/03/2016 -
    - - - - -
    - Ждем истории по окончанию испытательных сроков: Тимур, Андрей, Дмитрий, Евгений, Алексей, Азер, ... -
    -
    +
    +

    Наши истории

    +
    +

    Как я стал Java-разработчиком.

    + + +

    Главное - верить в свои силы.

    + + +

    Жизнь — как вождение велосипеда. Чтобы сохранить равновесие, ты должен + двигаться.

    + + +

    История успеха длиной в год

    + + +

    Разработка ПО – это тяжелый, но благодарный труд

    + + +

    Каждое утро я просыпался с мыслью: "Как мне написать приложение?"

    + +
    + Ждем истории по окончанию испытательных сроков: Тимур, Андрей, Дмитрий, Евгений, Алексей, Азер, ...
    - + \ No newline at end of file diff --git a/resources/story/story1.html b/resources/story/story1.html index 6b562ae..bbc240b 100644 --- a/resources/story/story1.html +++ b/resources/story/story1.html @@ -1,5 +1,5 @@ - + @@ -8,7 +8,7 @@ Истории - + diff --git a/resources/story/story2.html b/resources/story/story2.html index 4038a23..069654a 100644 --- a/resources/story/story2.html +++ b/resources/story/story2.html @@ -1,5 +1,5 @@ - + @@ -8,7 +8,7 @@ Истории - + diff --git a/resources/story/story3.html b/resources/story/story3.html index 02b863c..a525d42 100644 --- a/resources/story/story3.html +++ b/resources/story/story3.html @@ -1,5 +1,5 @@ - + @@ -8,7 +8,7 @@ Истории - + diff --git a/resources/story/story4.html b/resources/story/story4.html index a573049..f075f59 100644 --- a/resources/story/story4.html +++ b/resources/story/story4.html @@ -1,5 +1,5 @@ - + @@ -8,7 +8,7 @@ Истории - + @@ -41,7 +41,7 @@

    Начало

  • объязательно самообразование
  • - +

    Встреча с Java

    Возвратиться в программирование в 2005 году после 8 лет работы в Alcatel инженером по тестированию телефонной станции было нелегко: взяли в Siemens на java как специалиста по предметной обасти. Причем, пока ждал ответа от @@ -59,14 +59,14 @@

    Встреча с Java

    -
    +

    Жизнь — как вождение велосипеда. Чтобы сохранить равновесие, ты должен двигаться.

    Альберт Эйнштейн -
    -
    + +

    Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!

    Льюиса Кэрролл "Алиса в Зазеркалье" -
    + Ушел из Siemens после 2 с небольшим лет, как только перерос их велосипеды (незадолго до меня они перешли с собственной RDBMS на Oracle, сборка была через make, в проекте не было ни одной сторонней библиотеки) и понял, как это нужно делать. @@ -131,12 +131,12 @@

    Светлое настоящее


    Приглашаю к участию в проектах (интенсив "Разработка Web приложения" с 25.03 и следующий набор Java Enterprise Topjava 26.05) и готов к любым вариантам сотрудничества.
    - +
    К списку историй
    diff --git a/resources/story/story5.html b/resources/story/story5.html index 756f3e7..9fca3c4 100644 --- a/resources/story/story5.html +++ b/resources/story/story5.html @@ -1,5 +1,5 @@ - + @@ -8,7 +8,7 @@ Истории - + diff --git a/resources/story/story6.html b/resources/story/story6.html index 4793f3d..a7af605 100644 --- a/resources/story/story6.html +++ b/resources/story/story6.html @@ -1,5 +1,5 @@ - + @@ -8,7 +8,7 @@ Истории - + diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html new file mode 100644 index 0000000..1b98199 --- /dev/null +++ b/resources/vacation/technodiasoft.html @@ -0,0 +1,52 @@ + + + + + + + + + Истории + + + + + + + +
    +

    Требования

    +

    + Обязательно: Core Java (5, 6), JSP, Axis, SOAP, JSP, Oracle RDBMS +

    +

    + Желательно: Struts 1, JavaScript, JMS, Hibernate, J2EE +

    +

    + Желательно опыт работы с: IBM WebSphere Application Server или другими промышленными СП, IBM WebSphere MQ +

    +

    + Среда разработки: IntelliJ IDEA +

    +

    + Инфраструктура разработки: Git, Ant +

    +

    + Понимание принципов создания многопоточных приложений. Умение читать и понимать модели: ER-диаграммы, ООМ. + Уверенное знание и практика работы как разработчика с СУБД Oracle. Навыки проектирования БД приветствуются. +

    +

    + Опыт разработки высоконагруженных веб приложений в многозвенной архитектуре, работающих в режиме 24х7. + Желательно опыт разработки банковских приложений. +

    +
    + + \ No newline at end of file diff --git a/resources/vacation/test.html b/resources/vacation/test.html new file mode 100644 index 0000000..248ef64 --- /dev/null +++ b/resources/vacation/test.html @@ -0,0 +1,48 @@ + + + + + + + + + Истории + + + + + + + +
    +

    Темы тестового собеседования:

    +

    + Объязательно: Core Java 8, Servlet/JSP/Tomcat, JPA, Spring MVC, REST, SQL +

    +

    + Желательно: JavaScript, AJAX, jQuery, принципы NoSQL +

    +

    + Инфраструктура разработки: Git, Maven +

    +

    +

      Хорошее понимание: +
    • принципов ООП;
    • +
    • объектной модели Java
    • +
    • фреймворка коллекций
    • +
    • JMM и принципов многопоточности в Java
    • +
    +

    + Желательно: Stream API, ковариантность, дженерики. +

    +
    + + \ No newline at end of file diff --git a/resources/view/exception.html b/resources/view/exception.html index d4fbbe8..8f3e40f 100644 --- a/resources/view/exception.html +++ b/resources/view/exception.html @@ -8,7 +8,6 @@ Ошибка - diff --git a/resources/view/fragments.html b/resources/view/fragments.html index 2d053e4..427f07c 100644 --- a/resources/view/fragments.html +++ b/resources/view/fragments.html @@ -3,8 +3,8 @@ - - + + @@ -13,8 +13,11 @@ diff --git a/resources/view/index.html b/resources/view/index.html index dcb4100..cc5090b 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -8,7 +8,7 @@ Java Online Projects - + @@ -19,120 +19,122 @@ Projects? -
    -
    -
    -
      -
    • -

      Максимальный охват

      -

      Самые важные и необходимые Java разработчику темы, API, - фреймворки, инструменты в одном - курсе.

      -
    • -
    • -

      Насыщенное и структурированное изложение как дополнение к - проекту

      -

      Изложение материала "без воды" нацелено на практическое - использование и дополняется материалом для самостоятельной проработки. - Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, - в - связке, как дополнения к - созданию единого работающего приложения.
      - Усвоение и понимание материала увеличивается в разы.

      -
    • -
    • -

      Последовательная возрастание сложности с нуля

      -

      Сложность проекта возрастает постепенно, с кода "Hello Topjava" в - main() вступительного задания до финальной версии. Слон съедается по кусочкам..

      -
    • -
    • -

      Совместная разработка

      -

      Участники на протяжении всего курса работают с кодом - проекта. - Выполнение домашних заданий - закрепляет полученные знания.
      В результате проект становится "Вашим".

      -
    • -
    • -

      Общение, поддержка группы и преподавателя

      -

      По любым вопросам: git, трудоустройство, зарплаты - программиста, - java консультации, архитектура, новости IT и пр.

      -
    • -
    • -

      Доступность и структурированность материалов

      -

      Все видео доступно для просмотра онлайн и скачивания (в - случае - вебинаров- сразу после занятия). Записи разбиты по темам и - тщательно отредактированы. Большое количество подобранных ресурсов для углубления в - детали.

      -
    • -
    • -

      Оптимальное подобранное время

      -

      Занятия проходят раз в неделю, время необходимое для - проработки - пройденных тем и выполнения домашнего задания

      -
    • -
    • -

      Ревью Вашего кода.

      -

      Вы увидите именно свои ошибки в стиле, структурах - данных, - алгоритмах, кодировании.
      Опыт равноценен нескольким годам работы - разработчиком - java.

      -
    • -
    • -

      Помощь в составлении резюме и с трудоустройством.

      -

      Читайте наши истории (делимся опытом и - успехом). В группе skype выпускников происходит активное общение на все темы IT, обсуждение - вступительных заданий, вакансии, цены на рынке труда, события, помощь, интересные видео и пр. - Ваши формы соискателя я рассылаю всем знакомым HR. -

      -
    • -
    • -

      После проекта topjava в твоем резюме появится раздел в опыте - работы:

      -

      Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе - ролей на стеке: Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API

      -
        -
      • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и - Spring-Data-JPA -
      • -
      • реализация и тестирование REST и AJAX контроллеров
      • -
      • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
      • -
      • твоя доработка проекта
      • -
      -
    • -
    -
    - -
    -

    Top Java Enterprise:
    наиболее - востребованные технологии /инструменты /фреймворки Java Enterprise.

    -

    Старт 26.05.2016 (по четвергам с конца мая).

    -

    Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins
    - Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на - основе - ролей

    -
    -
    -

    Практика Java. Разработка Web приложения:
    - Интенсив: 10 занятий 2 раза в неделю.

    -

    Старт 25.03.2016 по вторникам и пятницам с 20.00 (GMT+3, Москва).

    -

    Объектная модель, коллекции, система ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, - SQL, персистентность в базу данных (PostgreSQL), сервлеты, JSP/JSTL, веб-контейнер Tomcat, HTML, - модульные тесты JUnit, java.util.Logging, система контроля версий Git.

    -
    +
    +
    +
      +
    • +

      Максимальный охват

      +

      Самые важные и необходимые Java разработчику темы, API, + фреймворки, инструменты в одном + курсе.

      +
    • +
    • +

      Насыщенное и структурированное изложение как дополнение к + проекту

      +

      Изложение материала "без воды" нацелено на практическое + использование и дополняется материалом для самостоятельной проработки. + Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, + в + связке, как дополнения к + созданию единого работающего приложения.
      + Усвоение и понимание материала увеличивается в разы.

      +
    • +
    • +

      Последовательная возрастание сложности с нуля

      +

      Сложность проекта возрастает постепенно, с кода "Hello Topjava" в + main() вступительного задания до финальной версии. Слон съедается по кусочкам..

      +
    • +
    • +

      Совместная разработка

      +

      Участники на протяжении всего курса работают с кодом + проекта. + Выполнение домашних заданий + закрепляет полученные знания.
      В результате проект становится "Вашим".

      +
    • +
    • +

      Общение, поддержка группы и преподавателя

      +

      По любым вопросам: git, трудоустройство, зарплаты + программиста, + java консультации, архитектура, новости IT и пр.

      +
    • +
    • +

      Доступность и структурированность материалов

      +

      Все видео доступно для просмотра онлайн и скачивания (в + случае + вебинаров- сразу после занятия). Записи разбиты по темам и + тщательно отредактированы. Большое количество подобранных ресурсов для углубления в + детали.

      +
    • +
    • +

      Оптимальное подобранное время

      +

      Занятия проходят раз в неделю, время необходимое для + проработки + пройденных тем и выполнения домашнего задания

      +
    • +
    • +

      Ревью Вашего кода.

      +

      Вы увидите именно свои ошибки в стиле, структурах + данных, + алгоритмах, кодировании.
      Опыт равноценен нескольким годам работы + разработчиком + java.

      +
    • +
    • +

      Помощь в составлении резюме и с трудоустройством.

      +

      Читайте наши истории (делимся опытом и + успехом). В группе skype выпускников происходит активное общение на все темы IT, обсуждение + вступительных заданий, вакансии, цены на рынке труда, события, помощь, интересные видео и пр. + Ваши формы соискателя я рассылаю всем знакомым HR. +

      +
    • +
    • +

      После проекта topjava в твоем резюме появится раздел в опыте + работы:

      +

      Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе + ролей на стеке: Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API

      +
        +
      • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и + Spring-Data-JPA +
      • +
      • реализация и тестирование REST и AJAX контроллеров
      • +
      • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
      • +
      • твоя доработка проекта
      • +
      +
    • +
    +
    +
    +

    Наши истории (делимся опытом и успехом)

    +
    +

    Техническое собеседование Java разработчик

    +

    Тестовое интервью

    +

    Core Java 8, OOP, JMM/Concurrency, Servlet/JSP, JPA, Spring MVC, REST, SQL, Maven

    +

    Техно Диасофт для СберТех

    +

    Core Java (5, 6), Concurrency, JSP, Axis, SOAP, JSP, Oracle, Struts 1, JavaScript, JMS, Hibernate, J2EE, Git, + Ant

    +
    +

    Стажировка на Java Web и Java Enterprise

    +

    Top Java Enterprise:
    наиболее + востребованные технологии /инструменты /фреймворки Java Enterprise.

    +

    Старт 26.05.2016 (по четвергам с конца мая).

    +

    Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins
    + Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на + основе + ролей

    +

    Практика Java. Разработка Web приложения:
    + Интенсив: 10 занятий 2 раза в неделю.

    +

    Старт 29.03.2016 по вторникам и пятницам с 20.00 (GMT+3, Москва).

    +

    Объектная модель, коллекции, система ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, + SQL, персистентность в базу данных (PostgreSQL), сервлеты, JSP/JSTL, веб-контейнер Tomcat, HTML, + модульные тесты JUnit, java.util.Logging, система контроля версий Git.

    -
    -
    From 36d6bcb49d093bfe284c6cc179a71cb959f581db Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 11 Apr 2016 22:29:47 +0300 Subject: [PATCH 078/936] Fix --- resources/view/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/view/index.html b/resources/view/index.html index cc5090b..e578edd 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -20,7 +20,7 @@ From 084b8d948bd11b36c370a5a6f9465496c34e3b18 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 11 Apr 2016 22:31:32 +0300 Subject: [PATCH 079/936] Fix --- resources/view/index.html | 2 +- src/test/java/ru/javaops/service/MailServiceTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index e578edd..bb156fd 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -21,7 +21,7 @@
    diff --git a/src/test/java/ru/javaops/service/MailServiceTest.java b/src/test/java/ru/javaops/service/MailServiceTest.java index 1be7624..2c6ec09 100644 --- a/src/test/java/ru/javaops/service/MailServiceTest.java +++ b/src/test/java/ru/javaops/service/MailServiceTest.java @@ -18,7 +18,7 @@ public class MailServiceTest extends ApplicationAbstractTest { @Test public void testGetContent() throws Exception { - String content = mailService.getContent("basejava_register", + String content = mailService.getContent("index", ImmutableMap.of("user", UserTestData.USER, "template", "topjava_register", "participation", "REGISTRATION", "result", "OK", "activationKey", "activationKey")); System.out.println("\n+++++"); System.out.println(Util.getTitle(content)); From 78860d442dc42e84f4f706fd9dfbc7ce97ee9962 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 11 Apr 2016 22:33:50 +0300 Subject: [PATCH 080/936] Fix --- resources/view/fragments.html | 4 ++-- resources/view/index.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/view/fragments.html b/resources/view/fragments.html index 427f07c..2341f8b 100644 --- a/resources/view/fragments.html +++ b/resources/view/fragments.html @@ -15,8 +15,8 @@ diff --git a/resources/view/index.html b/resources/view/index.html index bb156fd..1d226e9 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -21,7 +21,7 @@ From becaca45cbdd7bace5b1b76a3b97181e6a831e5e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 11 Apr 2016 23:02:46 +0300 Subject: [PATCH 081/936] Fix html --- resources/static/img/email.png | Bin 0 -> 530 bytes resources/static/img/vk.gif | Bin 0 -> 426 bytes resources/story.html | 17 ++-- resources/story/story1.html | 42 ++++----- resources/story/story2.html | 121 +++++++++++++------------- resources/story/story3.html | 102 ++++++++++++++++------ resources/story/story4.html | 52 +++++------ resources/story/story5.html | 46 +++++----- resources/story/story6.html | 38 ++++---- resources/vacation/technodiasoft.html | 23 +++-- resources/vacation/test.html | 13 +-- resources/view/index.html | 2 +- 12 files changed, 245 insertions(+), 211 deletions(-) create mode 100644 resources/static/img/email.png create mode 100644 resources/static/img/vk.gif diff --git a/resources/static/img/email.png b/resources/static/img/email.png new file mode 100644 index 0000000000000000000000000000000000000000..832787392dd9531a54636bfe34a830757faad107 GIT binary patch literal 530 zcmV+t0`2{YP)gjnO$$OSu5+~ z?GnX?h=lA4Aw)tUQAmVFq0y*l{09woYO#CvJPuUx9E=pyT_#!F+yaE_A#~L~0z7#IZ8fe)ldA+)52({5L z7I&}FQv-y8c`#;T81rLhdF1E6i9a}R(?EclS_D?Gh>cMbDJMeda%CBuE5c@ z!p$F0d|rQ@_4xYK+~ba;wQ7v3aFMV3`~3R+{U}(2;O6W#VT;h%-thDGN_L)3dZGXS z|NsC0A^8LW002J#EC2ui01yBW000KZz#rn&D;kd{gfO*OoSx676obI<{BOV?ZIh;E&I6eXq9T}z|ARQH)kRbs+H4P!O9UUSfoB<>sGISC* z!66|U8k{%*EuaG&8qPNx4jTg&bUq9U4+I<=Hv|sr1`X~F4=yh2>lGga1RwhQ`1lDW UKT3Q^prT;G1PBw{`w;{HJAnJFzW@LL literal 0 HcmV?d00001 diff --git a/resources/story.html b/resources/story.html index 99c49a3..85483b6 100644 --- a/resources/story.html +++ b/resources/story.html @@ -1,5 +1,5 @@ - - + + @@ -13,13 +13,14 @@ - diff --git a/resources/story/story6.html b/resources/story/story6.html index dac30a8..dada22d 100644 --- a/resources/story/story6.html +++ b/resources/story/story6.html @@ -19,9 +19,8 @@ Java Online Projects diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index bc842c8..48dcce8 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -13,9 +13,8 @@ Java Online Projects diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 62958b8..b9909be 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -11,10 +11,11 @@
    diff --git a/resources/view/fragments.html b/resources/view/fragments.html index 2341f8b..bc143bb 100644 --- a/resources/view/fragments.html +++ b/resources/view/fragments.html @@ -15,8 +15,8 @@
    From df3f8e256431fa95498062158f5891bc24836d80 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 11 Apr 2016 23:34:28 +0300 Subject: [PATCH 083/936] Fix index --- resources/view/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index 899c520..2a65367 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -20,8 +20,8 @@ From 724e6aa658ebf422078c1a5d8362893f1d249cca Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 12 Apr 2016 12:28:09 +0300 Subject: [PATCH 084/936] Update test --- config/nginx.conf.conf | 2 +- resources/vacation/test.html | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/config/nginx.conf.conf b/config/nginx.conf.conf index 9c8f2ce..83ae10b 100644 --- a/config/nginx.conf.conf +++ b/config/nginx.conf.conf @@ -44,7 +44,7 @@ http { location / { expires 0m; proxy_pass http://localhost:8080; - proxy_connect_timeout 10s; + proxy_connect_timeout 30s; } } } \ No newline at end of file diff --git a/resources/vacation/test.html b/resources/vacation/test.html index b9909be..646af0e 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -34,7 +34,9 @@

    Темы тестового собеседования:

  • принципов ООП;
  • объектной модели Java
  • фреймворка коллекций
  • -
  • JMM и принципов многопоточности в Java
  • +
  • принципов работы ORM
  • +
  • JMM и принципов многопоточности в Java (happened-before, CAS)
  • +
  • транзакционности: ACID, уровни изоляции
  • Желательно: Stream API, ковариантность, дженерики. From 772764bd1ab8505eb7548d9a0a259ceb17a63635 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 12 Apr 2016 18:13:22 +0300 Subject: [PATCH 085/936] Add basejava lesson 5 start template --- resources/mails/basejava/lesson05_start.html | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 resources/mails/basejava/lesson05_start.html diff --git a/resources/mails/basejava/lesson05_start.html b/resources/mails/basejava/lesson05_start.html new file mode 100644 index 0000000..49f629c --- /dev/null +++ b/resources/mails/basejava/lesson05_start.html @@ -0,0 +1,21 @@ + + + + Пятое занятие проекта: сегодня в 21.00 GMT+3 + + +

    + Здравствуй firstName! +

    +Добавил в сегодняшнее пятое занятие видео с теорией по коллекциям.
    +Оно идет 1 час, 10 мин, посмотрите пожалуйста перед вебинаром, чтобы можно было задать вопросы. Вебинар начнем попозже - с 21.00 до 23.00. +

    + До встречи в комнате вебинаре Adobe в 21.00
    + Григорий Кислин
    + skype: grigory.kislin +

    +

    + Java Online Projects +

    + + \ No newline at end of file From d8f799c98e31937d7000ee83a7d551027d9bc918 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 13 Apr 2016 19:30:30 +0300 Subject: [PATCH 086/936] Add story7 --- resources/static/img/portrait/DKorolev.png | Bin 0 -> 78694 bytes resources/story.html | 3 + resources/story/story7.html | 85 +++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 resources/static/img/portrait/DKorolev.png create mode 100644 resources/story/story7.html diff --git a/resources/static/img/portrait/DKorolev.png b/resources/static/img/portrait/DKorolev.png new file mode 100644 index 0000000000000000000000000000000000000000..0bbcb79ad8a599afc22baa42fa54afe76419c3e0 GIT binary patch literal 78694 zcmV)iK%&2iP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D|D{PpK~#8Nto?bc zZCQTbhn;Dkea1Vzv0hbmR}bvw&}>m6WyzKmOE9G9k0cIa8v*Qp0wggMSytd6FknXs zf(S-n1W6FUh%(xSWy^{ziUcf$V0pySlrox~4bY`OJGb=j8MGt#j{t zRrOvqDSO>>_t|^xHT>4^_g%kX?cp@*x@@&NjYeZrt;>2**HyFC>gIXY$s3J!v&oqc zr_E-wUf0EHF`HdpUQQZ~ZCy7elgq~sAHH+{TUDNY{wM#!=Rf)5hr>MUcUp~YGg{eh z8+@nFrm<-?TdB2eqtV)!xjVcn_Cr%DnYQV$MQ1eE_;B^jRr}Y4Q@TD(1?tU*3;aP- z-Ke+gd0C%N7VkZJ{|7(#?&x3~*KD?`avnG4*nj2Tz1uf#9*p;Tc?ZU|WK`o>a@LzhRj(ICaWTC-KfPEKRkPV?wc6|L zcDva?{Cd4vF6y#cO(tijXOEsdd3!!xY}Slxi_99Ebw0=sZ{E3e=aYv=FCXk5_J-YN z)@pCIgHH3#(cb=`H_SSX=B6kXi{+$7uFZCH)7-W;O_`%8*^;WNn$4$=kKcOhjjz4) z{dd=mtSF1wteh>U&Fz}c-uP%Z++Qpgrx)kv=ck*h%=5v$d#~(|#+&9E{M7ZD5v2y% zVHA7=trk+eN}S@*ZIp?0C1a_$N^#=DDPY%X!SZO4QsmH$snuE6Raq=y3T%rOc8yRe z9kIE_=zpD*8hjR29A1B(J-pseRjxnRb@`UGe>#kkVlFbMX1m2-)^Xa?Dol@Nw;MpT zVKOV6s$L-^1QocFNfct@dv;w5w@AUd7bYe$e>D4a2v>W4IXWA;4?)7FJKzoY# z)L{Bfh)TmJaR|rUaZHgMgfu5=60NcOyyU4sX5h_o9Pr=ibT7^O6BZ0}_ZH*x98` zq}J#yARUD58ut`U&>;H`H6_nzHDfH4{t#UsOqLCPpg&^>$|cKavWsP@*2`LTs=6Ru zkCv_ze-brpNjplPNfbyWQ}sW1O0{A_?hdcFAD`wPguHbGpSRdEUGC+=8mFg(lr}{X&_PV#ZjtdcTN=RMcu0%M8#Po1aZM5c9j}J z3?)hl^k2egYLIFnVG_r-Wn!O>b_Z4x1NbXRo02dk^g}N}3x)YcBT|pDqD|dp>w@yx zIly56DFzdjQ%7l^tz%{HX>u6QYX`fWk0hz57=JPAB1bz88?r2CR^p|UHGWhY;ztzf zGl%r9`tbY1-Ni6=-2a0oC}Dtd_Ya@`a6LVfsF-+yU^^IntbV7%VT_8C4n-7hE8q%3 z5M-~{AB=|GUKb@4LJ?{e22R!oT7o&Y96Qm^F41y=pXr%Bztj21ff)2@r=2k$oIPrl zRMJEdT2+Q=KZwu*nVE2ETi0E4Brz#Bwcn!AZo8FX_Nh${l#_|k;5?>*%5CQYC23#1 zg}Ff5x_q`TF0UI*9a%bZ02VpyC%j&1o=BX(qJnB^?>Q;ew0F%)YE+h>MB1$`)1sl-gsT70wm{F(n zOeNE9CxptM96@%WP|4|c*DFB4=>Krh&NrLF!uhjlkifA&8olcti zzwC$@Owk8;@-$K3uTB!#^WLD}9d~nr5COqST~iVTDQeD6BiMpF*CbvIO#ZVmMW$8h))U&$ z(C(cUeFu`Hmne^a-~j^=4s3@&>2I`A;?OC>Z4ZpJg$dmfcbS5wNC^Ofg&CI(+8MCJ z3vZP5YO^j-Qk3hox;6|?IF}ILK+iHj+et$apRE=-P9=$;dpcJj>vctT4e8P;P)I?C zBaP&qRK?Ii_ zh@M-J7*zf@lWc9*Mf4RJF_0gUqO9dMEkEo+qiR2$Z8kcXS&S@`HZtY!)|DyIAZ(Is zusN~|dzp8;p)~-a3iaBjk4{1qX^#>%?^oK1(>oj|(gUMbh>G$P5eF5V31vj4`|Pj_ z=cAR#;Lmj{d2L(L8xstgEy@l`<;oDJ1l0@zeVXC90Nl;Gv$F~n-iu_UV!8!c1CBJ+ zosb)GH=R7CnPj{bfVdtJ?TfA8xE+%lCnOsB(@3sUI{TqSyJ-vQR6N zBM0s#7Em3_f}O{vhnb7`Rt$($ps*xs&-Y8)Y_RsTY-aUKYI88qse-v zJ2W%SDMQF%g9Xvaovf90qy07Aw$Q3#q@#F6f^!i^o!Zo=kt=g=Yn2GAQb(&%I~79fd`t?0(=>j5N(Gc~ zeB@?qud7`1?w>mSK^mY8ob zeHcWQ2K$O%_Y{yiD*vd9NTTUbIaagob5dfEiSkepATV&*W$I+vOq^2OsWA>P1(xQJ zj+smn$%ZV8BDuIWU_(*G>M`y}$$~QBDB13~YD@;Yli8>AjT)(<8)|!Lo)B8u#x6P3 zP^j#(P5Zl@=#rk;hqY|4=9DwgGlA}c1aU8Y&! z#&73&TFgZKs`KM4$F#yE@@jysL`Q6+5e_L5+0IFgewJ`o#u@nM%^hG)T8*rlt{lNlx^K2gt;FH91u9JOdlH2U{|hX1gil&%ip!!GC9bX}OwRf0c6wsL6=4pmb9ErfL(5x?Q{8Z@jP3bxHt2YhlczpGeWCJLHg{A#I^3&Ntfs>%aQ%F$w@i znV=QC>s6$g^6UsdlsL79tLv&*6^sxjW3bqt&Q2G_e02EIjT`p{y+P(G)eZzNYKj!{ zd&>9cm3*r3RN?6$jgQ?wL$MIxZ`1y0Hi2pv+42q`AJnFpccvrGS?e`u?E1sybn#Q zvMiTNYz5KOa4_igdkSsa1Zq2~Vye)Oym3vMgq#Gb74> zAjvn>I!s;@)~}$6!EEZyvY1V#ljVHc-`hVtdToC&=wt+gg57aN#ni&{5@cL)^CQLV zaCdTd))qs2{}dm`X*+4eHfWo+xCI+sFLv5dRji?@+ipyz%Wr?{^h=w8i>vTQUuAW!J1ew8)q3Z>U^#O#$EkQbDo{SX7-oBv8-u?8%cy zRZ%SFXqU_RYJN63LnRsDlXrPGKRbT^?bnOh$$M{p=iN8IJMQKCz1|iqO)p_#U9NIK zni+wN#-kqoUAF_Nh*K9qph`B%2W5#8LjNvN>_yQ88bSp*DK}=)I4C!{!r-ymo?{qsY`w?}Zy_a={d7j4=D?n3MCAM4j5xtYbW~T#@w5~Vk z$?5du;`~XmB3y1PSJeu_$`#QAu@o}_#|UK#HEC5C1KUT7d+jYS$XBS(0Deeky9w*X zzIl>PDpoU8N5|XtoG2TNc)0+oIGIdpv^1JLHTR(eJ1`2XVm_T*%x80|7e#$BIluqj zoA)36pnvDpAN`4c@wIy|j|b`nnxJhb?hBF=l`n&1Q_3X81lC3Qn7SX67*ULLcX*x5 zr&-lZd$}lo?(h8F-}=&Tec^MTTdfwq^R?f6^ZVa%3D7&z+TFZ$G#cy;dsR`PzE;}W z^5&fz2Zx8nYVl*A|IydK{rbblk5A9ekS|(9Rnu%?*FX~B>vgfn4dSXVeBmdLk00e( zHkr=fd;k7u@9>pReg^(rTwLVC{>9`Hy>RQ!?VtWr|J-MP{3q|-`P8sK&T~bQP{d7ugiub6O8>eC{hUoB`scg9SQ6cXV6r=SCmhe4liUC~ax7uWOy6JXr z-umR>_#nsVJ6R~dvpX+J;?R|o55X~}+Q(M>Xo`{U5_O+FB+;1W#IIJpZajSOgvj*n zt)rj)TmSEGeEmyL9=*3%Opb0HmNg;G;%ENo7jGUNEEkI>XXj5&&cS0dOn@L_5JUC{i|R8!jFA^v#xO> z|Ky+i>6h-_7>zrB{HOlN(P)2ixqSE0#e0v=A5CVfX6NAUE4|@O^7R}UVaz4!R| z^nBWAWw_^vO(lU;s&clRBjn*|3`juL>G{RwVmd2lmy63zPT_T@*PO13i`lAJH%9wM zgV8~wlbt?#^4q`ikN?yE+yD80`|te4fBnDz=l-QX`!D>j{>s1m=J(%^TmMXsC%75R z^y@0$Q(^k#v_lLl&mc)j3<<@tLAKhcoktrRP!VUzr&-%d4afGnmvk8Y#g}V4T3ywd zEl@o=f)x-WLFhu4R>R?KG=XeY#X|E{BHwY*eQK=`{-8CLP=Z0gmQs&2{ z=tN>@WfOA8c6k*LY9vRk{uE?Cq`~K${GkLSN_U@hNV;aGiJWvQj!5iSpxUmB`tVQ?U|f`La?dVIfCu7>!N18lWHEot&AdvQwVT|-# zeFoAySm{Ad&G8?Dv(*T3{jPu~6hXrxVRT{kyH13C%Hym>k9ZL_f^{ss;6QAs~5K7|rc zVJz(yjLe&zcs!|{Ls6qctFCL3TFrH*?aIFkK4P+V0Rd;4n7di8A*02P5iOxUt_GhB z+vG@~S|trZ?Z4`}sn8PaB(K=1v!PS8#pUJz!H2ODxv&SVNvyw$aT#Oc*v$wqtJUc6 zrK6j#5>>h+<bCTSEQas~|ityXp-ki+- zT%>jlac;T+Z;v=wUW#c2=Y5LZcBT#k|I6jPT2}-@ z{T_@R(v~{ZLAy;|P?9ZhNnT0-!gE(Jb>T^vTFDz(e4I+bU}knr>qe>18=Eh%(Nj5iJFh5H0s#-aDf-pFmWo{+#S9s*)B;GxYU8M zc=reI{`PPDlLzm-_47abH}?juv*QQjLI33Z^qb%K{h#@nKOu)u0(Il;^5XuZM{p6+ z2?*$i@#1LRd->kYn>W#9=jRu7Rio4%J$g*7E)j!QuD7MDh>fh1G2J^^-tF~q)nkr$ ze>4C^{OnUe9(#k4C%duO4o1tO5*+DKNNkKmdRslv%E(PLxW!X3X#IpS~NTu2x50v z^Vzf`I+}*beA5#<-X7HKG8O}0h-IvyRa_2xL86Oj%%&pa50|cF<38JG53iF>4%qXy z%0|5^{`3F%|M{E0_Dk=*`R&7l{`BH>)F0*DQJ#(e*iZlT1%oV@#kcTOIkJbHBe{)0!Q58Q1Q%LSn>Dr7tw_4@sy zCfl2yU}90SU-_7nV%`8vwJm^N*Ozz(s}j-9W(zM!aeCXBFIRYrr~zb%HEOqVDsGyq zEU)LQ`MO>;^8UKrIez%gfB1j;Ywx}N2H>LrDRI%r$u$7^so{)!N0F9ZpTbvqI(53b zt}!90qQoAc_m>PsekIQ`1d?Q(w$G%vZN+F*b%y^zrQNK<17w(23s~Yp=N_x?-B0vo zWxZJIrnbmWJETAzw1V9o1-q+K&lXCU6TE3OFGx0Ek_L#2g6u>LmE{betQH7Hq(@3s zUf3MOiLeixhr$>4ze}mibumW$>{zZ7R(`wodLXX;x4!!2hwpsv{U7{(u{b{%4f=!8 zbY8yo?t_;;@oDtQSHJev%h_TwnKQe_d*eHI?&O_rznf1lri=NKu=e=m?7QFl-togn zC#Pp8=jYS8Yb`F4vMs$xxL7RKsMu{|+#j^IUem9Zi{_?^2*N8p;0NCdqE{t~r$VlE zaGQ|0T5snI{Z}x6p2jzGn%4_7i!1(=Y&HqNRyB@WXWQxHJ)b^)`~UiX`45Wu0#O7X zl!_Qqz8r|9wC3Sa8y6k^gn{t9zK}53Y+PByTk#W-C#8BOhovo#Id;;a0takJJabF{YI4-9t{NjE_ka zbo9Xl2L>PTs)&l4&AKeGC0MK=C?y^8=O!94(2KOox=PQ@e43=z&qtF?ikTLiX>?l6 z%Zuq-KX~gG|H04y*k@n+{AWLf9fHNnqWZ!8_t0-|z5Rpt@1J!02kmZqun#i(-A*>h zyZd`%P>zqSYYD72Yb+c=J0Ux2Z{5IvAeStt5Gc5|Y`ismT_5c4GZ99Ed^Et&;g)r9 zfd;*7G$gZ^bvsx;xJMn@VWKh)^bS!59K~TR%K|Ng7`+Q1Cg8T-pf?#(d%f&=Co2x_ z`u#V)``(*xPzpp-QL)I8B#?ku9B~F_;2GPHg~U*-yUIfN4?vk|J|04Ef!_qxV5fUxhQc`;!5H1;ujkdw&<+gY2tr#*eJ_+=^Z~btmqgtt{UsI9|QIdk7kqRjc_^t<1G+n2XcF8+96YX){V?y93 zQ3wf!!)AQWn5ufqY`}>kc!q;YJMI}pC8Gk0ssQM)wkl@7^!I(US7}zT z0SRXXlsBWTb`Jea#)7*{?IKWU4SR(!m`)MV@7^AcxWD3C(haj%03XlIxw6c8Z<`Ma9WZ{R8g5fpve`!gwJ?hdXJ zlMT;Lix6jN00Mw3UOKX=>L%*$JHPYW|KMl;vw!sSf9s8JeQkbu^7cFL{G(t0&6DZ! z{)0!8Dd4Hk&M!|cCfio~$??g2zQBIN9U7v+ljGx3+g>rLgDdc33#Ji)Y>&H)AqvmZ zdx|mi1jR%WZOuvvyw>aaY6Y_NLn)2$n$2o!J~`qKL^RN{Mw!H$UgPxMNRpsOn69=* z5LV&BW*x-N%!i=b%aV1s+l|}L8hoR9fAtrB?w5Z4zihTu7OOe#EEERSp-14|4i?B` zw}}+!p_o{9xi^$~u#~Fl4$lzF4xl#pYzi&qO{ZNSHBqtR0OQc|)j$}kD(p99(^ zso88fD6|6;JJI`71I0d>J2;b4AyQPkCdDcFF^QQZ55hQDOP+{Y^58A8Lzu5COMl(! z3litW+A~C7CyqYEAPaAs)f$wb1L8V@o*U{1j^OdNPaZz{_Se4h^vg-k08pZ*X+3269EmChre0^o3F2W?7arPL)RV0b7~XYyTx)Wy`D2tr;7 z7cx2WOqPml@S(gmMhfNyK^6$A5NoQHGGj+5x7$9}6)vdx6r%&MMjzq~bb?g9U{yN# zS_|N3;T;Xv4W>kkX(#1Bh3T`2Q;Do+oPiHFM7rW+Ak~@TMGa_XCS~m|3ZW<#p)Z~$ zYNT<#C^-yx^pU=vo50PgSf89s=pMDTn%CvBSYA%*)#CTQ_T}IB#lQE)H@{p=PqPkl z)Sv_l4)CyyRk>U&muKe}M7AZdURliM-X+=Z4Xyw`Z{uHhLx8>57y zmS#LV4m}e4DTm-m_yrp&rzoO)EZ1vd*+&fYLagT9x=s~bRTm+tg~vpZ)L<}-23nNS zN`MJHK|?O$Go~73LI>KEzHoFu``Ro2`Ty(xQ4~v{jbWp5hz3g9I+3<4d#_caT`zsGv!jy>`1m0^pO&wFG|;B(-73j(P+{oG9zE20k6tLU#3*} zdgle{`Df`XRiwF;;}qI9@~nG$eDZ7m_{*ro*~P{5`1F_l&VTZM{A+*p@BYpI==;C> z8xP+2*0!zuiJ9Mf@4=Jfv(xh#0wgY_1(@QEYJx_6L$Cq${eF)eEHG)dm}6U+fnly< zJsD>)2)M>*5X?7WZY#@jKE6mRR@50cg{XuanYwI)PbSg8G|1Y+!GMziyLGYNFl)9= zS5={hejT#zsePe4nMgJp^B721Rmm=RB}6I9HBRs2C--0f##bM_^VYmx;0x_05X7^& z;ynM+YD&N}vfyicD=r%4(2`EZhLNs)Xsd5Zoh6wIWp*1B9*tKzNi{NBas!|#0KtN-Zd|3BaOt$+N3 z?|+NK>E)BMTD|$+d$U#5&U)`YdeZKVTHW3T%boXQLTi7p+K3;sTdr$#>iNY)4-vPT zct>}!f*OVZe}iWdM&Hmvq{yHl75h$kz(hN2Fn`{_2C&y_uo;BzM&u4*K|Ex_ak(ln zjZ6wO4bvp@Fy$p*oh-xd3Ye5@N+Z{NvZWgCo0WZ}WZmg?*L68xUS_TOm;b>pj1Tsi zBX*~VtQmZb6!VQSC6Yo>!3ybROYEucGlI5xn8eTXvo%~KTFF;6X&9p=awQa@MJ5KmWJ?)8F`&zyF=D{mRMd2@H91anw!O9 z3Ib-!WmV}E;x8h3DKtRwwvl)wblr~mSHUkLF&#uYg=Oq2dYE36E7@)IdZlV4(tD!d z8&;6G0?z?W=$umY4vJB*Pt(9!C8-4a+nh=;(69q-MCxE_IqyKo>SOo7!h9 z#G}{r35=R{CET;T6p+Zg&VO!7#VD;pSA52EGNE`_1n55Qtak}a^4nB~` zqdU$kQxYL{r?oDYtFuR^@4xl#_rLw(^MJ*?T}-PseDu8DkPH1u=wG>$@!| z(k^2VsVL}EznapZN3@ceqzs%mBaRt(6bO>(jt*mE zO9u&$>$Peuu$-zh+sKXKuu}B+|m^$rR8h9H2}LY zN58NeCI>?pzGuS8vU~U&vXCg@8EXhY8E7UXNnwbIHqp(vsx%bMLO7~d?Tb#=uZWeQ( zCY<`J1g1tSsSTP!UO%KoQn2LNV$=%II6`J7{9LY<$B*8dp1gDV5B@)JPhW=UC{LE;yU^Ipw`gOz4LC z*ku*ESL0e95-ApgQk;oU0J~n}@p?arOxfr{P?Qp$j*@IaXE+||P&rdu`Rd`RjngUR z5PaYexsb!5!AlGJE$t!9_pWlB)DkNJWEYe3lPB*H+<6^a?>T5?yVDm51~kjYE@BP> z3x?AUo3COK27=1Dah?DyLD2J3YC4i!RX=ISU>{*{XM-{+<2g1` z5YX0tH(j;-oFp4xoYwVrF<-Gm05m;2IeGBrVm_G{B`S`QgHEFjEoq}Ds;rx@isII- zTjZ?tK-Nf63)ShApih@nkac}rUDK`ELa1St;#4Gn>;2{=6cr-(Y!^=et+lREqf~@@ z082L1+U$5ds09q$nRit(AjAdlZ6es~@PlQE5A@-VfP+m+fy2lV=k^@is3<6ns`z5+ z5Us{)Ln`AdcGjEmXn)x6J-p8ZK7NYJs2*N`#wyCksU-TKirkol$+Jvd0z&9ayB|&r z*R9apDJEySh2;bdBN4Wgv9*|r5+8?*E_oBz7>!~k_G9c)V`0B-6tiM$a0mWWY61)o zB3Rg!y=aDBoRCu|6u+@!bL*RU`E)ut6LV87fCEGkGt;AH$=S(QQ1|@A>}kWmD6>Pe z)RXUP2biPvV&!|?Hj~Mt$0x_9mxKz7`E;dPY>xUFOmF!jgZ5%JI~a}j2L1VbIa?H2 z*00NzuY4pH?RN5BF5}cq+dS@utcidn-V5vWAIwo~s2kLu64*4E1errcJk2~VcXiMl z-d=vy1IT^G0+kc(&Ig#+X+`}ty? zAax{@6gHuzE48YzO}pN6XM4RT!% zMpSVFDheb6B@{uQ&>*eFsGSuKBocMgz7^mFfbuz%tCSpProJnHs2!sPnumQ53#)g< zKAND5vmw&h)!~b<17WN4ynoUDgDyC;tM;)eW?)J?3Q?jER`ST%qCgD2tAC>B z<7h+0I1s0D;zDRU4_u;Qn86mBg+DSkMxV@dqly0;3oR;A=R%lLn1YD;vpLu;Uqa*{ z(`!aDhc3KT$+>Ea&|vHt;MG?oOMdukA(~`qg&qK`TOjS=O-!#}krGZ)AM=EY*MDvRc7w)p*T{5B5Q z6ot857S(z-Uv}DE?A>fWC#FJ0z4{67x(9p@A3vD{XuJT*Jlt$9XA=enJjEs zmJ8CgC=m(KX#yy_DIc`4Lt@59j$?vFPG}}zVq#*w!bK&c0|CNzU3!U?)|meE1;}9u z6PfCE;fMi^!VIO0M4cPaFA($DN&4${GGRpvX1knXRml|ay)GkW9@<{DnvRE~lk@rb z@CZTBZcqdiP;$7B41=x%i!o6!1KPm`v}G=B+I&nR+ji_RHQnKmd^?RZkb6~tQ9+R} z`+*^3qzUQ52;;IB>Y%Nup&ef{jJN@eS~Q;8jAk4)`Durgc6JB!Pop6qpVF$TWwBbW znP4VhdX1UqB$=x?gK27CJ42989j(}ssTy=}I`}2#BxP6sqlq(5=MTLre+JKlKRv!Y zJvqBPzrb;R=gsde7pn@Dzuxo*17nu$_U7%|=v`dT8;1vb!@**{I6XgK*6Yc+O(R6YfQVg`V5Q;+P5 zWD5>e<|J)o*Ab-R^Q&Jen!<~CLX8~`A;`<~sk#E(#?2$H5UVfXA2u-VeTLh#;H1Dv zyIRg3HTrp3LqE&7G<@Vu1=31&d$y!rw_mUrC%M74xc=Ea(+3(*<&70XERE_ z{r208`NqNi~!YTJTwUSC{I&~i|hkmRXflZ zlrA@>EY6A=X*J;M5u%06I7w+0Db?{J+dg>RKe+P~fApXI+>d<$D1;^!W*9h?Wr!(8 zC#*4;&Ro7?j-h(n9SnEJV<99}jza==ftuqAB^O6AaZFGRUwi2$n9%f)CUfDQbTeD1 z6Z%VrIZsT`W&1SgcGq$==ziKdd+o~Pyr&vk0hr>a#l4RRBLQ(o;ztshJIT>D?wJG_ z=}TkW9o??h1p#%CL}?4}YCgX~^4(G@$Y$cpWQNA{SuGZ?fAjag{H0%h=gr^$+E;$_ zD_{BTi^~}h^sdddG2eK+Hy)4g-o51uyxJ;4to&?IEeglteTB%S(p=ECIqFvVhy|iY z$hK=q)WkzTkYFa%GU+%YZe@GYnyOytb`cT{LVA$*R z`=9*$kFS=Kum0*UpFMc*$?3z#lS}3V!OHQIClqCZ4F+92wBxgrd9^v4&geTLq#9+c zBNibXMhM=}j|=TSS_u1GC_`yNGE)`WQ6{KJV~HKdb_vSCJCGGrNFO=q*ii;Rpwrb^ zw1I<`;UUlmTLq!SiM8n?&(Y;Ig<2hrYqvvu4D7aj0uZDulp88NFLc31$dDs2Q;q0- z^7;todm)#p32AePngM)V5H7y5Qx;RE;j+UAv5JLfo(#BC47Iw3+Bq9aaS^b*6 zXA%_?+CmRRAR_*>REbV++cDVJZU!hUOgkTK>S>~^r`1*-!syv_d2)O@nay5%?bVlV z+?rfWpFDc>)?05*CJQ1YlmRv99#!WP;^lg}D2`7rri&HR)oUwK-t-rkP<{ZwL6H~P zPC(}&V`U7`DQ|ZvUHDPYF&@sN0;$8mLe7eLZ4oiyky0|ZFgj{O4j~p0qAocYSZHBN zFf+-A`{3p5@q0h`?(ZzlAH4bfZ=64Ve~Y0Ip=>nzS*MrfgKl?71GH4v%;Gt|sp})z zAoGo+-B!ojTg3t5LS!*CxTN@YI|{}vDxI;1V&NapD$BbRfj5AG>dYTl$|0>ZZJvtJl=3@Y| zJB`H+AGsEMOjOAPV;%6JuPHyFAskKW#bp9DNH@#yF4(FxnX<|SA;FEh7mt;SzgBbL zbES<@uRG|r`(5a4@fi;oNrSWFe)qtiWNr>~jB#Tul-qm`M}xyrZ-0;t^VY5X{_UgD z!7$$+^{Ij;W-hi|o-WQ$-u~S$f2mO|w22`=Gj=ixiquXpQ-N}TEI6V04ljYT zG-8L*TogACAXzKv6Dk8X`oXpihr@mkikVvkhPCcfsvO&oCc6zXcNB0X{)mO44Te!h3!Eq}|H1F0Lx=kx#;KpnIew9Kjfa(^P5fn3cA&m2XfM z`qk>;6?yGP>kRnCZ4;9{9Q1pHHd%*#n2TP?x=f-@uZL~k4*M#a8wcZYuiNXi_6GU> zuzNJ>y>#>7&W-)MH}`KHjqV=p-8vW@?GJ7rjc@GrZtf3`M%}xyfA?T`W3PWS?!9z0 zzH`IR?Ze?~_io+2x%bkI@h4uo@$&71+c)3sF z1H`q@a##34@tY2Vp07KRRyog9j7g|GH2UBKJ~;dkP-0Gk1Pnt_2xM8($v8~s`Jkj= zn&qOdU84o9AEs$%H$&X2W}#1_eCBe5Bt$=YEq;kHfQ6rg-oXyFA$WkpPBVzs4qpt@ zNP$z6Gc4_>P_ba!2J_V?OsP%-;&V40UzF^}K{^IvpXqddd2#;u;e+|)^!__)N`l@}M6*p20qsHt3UasKq^nQ^ElfL@e^tcs-2!tB$ROmvdDNoQdK z=QAS}WVwMszJMP~tsO@W{(^A)+&!^NyYKB*?Ouj11ce>IjGF4_*`VJAm;G*g(CeW8 z_C~$EQU1!UBXD*&?yCY1NB3?W-Me*oW7NNU2oMLi_J=q2hj(ut-Wd09?hik4_r{&0 z@vAQ#-8vi`4)U7^!<&0l9NgIN-yHY%^3F>)4vt3oox||~i0^j+@!ebFyLXP5zC`PT z!BMN7W7Tkhf}aY}yGrz7*#MG~U3}1(qpCVSr77sD6@owcA#-rRUuCBMMK_|6AR4|W2r*}PBgDZwHLe~ zMbPz4FwIU}7Qtkp!099qCcbvWJvXIssC!~%KK8NsUh}I;bejZu$8FN+0g>k>=;dUb z_NitZOBCkAhwnXn|LwhgZ$7W~j&7b$C#`i>tTu*Q~vN!{S)?lN2glvp8IE`f+nMe8LYeH97zrv?}K6a<;5i48_r+lIphZyRTYV)b$b{5QO&nP`^k2aI%dm z1QAA#Y6{)T&}m6m!o3jOQ`vEpqfqc@m=q;q?yn8=j}8w%``V`t_lMv9=2zZ)EH)^#ihCvdTyi(+07HpR`US+|EC?e|BReShvR z#E+W?S5zy(v;;N55%S|G;qp3pMy*7`_r=oS^$K?+0}x;fDSS|Q3#8DhG;RpRR-{G{ zwgX=hzCmp)r0jB%sFV;WL^`cz-C>fcn!OU%Y4y-1&`pCoDxa5Ph9EWwrBQLf9^AvA z0BS&$zo53)<)YH+J8PV#AD=)_5W_B3B&Uw-$E*B`z6Rn+=2UxUAMySzx~Q$HTHN7^W8&*;8-PWpU|aXvzNf^?Eb%xBAzIJ(y=+i~`-6Nu%#RL+ z+x7BbfI)4e|KdaWEnyQ=AKxH;5JF!~PuE*s*M#jvS?%_kz$)*yz0STSx`&XBo@JBB z%!N&2+YBIfe3}RMKgL%z8kN6#j*3~YUOF1BSM&K~ns*O7y}`OFfIuwduVGuUniQ)k z`?xk4Az41idfj#xE~v#|1N|A0Xlv5UD$SY% z7C{hT^XxUdX`YF*BHMG?vVTMFp2Be@Jd<;w@ zQQ7JZ?-eJ-3_a(Mgb?n^g%o$c|v@6i6`bT*&QW0u!A zVOVuE(j{)`WCmLaSr7y)&U3UKu8XD|r-g={K#t9=SdHm|JV=aNrZlx!`uN86h^tkt zYhQ1O9q)GfE*AJe0!}9(IXBKZy_rDWXiGbD6^a|D{b zc@pJ>Pgpr$*WjDOiXf9N0c#SAE?uLU_j`~Q#Czc?$J2CGAD^Uh*#}4>pjIm5X*j%^+)k>XY}@)nc()>>u64g$sSwSbIYeB&VP1RF$Clu=QGMS8Qc}k`NT@ z>RBnk3g?)(j=}T6LyKMKB)Wl$Z%EM2FdVd%BZ5q3kpvi{GpiULl*3nFe*zg43hlO& z5zVn>gY1NV5=ZnQbxDd^I2ww?7~-OWkyn(mt>-4H&@vww6-TN=wP{>6sfrb|SilI5 z)YSFxK9KZljT7le?ofZ6_wF6;fBPF>>*ehSkB$v#P&+k&4!q5x__kcGHf4Qzc0M^f zUoGZ!wHl2Ev{1vH^%?=NkJk~++HsH@_vflM3`gY?gHKnbU<&3aZXOfp0L33QB#^?U z6AuwGHFL(aH8PFf_HsqwLDQffz6Uk}eux_f)ymIHpLBCkcQRC3HE^GKH2Nb-~zWPm9 z&1#Au{^f}7diZ%_M49N%MZQGvaetTC-AO-W=jGNci!fTmCmk$V!q0z>0F|u~S!wOW zw@0>Wzp1oav5OwEbHNl1*+9}M37Yf)%i8(kuN`LXY>lDvy%G%E zNyFC8u2TRssAsB0hP=i!sL0-Y^Lr2Ozo&ml9NOvLymgBJ7LQXdZ}8Qy?7mOb3#t7+ zT~Hegth{3nS<*Bu*(inSf_@nWya7yc#|3IH10Q%(P*oHzS}}eKit5bY%$C*5xdV0#b#(Z~udPQbRi+oWa+X53y)M8CKkREb8!Ky$)H`t9dn>eCFkwE<4c4 zdbQS~l(yk5=fQTOsGY(Rkn&2(*vKWcijWSO#VYd-3}T1Eky4Ia4H&{X^uCruuJacN zG89%j#EKE91j=xQ2}V9{9X&7t!|v;*R1mHk`ezk+B58KU)+Tp-M^;P-GTFxA3sY2# zvQa!Tq!FMReGp^9Acm|Ju^W5a^}6dx@}$rc0tH5t^<*-6aQx&)e&X}^Pmdp+K7Rb@ z`0Vldt zG@=&2_GSpmz)a>G^SA-ikqb%@p|S6ve8CBtcspOr2n`X)a5O4bOB`?@sV27hV4^+R z6}-S_W8#wm8JHV8LnirU6sgHXwrkmQsa*^ zqE_-4tTUuw2nu^!t(KR^1a`1rkkmDWC@VPRg=~RZM~e^;O7O?T5o1m!)G?56n~Y_5 zdbdNR-AXTU-WHEKj= zUsAiH)pE8=H^7H7Dynqqxhc9yIK`2mymKp{+QkNy>sjF?ee$7z0-_{UBnI^t4=J4b zjD{$LT(aKa)1UqP+i%~WESGzSHxBj>d)WZbiV0g5KD*NE4Kt#MZtv1}j+UT^+NYP( zWm(3(#I)gn5g^7IO{7d2Ea=dm6RHGUoTwB@x)#5a7VaNzHF^QdPLx8JY*>WyuB-42 z6t1s0cipZz$k=c7+8J;e_4=TqS#NwnlsyEdLUS;wXnMISaYO(TA`p{xi6-%9O;BC+ zmdQrb%!*F#W7B$WUgH3(H6r)-z;qJ8Z==`B864EROz$&LxOf{M5DB5DVOJLqn~&da zHhWBsR;#2i0h^OAA~XIFE$Vmo`bk`ZR#Q$jy^BRn3I#w$q|%(cRa{p_?<%>l<4uvu z&jqJWyN4~1N81WEqdjG4+;_?dz3EUk6PR~&%$cTS#A8ly3yZ^8key&{BAsZLPWcbH zNQhstYQ#47ual}!YCbkWr|6?0n-Y#Brxf!531Qygr1LXj+C+=gO5H_0Q=Dmfg|V(5 zy#MGEpZU={_dbcF%5quw!w0M3aHzvZ%bnJ$Bw!laxY+l0Av^?BRfMkaLdt2)f2XfE z(UGDHYM2muuppGVVYzMte8Mha!9AxYYZ>Tc9y*!&(s{oHwadj~IP?de0Tw2w+wDv) zE~;ud8WO{4Q2C%`ZQ1oNoZSsZngoSlz<pq6p@1Ykgq2c^YnMWF;hV;_;w0JtgXL6)sm!im=m=+@ivS#uN2%0J zK*CB4L~0q-bx)p6Nm8#;%p<=erMwp<3eq=SrlYWRK*?t{(|h=3#77dfKH9i_64tbv zuYU3qk4~mP^7)_4ksqOMbK4*G(MQwCl<)+D&GZ3$fQca?AiPqlvm+~j4}TnA@mliG z(_xqGCdLJ?*ebGi3-`&oR&pAv74#E*bUNCTSY(JsaKdl4{!WYjC|GiZb)}cw83SB2 zA}HpI$%D4W>&57`8bD1_Lb;_eGmZVZ4>~m%UV}V@rxNll>?*1}UVPr`b`8234VRP3 zYPkfXDLQPS0_vjf_*+bZi^Krg#K{p^l60IKYm$60Ma+jWFe+L5rc&*xMb5 zWY5BXo25{c+ojmQKC~;o%zCEGa}yK?(Q11N2OhjhK%IwcQJ0v@-6XcPsB@JPdUgkq zQdm_MpKKvP+$QeN!5>2>H3=6Iuacv*g42ZAp_fw zvoe~BWF`$tuVf`{#0RqQMm1H=a?bitIMop{;SYLnZ!|>B+5fh&S}Z|f*UOJS{j9}C zd1JY%%8PlbC>Ifv3?SNm>$UehtTe}+t-t++Hez;E%W{qSBM7X(<+>=U)e2~?X46Hz z+SVn$f}_yA#h;2-{lFp!PYDnNQt)oJ+hSRrKH8(VaMN*t2?Q0VLWL5VF{FQDOU2IsQj3CE*EK|vtJaE$~uhkH}XaoU(aA=Y9 zP<`EW>MLo!r-?#R5h)!*PqfUSt}vV)81{o`)G0)^T|=rDkR<`0O*M8YHEZk7 zv=0g}v-j@3(rd53`lVkP4g0;(pmJSBTS1$!yj-n-MZecaZ;?&pq0S1>t4`#Jz=RTo zC!9?*o~%EasV@@w=u)+s&I$1H=7u3Q*LywNv)MGML4S&t*&+&Pz-yR;zEAzq56(uv z>&wR4-hFCeN~G0;7?+G(7lZ*goxWrMkzpV;_7#$e2Wfm4A1XwhggFG4q7x^)+ITw+ z-dHF<6e`R?*)om$gM8$jf3eK(r71W8GK|%nW0K!2XXpKD)+$%X-}otl^^ib<-H!7l zNVK9hi0Pw$pxT9naVoLyioLQUb7#{;Q?VjU4e8-vp|!B(Sz%K?k<#z9QIS(Rsx#=|aH(NKgi1AeAZ zno4AMBq712u(aL~>VD#xDTmVW#C+VIk%|PfZJ94hxH#c%%nx;~ zN!22(Qw@t#%_l4 z&A1(eY1ksR4;!Vj#8qW(ct?;=GVQLF)2~V_t_A3283D--qk~4-WezMSgJ#*ya$0XU zGZ-L`8^oPEG{p2&@-Bf;KGp*CiabrohLVZ`$si*#SKZaDR*pm#wIR%V>vAwtv#SI| zvwbi^$L_^NHL4cQpE6Xe)^|;LH*;K`p`JTBSgbBB^^_n)0!cQ-7&qtV7w7|kh!iMxc(}hVOPi%l zr!qYA@-a~_%_AV-CJUk!Tto1I7&$yHI!Bgj`e=Em1ov5@!!)-lmCJe+d1ji607D73#nW^5`I!lqb|S8-`Z z38no}4=?91N4>M7Sw>rwha5^l7r18!$fg{56acYfTt2U&YtC?O!H`qlB}K}Rd&Le1 zA+<0%j;$+NA~`i6-Y_o7Ks-!m)5+xg?Cj+H>>L!L7wK!*?@LQF7D`ouz?$gFg(rHo zEfocwtI9&<0%80h_FOGDo^y&p2?U_3?O4hKh2YnF02=*TSG8K5J|1*KJT#3QkWm_j zfYhyYScwUI(|LHw(WEEfF$0X9^lzu31?({;Sp-Xsqw-WQ8nqE%Y`c*l4{5QbN*z23 zld466Aetq)3=B=az7wo|;0~!>BI7!9S4pBiTJXcklBB02hGKD$wR%R#)hgJ$n^eyx zjvZ8_lmj@(0WtMvJDo504~~!@nX6(o92hb9XrAva%h)P%S0&XY=v^;?Vks#t1brJG z6eV1eu4ksQ)Do%rl4+)QFH(j(Ym~mOv7|~fR3@N6uZ0;iQJwBWZ&A}}fJO|PBiYD~ zE;vv7V7*vj4g9f>(P(&Zuzz%PG#vT^woEN7d%Nq?n6#$y_Ow6&Jxq0QLw+i7 z%}uctiT!jI(5B2pGet#=>y}P=2nnkz${B|0G4Mp9L58DK)7GV#&8C`f$F~y(yM$k; z$-~3LqZ^0&2Ychaao2@%JYq2L^D z2d$O%)A)B={@F6%@CxVxz)>8%$WTxNY6Xi4WvXxpGjU8waw%k)=NUm5K@D*jYMlnD z>qX7x7CS&KFX(R@I3zT}pr}Nv@syHO0FGs0aD{-#r+;O7r}E#b3}Ea>_nuuoY{qTgB*m#A&iYobgx9fD2l6#1AHXDWVFOy zr8uNCU+&Nr6|K&RI2D^z{W*!!{5zAPkf04cLWN=O!X5dq>Pf`HUStwiMCMPxmu8>zJNt-Cg0E&LbTN5Y(x%Xk=DEs zCw>kJD)T|Fh0P}z^3n^Ubr~n1432>ubFT$q*nb+K85)--wCPO<&O4PhmK49hxvHM$ zV<4$djI{|?6BRUDi`8PfEGEnH$^G{ilMBKqhA5p8C&3@b?k2WLCLtHPbOfXlh`wz)N+aRj&PS6A>?)$S z-+29Uayp&Pk;h^_J2^RFg6@y^7KHy^?QqQK>D6iphkD&?T~-Pw%pZ)9J&>+8P!u(j z*YMa!#+diGQph{&=9I$klodFpxJ2=W@&%BAO>s@XK}@wZAloTg#%VTPIRPpvA`J2b zH`3h}KGG@F$`WT~ZA=enU6*&XR0RoOh1t|a#dQHNTC#=BK}NJoKR)*1!m2+-Li2RW zFvTqnz93Tv02y=|v#H+r6MhgLZx!-It(dNIxf1iO_G0S~r7otImyh3zM?Yhv0MNM> zymlHWc?Y)>hiAOh;f{P!{l#FZ%a%lew3C3#p>Mr#^*+ZAQqTA>nG4Bx?$Q=)#!bi1 zX`tw1!D*d-)dUubo53X-o=q66MWsg(D^M8PyK(vf`%TG#TN zB)^mKVnE*c<@=JE6rWqiw!) zST!MR4aViw6&p-ZXorxr&p*R)!LaMi(Huj4uu*P6ECXi*w5EA+?F?#lb`o?b3|X|M z_-vmUDi{+?P0^nlzYt5L_zEf#^(o`U$%1NYI*jrtPmQnlN7pz^>-e=UazEINGbRo4 zDzT4zFc6IG_U+rt)oM1Kr)H_nH|{CHGQ-A*_g$$%M`+?JmyqZ$L+5a);rCK)4G&VE zJLJiJrxASxsZ#6Ge8kk?i77xP*r-dUy3q26L!I*a52QqABsHSlMWR`6`V57t(pIUo zR{qLp1Vc4ie?{ZII=~mP`~JlF!uJ@^CWEDUXy|sjw1IOGuLjW6`eq>kEp{0QS&UAB zdbgsIjQ3>uJ7$ZbTvVIY8ppReE9zOXp3a%C@2ERY;9qB%#;fAAzY z5uJ!!$^;e=5od(YRe@bfEMNyVk|18UtDSoX8-;y*+~o^}2^Lddp(B)6h(jGMPU45Gw@No6+<6%l6HVV?2aFyky8nr2wxvX?6)0wC3vmXT| zB68ykJY!B>;5@&$B%UB2aS}VTbAEn-)`1Jy4y2wSLcg>Er`vfKU=c+%;x+iRYiFJ` z*#TeiPrf-!=-S`8OR|>21eYCV+KR?O*{loeHj3n)90_6-a;E| zx@c3C1kL%7YOm#M8N2#o#1N?MYQ0=6!$YWMizW6U>?1RZI`o2ihQ{5JqmwEonEe8q zkR6hT-H?I>C@L@2fzElko-B&v%lYwi{^b1fYA#Y(nthXNqleHH44(8e(*aWs6Q70z+a7cYcbHV|Tfw$v240wwuyHsU_OAzWa* zovZ*6t=0;K$tfskiFiXC#)N&hPK%a+ENyq%J;3GNW0Y~(UL#a>lgH#3*XP5BP@zl>B|ke2!sL4Acz+L z(Tv0fha{1f86o4cZO)n%n!s*%Da!BMr#R#vEQ`^+hr7*r0TAI-I6{fP6au6SCd?P@ z+k>1`UL<)zTL~vIRN+kGFm2Ng1CFzj%Qh&JAieIZVjoSRbSa!tI zeGN2JY(!4lVn%HUgH4z&mMY^`%eM+IiI&h548qkeS_RO-oDFeLXd2ldAHzAJYvjoh z_T2~?U~ezkoViTuFZIVwd%ic=K{1|o=koFbc7QCwIxiX; zNGZNXJUtmix07~CNjuhB5AycGa4;49+ewUJQVDdTVVxKarg30~sr2;Eu5 zpWF25PD1Fn-akIR#OFY$t+kP9b5Ye7%hh6C&4}2Gda_uh&+%k(GM%4HW|y2Id9`SJPebXH84o5HvKH~Q`N%ZK})ym#>VPu}^=tGDhRj&6*59g41S4VnyDENt<| zupq=Z8>~iiUE|9WPG+03->L?kP1~1NJ8DI*XkErpaw=aTMGBTGJ_G~%Vu5XxxkhUo z<@J5>;7IILbonAWuM4*tHCBYNL;y@j2nL7A$-BjYL8Exv@6`kfz zFc@TA*Qm>~q8=iq<+3UXE#uJ+)peR==ntt${nTrhj^K)_B6_&)EC?n8Y#-J!m{Fajoz*$b`<;8S) zK3$xiO)miGbPgsj=f(MyW>#JTt!rkMZ-5ta(2KL{{Rp6ePSY@K*AX%q)w14tOGJ5_c(b_)q=Ye(3(Ig3nJ;Fa$3Y zJk~jFXPsuNDhX-h8ebH=?vWJx{KuKpBO!CCx!F57IzPK4h9z>!vaHwZ6kyA!F@SU$bV@U2w7XD6ROISS!y7j_L36Mu zUZx_)(9Al4&AivUclXZTXc%<2m>a~=s5nN>SzHwQ?e+$jv(@Ev2|%Z-0*lZ7lhcd) zk53;xIX^zVJjQpNt?oZQnJibwXBQU$w%Pz$Y&ZH7MaiTpOMgr?;&JiHFa9Uj$d}<)IbP#7&d6eXhQ?6Ngk@>v12B>1_iPxpYqd|lCFW^ z0n`=a1K7wEsNvu!7=<|)?g>{IRoSg(ADX~$V zt6(X`D7ERJ5hW3|@K6l)!bc0hQvgZ9R~c^yp*&N|>Tmrwnu13(9f_0vlc=L)p2?A< z9YM-Ec78~L4C^2gx`?pfY#b-USM&}Se^e`j@3x<16mr;7^r!b@U}HXdxT+I;bk{_&Sz{nSfG zcW&+N9gc_ly?ofsd;@Qm^?kZJZp9X3esmFZPIrP532{R-OiMZ|@i0)h!wgW{+0S<7 z#1{$HPaM`ZX->nS#}X+8DwGW}0Kp_(OUu%{M`p#f%BY|EFwv^UFLti75;0Lt1YZ?> zUb3tzN86V&*jK`g1f7C51*WOXXfVn=ldKe{;s|+v<};t&-`m$(jYi|~-o^Qa_Pz8j zmTuOqy=$t5Epa~zVLKyogv?+YiHrNu8iMm;5m^pRVs;>gKTrtWknHsxR}Wg=Am3^A zz1Oapb=wh&s@0lap7yyCf=T2^%bZc2ODs)v3iVnspDnO@qhbGG%qBnFAG~zu=%w2? z4#vGBvi!AlFwq+19iO}1ZkTq?i{OS=RU6y+Y5~?(RmqkSB6#@bjW+QdY_YCj6xvi> zx~6(((C^(m+Rr$>QC}Okr<>)R-t?_9>Ad;tigKum(Of<8NoWurLPfMM=nCHJ~;WWKygF@KQ6!Tvr~PtP9ZSq>Hn4rm_q z#_O$AbwuV2i!$@YGL)&B(C50_sFNDykR~*Ksp$0Az+8-g^=Q{PLxuw;izXdtTP+SW zv3NcP1;bIO$#sC;^3hu*y@C(p(9Xmc4u|~ql)wo6268){-e}lq=aY-e@o;doKOSLE z`(1F_@3pd4y*KRkdOj|a`Medz4IyoTG#xT-#!|S71!WM}-gXGBd?-cb=^|Iv+<5yE z1|L_o-|LS0y^;4mZK`^EdRe{qczQOk&ll_Sa{b_9dRc7iR!$68uBt{i|J>((hnY`Wyj#|D;v97Lu%8ZYgjAGZx?wt%WhH+s2s?BUZ9q%DO6xEXPq&GKt z+gzR_u-uoNmGk+6264}9jXg@>R{BHvZL}?2p$?@e=ywJLiHw5zN|GD9TR*YFBro(0 zhr=%ZnR?EO%qPmpe_RpWQCSTK0VVBIM_;inDKQ+6?%uuWyQKTs!NHz}jc5#-+pR92 zmapl<)rA+#Iy6?EVIcL4&^>K`N4?6ju8u7K4hP?|_NAyQD+%`T#18H_>@4G*Eb!Oo zvM)E=*Y7|1!RhJaRkiMqBxt*(YiNp-Smy8ZP?@>*cy+a zP>c~1_hAv9PG{Tfpf2Rzl{1!D@oY*N=Bshck)e8&Ua}Um!D=VC%nv7h173+JM6PiY zdM2g?C$ASJcL<|^6zZFrr06$hRm?2V1`MDR1x4ke zTxj>{JSBR5W-^#!U?%1$9BVc3pq2|?Br)C_xsvZ3KE#;FNIbOMGTrX{b(aK zUostdSAee9>)yM4^VZ>h4~L=K23kE-a!$Cn#Wi17t9W05vy@ID&lP!pm5I=&Or8YO zsoyu;RE2jsAbGVa@NIC8?@xnfMnJ$U1afm${6Dd-IpnXhbir9YfF zOLjU5N7~+okc)y{2MT~P0K1E%EGQh%R`8q%PQ?K=Jueydw(BoCOvj{f z=dSjH$9`U%)a=qlladoNtKH5Rs6X!#A+-#OCR4i~ZH|hJ7Mjnemz{2Zyg&AKlfhsx z>`$lDx~}8KQ%FT0tqn$~(Qe_`so3HM6h?rUK`5=!AEP9Pp7lT+_@<378aE#ScbPz; z<~CkT-o(QQq3PpV8jN_C0Q9J4q^s?n0EYIyI>5`FzQTSq0$~6yYjsxh1<=KtDvRZ^ zM5B3^(rj6->c)zlLJt!DV5Up&1n^c6JaIxMx}!_1g_F*O0lgbgy1(a>DgA!t1d3Hj zJr>63yP7(0KRPM5-EF%E9GhC665Tu+J~0yYNOrFh-={O5mcFdXT^$$`Xmwv5#Y zzz5q97d9$?GKz6kxX1Gfvi>_WzPib1AwXJoi=?|rA2d*>%KX$vzrZ3(N<&sMJY;)F^fwmWa3W7!y)0w z2PUqP?eBJXi5v_py)uiBZr%Cp=f1F7mJF$`N|ajA*gQQujh8Sse2_2Rt&FGVT_Acn zPCKT9TF3D^qAU8@(1)+2UB*ozmtx2d2bcX|F`5NJi2|6mXaeu7 z##PXB;HZlVUo018Q7jgV+2tj~fLNVJoRal+UawE5#pCnoyN^%bKR$nWa{2gdLZCBU zRV(k?Z}|J6;p0*qm^K>z?3jIO_I-X7tvu*wd*j}q-yIClRrYSI-`HL**AwrJE$0jR zZR1yrdM)A?!Y=0DIL~g42YbEz_TKpAyXg8o1qkLGJ^y$g%s9<~7NM+wc(I%<7nh6q zWHz5n=a=)vjE+L?!9-O;;^huT*Syubh!r@9XM&rftw|@yPg;{IR0@cI5p@whtM|$R zLS=5ULWnHwQ#L9^e<@jlluUdasi|myO#t64f%N>8TIL@DQX%%?yNkVE%l2i9a45B~ zD{$RuO3V>ezNlbI?j7D3?%x`X_tP>SgCRhr5%w>q6O8C^Z=5C~{DoqjI8o}&pk$(K zAzGqhz-fnK22mKc;FFj2H)z=ga~>}c=GNtEK3Q-U)e9(P1m)tEXTF0m%?f?vi?N!; zV%6<*FE1wPnF1WMe2|svmB0JGEH5X^N2l}mPi7A<7blDAqS(yVty$feR@+IvIa#bu zr=XxF1_P4Fs?lhp$s~>;K>cP5f;qx$q_r)7QK!8*+8=de@wl7!Cf)$m?Dz4ke3+-I z7B9bi)ZT82)64aAnl(1BzI^v^f0*Ts+8<3`db1i9r>K}zD~wbzozE|4^Yh8%?DFzt zGC4WBJUhFXoL*j>T%4a=Oz;z8x-tK~yb5SSPP+s@5lY(bazLj(OBaWmDoR1-iB}yI z9cfENK|!K8QUo75h2wPAltKs~8--wtDe98~IsSh@%f`25s2%$+N|c2tI}A#Ye%#E5 za$~}JSBBTo)p{T@O_Zlyn~W@7pmAqB-p_kOfQb6Upf8sz3}UC=29)k})`t>2Qt?|b z%sH%At#}oXQyS1Mwus0C8)-y~I*_djnklKGb)ONNtvnDZ`fAsolVAsuWEuHL5MA;~ zCxWW@SKPE3nJ-A;Gl5KyYP$rC2tGoZ&e~hayu-p)BGS}bXFpK1OZ0=V-6OM}O{YuL zR$cYuozT60cR28cAU&;LZ&Q|wRWX^)5GR4Tb-*HnavjcFMxYensGb=%r^CZ^$t&C} z&dM`^>x=JP4#5j;Hpk=fjT=WyEQgAhtcrG~NnAM1aZ!xsTl)ul41>lY0J6|<&X{7e znAeYwXJ_;JWL`|F_5Q6}ckjK7mjbM_ynW+n+#hsqj7K*HgBzpK{=xp)YbId86O!Hu}wC&@2Z`C6wg! z!n>r@85s;?!$-gKRSN$`0V0%IzOFPr?dKO*__m! z$-2K-kBY`#**+{<`*r(Z-5jl(Sxq43C)V_yNyyHr6;oOt3kLZR6eGx(^Rm+)he!*5 zjLgZ#L_~{$UKNV>rvhEMX&Z32(P4B%xfIy=vSMGN9X;8XDIJp7r^fZM;1N8biHy;yumi|yot?qHc(%2H8LA-|r8;s=QrajZ7JQl!BAHoI z%eV=n`n{Yvt|e&31Poe`QBd<=ximI!RQSl}Gubf7ZjJ;o88FFfuw{RiS(FvwgD1W&fUUVb3zyvbuTeaJ4Mn`p!4rx&PMN@4xxp@#*Q= z>SCVF%h7VPx6TgM?Y(tpyv;_9?zo-pwL0T0-|OUi&Gt~Gqq2l=dWxikh1ivoJGqJA zSj8gJ^s@f$K~@ULY3eHxXx!aai)Y|4L1`pf5Q;lA>LEn8p~lToJ=&8eBkf@L%uzJ! zPTbS=@yVNv!lEXyI@^p)yaZn|&GE;HDt17HZnz#Wz3QBPftcuu$<|m_^Yr%Qy@5Za z02sWA84p!E2bx|D>h*G>51Rpe_(4=*kQ+xfCQ!Gzb_DfX@1?Zj{Mfh3oD2l-&! z8xDKJyq7UroY!K$E?1kXys^J``}R#7MVbL~9iwBYly!)yKrxp74lb78d+zEDdZ-Jy zd+5<|Ki_t?Yv0tP?)OD}s4<`q$C+MOf_B4o31-W1Jbdf*-+lX?2k$+;d~i{n7Tftc zUpM!+oxNsvuhkp2dZSK%+#ULxwcSCdGiY~+PO}=;piTKwK&UU#dkJF@brbmioaK;-=HEcF`2cegfZAxa!Zkey78$^bBx9o$_rt zvp-bwLrFSPc^l!|VAw^Jjq6AYpWUl{x=5g=j<34fwM>i~6VnCs#&&#k&J$_g2`p8c9Zw?^HnP%Xc!|)!yKV!cxHM z@6rM<{(_NKpa}p8v&v#o`6G*sZr3~3C?rk($cc~pon6kWwGZ0gxqWAEJo2Si(f53{ zAbff4)qA*%=Z_vPFE8uWlF=Z_F&3MCwi}`jsKPX4E{I|5@BqlBD{t4R%Psy=Rc{MC ze3vwEPy9W!!|`Cy>wtcLl(O3<_JjH_F?X`IPt&7K7X-jn1tYzb8?Esl7xmn!Ih*I=8Xoh=}0(C6hQT6Ja@&MIySMvE)aoR56Rt83Th~% zXU&|#Z`CSTg#+4DEj5@Hy{tRLGwyp!A(}XN3>36wnEJAA%;vMB@u=6RUO61Se6)8s z$oKN>*8cEwue{_#vFGRW^HY2j*S|XcR5YpzWQ7j$!YK|Nrk_4FD9mj{>xCeE)@D^= zL)K_i=Xq&9_GNF_9}n_jue(3SZ_mf0J|7_Kk{N?)wtN11ZVx&!L_U^K7hB&8fS>74 z{KUmeG?}ZszKDY@(<8)4jN04+qh|VDn4LhO=}Ne4V59rH1VUW_dbQ@a_Y0#P#5ufbCRp(hG=^b_z+!CANs8*u5gwt>V-m7Ew&&jK{I zRk3nSb-VSoBu3v(N*Cxio8@AeBCA_R2mAeOFKhH0#Y+d{&)j?IwRNlHSNW~q%Ne%x59{3(?FV!Jc!G)IKoCSQWR0mn4uD7wS>8mDv^`w{Jz5ECY`(1w$ z2+ayivGqNFFFniq112-G*U3jmfN@nD%hYr4*joE*nqVIm1-tw=yio%OC~=oGYm7hE zxn+acV!+}qIQ)SWt?ZIW#_e{64jx{sh;XeT-1T6EqO34bwrswdQRYSi(OR5RqmZb^ zhMg1{t41glirlgYN3sB@Ad>Px@Cy>t(b)(E$d)0t`NCvn>oy@SUft|si6_6oBSRx# z1zhI=u{wix7PANTL0=19iU{=;$NQt7_>+HT|LE00Z$Ko3LO47e;BXPo=R%n!s;E;6Vj%ffaAq>=^LIT{>&4+Jr z4Dk50BQC6~7wSBu2?~HGSOqJ0j)r4U!{`AX#c5_!wl`(g*Z`QGzloct`{=EmiI-9O<-A-hv-(m;-nXPyyPG+IU~onVAO<2)JZG7J)uo#EOVP6#a2IwU z7w{pRL`uRU`#vf}$Z7+SoC8$6V<9dkl^X^`2O1`;fJ7AoL?Pfhr`~PJ6&g=@63gZV zqFs{GC>K3HCrLyiFaR2zXsl@u>)mQ*tMX#8xLg$rZ!%QT2TFIz#z}x6 zbrYJ5&l)@U$xpxbQ$O=Z3E>qdaX4~pwJ`rZVux0vYWd7f57~6P35z66Ufe(l-2kc! zvbH*ul!PA)8HWi?gD#XE-ky`#V?~;PJ5ZNWm?Va#M;rHI64ZflSq&Cd1ltWz8RBJj z2x8iUk?-6aV|{zB2jPA04R93*db;gK-P}SW16N3(*%yztn{oB4<89z=xF&9(hmK;( zw~XNNh%11FPV$+58rW3zYO!>Qs^7z{q)meQzQ5p~?+sl`pteu=i;Oj>_sSI0@$52g zN~I4bJZc4TX(&hxN2UWd^o4$X&=F6@f{)N-u!U)??zm3MOJJzSNXi|GneK4cJGMIS7!j zotbd47f+Crs*we1;_B43fNm6#8V9H{hWvL?rMJ zra1e<8*vp_p{*uXAv|pi!hXoz*!-g)QKCtQH_JA}K;DxL4Jb zA^eh!0jKZ@8-t!d?hH1)r79jqg?4b=S}hu@W9^l=bRve(b}2+3pY&z#Da4Tt_y{N< zk|#vU)1IoQn-5kY9 zyiFOjwM(lw&8i(*ARP0R_)JwNfqq5P`-i$Y1`*v$Wuxt^wbyr*lervpIW3&VCNFn| zYlYmp?d=j}A7gb{_HeI-d&t*}azMnTs>{uh# zb?GAPjhL`ICBM_24%n$6K$+iFT;}s9JIL|(AnSFJ_u98_@4fo+tG90-><>q{Xg%+?^qw~(2m(v`!$xQf-2o7o z1fU*P!==Peyz4bz1CLT z6PV+k5m7+D{L`4F#Z<;lm}z_uReaQcgs1b z1I9X{EtgS4g>j?+dq9N0#)TuaO&`Y16p($eRq2RlO*#~|T{nn};9v|a%g1<^oi@_o z1wm^50zS-VPBZ6SgTqNIi}VYFNyM_s_n$zjzu<4==Q=8FQ9*xHYRlE?;NHuv@k{;g zzBlosNW$!kSMjWZQg13eagQ6q9AXyg%rpDFj8TV+u!Aa{vjz23PHK^8X}P?-ID531 z`;<5}3SY&HYV-w$d7c3;rV}A`Q7n-r^L8{EAp$)tuhEFO)N=cO{#X7@^#`Vqlwhh? zdDZt7OykJffpG8}JQ$D1cW&Q#^`+PD-uleJ_;A=K5Y4+8eydB+ zbkA0d+OMu7h`RO}L``5JFWJbOAl_Y$bE71w2;8YPni5L=Z9@j&!{=BEjLn7+7up<$voh z14^jGjo97b6EmK3l%Zp|8q5kYX$5vm2^36}eI${|hv}gruY4?okfJ*n3`V1a@%YAY zc(dOdW93v}`uNWOPyx0VZH5SJgkUy=$`!s3fT zV5gR6zO`FwR*pc464SYcYzLqd9DooLQi=tKrOsSM7>l^%KpyJi3!u92j-)U?oE%qzO%LqXhGdn9D+`1m!-gn2d|51|C*>d^dg4%MxwiTghg zprPA_OuSowy6L_A+4Z)Ev>6e~uk^-p!!vihi@-cKtFlB#4RV|-<4;tHl2vCJevuMP z-O4K$0R&35SuJOmmk-Y`&l}s!JF@5@elMxl8xq-46(=2!eKA{u7?9XN z%t^WIYB}b}NQtw%6el5$yw1_hJH>kYg)e?_bg=ii&%E{{cV2$|n_pWLlWo17oz3sR z^XTojA3S(;LZHU@@BsJr28ZL({&;YR2JiVp8^LI0533m@Oa%f3k*4#(-qk5vRYou% z7{oDXfD)l3cG+i-eRZWX!4I>Os$@to#?O}lZuA9c)xxgJ%UyqxN(U7@8j|^YmVEgG z6~Q*OF4YAV^>M2q)PAx2xY}k$MB}6l*HjgY3PknNHB%3Kq3xJD-p1()7mdX2bNW#k zxGvXaJztiS3Q31U`g8qrM-BZkJWb7*m^^QZX|W|C;T;{Fnby z7&puZ3f)(?n~(OP+< z=M)KLJr!Pf)J;a{z*}v70O5yPl6QgI2GI=qUlp&c8MsiP7RrI{<%_x(I(Ej0ia{9I z++f!Uk{lUi`NsPlb~#I-;D)zXqeRi2Fc+n(<7fq$$ss&;D!3@w1_?gxq>|VaD}Tn6 z`ZUBA(jY}91|%T|x!Fj^WeSuW4xma?{fHPL0jB8@_2)n+o+PA%h#MMyD#5 ztK}3waGdoCq=O+mh-Bb9*+BagK@7rfO5f>sM-y2Cr#*y39FW^ zs!dVMrqjn~XJ^1t|8HFt{#54{M?7Mo49bdP<;5P~n&I$4bTRk>!ClxO=mnejrM#vazgFGOLO*AJ; zFj{X#i8rg!k;|B(yzXP;V}&SY1PD!PK=wirG#H;mAec3!te4B4BVV!2~EF?e-yB2$7*i-042X7ejqiJ$)u& zg9l5;>O^HAJ{XH0QFoxokqXFJCA7<&Ack}u+n}mS5O@Xl$wrUR&RhLHvE4Ed>lSKAZa)G;@|8Ko&0E$0!WL%okLqQIiJ&X@DoXY zd)JzPCgEujn7f9Bd5(u6O5d^^ub{z5pfI+b8!vqV!7t9v7(;ti5B$~RR&UV7|3z1J zQI;q$U|F~4UTSX?h9bs)+V{MBfC2Lt#a%!0I#t&4!dBb^p?W1esJ)u%Wk%?f=MFrW z2DZ z#aJ$O^Z>l;2dS9nljy-lK!#F5M1f*8WrS9!LLw*&;I$bZ!%lib5}?M_h<34B&*yW< z84dajkl0Lm2dllXB#+!Yq?m?(Vc}DbYgLiv+-=GE<{)+Jypg6c|u5G7~-`y zmF&Q%)TGrAK>n^h{hA zXoaHlpIT0Sdh8g_)0FVwybDrJXh9N z1gLJCFh#y_e$6ml=U^&f#sFopEJ0wgs8;i0H7{3-VzqP;jl7Z&sNu81b+g=bifyOd zcGr#Www142{jERVIzSCwoK6WNU5e2P`-~_F1=`j7%!i}FcyDjCH_%K2h1w++Wypji zUT!wLjVS9J?hp4zs4AD%jZ$I~MF66Xfe8p7Uk}9zD_}<$XctiF%Yikw1v;SJ(r1oBLn)<>I?2$v0ACHGEcu6(fCeGyyrE50K`I_s(dZk@&bzwrOH{Qd zJ__3Pek$gAv)jsgoem7jJD|7Q>tYK4d$B>&x~jW@c$q5nHJITDBo!uP0%UGJZ4#NklI0r}cxP5Dimy34rw+&mlK1};|`!q*V_$ZJ+ zShBD$1$W|CwF+`o;8-J0(4fba@{UAooYiQ*x9tZ%}(Bc zi+GR5xapJKynFcatDj;Lb$ej9nK7=ob`enx>dhtYe2|a#_qttwG}_ta6c^Bbdj-|k z!)SmzE$xofn#mTpBt~F1Ib>>4k(p-8%?{pO!Z8Vz5&AUE1*Nxu_rx<*P#Wy4udKs2F`P{X%0bVH>qu`8=$K*-glFFVEB`AWfNcT#T8X7kJ0 z!Z%GaH(dq>+6dXZ&Nkcj@$ux1H{Z)UE!^}R*O2ihLXGU~S9#c8qdnX^`1Bv`?;VXs z`-9QpXpGN(INIAE?HvxshlA1n$nBn&W=5l1HxBoP`{;F9=<1hmCl))R)Nuqlg9YA! zV3Fl=Hklk>oLzuJgTlh+W#B}f54>sGAA#BU+d!*DRhFH0w&#PySuAO&Yi$vtq4v55 zyHp!-PVT47B$(iS%#rJ|k@GQ0wnSo|HVMyhv(C=X-hbzN-~awMzWc`a9z2%RpfuhGb0$#&^?r>9e0{=VMB)+uoMpWfnbNXDV|Z zE-vPahYudS`_8+U7Zciq=D?Oqm5>GeT@7kBykd)NRfHm#sZS<{xR4CPQMZEW%!YV? zE=CmEbkm9}+mea21eaH)GTK0v!36mL2k~RTGBZw;gfFPtZu{JlL!|?vIf}*sIK`j9 zqg8!FSS;V*THse-t~Ou!?%Tid`|o`HjVG_acmBQmXWx1I!5i;AHgr-2xq1V>Pfkv5 z-8dTfV|R{}W-Kh;LiTx%X|AT9~|;| zW$)nL{=v(mgFC&!UaOs>pD@{qLZ{C8>CBFF^-Y3ls!|euCo{$A9=d}O@)h`F!pT~) z(2TmLUcbYb08v^ea`Hx(V6san?nPbaJsUc?Mj&Setz~wHk?ikjp%A_} zckcOChfar(1f1Zjh!BlHFt(41I- zD!}8^9YhH@o27yo5I}ca6r-RFwXCR>fwI$i4lAJ*<&hu}eAk7L#X-E$?sdRHf@Y;* z@)i-g0bxGWRc{O9{f4t-^X5D6pDk9c?fPigyLB+Qz1P39KRz4|HdWyS(}`|go?qTL z*xMVr;*mMkl|M3fo>@XC*@=jU$@DH)b#R2UeV8?|^GCGu34au41C1c99J(PY27t*Z@>llMA+9V_f|8!l#`PetLBV)Qa9#PV$7g!xextwDI^?FZz@ zcTJ%lgQU7t97uL5=}@@>;^p0q68DyuHGCNK2RjV~`y7lvT|^>7Y?y6yMw0uHv>=fW zsT!o`5cy0B5kOdKG)2dReYhn3HJW8J_xc&G3SuxQaly~$K%^9udR+ki8hPves7~ov ziALYZ90~mNf9ua}<0?Jes8`<8*=T4h%VkA8OxR3p)EoKKzPISi<`_TulZ=|hvFH+KXWnw=o6!g$s7r_pUYHE98v?yYHek$9!)lOc+>RS6 z7CXRii%ZbSXu9?ySIb2)XClMtc(}#6RPM2uDKLie969Mz2#G5LBR&cq1D;;hv=Wp;n=%ZX(48Ws6w#HeQ$a7$;)XPO< zyYN>Ey&K4Tf}I>DLZA4;9s`!n22O0Z-d!$%d@-yTIMYy_0T#UZ8)byEBqx;B)(iUn z(yo_5IzS|;J|H4Ck!XfN zksatvh&DxmYwW%#NmsBhU>$x5vnJC7;L^pKJ^Xk1#QVn7S|*|Z_K_F6T1a{Yr%c7v zD9ORvI)P#16MyU{^4?8Bfw|VCF_$gEAI=UA;&3qZ>A3VO&W)z`IqC`R)FAx@fk11G zM~^C!Xih~~fH3?WMIUv7?_tm-NelkWpj-zaap>wP@`6)v--j?}{G-N#$h$Z`VG zKrl1-DVOyJ!b6~Ui0^h<#4@mBF)yYQ0{3dZDEt8lfA^x<1%_a&pF2)IIr@*k3?tGX z^y6t9MjDF`3^!d?3uej);$|pu(FpC7ew{TD?%b2$V8j*8lJB7K9YgNdNRaO9WR;Z1 zu-vDj3dA_o`&3~gJmI{ZIruW-yu>Lmdk7I0^ro>5cm!#m-fO#D}_!Xq2 z(XdHli8-tTz;GcJjH>tSP6ZJjsF4tqTiEv_tmC@63s{L!7Ky|TJ(A1;S%$`b0WNk_ zpV28Ypl5PouvGU=K@!+(^|KzX;@#VKMuP#`4MveY7!IV^M{4os^uKO+Li5{wEQ zDuoXv3UI=5oTHG?R4ZdC*i)6FNT{``QgdQNzbjKAIr{Kct-2lcdSG-kBub8@Q}7c^ z#-37W*BRu}f(O_5h;Lg-yNS{lq#c=2UYJIvv2`MPT~y^VkSSDkBeBwKU0@No7=>`? zf-zy@KhzUF!$R!-pZQn*)w=K7?R@*7Oy`s0m2yaEdJ{80gXg);3t>+(4Bl zh)4CE7aN70MPzb_YG(%`=o~{Z9`^S4_l|DexO4aR&6`KVk-v=9b-HPvRj9b4w2g<} zZuh$wkbXWOxCZAgP|!FX8PBN6u%0b%NCl_y*a_2ka&hK8wkGL>0_oO;k;uqr=ps(o zl0rRM!t^1rm{OHUw1mW&Pq7*pK#Im3BY(7H!>OsJB6BL&HD+Kq7>tMe`@^F_Ht?)` zk|HTcJFzvzWO^n&OOvInvO9cUl1{b`CH{gMWX1;n7;Y9H&B@TGp z$7y6^bC4On;kGK*%VNbYl2-DuY9$*Z1%sq8#;#+K&~{zm8hq@)bZCd~(SwT*49`MQ z*p&oD9%=<+Y`btt^#e$Jd;-r;ug;g}049%Ifhy5Nf zr2%bs;6A#xX)oE=4QOEaxK-L#mD9SIU3yzrVzN7;DQGmM>KrNy;zIr{<@9$TO89BI zDj7{Bd&IPLHf3l+4@03+Cw%Q~v)-f$f>3Bl2bRu#iD!F|5B7)q82uLBKQ*JlUAxpw zAi3`Ts>fXtZqKANjOQjhr+_-b-f4%7&>8yX47seAUTQ&x%G2pUAZbP?@Zoi;D|Kh`J7tsdVvK z11l;df2^mb-?E@YKqeeAdQWqhdBqpm$vH?|N){;Ay$I#>1)AaxMoTLxNPXNvu|X770O8I1DmTHKM7o%KiU6jPUAPa~fvhfH{XV^A&T1wBZxEH&EghHeljNNt{-6y?Yo%X`U%Ash!gDvsXxJ=4APw&B*tJUxIe8KQ<4^s| zfBx>Lzfd=tqrs?kSvY7^V6TJj(&t}Sh!x$$-*hrt6eXlI)T1RtxF3^`>5^sV5mtO(VU4q=Ml*?%9ECFuylB1y8;N4aN=35{QdVIP3DWH zylFB~O6Q3yL`)g<9LV9&E>TLt&^z8y`4EFr01FI3Y(-cq4I3SLppDQOA#KPUvKgE3 z+^rHA>1UB;)zPPJSSQ!-u}po5U8c$4=MBX=X29~)+s zV@eB`RE{AFbDN{QSL75`vLCD~q0h3HRb&lQx-wu19wMp3LZ+}PCH z_uqZ==89VZWytHJ4bcw1WOhy-AYz>~+7r0(W1rGYM>Ht(@i7J;; z6#|KpuvonqsK9i`!yyjN4P!A(A)oyqAdssP#Vzv}r$moGg{uEUa0$AA2aV{1G&Z`+ zsQ;Cb5T9Y5jr!TJ>r;oQ(hdH8SyR95dmL!LZV_Xl&)QkFZIoySJwS+!n^s+}=1Y{y zV(=vb(bg~o%=>|oIPX}P6HZ9k9})`mg{;-z{1K=Ns3Uu?Oqx_+7aZ&JL(X%cO@5_#{ckt`ETd9KQ(9%*5?x{ z_Q#{%ctC%%#e(2rIPTxPb#U|M{%G8z<%^5UC&$O}Y{?c?CxIe95C%^`s&6Zn`nm$d zow}~19`FV0P(@e*_jL=5-)Vrt5C$=bk$=z2CH+56F*5a^-bKKY4?=fvHlk(01h4fshb&_hp@ z;*-S2C=f$T6(8|aF++h!6pFhgy_i30cu6L0T!?Y_v=N{QIKV?PQnKl1QrL1J*mFsw z=>(JNNVXr<;@WVl-|M1Ay|ik`nfzlBT(ODFD+MoM7Y(@&og1QeB`)EpI zh;Mc%$v5&+wZko49cD_L6sFQIE&`<{dritGHS@u~Y!2?k?DB$7x!Lwx|Hl93uPw^% zDC-xC1&kgJ2jlTxJ{%Gt-OR8+lL&Uou165Q{NyFiVc7vMEHhCg4DL= z%~wS*8}v>Ph2kTyQKvEZcrbt6h}k4uS^Esc@`}d!mo=?ut zCYKkpB zY-jA+;_k@(l%fl>pDq01Br8lR{78b(Wi*s2SxN^K>K^cPkiF;=RW<3 zAN|~Capl(Ql1@=4bdE3>Ae7J(Jfcf7LoixrDT|A!8&#+3p0Rt~)c26BIhEyIwA`wy z7ON#6D5MESV`~5%9{AFJ+EY){T55zH`XZAZZ_BOY?$H>m`DH;_*O=g?hc#HJSJi4+ zO(%=R%%@0Zv+~L5<>~3=@yX?S+gWeBb)z#c)+ZN>(~DWP-Y()!|FyS~NfBgs^IRTs z0DbLtLTBjFfa;b>U#%OJ>(}b{(&tOWsE7?8LFLQ{sGcCfR&JyN4|k9aWsb4Y&7)^n ziu}Wg+%*CRl6uN;u6)~Tci8WuMK`4TDo;IAX=ND;oZG8Z}*9b(RkO;tZ9w_b3I&?cH(n zy7AxppZrf-gM(48UtCVl9zH4N3+y1G+WJE_){DvA8V~!22ctnhSHppk3b5KCjX)t~ zXp-h(t`i7yV}TmPRween0VeSn6_Liv)p#jHxf@)0zr|?07lJV#i;EgFvaRcIYrL(F zF{wU{X>|7>%x$Z)Q6k>4uBa6%Ggb;YWVY1hW^%rmO_#Ij3SgIO9nqq!i`BX=!B_)N zoWrtMqhBYB<=Msb?0mK?s!G))ENBcKs}ZH$1d(D>jjLr~jB0rQp-5=*fyB5~EN<40 z(S!(q7YzU?2X9k5*qEYi69V_TZQP`4J^lktbP-}C2?IC-E=I#~FAopF!hUQaZv3T= zY|@Iw394OpOtKx1LgU&y>cPPYQNz;6eo^w`nEks>5t8>UVA7pq1>vd-A?Pps7g{9h z5S^;hXkD>8GXEq`CV1*<$8|DP8o^D_&{wCQ``Z zm!?p%pg+gCYIVxe^?`s!2oHTOh7qb#vAPRTMDz{=-MwzMeIo=I^>ry;=B8=1R}s?y zrFMRL`S|$cbf&W%k3h^X{gtuB1%oTgc~Q=mt7%cZe}4Af>BZT!oUQ8P$@2d3`E<%m z-C#`p1+i->G@_Vg+fE) zg!2TkbX)p_C0%Ur=s858N}GitO5CiyHORZORgLBb@m`>J@hA)#_*WGwbQGZg0SLN$ zKEg@wzIhN(_@hh6-;j%FN0cxLXmS_9021`#{o~^^;8w1S#p--MzgRAp+fC7ItQyS3#SFq%SAw|7z3CyV9ma(ObHKRBP9o=xY|VqU}}RC+atz|h&DFz33Ns!~uU zkHah2wQ08vn5t{5txpRv!#A$~LTzHY>?eiD(yk3#zyuSRdOM?U@2V7;6$K)0W!rE` z|8ReQ>@OO3WwUyXk3O9;QI!Sk?8wO3%JJDHa-PycqK~yj}|3CUmcRu}Ns7`#-{o#O5 z-a-v}Aw~I8c%2xu?ljxEx2m=L)x5HBYz^PAtRK>8i;=BYO=SVpJIkoNL8+o4Xv14b z!iY0KjhIZ;XLU?TXEb~$o&eS*Eyo4)9Uw#p2yysT2YbGhPlJm6 zOc0j?Th$gP1FrOa3V-+VZ=3_D z0Xcc68xKBun*m7mN1noVW1>JQ6M`K%9aJcqSY09$<^nh)s&sottBrLo<1tS2L-(>H z>2Y;bGZ{_=O({5RUvOH2y|utMjJu2k_w`Pz$Zq@Ab!{gF(MXfQtB|RU1xzTBzD?I< zs1y`9o~IRGlvLTwT53c+2NBBD>tEsadtD?I70P_s;|`;8Zr44OJl%~gWniJSa3YaJ z!UgLMFdw7N?N9v4zwqB}cl#<3UlWq!iNdPfyZ5%tPz)IAjva4z&s>(G6>lX3AYL-i zE1*$YhNpr|rDxOtp|}L{7fzu9TRt?vAOp`qadNyu@Z{(d*m%R+0`*(OrRsM}C}UX0 zF5P)+F?x(}r>KiXd3tjB`uE;_aB_aWE!SBGvU(6-RE^6?Z?Ori+* zOnVM2YGT$5wp%_skNZVlI+Z$eKaOLwBZd8Ep!jTxGJ#Z5#5#43r@pE0+;CAU z{*&XQBY&Nun}H{lqz<7KysKgD#q^FZcvwVV*O3Hi4Q23b_%D5^CUvtdFm&kfW_UC`q6>iAhcLk}D*y>322kG494ZF9fVy*(a%>gBsX_L)!q@t^tv zs&hV_*lnkGiIHx#2A%HMxAzznc&Rm#q&1q%w%%am6BL3ohUu*#0t1Y)A0UGv5{YVK z0;+lwP(CP<$PmA=4_;y?F%F-d!N+AKGO6W|?am@`M`E|{v!=cTT-Zk99PHNA`K}97 zXtcQd-vC7=xhrQ;yk2@$m6#JN@&@qi>*DQ7y*PVyA1=o~_1$jB z8008m3@bATmzA0^L&GnS96r#=5zI97a9WodYjOzpL*rajXPiY_IH~v zz4Ey~_A{fr-vK->5PIX$y2SD@Vf+OqjZxO_`3A7ABx2m@4QIdOqsORzJ;%HUo61$` zQxcmNTwBbhghQ^m@8;shUn|vblOt7fZ^2vKx^h(zB{MKoCYS`PUWPPC@V8Ki z#p;!B)VTlXF$(=?Z|@-QjC}EV8_#;s#btG+c*_iFxANgIACCINAu4Ep(A)D@b+*&X ziyyrC=5n#B*R55xDORgqr`gRKd7p}9XS?o#&URmC`f0Fa}?Ie74asYIIGY?OPO@T{y&yj^|9UQWQamY}-DTqlThuf;R7`@CkAs zTLSU%BatYRhR^(TTit;-vGvjYjRqV}9Hd^nXxq0)X@e=bgSjc-ASgbPp5}=k5*sT% zuk6zl6O@#enLI+FwS9GskD7?mXyuBAs|gw#kDo~a*QfoZyz6b`sPr-N?3U&B-o2MF z^k4htH-G(izP|s;%lZBdlpXK-oL}Xpt$l#q`GQGRPd+d-nitX1blU+Aif4fgk8pUj~BP*c~8Pov;lh@e#|;t;}>4PB-@!-bVJS2oQ_ zl{i6TQHBEaYfykPfed&AhvlsoOf;-sKX0QB=$em6h~6cfw&-0^DXkqz$rgAJ`kPr)}t+U5qu;g)2oznD0sE=fs}IA zC}a206f5l9cr@ydM(;m4`-lJJH_L8*^VL_{{UO@7#0kW~Ec}6aRM>nmpD%m?9=;LW z4c58djtc=dl3k{GMnM;tcn4tg+J#i)fF^MyuFv}A97FbcIk6r&uNoJy`gXmp((EKr%)jKHf(Cnc7Juf*#QhYlIw+KpgmHC#N)w(J)An1db#Men>Knm#b zpCCztG26|Hvypp6YT9RHy5*Y&;v9?*JKcOd9Naj%Nqqk1{rjhj`S{Mw!R;H_a8Ndz z%gtt4)$^j9%omf{tUnlH>Ckqx1_Timda@{rm}BZilk{sY>Gc|gs9sEYTwwC%5lFGX zm9%zS&dFV?cyD-}NBbk7<=cqz?qD$L^}TOD^TWIgJwI^2(e=dy z+iq6lZFCwn%7`d=*r}OlU4Q41GI-?Jh~PTzhnExR9~OGyG%ki_dpEG%${%UQ8WY%{ zcre*Sh64$?I|o2kfJnhRaRa9@Kyh`It}40@`olBrb+bINkMdyBbMb0Ud{0BWcDl-d zO9q2f5H!G_olrrQj2ezaZ*&03GEt5FOu9M>nu4s3ipS(tV5nT8X zH@172^}HvuHyp6j%9|+LY}jiLvh5&OeP*4qxn036FrMK*Lrr24%^LUUYx>$kX44w; ziHCxI7~i^!R&@wyN@iE$Ye-FsBe}m59;ZaG>uX}w6O1JlGsW&Rb>Rj$)Z@kd?|2V? z{CogHRE*ANkO2}HC9K7|VsxZf{JVzF)WMYqeVkfS;nRAW=oH;?_A1F-w!5QiQse_2 zM%Igyy=X3Ng?e5+ZQ}Z&fv~*G2s4FNz%-#vc=`zhdK_Qo#X=4|iaM4_DQbBXdO(O& zb#d$Ny&wC+A8EIJ7q}L0(-;ClV1z@7pjus~2i}K2UzGKT8K$$@?$054Ow~;PZ_pQsKcWjwJsOiUcEE&UR&+9d zlpsSTV%M9#&0&}WI3xuf1Rh!5?GFZc8~&(dFE!c1et3gpp3M{S) z3NLp3#DU#N0A=j=`qW2~V^E()X)7_dtdaSw1-qLyA!!+R=GZsfdR96Fi=Zu4J@xf)(*ahO@=jp{c zd?*ZIcr!l-s3p_|o+Y{_EV5-W@e%-H)u@ebFK)u82OJXTb2!VQ6B7&;m=)W_d`UQp zcd8ObFRQl2- zENwwssSlN@gMZqMSh`jWvWA>z^1V4_|syet3F6ezVXfo*vU5sk?)ps+D^F>`pkUKQ!KhS!ySo|QvE0&SI+vwy~D$s{>(gVVZyZ98Hn{w zeYsZ|5M;aE1EGNl{_D76#F5SuQ;L28b?CkdI_=$yOfcH%=gVij*`A>jim9W#d4vFk zVTxdCK^Qq|miSdSA}tC#0%nr#DE$%q;#c~V7%G!;eBci)QxSEDnWaPYI?cc|cN%T4 z^&&n$WMh~pR`q+h+}Ylk(5Z>Wg~7sHN3i2UoibxW0r)nEB<|`T-r9DChBYCjpjiPW z*@80&PDqVRwy;p}g(IVP&PT~wHx)3kllJ2n>F88y&eEzabfBW*!c?BFxnw9)BiFTH z(AOi?Wf@m)W5t4Q!3e#- z-Jei$u5w6IkbqCr%e$0B2T75PXiP6Jp%|1f{ed&wggfXBq|Io925-Pq8e!b21;NYt zVm6y4s?>`~PO+6v96_8{jscaEO07YCS|h(CRbJ_!DM)gLL}JGZ4O~_9PQ$r_2ixA_ z(V`=}8QwFYXsegC5B7(*ZyXYPjeUr=Nlur1R5C1xcV5VlO%wg^rAaygs@q0>aHqx& zXyxfBkqc2OPInnc7)tgXqdfOKB2l9RAY_ZOrI-?VHc@`Jhi=lf0hhT?b%zGVg7xzO z99Ar1fd;F%`zOJa>C6O%Ikw_FpqrSWRCgU(I9zq`Oi#PS)Y|Rs&?{;_TI|`B1{`Ba z+z<6F47$J+ZK{1{(3}yTv@1tE0+LV_u!!VYzi7c(wc{WKsSt2pOV=2@t>4rkhqryqJ~xkLW|z2MtgAc z6@P9wBuS@qs5OpcR%E6m-GNl{@WFJ$7@MM}Ow38RYA5zZa?f+_tC$*b2~bm@rhwHx zNTO?#LlW5VCZu)glvPo$RbDQ%Ib@iaB)y|%*M~cfZFl&A#He?Bq!h8cB3YvtAT}4M39>G~2kRq$`#6I#t#m z{E2_z&mZ1>Wi;L&?H@?Kr@gs^x@a+aQ2eeysm5%r(eQDR|9@j|8Z%3p<@MznnGv~f z@BZHX-dek=S9cFH*q8wcnZ;mZY)c5)U?hLAKv?2~C5%DHlKsH~TNYUI2DU$q$A*FF znE}rX)6>&k)7?|uRn@iEt-HMYl6z)sx%&4%@!sm{>U(>Ln>XLcSf1sa|M{PDo_Hc+ zxpa#~gsaijI972AcvOYRNgSdq;i{GNP)?apTge45(M%J&dZ8M1k1-BjXHlJzfpp8a zuqOmiF|n?$8c-u!IC74nW;59hafKe3nl&a;I!Jdx3kMd9I8MEdOctRV4M^c~uIuTh zE4}1ICDT4LKXK}8uBVXcWTM(aEtN0hz}0-~wOT6CS%(a@+G72CvSL`l2WsfZR76XX z(@jgCl=EbTy=+x1O-nLL4aEiUr#{LFWdEvWr3vS>5QHIU#5POrY@tg_JwlxlX%DAo z5TF&U`ku5cSw8i{YPSY`>c`dBQy1-^aCOd@7!k9E4MFvMlBr?f^hpUqJcR=Zguo(Z zc(SmY|F)(tPP!6@et=1VJ3}|cs4^gWk0ZJB$`@bw+?RK+-KbQmKtbrB7;JX2aP_h* z2@dGs$%zKDcv1(-Sxu+oC<>9FQ_$c5)o>V2fvS+E8fuHoJ*i)>3bDtY5uZY7Y&4ot zTt!@>5EDk^K#81n&X*bt#uO;0#98pje4dnp3QdcOQ~9PSjRN2#p;DxmRxAxeLGMMk zRB(&5JP&G%If|!Hn#~WY;}{C0fhb|NUOObjcK@@xxff}yePKkiFxM)P=`ngH)MT-9 zCFf*e1Co#}B7Pdrscbc0WTK3IQwX;rFwxI_`D>ed zH}s%Wv}~aeF&&u{5urM3c{B%$%q-!cSQ4pN4?kH@FsI0~Qx|x$V}Ox4RUk#z)G%4S z4MovZS_ePd3G9)NlRI1J{dbfjEb`L^kdPvsPx?yHYM9-Vt#x_)6+x&Zt;?_&5AD?G zCR$3oft)1em?={uaS+XjX-hh-*N)()l$~067JlG=^s*DpAI;_JZFW(H#BKspMRHM6 zK_XsO(3%uSKQTN0;K4M*3nRZ`HICGICi7(Zl~;?t#vI-5iIrDJ<8Trz7s4*HvN>|(rxL* z-dZG~P=Up2#DCZT7?7H*$+U%@3b58n&}|(Y}3K6{^|R zWh7TpOZucg$&ahnJbkgoUo9L7T+>jLclbx`i5~(Yx(g1h$N1x;$Eq^k$ z&xhmWJz1GIybHBy@ZCzRK0*I zL*nFIy1une<>mlS6eel>Xi*L!O{*y6W2VBNj169cCheecnz^C?SU{)0ZnEFvIa;3# zY<*^-zh(sLbe5b+7Hckx#5GB(5xK0+2KFgOV|1FNu*5asN~lpVh zRDoVqljekQ6f#K*NMUdVN^IUplr@edzcD@1Jfr?Kz*0AK0Ydc~TJ5^|Y)MvaVL)oF z$6>FR_Pz&QAaI<5S}5K`DVUhXH=~I3NN@AdToNpST^3S6qmZW1o6!TTB`%$ZFo{q# z4jSvG6nk0wDrFBl#6s4nJc<_rt=<^3NG&t-l$$5Vr!VM5W=rW6}ov2a!G7FP8AndOrWB5G?23uh%O&swZ49BdXLM5{*JsxGAH zksErs9=VRl0F{~QrROV0FYyV&sz*Q;6b&DI0}9TPru9=1U^1}5H!f0`P!1^p&|W=M zqu`2x=&p4T`$jG*+l0UtlbUt`;e;fFHPJV2OM5sB3DO;op)Js@_6bQ!eW+fKo4{+U zg%TGqg=FZAkZqwbXQ^O?!m3yUq4pH97+0D~MdbHOP(|{d<&-F%Py8@mtipKaM^O+) zq?;I%KB7+vjSx8m+H{f9)G#3%8z6QOxU)HIn9}B&`kIQ7NTHI+7wAiRIiu6)fX)IK zC!573=QDC81dMFKxv;Joc+xg)Uy?IIO-NK8MYBWbO+uCijZXpQ$#xcDTFhjZ$iOIq z)zxxMFI_vD&TBla^7O5g-&h0rA=~+4CQMQijZjFglBtMqYPyh3|1?Cmyv+5y9Z@DwgC+^$1W+~8_ru9#suUSJSuO!<6wg8#J*DMn4b6%Opow2W zGZnAXqbOayb_*d1&KAmxQMFJ84Wrpt0+#sgTbRWDEKx>&+CckhmRTGiw*-l=AHe`Q zu)|jM&56>!UI?stXUd-PMGg?DDh=QS>cCEI=v4TmF%*$SSjl*cMIt6}m2O39MMvpZ z@}1Q9V_?)-Y_;A0Y757+s15pSSzlHz7-uC91=~x3{3EzDX&IrKOp*n0A~qzbjU4yc zg#v^DNmqcqLaWMQp-Q)0D!QIqEa)S{kb!#6dil^A^RcF^lzlkqT$f zr$#9$nr}Ha9Ejc*9L<3@Yl@8N6B}nlE@2!_VUoGtJBp(Tu;f%`na=7ZrHgq;FOi1h zuCsX(4L$S(&7?@D5K;~p!``%YvCN7H*~&x+Fz%8M#fTpyXNl6LSlV#6@S%|qfUwR`uQX;@04Mf?pJ@m}L-OgY{7*Jh zDVB=RlUvXfIb9pJ++F0pfJ!s`w;|Lt?2Yg&t|rqH+|Zi7_{RxWc=9)?DcPbWsr#w{ zwB?gsKRV>6Eu2mj$+}2PP|*m32Afd~F=XP0=(2)tKCI{?U}Ftb%-JeMOCk%t6M%m5 zoveHcsaU-6>uROvEXzj&KHN-F5~R4)wNL~`c0fn4Yz;w*K;RetvfXThg6B5srw|r_ zaij(Wj8-WK<^q>=LZ{|5sa<`hj!`ACpfuUSk-yb zr#w6an%6^3P(8)KsRaK?_f2WoBQ?Ssb5c%?r;9<76iT3x`(s7bsG_7s7KE-Ut@cm; zTrGwg`3x!X$9MhYVhkp0&<_pP;-Jv7L(Ye9T&)PAuv$6Fyt_ds4t8{3uG2S6e{d7PfbDw)9@jY(d%>xp;yFr%D@QrEtOo( z@K6!q-E!d1wx0V^=jL-Wy@|=upq=n1W`H5FLo+IhmJC_0glmFJ`e)q~pycWGbd)3u zutSwJCaO`dO*x-l*di#4J2iE(n9mD4$To+-<(bqHm24K7(25Ets8+=F1g11XWU6YC zIuN~DsMh^>t%<+?WI?i=M%%9N_l!m0vjaF<;e)DUon}H+*b~$;gBjVOOWTyFc!K80 z3(E!#Hwj9u5EW&ubCB^a`W?F33bnv2?!sLCy|2}J`9VR;ji#cBu(6vj6Q29 zML*3tHDgK5XVEhZ6^sx*(kvv(F(1bdx*PeN% zU{H?(Wk&)``{u`!Rs8`s$%?g8OHv6-(uE%_?9(PTsuVd9V-9PMie=F`NuOmuEbO_8 zGWbD55F(rKRvMZyHPC>(JyVyH%!OHLDoz%m?c#@I3JVUJ!o?oQT#kciG@1uNh?AG! zC-G9=F1$dH3B=ish9Fv9OpyQ2L~-l~p|Cdtrj#+qm{2H*m!`EWmed8zQEVI&2CRHo zIbMMCVVLdQ`pTF8$e+Ob%bMjd2=)1+kyp)-w;{Vk2K*M}S) k=a^%)G*>w;td-# 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 literal 0 HcmV?d00001 diff --git a/resources/story.html b/resources/story.html index 86ecf08..ac30ac5 100644 --- a/resources/story.html +++ b/resources/story.html @@ -26,6 +26,9 @@

    Наши истории


    +

    ИТ-область – это эскалатор, движущийся вниз. Если вы хотите развиваться, то нужно постоянно двигаться вверх.

    + +

    Как я стал Java-разработчиком.

    diff --git a/resources/story/story7.html b/resources/story/story7.html new file mode 100644 index 0000000..81d220e --- /dev/null +++ b/resources/story/story7.html @@ -0,0 +1,85 @@ + + + + + + + + + Истории + + + + + + + + +
    + +

    Обучение

    +

    + Обучение на престижной кафедре Технической Кибернетики в СПБГПУ дало хороший старт для развития в области + информационных технологий. +

    +

    Начало карьеры

    +

    + Благодаря хорошему образованию и знанию иностранных языков, после окончания университета, смог устроиться в + известную международную компанию – Т-Системс (подразделение Deutsche Telekom’a). +

    +

    + Первый проект был «околоджавный», если так можно сказать☺ : 50% было джава, в основом Core, 50% - Message Broker + от + IBM’a. Тем не менее, это дало отличную возможность углубить знания в синтаксисе языка, а также познакомиться с + применением джавы в других приложениях. +

    +

    + Большой шаг вперёд произошёл, когда я смог попасть в java-school, организованную внутри компании. Она позволяет + за + короткий период (около 2х месяцев) в интенсивном режиме познакомиться с новыми технологиями и популярными + фреймворками, которые активно используются в повседневной работе. Результатом прохождения java-school стало + сдача + мною сертификата Oracle Certified Professional, Java SE 6 Programmer, а также рост по карьерной лестницы. +

    +

    Дополнительное развитие

    +

    + Чтобы расти как профессионал нужно постоянное развитие, в т.ч. и самостоятельное. Помимо чтения специализированной + литературы, посещение конференций и просмотра обучающего видео, хорошей возможностью для роста и развития стал + вебинар от Григорий Кислина по популярным технологиям в мире Java: Java Enterprise (Topjava). Данный курс позволяет + в интерактивной режиме построить небольшое но полнофункциональное веб-приложение, где половину работы выполняет сам + участник вебинара. Таким образом полученные знания намного лучше усваиваются и могут быть применены в других + проектам самостоятельно. +

    +

    Настоящее и будущее

    +

    + В настоящее время, я продолжаю работу в компании Т-Системс в проекте Swiss Federal Railways, в качестве Тим-лида одной из её подсистем. +

    +

    + Хочется пожелать всем удачи, особенно начинающим разработчикам. На пути в ИТ-сфере, всегда много трудностей, но главное не сдаваться перед ними и идти вперёд и всё у вас получится! +

    +
    + Дмитрий Королев, 13/04/2016 +
    + К списку историй +
    +
    + + + + + + + + + \ No newline at end of file From 9058d6fa1f156c077e0cecc30fb831104155a75b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 13 Apr 2016 21:36:38 +0300 Subject: [PATCH 087/936] fix vacancy --- resources/vacation/technodiasoft.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index 48dcce8..5fb431f 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -21,7 +21,7 @@

    Требования

    - Обязательно: Core Java (5, 6), JSP, Axis, SOAP, JSP, Oracle RDBMS + Обязательно: Core Java (5, 6), JSP, Axis, SOAP, Oracle RDBMS

    Желательно: Struts 1, JavaScript, JMS, Hibernate, J2EE From 65ab7b781bf031013decf02485fe8db2f65033f5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 13 Apr 2016 21:44:07 +0300 Subject: [PATCH 088/936] fix test vacancy --- resources/vacation/test.html | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 646af0e..0049208 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -36,6 +36,7 @@

    Темы тестового собеседования:

  • фреймворка коллекций
  • принципов работы ORM
  • JMM и принципов многопоточности в Java (happened-before, CAS)
  • +
  • паттернов проектирования
  • транзакционности: ACID, уровни изоляции
  • From 6137cfde4d3a50a49861810f0c3b6013bee8f641 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 14 Apr 2016 19:17:19 +0300 Subject: [PATCH 089/936] Add topjava lesson07 --- resources/mails/topjava/lesson07.html | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 resources/mails/topjava/lesson07.html diff --git a/resources/mails/topjava/lesson07.html b/resources/mails/topjava/lesson07.html new file mode 100644 index 0000000..c2a0107 --- /dev/null +++ b/resources/mails/topjava/lesson07.html @@ -0,0 +1,24 @@ + + + + Седьмое занятие проекта TopJava Enterprise + + +

    + Здравствуй firstName! +

    +

    +Выложил седьмое занятие нашего проекта.
    +REST контроллеры и тестирование контроллеров. +

    +

    + Перед накаткой патча 0 код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
    + Обсуждение урока и ДЗ в slack #lesson07 +

    +

    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 19.04
    +

    +

    +

    + + \ No newline at end of file From a92ca6abc1ef3274ec1410d77d5997d15e6375cf Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 15 Apr 2016 19:26:32 +0300 Subject: [PATCH 090/936] webapp6 start --- resources/mails/basejava/webinar_start.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/basejava/webinar_start.html b/resources/mails/basejava/webinar_start.html index 755890d..d8d62da 100644 --- a/resources/mails/basejava/webinar_start.html +++ b/resources/mails/basejava/webinar_start.html @@ -7,7 +7,7 @@

    Здравствуй firstName!

    -Напоминаю про старт в 20.00 (GMT+3) вебинара "Java. Разработка Web приложения" в комнате Adobe meeting.
    +Напоминаю про старт в 20.00 (GMT+3) вебинара "Java. Разработка Web приложения" в комнате Adobe meeting.

    До встречи на вебинаре,
    Григорий Кислин
    From 50d417d6be5f8fbc1febbdc54d6d33c0aeb67650 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 19 Apr 2016 19:55:11 +0300 Subject: [PATCH 091/936] update webinar_start --- resources/mails/basejava/webinar_start.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/mails/basejava/webinar_start.html b/resources/mails/basejava/webinar_start.html index d8d62da..6bdfecb 100644 --- a/resources/mails/basejava/webinar_start.html +++ b/resources/mails/basejava/webinar_start.html @@ -1,13 +1,15 @@ - Вебинар "Java. Разработка Web приложения" сегодня, в 20.00 (GMT+3) + Вебинар "Java. Разработка Web приложения" сегодня, в 21.00 (GMT+3)

    Здравствуй firstName!

    -Напоминаю про старт в 20.00 (GMT+3) вебинара "Java. Разработка Web приложения" в комнате Adobe meeting.
    +Старт вебинара 7-го занятия сегодня в 21.00 (GMT+3) в комнате Adobe meeting.
    +Реализация DataStreamFileStorage домашнего задания будет в отредактированном видео, дам вам на него ссылку уже после вебинара (как зальется в Google Drive). +На последовательность изложения это не влияет: мы сегодня заканчиваем с различными реализациями AbstractFileStorage.

    До встречи на вебинаре,
    Григорий Кислин
    From acd2a75ad3f39c42ccab79ab8c35ac3b2991d8d8 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 21 Apr 2016 19:29:56 +0300 Subject: [PATCH 092/936] update webinar_start --- resources/mails/topjava/lesson08.html | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 resources/mails/topjava/lesson08.html diff --git a/resources/mails/topjava/lesson08.html b/resources/mails/topjava/lesson08.html new file mode 100644 index 0000000..0e1c14d --- /dev/null +++ b/resources/mails/topjava/lesson08.html @@ -0,0 +1,24 @@ + + + + Восьмое занятие проекта TopJava Enterprise + + +

    + Здравствуй firstName! +

    +

    +Выложил восьмое занятие нашего проекта.
    + CSS (Bootstrap), JavaScript (jQuery + plugins), AJAX, добавление к REST контроллерам базовой авторизации. +

    +

    + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. + Обсуждение урока и HW8 в Slack #lesson08 +

    +

    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 26.04
    +

    +

    +

    + + \ No newline at end of file From fed676fe77a9b39a5eee84cc4f134b2ebd89853b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 22 Apr 2016 00:50:09 +0300 Subject: [PATCH 093/936] Update vacancies --- resources/vacation/technodiasoft.html | 4 ++-- resources/vacation/test.html | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index 5fb431f..6d0e807 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -24,7 +24,7 @@

    Требования

    Обязательно: Core Java (5, 6), JSP, Axis, SOAP, Oracle RDBMS

    - Желательно: Struts 1, JavaScript, JMS, Hibernate, J2EE + Желательно: JavaScript, JMS, Hibernate, J2EE

    Желательно опыт работы с: IBM WebSphere Application Server или другими промышленными СП, IBM WebSphere MQ @@ -33,7 +33,7 @@

    Требования

    Среда разработки: IntelliJ IDEA

    - Инфраструктура разработки: Git, Ant + Инфраструктура разработки: Git

    Понимание принципов создания многопоточных приложений. Умение читать и понимать модели: ER-диаграммы, ООМ. diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 0049208..2d50108 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -19,18 +19,12 @@

    -

    Темы тестового собеседования:

    +

    Примеры темы тестового собеседования:

    - Объязательно: Core Java 8, Servlet/JSP/Tomcat, JPA, Spring MVC, REST, SQL + Объязательно: Core Java, Servlet/JSP/Tomcat, JPA, Spring MVC, REST, SQL

    -

    - Желательно: JavaScript, AJAX, jQuery, принципы NoSQL -

    -

    - Инфраструктура разработки: Git, Maven -

    -

    -

      Хорошее понимание: + Хорошее понимание: +
      • принципов ООП;
      • объектной модели Java
      • фреймворка коллекций
      • @@ -40,8 +34,15 @@

        Темы тестового собеседования:

      • транзакционности: ACID, уровни изоляции

      - Желательно: Stream API, ковариантность, дженерики. + Желательно: Java 8, JavaScript, AJAX, jQuery, принципы NoSQL +

      +

      + Инфраструктура разработки: Git, Maven +

      +

      + Время собеседование: 35 мин или 1 час.

      +

      Возможно собеседование по вашей вакансии.

    \ No newline at end of file From 44766dd5c50c85bee4d68234fe4647c2a7b1803d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 22 Apr 2016 00:56:18 +0300 Subject: [PATCH 094/936] Update vacancies --- resources/vacation/test.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 2d50108..d1b40ae 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -19,7 +19,7 @@
    -

    Примеры темы тестового собеседования:

    +

    Примеры тем тестового собеседования:

    Объязательно: Core Java, Servlet/JSP/Tomcat, JPA, Spring MVC, REST, SQL

    From 07a322a3c363435215cb3b62b3f06e5b39a5a05a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 22 Apr 2016 01:00:00 +0300 Subject: [PATCH 095/936] Update vacancies --- resources/view/index.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index 2a65367..f133a02 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -117,8 +117,7 @@

    Техническое собеседование Java разработчи

    Тестовое интервью

    Core Java 8, OOP, JMM/Concurrency, Servlet/JSP, JPA, Spring MVC, REST, SQL, Maven

    Техно Диасофт для СберТех

    -

    Core Java (5, 6), Concurrency, JSP, Axis, SOAP, JSP, Oracle, Struts 1, JavaScript, JMS, Hibernate, J2EE, Git, - Ant

    +

    Core Java, Concurrency, JSP, Axis, SOAP, JSP, Oracle, JavaScript, JMS, Hibernate, J2EE, Git


    Стажировка на Java Web и Java Enterprise

    Top Java Enterprise:
    наиболее From 2681bccc8a6b144701bbaa7f1618287544d45c46 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 22 Apr 2016 03:26:06 +0300 Subject: [PATCH 096/936] Update test interview --- resources/static/img/test_interview.png | Bin 0 -> 24067 bytes resources/vacation/test.html | 55 +++++++++++++----------- 2 files changed, 31 insertions(+), 24 deletions(-) create mode 100644 resources/static/img/test_interview.png diff --git a/resources/static/img/test_interview.png b/resources/static/img/test_interview.png new file mode 100644 index 0000000000000000000000000000000000000000..487a3668a791c9e37656e68af1388dd8f8b18477 GIT binary patch literal 24067 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

    -

    Примеры тем тестового собеседования:

    -

    - Объязательно: Core Java, Servlet/JSP/Tomcat, JPA, Spring MVC, REST, SQL -

    - Хорошее понимание: -
      -
    • принципов ООП;
    • -
    • объектной модели Java
    • -
    • фреймворка коллекций
    • -
    • принципов работы ORM
    • -
    • JMM и принципов многопоточности в Java (happened-before, CAS)
    • -
    • паттернов проектирования
    • -
    • транзакционности: ACID, уровни изоляции
    • -
    -

    - Желательно: Java 8, JavaScript, AJAX, jQuery, принципы NoSQL -

    -

    - Инфраструктура разработки: Git, Maven -

    -

    - Время собеседование: 35 мин или 1 час. -

    -

    Возможно собеседование по вашей вакансии.

    +
    +
    +

    Примеры тем тестового собеседования:

    +

    + Объязательно: Core Java, Servlet/JSP/Tomcat, JPA, Spring MVC, REST, SQL +

    + Хорошее понимание: +
      +
    • принципов ООП;
    • +
    • объектной модели Java
    • +
    • фреймворка коллекций
    • +
    • принципов работы ORM
    • +
    • JMM и принципов многопоточности в Java (happened-before, CAS)
    • +
    • паттернов проектирования
    • +
    • транзакционности: ACID, уровни изоляции
    • +
    +

    + Желательно: Java 8, JavaScript, AJAX, jQuery, принципы NoSQL +

    +

    + Инфраструктура разработки: Git, Maven +

    +

    + Время собеседование: 35 мин или 1 час. +

    +

    Возможно собеседование по вашей вакансии.

    +
    +
    + +
    +
    \ No newline at end of file From e7195f4c4bf3d2dc78d9e8a3465a9b5cef49e6a5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 22 Apr 2016 03:32:20 +0300 Subject: [PATCH 097/936] Update test interview --- resources/vacation/test.html | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 9409aeb..272adf0 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -18,8 +18,7 @@ -
    -
    +

    Примеры тем тестового собеседования:

    @@ -47,9 +46,9 @@

    Примеры тем тестового собеседования:

    Возможно собеседование по вашей вакансии.

    - + +
    -
    \ No newline at end of file From 86e417132e97abce9284f0b34d8824aca0cf01f8 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 22 Apr 2016 03:34:42 +0300 Subject: [PATCH 098/936] Update test interview --- resources/vacation/test.html | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 272adf0..8da328d 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -40,14 +40,15 @@

    Примеры тем тестового собеседования:

    Инфраструктура разработки: Git, Maven

    +

    - Время собеседование: 35 мин или 1 час. + Время собеседование: 35 мин или 1 час.

    -

    Возможно собеседование по вашей вакансии.

    +

    Возможно собеседование по вашей вакансии.

    - - + +
    From 5665ed2534cc58c46080b91b6fc38427ad004f9d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 22 Apr 2016 12:52:12 +0300 Subject: [PATCH 099/936] Update test interview --- resources/vacation/test.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 8da328d..320496e 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -20,9 +20,9 @@
    -

    Примеры тем тестового собеседования:

    +

    Темы тестового собеседования:

    - Объязательно: Core Java, Servlet/JSP/Tomcat, JPA, Spring MVC, REST, SQL + Объязательно: Core Java, Servlet/JSP/Tomcat, REST, SQL

    Хорошее понимание:
      @@ -34,6 +34,9 @@

      Примеры тем тестового собеседования:

    • паттернов проектирования
    • транзакционности: ACID, уровни изоляции
    +

    + JavaEE: JPA/Hibernate, DAO, Spring MVC, JUnit +

    Желательно: Java 8, JavaScript, AJAX, jQuery, принципы NoSQL

    From 8eaa4188d1ba3997ddb307f1a99b2f8520e02f2d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 22 Apr 2016 13:58:10 +0300 Subject: [PATCH 100/936] Update sbertech vacation --- resources/vacation/technodiasoft.html | 14 ++++++++++++-- topjava2.md | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index 6d0e807..9fb21b6 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -18,8 +18,10 @@
    -
    -

    Требования

    +
    + +

    Вакансия: Java разработчик (Москва, СберТех)

    +

    Обязательно: Core Java (5, 6), JSP, Axis, SOAP, Oracle RDBMS

    @@ -43,6 +45,14 @@

    Требования

    Опыт разработки высоконагруженных веб приложений в многозвенной архитектуре, работающих в режиме 24х7. Желательно опыт разработки банковских приложений.

    +
    + Разработчики сначала будут изучать систему в ее текущем виде. + Далее будет переход на новые технологии (ближайшее время). + «Морда» останется та же, все остальное будет претерпевать изменения… +
    + ЗП: до 150 тр. брутто (с учетом налогов)
    + Общее требования: уровень middle (опыт разработки от 1 года).
    + Для прохождения технического собеседования добавляйтесь в скайп: grigory.kislin
    \ No newline at end of file diff --git a/topjava2.md b/topjava2.md index a8fcf6a..77727fa 100644 --- a/topjava2.md +++ b/topjava2.md @@ -90,6 +90,7 @@ namei -om /home/ec2-user/javaops/static/index.html
    How do I run a Unix process in the background? +- Startup scripts ## External properties http://www.javabeat.net/spring-boot-external-configurations/ From 3c3765c5a69bce9d9b02cdf1e3e75d05b6ed8217 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 22 Apr 2016 14:01:24 +0300 Subject: [PATCH 101/936] Update sbertech vacation --- resources/vacation/technodiasoft.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index 9fb21b6..588f691 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -20,7 +20,7 @@
    -

    Вакансия: Java разработчик (Москва, СберТех)

    +

    Вакансия: Java разработчик (Москва, проект СберТех)


    Обязательно: Core Java (5, 6), JSP, Axis, SOAP, Oracle RDBMS From d5ae155f72ebe77254f832ae68c7a323974a9830 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 22 Apr 2016 20:39:21 +0300 Subject: [PATCH 102/936] Update basejava webinar start --- resources/mails/basejava/webinar_start.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/mails/basejava/webinar_start.html b/resources/mails/basejava/webinar_start.html index 6bdfecb..1c9de38 100644 --- a/resources/mails/basejava/webinar_start.html +++ b/resources/mails/basejava/webinar_start.html @@ -7,9 +7,8 @@

    Здравствуй firstName!

    -Старт вебинара 7-го занятия сегодня в 21.00 (GMT+3) в комнате Adobe meeting.
    -Реализация DataStreamFileStorage домашнего задания будет в отредактированном видео, дам вам на него ссылку уже после вебинара (как зальется в Google Drive). -На последовательность изложения это не влияет: мы сегодня заканчиваем с различными реализациями AbstractFileStorage. +Старт вебинара 8-го занятия сегодня в 21.00 (GMT+3) в комнате Adobe meeting.
    +В уроке есть видео "Потоки. Параллельное выполнение" для самостоятельного просмотра (обновите проект, класс MainConcurrency).

    До встречи на вебинаре,
    Григорий Кислин
    From 134274384d0d12db5b40c7021fb554da4faca92e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 23 Apr 2016 23:54:47 +0300 Subject: [PATCH 103/936] Update html --- resources/story.html | 13 +++------- resources/story/story1.html | 26 +++++++++---------- resources/story/story2.html | 24 ++++++++--------- resources/story/story3.html | 24 ++++++++--------- resources/story/story4.html | 26 +++++++++---------- resources/story/story5.html | 26 +++++++++---------- resources/story/story6.html | 24 ++++++++--------- resources/story/story7.html | 26 +++++++++---------- resources/vacation/technodiasoft.html | 8 +++--- resources/vacation/test.html | 10 +++---- resources/view/activation.html | 8 +++--- resources/view/exception.html | 6 ++--- resources/view/fragments.html | 2 +- resources/view/message.html | 9 +++---- resources/view/participation.html | 11 ++++---- .../config/ThymeleafConfiguration.java | 4 +-- 16 files changed, 120 insertions(+), 127 deletions(-) diff --git a/resources/story.html b/resources/story.html index ac30ac5..e23d177 100644 --- a/resources/story.html +++ b/resources/story.html @@ -1,16 +1,11 @@ - - - - - Истории - - - - + + + +

    - +

    В данный момент я работаю в западной корпорации на должности ИТ-администратора: системы коммуникаций на базе Asterisk (офисная телефония, центры обработки вызовов итд), также занимаюсь системами виртуализации и базами @@ -77,16 +77,16 @@

    Что в итоге?


    Иван Виноградов, 04/03/2016
    - К списку историй + К списку историй

    - - - - - - + + + + + + diff --git a/resources/story/story2.html b/resources/story/story2.html index 0fbb788..a1da4fa 100644 --- a/resources/story/story2.html +++ b/resources/story/story2.html @@ -2,11 +2,11 @@ Истории - - - - - + + + + +
    - - - - - - + + + + + + diff --git a/resources/story/story3.html b/resources/story/story3.html index 55ed9ab..841946e 100644 --- a/resources/story/story3.html +++ b/resources/story/story3.html @@ -7,11 +7,11 @@ Истории - - - - - + + + + +
    - - - - - - + + + + + + diff --git a/resources/story/story4.html b/resources/story/story4.html index 0888b1d..dad6e79 100644 --- a/resources/story/story4.html +++ b/resources/story/story4.html @@ -7,11 +7,11 @@ Истории - - - - - + + + + +
    - +

    Начало

    Программировать я начал в школе на Электронике МК-61, целых 105 иструкций. В журналах "Наука и жизнь", "Техника Молодежи" были программки игр, умещающиеся в @@ -143,16 +143,16 @@

    Светлое настоящее

    Григорий Кислин, 15/03/2016
    - К списку историй + К списку историй

    - - - - - - + + + + + + diff --git a/resources/story/story5.html b/resources/story/story5.html index 895e052..1571e6e 100644 --- a/resources/story/story5.html +++ b/resources/story/story5.html @@ -7,11 +7,11 @@ Истории - - - - - + + + + +
    - +

    Добрый день.

    @@ -80,16 +80,16 @@

    TopJava


    Лев Хачересьянц, 16/03/2016
    - К списку историй + К списку историй

    - - - - - - + + + + + + diff --git a/resources/story/story6.html b/resources/story/story6.html index dada22d..573117d 100644 --- a/resources/story/story6.html +++ b/resources/story/story6.html @@ -7,11 +7,11 @@ Истории - - - - - + + + + +
    - - - - - - + + + + + + diff --git a/resources/story/story7.html b/resources/story/story7.html index 81d220e..7019907 100644 --- a/resources/story/story7.html +++ b/resources/story/story7.html @@ -7,11 +7,11 @@ Истории - - - - - + + + + +
    - +

    Обучение

    Обучение на престижной кафедре Технической Кибернетики в СПБГПУ дало хороший старт для развития в области @@ -69,16 +69,16 @@

    Настоящее и будущее


    Дмитрий Королев, 13/04/2016
    - К списку историй + К списку историй

    - - - - - - + + + + + + diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index 588f691..205b084 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -2,10 +2,10 @@ Техно Диасофт - - - - + + + + diff --git a/resources/view/activation.html b/resources/view/activation.html index 0ceb034..a3eea57 100644 --- a/resources/view/activation.html +++ b/resources/view/activation.html @@ -1,10 +1,10 @@ - + Изменение подписки - - - + + +

    Несколько раз делал перерыв на неделю и даже две. Думал даже вообще бросить все. Каждое утро я просыпался с мыслью: "Как мне написать приложение?". Уже была изучена библиотека для работы с Asterisk, но как связать базу, веб, астериск и полностью развернуть свое - приложения у меня не было представления. -

    Перехват мастерства

    + приложения у меня не было представления.

    +

    Перехват мастерства

    +

    Как-то раз в один из мрачных вечеров я нашел на javarush описание курса topjava и сразу понял, что это то, что я ищу. @@ -67,13 +69,16 @@

    Перехват мастерства

    помогал решить трудные задачи, которые от урока к уроку возникали в процессе написания приложения "Расчет каллорий". Мне кажется, что для эффективного изучения очень важно, чтобы чувствовалась поддержка преподавателя. У Григория это очень хорошо получалось - всегда оперативно оказывал помощь в сложных моментах работы с фреймворками и фронтендом. -

    Что в итоге?

    +

    +

    Что в итоге?

    +

    Приложение автообзвон готово и уже эффективно работает в тестовом режиме в одном небольшом контакт-центре. Ради спортивного интереса я сходил на несколько собеседований, в 2 из 3 прошел на должность джуниора. Сейчас менять место работы не планирую: в моей компании меня сейчас пригласили принять участие в новом проекте на основе java+extJS, что открывает новые карьерные горизонты. Конечно еще много неуверенности и нужно улучшать навыки программирования. С нетерпением жду курса по Григория masterjava. +


    Иван Виноградов, 04/03/2016
    diff --git a/resources/story/story2.html b/resources/story/story2.html index a1da4fa..431af36 100644 --- a/resources/story/story2.html +++ b/resources/story/story2.html @@ -19,13 +19,13 @@ -
    +

    Всем привет!

    -

    +

    Меня зовут Григорий1, и я джавист. -

    +

    Желание стать разработчиком ПО появилось у меня довольно давно, в 2013 году.

    Тогда я занимался не связанными с diff --git a/resources/story/story3.html b/resources/story/story3.html index 841946e..3efaa5b 100644 --- a/resources/story/story3.html +++ b/resources/story/story3.html @@ -24,9 +24,9 @@ -
    +

    Закончился испытательный срок и пришло время рассказать “как я стал программистом”.

    -

    История успеха длиной в год

    +

    История успеха длиной в год

    В ноябре 2014 года я прекратил свою полуторадесятилетнюю деятельность никак не связанную с IT и начал искать себя. В наличии были умение и интерес работать с данными. К этому моменту, уже несколько лет я делал бесплатно и @@ -36,7 +36,7 @@

    История успеха длиной в год

    видел до этого такие языки как Java и C++, а в далекие 90е писал на Pascal'е и Basic'е. В итоге, взглянув на круг интересуемых задач, конечный выбор пал на Java. И пошел процесс обучения…

    -

    Первый заход

    +

    Первый заход

    Основы программирования были понятны, синтаксис простых программ тоже был давно изучен - за спиной была пара простейших Android приложений, собранных по урокам и несколько классов Java, которые решали мои бытовые вопросы (один из них пересчитывал параметры покрышек для разных размеров дисков).

    @@ -51,7 +51,7 @@

    Первый заход

    задачи, внешние библиотеки и… ...30й уровень. К нему я подошел к началу августа. За спиной были сотни часов кодинга и много тысяч строк кода. Подошел этап реального проекта, который входил в стоимость пакета приобретенного на JR. К этому моменту я уже объективно понимал требования к программисту Java и иллюзий не питал. -

    Проект

    +

    Проект

    Тестовое задание сразу обозначило мой уровень программирования на уровень чуть выше нуля и я с нетерпением ожидал первых лекций и заданий. Не стану углубляться в стек технологий и описание курса - все именно то, что сейчас требуют от соискателей и правдивый обзор самого курса предлагает сам автор. Коснусь тех вещей, которые не все, как мне @@ -63,7 +63,7 @@

    Проект

    главное, но очень даже полезное. Если ты не знаешь технологий и хочешь их знать - тебе на TopJava. -

    Дополнительные знания

    +

    Дополнительные знания

    Не могу не дополнить представление о моем обучении. Помимо того, что я сидел от 8 до 15 часов в день за компьютером и решал задачи, я глядел вокруг и вот перечень того, что надо хотя бы потрогать: mysql, postgresql, mongo, js, html, css, linux (debian, mint, ubuntu - выбирай любой), spring boot, freemarker.Дополнительные знания

    иностранные заказчики. Возможно вам придется с ними общаться - я был на общем митинге через полтора месяца. В международных компаниях в багтрекерах вся информация тоже на английском языке. Читайте книги. На любом языке, но лучше в оригинале. -

    Собеседования

    +

    Собеседования

    Для меня самый познавательный этап. Тут я узнал что конкретно хотят получить от соискателя, подтянул знания в соответствии с требованиями. Старался попадать на собеседования Middle разработчиков и избегал Junior, но и они случались. На Senior не был ни разу. Первое, что обозначилось в мозгу: независимо от позиции на которую ты @@ -86,7 +86,7 @@

    Собеседования

    надо отдавать себе отчет в том, что их должно пройти немало, прежде чем ты найдешь ту работу, которая устроит тебя и где устроишь ты. Все собеседования до этого ключевого - твой путь, который надо пройти, пережить разочарования, сделать выводы и пойти дальше. На этом этапе важно не забывать об этом ни на минуту. -

    Сейчас

    +

    Сейчас

    На данный момент закончился третий, заключительный месяц испытательного срока в крупной компании-аутсорсере и я много раз вспомнил добрым словом проект TopJava и JavaRush. У меня нет градации, но, как мне кажется, у меня уровень Middle. Вопросов я не задаю - сказывается опыт участия в реальном проекте, задачи получаю большие и решение о diff --git a/resources/story/story4.html b/resources/story/story4.html index dad6e79..232d4fa 100644 --- a/resources/story/story4.html +++ b/resources/story/story4.html @@ -24,9 +24,9 @@ -
    +
    -

    Начало

    +

    Начало

    Программировать я начал в школе на Электронике МК-61, целых 105 иструкций. В журналах "Наука и жизнь", "Техника Молодежи" были программки игр, умещающиеся в 96 инструкций БЗ-34, например, посадка на Луну. @@ -43,7 +43,7 @@

    Начало


    -

    Встреча с Java

    +

    Встреча с Java

    Возвратиться в программирование в 2005 году после 8 лет работы в Alcatel инженером по тестированию телефонной станции было нелегко: взяли в Siemens на java как специалиста по предметной обасти. Причем, пока ждал ответа от Siemens, пришлось отказаться от перехода внутри Alcatel на вакансию программиста C++. @@ -96,7 +96,7 @@

    Нужно бежать со всех ног, чтобы только ост
  • наконец: уходить надо вовремя.
  • -

    Тренер Java

    +

    Тренер Java

    Работы бывают разные: расслабление и застой, если сам не находишь себе достойных занятий (особенно в конторах, где программирование непрофильное или новички в бизнесе) или впахивание с ежедневными стэндапами. Для самообразования лучше первые, для получения насыщенного опыта - вторые. Работая расслаблено, задумался о @@ -114,7 +114,7 @@

    Тренер Java

    преподавателем. А я стал сам вести вебинары по разработке Web и скрести по всем сусекам для набора на первй выпуск Topjava: запустил его в августе 2014, набралось целых 6 человек! -

    Светлое настоящее

    +

    Светлое настоящее

    Сейчас идет 6-й выпуск проекта Topjava, в команде slack обучается 115 человек. На сегодняшний день это мой самый востребованный проект и самые востребованные на рынке Java фреймворки, diff --git a/resources/story/story5.html b/resources/story/story5.html index 1571e6e..39e0d78 100644 --- a/resources/story/story5.html +++ b/resources/story/story5.html @@ -24,7 +24,7 @@
    -
    +

    Добрый день. @@ -32,7 +32,7 @@

    По просьбе коллеги, решил написать свою историю трудоустройства программистом.

    -

    Обучение

    +

    Обучение

    До того как стать программистом, я работал проектировщиком сетей связи. Но решил стать программистом, т.к. идея автоматизации разных процессов @@ -44,7 +44,7 @@

    Обучение

    поиске разных курсов, я наткнулся на школу разработки в Digital Design. Я подал заявку.

    -

    Digital Design

    +

    Digital Design

    Первую часть курса школы включала в себя изучение Java Core. Вторая часть предполагала - реальный проект (что-то наподобие TopJava, но большую часть изучали сами, по примерам и туториалам). С Core проблем не было, но вот @@ -65,7 +65,7 @@

    Digital Design

    Проект я доделать не успел т.к. посетив 4-5 собеседований, я получил два предложения. Общее время, потраченное на подготовку и трудоустройство, составляло 4-5 месяцев. Три из них я по 8 часов в день ходил на стажировку.

    -

    TopJava

    +

    TopJava

    После полутора лет коммерческой разработки и использования фреймворков компании, решил обновить свои знания по OpenSource технологиям. Проект TopJava для этого подошел идеально. Я узнал новые возможности Java 8, поработал diff --git a/resources/story/story6.html b/resources/story/story6.html index 573117d..45fd5d2 100644 --- a/resources/story/story6.html +++ b/resources/story/story6.html @@ -24,8 +24,8 @@

    -
    -

    Как я стал Java-разработчиком

    +
    +

    Как я стал Java-разработчиком

    После окончания технического университета в течение около десяти лет я работал разработчиком электронной аппаратуры. Сначала разрабатывал схемы и печатные платы, писал программы для микроконтроллеров на Ассемблере и diff --git a/resources/story/story7.html b/resources/story/story7.html index 7019907..dc6156e 100644 --- a/resources/story/story7.html +++ b/resources/story/story7.html @@ -24,14 +24,14 @@

    -
    +
    -

    Обучение

    +

    Обучение

    Обучение на престижной кафедре Технической Кибернетики в СПБГПУ дало хороший старт для развития в области информационных технологий.

    -

    Начало карьеры

    +

    Начало карьеры

    Благодаря хорошему образованию и знанию иностранных языков, после окончания университета, смог устроиться в известную международную компанию – Т-Системс (подразделение Deutsche Telekom’a). @@ -50,7 +50,7 @@

    Начало карьеры

    сдача мною сертификата Oracle Certified Professional, Java SE 6 Programmer, а также рост по карьерной лестницы.

    -

    Дополнительное развитие

    +

    Дополнительное развитие

    Чтобы расти как профессионал нужно постоянное развитие, в т.ч. и самостоятельное. Помимо чтения специализированной литературы, посещение конференций и просмотра обучающего видео, хорошей возможностью для роста и развития стал @@ -59,7 +59,7 @@

    Дополнительное развитие

    участник вебинара. Таким образом полученные знания намного лучше усваиваются и могут быть применены в других проектам самостоятельно.

    -

    Настоящее и будущее

    +

    Настоящее и будущее

    В настоящее время, я продолжаю работу в компании Т-Системс в проекте Swiss Federal Railways, в качестве Тим-лида одной из её подсистем.

    From 291c1772be546b17ea711846a285d3518fca0b44 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 28 Apr 2016 17:46:12 +0300 Subject: [PATCH 105/936] Add lesson09 --- resources/mails/topjava/lesson09.html | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 resources/mails/topjava/lesson09.html diff --git a/resources/mails/topjava/lesson09.html b/resources/mails/topjava/lesson09.html new file mode 100644 index 0000000..2be896d --- /dev/null +++ b/resources/mails/topjava/lesson09.html @@ -0,0 +1,24 @@ + + + + Девятое занятие проекта TopJava Enterprise + + +

    + Здравствуй firstName! +

    +

    +Выложил девятое занятие нашего проекта.
    +Наконец делаем настоящую авторизацию, ее тестирование и отрисовку таблицы по AJAX. +

    +

    + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. + Обсуждение урока и HW9 в Slack #lesson09 +

    +

    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 03.05
    +

    +

    +

    + + \ No newline at end of file From a7290a9f1b5aa7544cf1595601fd0e853bedd093 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 28 Apr 2016 22:41:21 +0300 Subject: [PATCH 106/936] Update technodiasoft --- resources/vacation/technodiasoft.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index 205b084..11a4e2a 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -2,10 +2,10 @@ Техно Диасофт - - - - + + + + From 09f407da13e2f1c8c3c3ae2740badfb3387804dd Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 28 Apr 2016 23:03:14 +0300 Subject: [PATCH 108/936] Update technodiasoft --- resources/vacation/technodiasoft.html | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index 6443130..dfa37ec 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -20,16 +20,16 @@
    -

    Вакансия: Java разработчик (Москва, проект СберТех)

    +

    Вакансия: Java разработчик
    (Москва, Санкт-Петербург, проект СберТех)


    - Обязательно: Core Java (5, 6), JSP, Axis, SOAP, Oracle RDBMS + Общее требования: уровень middle.

    - Желательно: JavaScript, JMS, Hibernate, Struts-1, J2EE + Обязательно: Core Java (5, 6), JSP, RDBMS (желательно Oracle)

    - Желательно опыт работы с: IBM WebSphere Application Server или другими промышленными СП, IBM WebSphere MQ + Желательно: JavaScript, JMS, Hibernate, Struts-1, J2EE, Axis, SOAP, опыт работы с IBM WebSphere Application Server (или другими AS), IBM WebSphere MQ

    Среда разработки: IntelliJ IDEA @@ -38,20 +38,15 @@

    Вакансия: Java разработчик (Москва, проект С Инфраструктура разработки: Git

    - Понимание принципов создания многопоточных приложений. Умение читать и понимать модели: ER-диаграммы, ООМ. - Уверенное знание и практика работы как разработчика с СУБД Oracle. Навыки проектирования БД приветствуются. + Понимание принципов создания многопоточных приложений. Уверенное знание и практика работы как разработчика с СУБД. + Навыки проектирования БД приветствуются. Желательно опыт разработки банковских приложений.

    -

    - Опыт разработки высоконагруженных веб приложений в многозвенной архитектуре, работающих в режиме 24х7. - Желательно опыт разработки банковских приложений. -

    -
    +

    Разработчики сначала будут изучать систему в ее текущем виде. Далее будет переход на новые технологии (ближайшее время). - «Морда» останется та же, все остальное будет претерпевать изменения… -


    - ЗП: до 150 тр. брутто (с учетом налогов)
    - Общее требования: уровень middle.
    + «Морда» останется та же, все остальное будет претерпевать изменения…
    +

    + ЗП: до 150 тр. брутто (с учетом налогов)
    Для прохождения технического собеседования добавляйтесь в скайп: grigory.kislin

    From d450c47aa2b38debec5a3ed8b8e508eed04cf6c6 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 28 Apr 2016 23:18:39 +0300 Subject: [PATCH 109/936] Update technodiasoft --- resources/vacation/technodiasoft.html | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index dfa37ec..de27577 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -23,13 +23,15 @@

    Вакансия: Java разработчик
    (Москва, Санкт-Петербург, проект СберТех)


    - Общее требования: уровень middle.
    + Общее требования: уровень middle.
    + ЗП: до 150 000 руб.

    Обязательно: Core Java (5, 6), JSP, RDBMS (желательно Oracle)

    - Желательно: JavaScript, JMS, Hibernate, Struts-1, J2EE, Axis, SOAP, опыт работы с IBM WebSphere Application Server (или другими AS), IBM WebSphere MQ + Желательно: JavaScript, JMS, Hibernate, Struts-1, J2EE, Axis, SOAP, опыт работы с IBM WebSphere + Application Server (или другими AS), IBM WebSphere MQ

    Среда разработки: IntelliJ IDEA @@ -38,15 +40,23 @@

    Вакансия: Java разработчик
    (Москва, Санкт Инфраструктура разработки: Git

    - Понимание принципов создания многопоточных приложений. Уверенное знание и практика работы как разработчика с СУБД. + Понимание принципов создания многопоточных приложений. Уверенное знание и практика работы как разработчика с + СУБД. Навыки проектирования БД приветствуются. Желательно опыт разработки банковских приложений.

    +

    +

      Условия +
    • Официальное оформление
    • +
    • Оплата жилья иногородним
    • +
    • Полный рабочий день
    • +
    • На территории работодателя
    • +
    +

    - Разработчики сначала будут изучать систему в ее текущем виде. - Далее будет переход на новые технологии (ближайшее время). - «Морда» останется та же, все остальное будет претерпевать изменения… + Разработчики сначала будут изучать систему в ее текущем виде. + Далее будет переход на новые технологии (ближайшее время). + «Морда» останется та же, все остальное будет претерпевать изменения…

    - ЗП: до 150 тр. брутто (с учетом налогов)
    Для прохождения технического собеседования добавляйтесь в скайп: grigory.kislin

    From 032d7069039d343984038379a31c803ec6b56747 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 28 Apr 2016 23:23:18 +0300 Subject: [PATCH 110/936] Update technodiasoft --- resources/vacation/technodiasoft.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index de27577..6977c8a 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -47,7 +47,7 @@

    Вакансия: Java разработчик
    (Москва, Санкт

      Условия
    • Официальное оформление
    • -
    • Оплата жилья иногородним
    • +
    • Возможна оплата жилья иногородним
    • Полный рабочий день
    • На территории работодателя
    From 684f9acc3bb6557d8d02d72e51e60f28405fc328 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 29 Apr 2016 13:27:24 +0300 Subject: [PATCH 111/936] Update technodiasoft --- resources/vacation/technodiasoft.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index 6977c8a..fe197a7 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -23,8 +23,7 @@

    Вакансия: Java разработчик
    (Москва, Санкт-Петербург, проект СберТех)


    - Общее требования: уровень middle.
    - ЗП: до 150 000 руб.
    + ЗП: 120 000 - 150 000 руб.

    Обязательно: Core Java (5, 6), JSP, RDBMS (желательно Oracle) From bdb159af1bb2cabe848aad016309f4c5fd2ae405 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 3 May 2016 19:41:45 +0300 Subject: [PATCH 112/936] Update index --- config/nginx.conf.conf | 4 ++-- resources/view/index.html | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/config/nginx.conf.conf b/config/nginx.conf.conf index 83ae10b..b4d5c66 100644 --- a/config/nginx.conf.conf +++ b/config/nginx.conf.conf @@ -32,12 +32,12 @@ http { } location /css/ { - expires 1d; + expires 3h; access_log off; } location ~ ^.*\.html$ { - expires 1d; + expires 3h; access_log off; } diff --git a/resources/view/index.html b/resources/view/index.html index f133a02..e4ffd37 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -127,12 +127,6 @@

    Старт 26.05.2016 (по четвергам с конца мая). Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе ролей

    -

    Практика Java. Разработка Web приложения:
    - Интенсив: 10 занятий 2 раза в неделю.

    -

    Старт 29.03.2016 по вторникам и пятницам с 20.00 (GMT+3, Москва).

    -

    Объектная модель, коллекции, система ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, - SQL, персистентность в базу данных (PostgreSQL), сервлеты, JSP/JSTL, веб-контейнер Tomcat, HTML, - модульные тесты JUnit, java.util.Logging, система контроля версий Git.

    From e4d327f50247af0ed886afb0522f6c898c4f85c0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 5 May 2016 19:20:25 +0300 Subject: [PATCH 113/936] Update index --- resources/view/index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/view/index.html b/resources/view/index.html index e4ffd37..207d682 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -19,7 +19,7 @@ Projects? +Skype From 1883e9f452be82dd16ef08b6c7db85fbbba6e875 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 5 May 2016 19:26:04 +0300 Subject: [PATCH 114/936] Add topjava lesson10 --- resources/mails/topjava/lesson10.html | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 resources/mails/topjava/lesson10.html diff --git a/resources/mails/topjava/lesson10.html b/resources/mails/topjava/lesson10.html new file mode 100644 index 0000000..116abc7 --- /dev/null +++ b/resources/mails/topjava/lesson10.html @@ -0,0 +1,24 @@ + + + + Десятое занятие проекта TopJava Enterprise + + +

    + Здравствуй firstName! +

    +

    +Выложил десятое занятие нашего проекта.
    +На заключительное занятие остается fix, выбор локали и деплой в heroku. +

    +

    + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. + Обсуждение урока и HW10 в Slack #lesson10 +

    +

    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 11.05 (меня не будет с 07.05 по 10.05)
    +

    +

    +

    + + \ No newline at end of file From 32758b51bdb7e7d632b343e28d52457d26ec2bdd Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 5 May 2016 19:31:06 +0300 Subject: [PATCH 115/936] Update index --- resources/view/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index 207d682..b38b803 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -15,11 +15,11 @@
    +

    Вакансия: Java разработчик (Москва, Санкт-Петербург)

    -

    Вакансия: Java разработчик
    (Москва, Санкт-Петербург, проект СберТех)

    - Для прохождения технического собеседования добавляйтесь в скайп: grigory.kislin
    -

    ЗП: 120 000 - 150 000 руб.

    @@ -56,6 +54,8 @@

    Вакансия: Java разработчик
    (Москва, Санкт Далее будет переход на новые технологии (ближайшее время). «Морда» останется та же, все остальное будет претерпевать изменения…

    +
    +

    Для прохождения технического собеседования
    добавляйтесь в скайп: grigory.kislin

    Skype From 7b83a67a498d8df9909dc179f8254df75e9d5091 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 13 May 2016 15:01:18 +0300 Subject: [PATCH 123/936] Update sbertech --- resources/vacation/technodiasoft.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/vacation/technodiasoft.html b/resources/vacation/technodiasoft.html index b20aa92..53eab04 100644 --- a/resources/vacation/technodiasoft.html +++ b/resources/vacation/technodiasoft.html @@ -1,7 +1,7 @@ - Техно Диасофт + Java разработчик (Москва, Санкт-Петербург) From 9d41099bb0e5bf87e4d97c23148f3f271698b9b0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 13 May 2016 23:42:36 +0300 Subject: [PATCH 124/936] Update mail templates --- .../mails/topjava/{ => lesson}/lesson01.html | 0 .../mails/topjava/{ => lesson}/lesson02.html | 0 .../mails/topjava/{ => lesson}/lesson03.html | 0 .../mails/topjava/{ => lesson}/lesson04.html | 0 .../mails/topjava/{ => lesson}/lesson05.html | 0 .../mails/topjava/{ => lesson}/lesson06.html | 0 .../mails/topjava/{ => lesson}/lesson07.html | 0 .../mails/topjava/{ => lesson}/lesson08.html | 0 .../mails/topjava/{ => lesson}/lesson09.html | 0 .../mails/topjava/{ => lesson}/lesson10.html | 0 resources/mails/topjava_repeat.html | 31 +++++++++++++++++++ 11 files changed, 31 insertions(+) rename resources/mails/topjava/{ => lesson}/lesson01.html (100%) rename resources/mails/topjava/{ => lesson}/lesson02.html (100%) rename resources/mails/topjava/{ => lesson}/lesson03.html (100%) rename resources/mails/topjava/{ => lesson}/lesson04.html (100%) rename resources/mails/topjava/{ => lesson}/lesson05.html (100%) rename resources/mails/topjava/{ => lesson}/lesson06.html (100%) rename resources/mails/topjava/{ => lesson}/lesson07.html (100%) rename resources/mails/topjava/{ => lesson}/lesson08.html (100%) rename resources/mails/topjava/{ => lesson}/lesson09.html (100%) rename resources/mails/topjava/{ => lesson}/lesson10.html (100%) create mode 100644 resources/mails/topjava_repeat.html diff --git a/resources/mails/topjava/lesson01.html b/resources/mails/topjava/lesson/lesson01.html similarity index 100% rename from resources/mails/topjava/lesson01.html rename to resources/mails/topjava/lesson/lesson01.html diff --git a/resources/mails/topjava/lesson02.html b/resources/mails/topjava/lesson/lesson02.html similarity index 100% rename from resources/mails/topjava/lesson02.html rename to resources/mails/topjava/lesson/lesson02.html diff --git a/resources/mails/topjava/lesson03.html b/resources/mails/topjava/lesson/lesson03.html similarity index 100% rename from resources/mails/topjava/lesson03.html rename to resources/mails/topjava/lesson/lesson03.html diff --git a/resources/mails/topjava/lesson04.html b/resources/mails/topjava/lesson/lesson04.html similarity index 100% rename from resources/mails/topjava/lesson04.html rename to resources/mails/topjava/lesson/lesson04.html diff --git a/resources/mails/topjava/lesson05.html b/resources/mails/topjava/lesson/lesson05.html similarity index 100% rename from resources/mails/topjava/lesson05.html rename to resources/mails/topjava/lesson/lesson05.html diff --git a/resources/mails/topjava/lesson06.html b/resources/mails/topjava/lesson/lesson06.html similarity index 100% rename from resources/mails/topjava/lesson06.html rename to resources/mails/topjava/lesson/lesson06.html diff --git a/resources/mails/topjava/lesson07.html b/resources/mails/topjava/lesson/lesson07.html similarity index 100% rename from resources/mails/topjava/lesson07.html rename to resources/mails/topjava/lesson/lesson07.html diff --git a/resources/mails/topjava/lesson08.html b/resources/mails/topjava/lesson/lesson08.html similarity index 100% rename from resources/mails/topjava/lesson08.html rename to resources/mails/topjava/lesson/lesson08.html diff --git a/resources/mails/topjava/lesson09.html b/resources/mails/topjava/lesson/lesson09.html similarity index 100% rename from resources/mails/topjava/lesson09.html rename to resources/mails/topjava/lesson/lesson09.html diff --git a/resources/mails/topjava/lesson10.html b/resources/mails/topjava/lesson/lesson10.html similarity index 100% rename from resources/mails/topjava/lesson10.html rename to resources/mails/topjava/lesson/lesson10.html diff --git a/resources/mails/topjava_repeat.html b/resources/mails/topjava_repeat.html new file mode 100644 index 0000000..fef133d --- /dev/null +++ b/resources/mails/topjava_repeat.html @@ -0,0 +1,31 @@ + + + + + + Регистрация на проект 'Java Enterprise (Topjava)' + +

    + Здравствуй firstName!
    +

    +Буду рад снова видеть тебя на проекте Java Enterprise (Topjava). + +Старт 26.05 (выдача прав доступа к материалам, установка ПО, группа skype и slack, подробная форма регистрации, учебный ключик к IDEA). +После этого будет еще неделя для выполнения домашнего задания вступительного занятия. +

    + Для участия необходимо послать мне сообщение в skype: grigory.kislin с пометкой topjava.
    + Повторное участие без проверки домашнего задания бесплатное, с проверкой доплата 8200 руб.
    + Варианты оплаты.
    +

    + В конце вводного занятия есть ресурсы для лучшего усвоения всех тем проекта. +

    + Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    +До встречи на проекте!
    +

    +

    +

    + \ No newline at end of file From f73ecdfe420a4a489840f0a31fe5fbc796807f32 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 13 May 2016 23:53:44 +0300 Subject: [PATCH 125/936] Update mail templates --- resources/mails/topjava_repeat.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava_repeat.html b/resources/mails/topjava_repeat.html index fef133d..7788236 100644 --- a/resources/mails/topjava_repeat.html +++ b/resources/mails/topjava_repeat.html @@ -9,10 +9,10 @@ Здравствуй firstName!

    Буду рад снова видеть тебя на проекте Java Enterprise (Topjava). -
      Напомню основные ссылки: -
    • Описание проекта.
    • -
    • Wiki по проекту.
    • -
    • Репозиторий проекта.
    • + Старт 26.05 (выдача прав доступа к материалам, установка ПО, группа skype и slack, подробная форма регистрации, учебный ключик к IDEA). После этого будет еще неделя для выполнения домашнего задания вступительного занятия. From 051800d06d4abb8e0cedf8f280ff70427a454b60 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 17 May 2016 01:41:38 +0300 Subject: [PATCH 126/936] Slack integration --- resources/mails/topjava_repeat.html | 54 ++++++++++++++----- .../javaops/config/IntegrationProperties.java | 31 ++--------- .../javaops/service/IntegrationService.java | 26 +++++++++ .../java/ru/javaops/service/MailService.java | 16 +----- .../javaops/web/SubscriptionController.java | 27 +++++----- src/main/resources/application-dev.yaml | 6 +-- topjava2.md | 8 ++- 7 files changed, 96 insertions(+), 72 deletions(-) create mode 100644 src/main/java/ru/javaops/service/IntegrationService.java diff --git a/resources/mails/topjava_repeat.html b/resources/mails/topjava_repeat.html index 7788236..6010dbb 100644 --- a/resources/mails/topjava_repeat.html +++ b/resources/mails/topjava_repeat.html @@ -3,29 +3,57 @@ - Регистрация на проект 'Java Enterprise (Topjava)' + Повторное участие на проект 'Java Enterprise (Topjava)'

      Здравствуй firstName!

      Буду рад снова видеть тебя на проекте Java Enterprise (Topjava). +

      Google Drive

      +

      + Проект эволюционирует, поэтому патчи текущего выпуска будут отличаться. Видео возможно также будут редактироваться / + дополнятся. + Все актуальные материалы нашего выпуска будут находится в папке Topjava7. +

      +

      Slack

      +Проверь почту- должно прийти приглашение в группу Slack topjava7 +
        Темы каналов: +
      • #entrance_lesson: вопросы по вступительному + заданию +
      • +
      • #flooding: оффтопик
      • +
      • #general: общие вопросы
      • +
      • #git: вопросы по git
      • +
      • #idea: вопросы по idea
      • +
      • #interview_job: вопросы прохождения интервью, + работа, вакансии +
      • +
      +Форматирование сообщениq в + slack
      +Desktop/ Mobile приложение Slack +

      Наш проект topjava07 в гитхаб, расписание занятий

      +Рассылка первого занятия будет в четверг, 02.06.
      +Если у тебя есть проверка ДЗ, то решение вступительного желательно присылать до вечера 31.05.
      +Повторное участие без проверки домашнего задания бесплатное, с проверкой доплата 7500 руб.
      +Варианты оплаты. -Старт 26.05 (выдача прав доступа к материалам, установка ПО, группа skype и slack, подробная форма регистрации, учебный ключик к IDEA). -После этого будет еще неделя для выполнения домашнего задания вступительного занятия.

      - Для участия необходимо послать мне сообщение в skype: grigory.kislin с пометкой topjava.
      - Повторное участие без проверки домашнего задания бесплатное, с проверкой доплата 8200 руб.
      - Варианты оплаты.
      + Добавляйся в группу VK: Практика Java (Web/ Enterprise)

      - В конце вводного занятия есть ресурсы для лучшего усвоения всех тем проекта.

      - Добавляйся в группу VK: Практика Java (Web/ Enterprise)
      -До встречи на проекте!
      + До встречи на проекте!
      + Григорий Кислин
      + skype: grigory.kislin

      -

      +

      + Java Online Projects

      \ No newline at end of file diff --git a/src/main/java/ru/javaops/config/IntegrationProperties.java b/src/main/java/ru/javaops/config/IntegrationProperties.java index 20c56bb..4d732db 100644 --- a/src/main/java/ru/javaops/config/IntegrationProperties.java +++ b/src/main/java/ru/javaops/config/IntegrationProperties.java @@ -18,7 +18,7 @@ public class IntegrationProperties { private String vkToken; @NotNull - private StamplayProps stamplay; + private String slackToken; public String getVkToken() { return vkToken; @@ -28,32 +28,11 @@ public void setVkToken(String vkToken) { this.vkToken = vkToken; } - public StamplayProps getStamplay() { - return stamplay; + public String getSlackToken() { + return slackToken; } - public void setStamplay(StamplayProps stamplay) { - this.stamplay = stamplay; - } - - public static class StamplayProps { - private String appId; - private String apiKey; - - public String getAppId() { - return appId; - } - - public void setAppId(String appId) { - this.appId = appId; - } - - public String getApiKey() { - return apiKey; - } - - public void setApiKey(String apiKey) { - this.apiKey = apiKey; - } + public void setSlackToken(String slackToken) { + this.slackToken = slackToken; } } diff --git a/src/main/java/ru/javaops/service/IntegrationService.java b/src/main/java/ru/javaops/service/IntegrationService.java new file mode 100644 index 0000000..83bdbd4 --- /dev/null +++ b/src/main/java/ru/javaops/service/IntegrationService.java @@ -0,0 +1,26 @@ +package ru.javaops.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Service; +import org.springframework.web.client.AsyncRestTemplate; +import ru.javaops.config.IntegrationProperties; + +@Service +public class IntegrationService { + private static final Logger LOG = LoggerFactory.getLogger(IntegrationService.class); + + @Autowired + private IntegrationProperties integrationProperties; + + public void asyncSendSlackInvitation(String email) { + new AsyncRestTemplate().exchange( + "https://slack.com/api/users.admin.invite?token={token}&email={email}&channels=#entrance_lesson,#git,#idea,#interview_job", + HttpMethod.GET, null, String.class, integrationProperties.getSlackToken(), email).addCallback( + res -> LOG.info("Slack invitation result: " + res.getStatusCode() + ": " + res.getBody()), + ex -> LOG.error("Slack invitation result", ex) + ); + } +} diff --git a/src/main/java/ru/javaops/service/MailService.java b/src/main/java/ru/javaops/service/MailService.java index 43c3391..5bca97f 100644 --- a/src/main/java/ru/javaops/service/MailService.java +++ b/src/main/java/ru/javaops/service/MailService.java @@ -17,7 +17,8 @@ import org.thymeleaf.context.Context; import org.thymeleaf.spring4.SpringTemplateEngine; import ru.javaops.config.AppProperties; -import ru.javaops.model.*; +import ru.javaops.model.MailCase; +import ru.javaops.model.User; import ru.javaops.repository.MailCaseRepository; import ru.javaops.util.Util; @@ -173,19 +174,6 @@ public void send(String toEmail, String toName, String subject, String content, javaMailSender.send(mimeMessage); } - public String sendRegistration(String template, Project project, UserGroup userGroup, String confirmEmail) throws MessagingException { - if (userGroup.getRegisterType() == RegisterType.REPEAT) { - template = project.getName() + "_repeat"; - } else if (template == null) { - template = project.getName() + "_register"; - } - String result = sendToUser(template, userGroup.getUser()); - String content = getContent("confirm", - ImmutableMap.of("template", template, "result", result, "userGroup", userGroup)); - send(confirmEmail, null, Util.getTitle(content), content, true, null); - return result; - } - public static class GroupResultBuilder { private int success = 0; private List failed = new ArrayList<>(); diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index 0b7dbbd..e273f72 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -1,8 +1,6 @@ package ru.javaops.web; import com.google.common.collect.ImmutableMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; @@ -10,14 +8,11 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; -import ru.javaops.config.AppProperties; +import ru.javaops.model.RegisterType; import ru.javaops.model.User; import ru.javaops.model.UserGroup; -import ru.javaops.service.GroupService; +import ru.javaops.service.*; import ru.javaops.service.GroupService.ProjectProps; -import ru.javaops.service.MailService; -import ru.javaops.service.SubscriptionService; -import ru.javaops.service.UserService; import ru.javaops.to.UserTo; import ru.javaops.to.UserToExt; import ru.javaops.util.Util; @@ -34,10 +29,9 @@ */ @Controller public class SubscriptionController { - private static final Logger LOG = LoggerFactory.getLogger(SubscriptionController.class); @Autowired - private AppProperties appProperties; + private IntegrationService integrationService; @Autowired private SubscriptionService subscriptionService; @@ -66,20 +60,24 @@ public ModelAndView activate(@RequestParam("email") String email, @RequestParam( @RequestMapping(value = "/register", method = RequestMethod.POST) public ModelAndView registerByProject(@RequestParam("project") String project, - @RequestParam(value = "template", required = false) String template, @RequestParam("channel") String channel, @Valid UserTo userTo, BindingResult result) throws MessagingException { if (result.hasErrors()) { throw new ValidationException(Util.getErrorMessage(result)); } - return register(template, appProperties.getTestEmail(), channel, "http://javawebinar.ru/confirm.html", "http://javawebinar.ru/error.html", userTo, groupService.getProjectProps(project)); + return register(channel, "http://javawebinar.ru/confirm.html", "http://javawebinar.ru/error.html", userTo, groupService.getProjectProps(project)); } - private ModelAndView register(String template, String confirmEmail, String channel, String successUrl, String failUrl, + private ModelAndView register(String channel, String successUrl, String failUrl, UserTo userTo, ProjectProps projectProps) throws MessagingException { UserGroup userGroup = groupService.registerAtProject(userTo, projectProps, channel); - String mailResult = mailService.sendRegistration(template, projectProps.project, userGroup, confirmEmail); + String projectName = projectProps.project.getName(); + String template = projectName + (userGroup.getRegisterType() == RegisterType.REPEAT ? "_repeat" : "_register"); + String mailResult = mailService.sendToUser(template, userGroup.getUser()); + if (MailService.isOk(mailResult) && userGroup.getRegisterType() == RegisterType.REPEAT){ + integrationService.asyncSendSlackInvitation(userGroup.getUser().getEmail()); + } return new ModelAndView("redirectToUrl", "redirectUrl", MailService.isOk(mailResult) ? successUrl : failUrl); } @@ -98,6 +96,7 @@ public ModelAndView save(@RequestParam("key") String key, @Valid UserToExt userT throw new ValidationException(Util.getErrorMessage(result)); } userService.update(userToExt); - return new ModelAndView("message", "message", "Спасибо за регистрацию."); + integrationService.asyncSendSlackInvitation(userToExt.getEmail()); + return new ModelAndView("message", "message", "Спасибо за регистрацию.
      Проверьте почту: вам должно прийти приглашение в Slack."); } } \ No newline at end of file diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index c2bebe3..a72869c 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -26,10 +26,8 @@ app: cache-seconds: 1 host-url: http://localhost:8080 integration: - vk-token: token - stamplay: - appid: appid - webhookid: webhookid + vk-token: vk-token + slack-token: slack-token spring: mail.host: smtp.yandex.ru diff --git a/topjava2.md b/topjava2.md index 77727fa..49f2278 100644 --- a/topjava2.md +++ b/topjava2.md @@ -262,4 +262,10 @@ https://github.com/feedm3/spring-boot-gwt Создаем приложение с помощью Spring и GWT. http://alextretyakov.blogspot.ru/2011/10/4.html -http://www.springbyexample.org/static/1.1/html/simple-gwt-spring-webapp.html \ No newline at end of file +http://www.springbyexample.org/static/1.1/html/simple-gwt-spring-webapp.html + +## Slack +https://api.slack.com/web +https://api.slack.com/docs/oauth-test-tokens +http://stackoverflow.com/questions/30955818/slack-api-team-invitation +https://spring.io/blog/2009/03/27/rest-in-spring-3-resttemplate \ No newline at end of file From 9580fb533ca416ca196296225a2a2defa1de188c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 17 May 2016 02:09:10 +0300 Subject: [PATCH 127/936] Update message template --- resources/view/message.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/view/message.html b/resources/view/message.html index 0cf4b2d..677f9ed 100644 --- a/resources/view/message.html +++ b/resources/view/message.html @@ -20,7 +20,7 @@
      -

      Сообщение

      +

      Сообщение

      From 4f89f7f2f57dc7c9403077d7558ccc0f613cedde Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 17 May 2016 02:10:59 +0300 Subject: [PATCH 128/936] Update invitation message --- src/main/java/ru/javaops/web/SubscriptionController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index e273f72..52b34f1 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -97,6 +97,6 @@ public ModelAndView save(@RequestParam("key") String key, @Valid UserToExt userT } userService.update(userToExt); integrationService.asyncSendSlackInvitation(userToExt.getEmail()); - return new ModelAndView("message", "message", "Спасибо за регистрацию.
      Проверьте почту: вам должно прийти приглашение в Slack."); + return new ModelAndView("message", "message", "Спасибо за регистрацию.
      Проверь почту: должно прийти приглашение в Slack."); } } \ No newline at end of file From 96ba8a7139f6febf6f7840f3cb934a393ccc43b3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 17 May 2016 02:21:13 +0300 Subject: [PATCH 129/936] Update registration view --- resources/view/registration.html | 29 +++++++++++++++++++ .../javaops/web/SubscriptionController.java | 4 +-- 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 resources/view/registration.html diff --git a/resources/view/registration.html b/resources/view/registration.html new file mode 100644 index 0000000..35e89ec --- /dev/null +++ b/resources/view/registration.html @@ -0,0 +1,29 @@ + + + + + + Java Online Projects + + + + + + +
      +
      +

      Спасибо за регистрацию!

      +

      На почту должно прийти приглашение в группу Slack.

      +

      Если доступа к Google Drive еще нет, пришли мне в skype свой gmail.

      +
      +
      + + diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index 52b34f1..e0c2eaa 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -75,7 +75,7 @@ private ModelAndView register(String channel, String successUrl, String failUrl, String projectName = projectProps.project.getName(); String template = projectName + (userGroup.getRegisterType() == RegisterType.REPEAT ? "_repeat" : "_register"); String mailResult = mailService.sendToUser(template, userGroup.getUser()); - if (MailService.isOk(mailResult) && userGroup.getRegisterType() == RegisterType.REPEAT){ + if (MailService.isOk(mailResult) && userGroup.getRegisterType() == RegisterType.REPEAT) { integrationService.asyncSendSlackInvitation(userGroup.getUser().getEmail()); } return new ModelAndView("redirectToUrl", "redirectUrl", MailService.isOk(mailResult) ? successUrl : failUrl); @@ -97,6 +97,6 @@ public ModelAndView save(@RequestParam("key") String key, @Valid UserToExt userT } userService.update(userToExt); integrationService.asyncSendSlackInvitation(userToExt.getEmail()); - return new ModelAndView("message", "message", "Спасибо за регистрацию.
      Проверь почту: должно прийти приглашение в Slack."); + return new ModelAndView("registration"); } } \ No newline at end of file From 0dc8c1fca877825ae2eeaf1c94c77396c413bbee Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 17 May 2016 13:47:26 +0300 Subject: [PATCH 130/936] Update topjava templates --- .../mails/topjava/lesson/topjava_final.html | 56 +++++++++++++++++++ resources/mails/topjava_info.html | 1 + resources/mails/topjava_repeat.html | 2 +- 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 resources/mails/topjava/lesson/topjava_final.html diff --git a/resources/mails/topjava/lesson/topjava_final.html b/resources/mails/topjava/lesson/topjava_final.html new file mode 100644 index 0000000..dd071db --- /dev/null +++ b/resources/mails/topjava/lesson/topjava_final.html @@ -0,0 +1,56 @@ + + + + + + Окончание проекта 'Java Enterprise (TopJava)' + +

      + Здравствуй firstName!
      +

      +

      Несколько комментариев к заключительному занятию + проекта

      +
        +
      • Я сделал код для деплоя в Heroku в ветке мастер, из за чего некоторые тесты пересатли проходить.
        + Добавил в ДЗ: найти этот код и проверить что без него все работает. +
      • +
      • + На heroku приложение не отрабатывает ExceptionInfoHandler по аннотации + @RestController (нотификация ошибок).
        У меня предположение, что это связано с обновлением java на heroku, + появилось еще с прошлого проекта. Как воркараунд сделал ветку heroku, в которой + откатил обработку ошибок к варианту урока 10 с дефолтными методами интерфейса.
        При такой реализации все работает, обновил + демо из этой ветки (необходим Ctrl+F5 для сброса кэша). +
      • +
      +

      Шли мне на ревью свое резюме.
      + Выпускные задания от участников с проверкой принимаю на ревью до 02.06 + (если проверки нет то возможно оплатить отдельно). +

      +

      +

      Продублирую важные ссылки в конце проекта:

      + +

      + Ваша скидка на другие проекты будет 700 руб. без проверки домашнего задания и 1500 руб. с проверкой.
      + О всех новостях буду делать рассылку и публиковать в группах vk и skype.

      + Если материал был для тебя сложный, возможно повторное участие на topjava07: без проверки ДЗ бесплатно, с проверкой доплата 7500 руб. + (варианты оплаты, курс рубля).
      + + Проект topjava7 и расписание занятий. + Для регистраии на проект достаточно получить ссылку на вступительное занятие, должно прийти + письмо "Повторное участие" и приглашение в группу slack topjava7. Старт topjava07 будет 26.05, приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию. +

      +

      Добавляйся в группу VK: практика Java (Web/ Enterprise), +публикую там самое, на мой взгляд, интересное из мира IT и Java.

      +

      Важно: если проект понравился, напишите пожалуйста в VK отзыв о проекте.

      +

      + Спасибо за участие и, надеюсь, до новой встречи! +

      +

      +

      + \ No newline at end of file diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 97e76ee..83acc7e 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -229,6 +229,7 @@

      Расписание занятий проекта:

    • Способы оплаты
    • Вопросы по проекту
    • Ресурсы для подготовки
    • +
    • Курс рубля

    Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    diff --git a/resources/mails/topjava_repeat.html b/resources/mails/topjava_repeat.html index 6010dbb..7ffa45c 100644 --- a/resources/mails/topjava_repeat.html +++ b/resources/mails/topjava_repeat.html @@ -37,7 +37,7 @@

    Наш проект topja Рассылка первого занятия будет в четверг, 02.06.
    Если у тебя есть проверка ДЗ, то решение вступительного желательно присылать до вечера 31.05.
    Повторное участие без проверки домашнего задания бесплатное, с проверкой доплата 7500 руб.
    -
    Варианты оплаты. +(варианты оплаты, курс рубля).
    • Ресурсы для подготовки
    • Wiki по проекту
    • From d7f6f0bb2bb01d920f38a5d02921f81b97a4e46e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 17 May 2016 13:58:49 +0300 Subject: [PATCH 131/936] Update topjava templates --- resources/mails/topjava/lesson/topjava_final.html | 2 +- src/test/java/ru/javaops/service/MailServiceTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/topjava/lesson/topjava_final.html b/resources/mails/topjava/lesson/topjava_final.html index dd071db..14e9205 100644 --- a/resources/mails/topjava/lesson/topjava_final.html +++ b/resources/mails/topjava/lesson/topjava_final.html @@ -31,7 +31,7 @@

      Продублирую важные ссылки в конце проект diff --git a/src/test/java/ru/javaops/service/MailServiceTest.java b/src/test/java/ru/javaops/service/MailServiceTest.java index 2c6ec09..83bda10 100644 --- a/src/test/java/ru/javaops/service/MailServiceTest.java +++ b/src/test/java/ru/javaops/service/MailServiceTest.java @@ -18,7 +18,7 @@ public class MailServiceTest extends ApplicationAbstractTest { @Test public void testGetContent() throws Exception { - String content = mailService.getContent("index", + String content = mailService.getContent("topjava/lesson/topjava_final", ImmutableMap.of("user", UserTestData.USER, "template", "topjava_register", "participation", "REGISTRATION", "result", "OK", "activationKey", "activationKey")); System.out.println("\n+++++"); System.out.println(Util.getTitle(content)); From 787aa11417929b5e5f52c0c8f13fddbdff15ed62 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 17 May 2016 14:02:29 +0300 Subject: [PATCH 132/936] Update topjava templates --- resources/mails/topjava/lesson/topjava_final.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/mails/topjava/lesson/topjava_final.html b/resources/mails/topjava/lesson/topjava_final.html index 14e9205..f29e78a 100644 --- a/resources/mails/topjava/lesson/topjava_final.html +++ b/resources/mails/topjava/lesson/topjava_final.html @@ -26,7 +26,6 @@

      Несколько комментариев к Выпускные задания от участников с проверкой принимаю на ревью до 02.06 (если проверки нет то возможно оплатить отдельно).

      -

      Продублирую важные ссылки в конце проекта:

      • @@ -42,7 +41,7 @@

        Продублирую важные ссылки в конце проект (варианты оплаты, курс рубля).
        Проект topjava7 и расписание занятий. - Для регистраии на проект достаточно получить ссылку на вступительное занятие, должно прийти + Для регистраии на проект достаточно получить ссылку на вступительное занятие, должно прийти письмо "Повторное участие" и приглашение в группу slack topjava7. Старт topjava07 будет 26.05, приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию.

        Добавляйся в группу VK: практика Java (Web/ Enterprise), From cdda9dfd5e6e1c73e70a3286dd4843e98ae68a1e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 17 May 2016 14:09:42 +0300 Subject: [PATCH 133/936] Update topjava templates --- resources/mails/topjava/lesson/topjava_final.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/mails/topjava/lesson/topjava_final.html b/resources/mails/topjava/lesson/topjava_final.html index f29e78a..10f6849 100644 --- a/resources/mails/topjava/lesson/topjava_final.html +++ b/resources/mails/topjava/lesson/topjava_final.html @@ -9,9 +9,9 @@ Здравствуй firstName!

        Несколько комментариев к заключительному занятию - проекта

        + проекта:

          -
        • Я сделал код для деплоя в Heroku в ветке мастер, из за чего некоторые тесты пересатли проходить.
          +
        • Я сделал код для деплоя в Heroku в ветке мастер, из за чего некоторые тесты не проходять.
          Добавил в ДЗ: найти этот код и проверить что без него все работает.
        • @@ -26,7 +26,7 @@

          Несколько комментариев к Выпускные задания от участников с проверкой принимаю на ревью до 02.06 (если проверки нет то возможно оплатить отдельно).

          -

          Продублирую важные ссылки в конце проекта:

          +

          Ссылки проекта:

          -

          +

          Ваша скидка на другие проекты будет 700 руб. без проверки домашнего задания и 1500 руб. с проверкой.
          О всех новостях буду делать рассылку и публиковать в группах vk и skype.

          Если материал был для тебя сложный, возможно повторное участие на topjava07: без проверки ДЗ бесплатно, с проверкой доплата 7500 руб. (варианты оплаты, курс рубля).
          - Проект topjava7 и расписание занятий. - Для регистраии на проект достаточно получить ссылку на вступительное занятие, должно прийти + Github topjava7 и расписание занятий. + Для регистрации на проект достаточно получить ссылку на вступительное занятие, должно прийти письмо "Повторное участие" и приглашение в группу slack topjava7. Старт topjava07 будет 26.05, приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию.

          Добавляйся в группу VK: практика Java (Web/ Enterprise), From b8da77a2eb3d6af90a01ae97599a4324474e0a21 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 17 May 2016 15:34:28 +0300 Subject: [PATCH 134/936] Add resend failed --- src/main/java/ru/javaops/model/MailCase.java | 2 +- .../repository/MailCaseRepository.java | 5 ++++ .../java/ru/javaops/service/MailService.java | 7 +++++- .../java/ru/javaops/web/MailController.java | 25 +++++++++++++------ 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/javaops/model/MailCase.java b/src/main/java/ru/javaops/model/MailCase.java index 26fe7be..1baba99 100644 --- a/src/main/java/ru/javaops/model/MailCase.java +++ b/src/main/java/ru/javaops/model/MailCase.java @@ -18,7 +18,7 @@ public class MailCase extends BaseEntity { @NotNull private Date datetime; - @ManyToOne + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "user_id", nullable = false) @NotNull @OnDelete(action = OnDeleteAction.CASCADE) diff --git a/src/main/java/ru/javaops/repository/MailCaseRepository.java b/src/main/java/ru/javaops/repository/MailCaseRepository.java index ef23b3a..9cdf391 100644 --- a/src/main/java/ru/javaops/repository/MailCaseRepository.java +++ b/src/main/java/ru/javaops/repository/MailCaseRepository.java @@ -1,9 +1,14 @@ package ru.javaops.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.transaction.annotation.Transactional; import ru.javaops.model.MailCase; +import java.util.List; + @Transactional(readOnly = true) public interface MailCaseRepository extends JpaRepository { + @Query("SELECT mc FROM MailCase mc WHERE mc.datetime > TODAY AND mc.result <> 'OK'") + List getTodayFailed(); } \ No newline at end of file diff --git a/src/main/java/ru/javaops/service/MailService.java b/src/main/java/ru/javaops/service/MailService.java index 5bca97f..fd0d2cc 100644 --- a/src/main/java/ru/javaops/service/MailService.java +++ b/src/main/java/ru/javaops/service/MailService.java @@ -71,7 +71,7 @@ public GroupResult sendToEmailList(String template, Collection emails) { return sendToUserList(template, emails.stream().map(userService::findExistedByEmail).collect(Collectors.toSet())); } - public GroupResult sendToUserList(String template, Collection users) { + public GroupResult sendToUserList(String template, Set users) { checkNotNull(template, "template must not be null"); checkNotNull(users, "users must not be null"); users.add(getTestUser()); @@ -174,6 +174,11 @@ public void send(String toEmail, String toName, String subject, String content, javaMailSender.send(mimeMessage); } + public GroupResult resendTodayFailed(String template) { + List todayFailed = mailCaseRepository.getTodayFailed(); + return sendToUserList(template, todayFailed.stream().map(MailCase::getUser).collect(Collectors.toSet())); + } + public static class GroupResultBuilder { private int success = 0; private List failed = new ArrayList<>(); diff --git a/src/main/java/ru/javaops/web/MailController.java b/src/main/java/ru/javaops/web/MailController.java index b423029..dc98f00 100644 --- a/src/main/java/ru/javaops/web/MailController.java +++ b/src/main/java/ru/javaops/web/MailController.java @@ -13,6 +13,7 @@ import ru.javaops.model.User; import ru.javaops.service.GroupService; import ru.javaops.service.MailService; +import ru.javaops.service.MailService.GroupResult; import java.util.Set; @@ -45,18 +46,28 @@ public ResponseEntity sendToUser(@Param("template") String template, @Pa } @RequestMapping(value = "/to-users", method = POST) - public ResponseEntity sendToProjectByGroupType(@Param("template") String template, @Param("emails") String emails) { - MailService.GroupResult groupResult = mailService.sendToEmailList(template, Splitter.on(',').trimResults().omitEmptyStrings().splitToList(emails)); - return new ResponseEntity<>(groupResult, groupResult.isOk() ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR); + public ResponseEntity sendToProjectByGroupType(@Param("template") String template, @Param("emails") String emails) { + GroupResult groupResult = mailService.sendToEmailList(template, Splitter.on(',').trimResults().omitEmptyStrings().splitToList(emails)); + return getGroupResultResponseEntity(groupResult); } @RequestMapping(value = "/to-groups", method = POST) - public ResponseEntity sendToGroup(@Param("template") String template, @Param("includes") String includes, - @RequestParam(value = "excludes", required = false) String excludes, - @RequestParam(value = "reg-type", required = false) RegisterType registerType) { + public ResponseEntity sendToGroup(@Param("template") String template, @Param("includes") String includes, + @RequestParam(value = "excludes", required = false) String excludes, + @RequestParam(value = "reg-type", required = false) RegisterType registerType) { Set users = groupService.filterUserByGroupNames(includes, excludes, registerType); - MailService.GroupResult groupResult = mailService.sendToUserList(template, users); + GroupResult groupResult = mailService.sendToUserList(template, users); + return getGroupResultResponseEntity(groupResult); + } + + @RequestMapping(value = "/resend", method = POST) + public ResponseEntity resend(@Param("template") String template) { + GroupResult groupResult = mailService.resendTodayFailed(template); + return getGroupResultResponseEntity(groupResult); + } + + private ResponseEntity getGroupResultResponseEntity(GroupResult groupResult) { return new ResponseEntity<>(groupResult, groupResult.isOk() ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR); } } From 54989330e42639f4cd2855f7d8cf23820af28196 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 18 May 2016 14:30:16 +0300 Subject: [PATCH 135/936] Update topjava templates --- resources/mails/topjava_ad.html | 101 ++++++++++++++++++++++++++++++ resources/mails/topjava_info.html | 5 +- 2 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 resources/mails/topjava_ad.html diff --git a/resources/mails/topjava_ad.html b/resources/mails/topjava_ad.html new file mode 100644 index 0000000..67fa2d4 --- /dev/null +++ b/resources/mails/topjava_ad.html @@ -0,0 +1,101 @@ + + + + + + 26.05 старт проекта 'Java Enterprise (Topjava)' + +

          + Здравствуй firstName!
          +

          +

          Приглашаю тебя принять участие в очередном выпуске проекта Java Enterprise (Topjava)

          +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей + с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), + REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
          + +

          Старт 26.05

          +

          + По ссылке можно получить бесплатное вступительное + задание, чтобы оценить свои силы и + получить представление о том, как будут проходить занятия. +

          +

          Требования к участникам:

          +На проекте мы не проходим синтаксис java: предполагается, что вы уже знаете, что такое классы, конструкторы, +аннотации, анонимные классы, исключения и пр. +Также необходим некоторый опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на +первом занятии, кратко повторяя основы. +Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно, но не принципиально. Весь +"Enterprise": Maven, Git (в том объеме, который нам нужен), Spring, Hibernate, REST даются с азов. Никаких + специальных знаний Java EE не требуется. +
            +
          • + Стоимость участия без проверки домашних заданий: 8300 руб.
            + сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом. +
          • +
          • Стоимость полного пакета: 16500 руб. + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при + устройстве на работу). +
          • +
          • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
          • + Если Вы уже участвовали на моих курсах, то есть скидка: 700 руб. (без проверки ДЗ) и 1500 руб (с проверкой). +
          • Способы оплаты
          • +
          • Вопросы по проекту
          • +
          • Ресурсы для подготовки
          • +
          • Курс рубля
          • +
          + +
          +

          Основные достоинста проекта, взятые из отзывов участников: +

          +

          Максимальный охват

          +Самые важные и необходимые Java разработчику темы, API, фреймворки, инструменты в одном курсе. + +

          Насыщенное и структурированное изложение как дополнение к проекту

          +Изложение материала "без воды" нацелено на практическое использование и дополняется материалом для самостоятельной +проработки. Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, в связке, как +дополнения к созданию единого работающего приложения. +Усвоение и понимание материала увеличивается в разы. + +

          Последовательная возрастание сложности с нуля

          +Сложность проекта возрастает постепенно, с кода "Hello Topjava" в main() вступительного задания до финальной версии. +Слон съедается по кусочкам. + +

          Совместная разработка

          +Участники на протяжении всего курса работают с кодом проекта. Выполнение домашних заданий закрепляет полученные +знания. +В результате проект становится "Твоим". + +

          Поддержка группы и преподавателя

          +Общение по любым вопросам: git, IDEA, домашние задания, зарплаты программиста, java консультации, архитектура, +трудоустройство, вакансии, новости IT и пр. + +

          Доступность и структурированность материалов

          +Все видео доступно для просмотра онлайн и скачивания. Записи разбиты по темам +и тщательно отредактированы. Большое количество подобранных ресурсов для углубления в детали. + +

          Оптимальное подобранное время

          +Занятия проходят раз в неделю, оптимальное время необходимое для проработки пройденных тем и выполнения домашнего +задания. + +

          Ревью Вашего кода.

          +Вы увидите именно свои ошибки в стиле, структурах данных, алгоритмах, кодировании. +Опыт равноценен нескольким годам работы разработчиком java. + +

          Помощь в составлении резюме и с трудоустройством.

          +Ваши формы соискателя я рассылаю всем знакомым HR, уже есть случаи трудоустройства выпускников. +Также в группе выпускников происходит активное общение на эту тему, коллеги делятся своим опытом трудоустройства, +публикуют вакансии со своей работы. +

          После проекта в твоем резюме появится раздел в опыте работы:

          +Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей +на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API: +
            +
          • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA
          • +
          • реализация и тестирование REST и AJAX контроллеров
          • +
          • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
          • +
          • твоя доработка проекта
          • +
          + +

          Надеюсь увидеться на проекте,

          +

          +

          + \ No newline at end of file diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 83acc7e..ee82515 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -6,7 +6,7 @@ REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API

          На бесплатном вступительном занятии подробно - разбирается работа с проектом в системе управления версиями Git. На занятиях я последовательно разрабатываю + разбирается работа с проектом в системе управления версиями Git. На занятиях мы последовательно разрабатываем приложение с объяснениями и теоретическим материалом по всем темам проекта. Домашние задания выполняются по всем темам занятий и являются частью проекта. На заключительном занятии каждый участник деплоит свой @@ -18,8 +18,7 @@

          Требования к участникам:

          Также необходим некоторый опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на первом занятии, кратко повторяя основы. Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно, но не принципиально. Весь - "Enterprise": Maven, Git (в том объеме, который нам нужен), Spring, Hibernate, REST даются с азов.
          - Т.е. никаких специальных знаний Java EE не требуется. + "Enterprise": Maven, Git (в том объеме, который нам нужен), Spring, Hibernate, REST даются с азов. Никаких специальных знаний Java EE не требуется.

          Основные достоинста проекта, взятые из отзывов участников:

          From 96ce0d511d2fdd1cf6450931ef13d10963147870 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 18 May 2016 14:32:28 +0300 Subject: [PATCH 136/936] fix --- resources/mails/topjava_ad.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava_ad.html b/resources/mails/topjava_ad.html index 67fa2d4..6f10ec2 100644 --- a/resources/mails/topjava_ad.html +++ b/resources/mails/topjava_ad.html @@ -15,7 +15,7 @@

          Приглашаю тебя принять участие в очередн

          Старт 26.05

          - По ссылке можно получить бесплатное вступительное + По ссылке можно получить бесплатное вступительное задание, чтобы оценить свои силы и получить представление о том, как будут проходить занятия.

          From 62031cbd09ebb94ad0b6a6187dc074a68920767a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 18 May 2016 14:33:09 +0300 Subject: [PATCH 137/936] fix --- resources/mails/topjava_ad.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava_ad.html b/resources/mails/topjava_ad.html index 6f10ec2..bf559c9 100644 --- a/resources/mails/topjava_ad.html +++ b/resources/mails/topjava_ad.html @@ -15,7 +15,7 @@

          Приглашаю тебя принять участие в очередн

          Старт 26.05

          - По ссылке можно получить бесплатное вступительное + По ссылке можно получить бесплатное вступительное задание, чтобы оценить свои силы и получить представление о том, как будут проходить занятия.

          From cefa8c1f364947a6005b4e33b5c8a39017e1952d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 18 May 2016 17:28:25 +0300 Subject: [PATCH 138/936] Add start/end Date to mail sending --- .../java/ru/javaops/service/GroupService.java | 14 ++++++++++---- src/main/java/ru/javaops/util/TimeUtil.java | 16 ++++++++++++++++ src/main/java/ru/javaops/web/MailController.java | 12 ++++++++++-- 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 src/main/java/ru/javaops/util/TimeUtil.java diff --git a/src/main/java/ru/javaops/service/GroupService.java b/src/main/java/ru/javaops/service/GroupService.java index eaf65ec..7e3cd3c 100644 --- a/src/main/java/ru/javaops/service/GroupService.java +++ b/src/main/java/ru/javaops/service/GroupService.java @@ -14,8 +14,10 @@ import ru.javaops.repository.PaymentRepository; import ru.javaops.repository.UserGroupRepository; import ru.javaops.to.UserTo; +import ru.javaops.util.TimeUtil; import ru.javaops.util.UserUtil; +import java.time.LocalDate; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -133,18 +135,20 @@ private static Group getGroupByProjectAndType(Collection groups, String p return group.get(); } - public Set filterUserByGroupNames(String includes, String excludes, RegisterType registerType) { + public Set filterUserByGroupNames(String includes, String excludes, RegisterType registerType, LocalDate startRegisteredDate, LocalDate endRegisteredDate) { final List groups = getAll(); - Set includeUsers = filterUserByGroupNames(groups, includes, registerType); + Set includeUsers = filterUserByGroupNames(groups, includes, registerType, startRegisteredDate, endRegisteredDate); if (StringUtils.isNoneEmpty(excludes)) { - Set excludeUsers = filterUserByGroupNames(groups, excludes, null); + Set excludeUsers = filterUserByGroupNames(groups, excludes, null, startRegisteredDate, endRegisteredDate); includeUsers.removeAll(excludeUsers); } return includeUsers; } - private Set filterUserByGroupNames(List groups, String groupNames, RegisterType registerType) { + private Set filterUserByGroupNames(List groups, String groupNames, RegisterType registerType, LocalDate startRegisteredDate, LocalDate endRegisteredDate) { List> predicates = getMatcher(groupNames); + Date startDate = TimeUtil.toDate(startRegisteredDate); + Date endDate = TimeUtil.toDate(endRegisteredDate); // filter users by predicates return groups.stream().filter(group -> predicates.stream().anyMatch(p -> p.test(group.getName()))) @@ -153,6 +157,8 @@ private Set filterUserByGroupNames(List groups, String groupNames, userService.findByGroupName(group.getName()) : userService.findByGroupNameAndRegisterType(group.getName(), registerType) ).stream()) + .filter(u -> startDate == null || u.getRegisteredDate().compareTo(startDate) >= 0) + .filter(u -> endDate == null || u.getRegisteredDate().compareTo(endDate) <= 0) .collect(Collectors.toSet()); } diff --git a/src/main/java/ru/javaops/util/TimeUtil.java b/src/main/java/ru/javaops/util/TimeUtil.java new file mode 100644 index 0000000..9ca920b --- /dev/null +++ b/src/main/java/ru/javaops/util/TimeUtil.java @@ -0,0 +1,16 @@ +package ru.javaops.util; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; + +/** + * GKislin + * 18.05.2016 + */ +public class TimeUtil { + public static Date toDate(LocalDate ld) { + return ld == null ? null : + Date.from(ld.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); + } +} diff --git a/src/main/java/ru/javaops/web/MailController.java b/src/main/java/ru/javaops/web/MailController.java index dc98f00..616077a 100644 --- a/src/main/java/ru/javaops/web/MailController.java +++ b/src/main/java/ru/javaops/web/MailController.java @@ -3,6 +3,7 @@ import com.google.common.base.Splitter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.query.Param; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -15,6 +16,8 @@ import ru.javaops.service.MailService; import ru.javaops.service.MailService.GroupResult; +import java.time.LocalDate; +import java.util.Collections; import java.util.Set; import static org.springframework.web.bind.annotation.RequestMethod.POST; @@ -54,9 +57,14 @@ public ResponseEntity sendToProjectByGroupType(@Param("template") S @RequestMapping(value = "/to-groups", method = POST) public ResponseEntity sendToGroup(@Param("template") String template, @Param("includes") String includes, @RequestParam(value = "excludes", required = false) String excludes, - @RequestParam(value = "reg-type", required = false) RegisterType registerType) { + @RequestParam(value = "reg-type", required = false) RegisterType registerType, + @RequestParam(value = "startRegisteredDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startRegisteredDate, + @RequestParam(value = "endRegisteredDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endRegisteredDate) { - Set users = groupService.filterUserByGroupNames(includes, excludes, registerType); + Set users = groupService.filterUserByGroupNames(includes, excludes, registerType, startRegisteredDate, endRegisteredDate); + if (users.isEmpty()) { + return getGroupResultResponseEntity(new GroupResult(0, Collections.emptyList(), null)); + } GroupResult groupResult = mailService.sendToUserList(template, users); return getGroupResultResponseEntity(groupResult); } From ecde4c7ee5e5c13aee4be73af4623fcc1978211e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 18 May 2016 18:23:40 +0300 Subject: [PATCH 139/936] Add ad_repeat --- resources/mails/topjava_ad_repeat.html | 99 ++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 resources/mails/topjava_ad_repeat.html diff --git a/resources/mails/topjava_ad_repeat.html b/resources/mails/topjava_ad_repeat.html new file mode 100644 index 0000000..de82a62 --- /dev/null +++ b/resources/mails/topjava_ad_repeat.html @@ -0,0 +1,99 @@ + + + + + + 26.05 старт проекта 'Java Enterprise (Topjava)' + +

          + Здравствуй firstName!
          +

          +

          Приглашаю тебя принять участие в очередном выпуске проекта Java Enterprise (Topjava)

          +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей + с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), + REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
          + +

          Старт 26.05 (следующий четверг).
          + Выполняя вступительное задание можно оценить свои силы и + получить представление о том, как будут проходить занятия. +

          +

          Требования к участникам:

          +На проекте мы не проходим синтаксис java: предполагается, что вы уже знаете, что такое классы, конструкторы, +аннотации, анонимные классы, исключения и пр. +Также необходим некоторый опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на +первом занятии, кратко повторяя основы. +Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно, но не принципиально. Весь +"Enterprise": Maven, Git (в том объеме, который нам нужен), Spring, Hibernate, REST даются с азов. Никаких + специальных знаний Java EE не требуется. +
            +
          • + Стоимость участия без проверки домашних заданий: 8300 руб.
            + сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом. +
          • +
          • Стоимость полного пакета: 16500 руб. + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при + устройстве на работу). +
          • +
          • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
          • + Если Вы уже участвовали на моих курсах, то есть скидка: 700 руб. (без проверки ДЗ) и 1500 руб (с проверкой). +
          • Способы оплаты
          • +
          • Вопросы по проекту
          • +
          • Ресурсы для подготовки
          • +
          • Курс рубля
          • +
          + +
          +

          Основные достоинста проекта, взятые из отзывов участников: +

          +

          Максимальный охват

          +Самые важные и необходимые Java разработчику темы, API, фреймворки, инструменты в одном курсе. + +

          Насыщенное и структурированное изложение как дополнение к проекту

          +Изложение материала "без воды" нацелено на практическое использование и дополняется материалом для самостоятельной +проработки. Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, в связке, как +дополнения к созданию единого работающего приложения. +Усвоение и понимание материала увеличивается в разы. + +

          Последовательная возрастание сложности с нуля

          +Сложность проекта возрастает постепенно, с кода "Hello Topjava" в main() вступительного задания до финальной версии. +Слон съедается по кусочкам. + +

          Совместная разработка

          +Участники на протяжении всего курса работают с кодом проекта. Выполнение домашних заданий закрепляет полученные +знания. +В результате проект становится "Твоим". + +

          Поддержка группы и преподавателя

          +Общение по любым вопросам: git, IDEA, домашние задания, зарплаты программиста, java консультации, архитектура, +трудоустройство, вакансии, новости IT и пр. + +

          Доступность и структурированность материалов

          +Все видео доступно для просмотра онлайн и скачивания. Записи разбиты по темам +и тщательно отредактированы. Большое количество подобранных ресурсов для углубления в детали. + +

          Оптимальное подобранное время

          +Занятия проходят раз в неделю, оптимальное время необходимое для проработки пройденных тем и выполнения домашнего +задания. + +

          Ревью Вашего кода.

          +Вы увидите именно свои ошибки в стиле, структурах данных, алгоритмах, кодировании. +Опыт равноценен нескольким годам работы разработчиком java. + +

          Помощь в составлении резюме и с трудоустройством.

          +Ваши формы соискателя я рассылаю всем знакомым HR, уже есть случаи трудоустройства выпускников. +Также в группе выпускников происходит активное общение на эту тему, коллеги делятся своим опытом трудоустройства, +публикуют вакансии со своей работы. +

          После проекта в твоем резюме появится раздел в опыте работы:

          +Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей +на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API: +
            +
          • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA
          • +
          • реализация и тестирование REST и AJAX контроллеров
          • +
          • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
          • +
          • твоя доработка проекта
          • +
          + +

          Надеюсь увидеться на проекте,

          +

          +

          + \ No newline at end of file From eb0b09a14206b3a5739af78f01202d5298bfa0dc Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 18 May 2016 18:27:06 +0300 Subject: [PATCH 140/936] Set failed < 6 --- src/main/java/ru/javaops/service/MailService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/javaops/service/MailService.java b/src/main/java/ru/javaops/service/MailService.java index fd0d2cc..b2187d8 100644 --- a/src/main/java/ru/javaops/service/MailService.java +++ b/src/main/java/ru/javaops/service/MailService.java @@ -207,7 +207,7 @@ private boolean accept(String email, Future future) { failed.add(new MailResult(email, e.toString())); LOG.error("Sending to " + email + " failed with " + e.getMessage()); } - return (failed.size() < success || failed.size() < 3) && failedCause == null; + return (failed.size() < 6) && failedCause == null; } } From 5558229378f374e6dc703a2f9b91a54540234a96 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 22 May 2016 23:31:38 +0300 Subject: [PATCH 141/936] Add AD group type --- src/main/java/ru/javaops/model/GroupType.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/javaops/model/GroupType.java b/src/main/java/ru/javaops/model/GroupType.java index f02ec33..635a694 100644 --- a/src/main/java/ru/javaops/model/GroupType.java +++ b/src/main/java/ru/javaops/model/GroupType.java @@ -8,5 +8,6 @@ public enum GroupType { TEST, REGISTERED, FINISHED, - CURRENT + CURRENT, + AD } From a6f3a3c761832cdfac16fa8ccb4b623be517b0ab Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 24 May 2016 02:31:11 +0300 Subject: [PATCH 142/936] Add urise template --- resources/mails/basejava_urise.html | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 resources/mails/basejava_urise.html diff --git a/resources/mails/basejava_urise.html b/resources/mails/basejava_urise.html new file mode 100644 index 0000000..521b5b0 --- /dev/null +++ b/resources/mails/basejava_urise.html @@ -0,0 +1,18 @@ + + + + + + Сегодня, 24.05 в 19.00 (GMT+3) БЕСПЛАТНОЕ онлайн занятие: Java разработка, практика и презентация курса: Java SE + Java Web. + +

          + Здравствуй firstName!
          +

          +

          + Недавно я начал преподавать в школе U-Rise и сегодня, 24.05 в 19.00 (Москва/Киев) буду проводить бесплатное онлайн занятие на тему Java разработки. +

          +Интересные факты, статистика, немного практики и ответы вживую на любой интересующий тебя вопрос по этой теме. +

          Приглашаю к участию в вебинаре

          +

          +

          + \ No newline at end of file From eeff422cfabcb2d193adeed403f4c6ea16075198 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 24 May 2016 02:32:52 +0300 Subject: [PATCH 143/936] fix --- resources/mails/basejava_urise.html | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/mails/basejava_urise.html b/resources/mails/basejava_urise.html index 521b5b0..188d563 100644 --- a/resources/mails/basejava_urise.html +++ b/resources/mails/basejava_urise.html @@ -13,6 +13,5 @@

          Интересные факты, статистика, немного практики и ответы вживую на любой интересующий тебя вопрос по этой теме.

          Приглашаю к участию в вебинаре

          -

          \ No newline at end of file From 42b819ce61f0844289d94ad7499fcd11170641b9 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 24 May 2016 18:48:37 +0300 Subject: [PATCH 144/936] fix --- src/main/java/ru/javaops/service/MailService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/javaops/service/MailService.java b/src/main/java/ru/javaops/service/MailService.java index b2187d8..8ddcff2 100644 --- a/src/main/java/ru/javaops/service/MailService.java +++ b/src/main/java/ru/javaops/service/MailService.java @@ -72,8 +72,8 @@ public GroupResult sendToEmailList(String template, Collection emails) { } public GroupResult sendToUserList(String template, Set users) { - checkNotNull(template, "template must not be null"); - checkNotNull(users, "users must not be null"); + checkNotNull(template, " template must not be null"); + checkNotNull(users, " users must not be null"); users.add(getTestUser()); CompletionService completionService = new ExecutorCompletionService<>(mailExecutor); Map, String> resultMap = new HashMap<>(); From c426fbb66ebb389127737a7d2737528eb3a8d575 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 25 May 2016 11:51:18 +0300 Subject: [PATCH 145/936] topjava tomorrow --- resources/mails/topjava_tomorrow.html | 94 +++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 resources/mails/topjava_tomorrow.html diff --git a/resources/mails/topjava_tomorrow.html b/resources/mails/topjava_tomorrow.html new file mode 100644 index 0000000..4899092 --- /dev/null +++ b/resources/mails/topjava_tomorrow.html @@ -0,0 +1,94 @@ + + + + + + ЗАВТРА, 26.05 старт 'Java Enterprise (Topjava)' + +

          + Здравствуй firstName!
          +

          +

          Напомню, что завтра, 26.05 старт проекта Java Enterprise (Topjava)!

          +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей + с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), + REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
          +
            +
          • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
          • +
          • Сбор группы в Slack
          • +
          • Раздача учебных лицензий JetBrains IDEA
          • +
          • Выполнение и проверка (у кого участие с проверкой) вступительного задания
          • +
          +Решение вступительное задание желательно присылать до 31.05, чтобы я успел сделать ревью кода.
          +Первое занятие будет 02.06 + +
            +
          • + Стоимость участия без проверки домашних заданий: 8300 руб.
            + сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом. +
          • +
          • Стоимость полного пакета: 16500 руб. + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при + устройстве на работу). +
          • +
          • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
          • + Скидка для участников других проектов: 700 руб. (без проверки ДЗ) и 1500 руб (с проверкой). +
          • Способы оплаты
          • +
          • Курс рубля

          • +
          • Вопросы по проекту
          • +
          • Ресурсы для подготовки
          • +
          +

          Перед оплатой пожалуйста свяжись со мной в скайпе: grigory.kislin (или тел. +7 921 855 0482)

          +

          Поторопись, если хочешь значительно поднять свой уровень владения Java и принять участие!

          +
          +

          Основные достоинста проекта, взятые из отзывы реальных участиников предыдущих выпусков: +

          +

          Максимальный охват

          +Самые важные и необходимые Java разработчику темы, API, фреймворки, инструменты в одном курсе. + +

          Насыщенное и структурированное изложение как дополнение к проекту

          +Изложение материала "без воды" нацелено на практическое использование и дополняется материалом для самостоятельной +проработки. Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, в связке, как +дополнения к созданию единого работающего приложения. +Усвоение и понимание материала увеличивается в разы. + +

          Последовательная возрастание сложности с нуля

          +Сложность проекта возрастает постепенно, с кода "Hello Topjava" в main() вступительного задания до финальной версии. +Слон съедается по кусочкам. + +

          Совместная разработка

          +Участники на протяжении всего курса работают с кодом проекта. Выполнение домашних заданий закрепляет полученные +знания. +В результате проект становится "Твоим". + +

          Поддержка группы и преподавателя

          +Общение по любым вопросам: git, IDEA, домашние задания, зарплаты программиста, java консультации, архитектура, +трудоустройство, вакансии, новости IT и пр. + +

          Доступность и структурированность материалов

          +Все видео доступно для просмотра онлайн и скачивания. Записи разбиты по темам +и тщательно отредактированы. Большое количество подобранных ресурсов для углубления в детали. + +

          Оптимальное подобранное время

          +Занятия проходят раз в неделю, оптимальное время необходимое для проработки пройденных тем и выполнения домашнего +задания. + +

          Ревью Вашего кода.

          +Вы увидите именно свои ошибки в стиле, структурах данных, алгоритмах, кодировании. +Опыт равноценен нескольким годам работы разработчиком java. + +

          Помощь в составлении резюме и с трудоустройством.

          +Ваши формы соискателя я рассылаю всем знакомым HR, уже есть случаи трудоустройства выпускников. +Также в группе выпускников происходит активное общение на эту тему, коллеги делятся своим опытом трудоустройства, +публикуют вакансии со своей работы. +

          После проекта в твоем резюме появится раздел в опыте работы:

          +Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей +на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API: +
            +
          • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA
          • +
          • реализация и тестирование REST и AJAX контроллеров
          • +
          • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
          • +
          • твоя доработка проекта
          • +
          +

          +

          + \ No newline at end of file From a20355a9ffdea460296ae8ddab3f077531df0049 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 25 May 2016 12:00:50 +0300 Subject: [PATCH 146/936] topjava tomorrow --- resources/mails/topjava_tomorrow.html | 120 +++++++++++++++++++++++++- 1 file changed, 119 insertions(+), 1 deletion(-) diff --git a/resources/mails/topjava_tomorrow.html b/resources/mails/topjava_tomorrow.html index 4899092..c78dbea 100644 --- a/resources/mails/topjava_tomorrow.html +++ b/resources/mails/topjava_tomorrow.html @@ -38,7 +38,6 @@

          Напомню, что завтра, 26.05 старт проекта Java
        • Ресурсы для подготовки

        Перед оплатой пожалуйста свяжись со мной в скайпе: grigory.kislin (или тел. +7 921 855 0482)

        -

        Поторопись, если хочешь значительно поднять свой уровень владения Java и принять участие!


        Основные достоинста проекта, взятые из отзывы реальных участиников предыдущих выпусков:

        @@ -89,6 +88,125 @@

        После проекта в твоем резюме появится раз
      • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
      • твоя доработка проекта
      +
      +

      Расписание занятий проекта:

      +рассылка занятий происходит по четвергам, для участников с проверкой домашнего задания желательно присылать + ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. +

        26.05: Старт проекта

        +
      • Сбор группы в Slack и Skype
      • +
      • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
      • +
      • Раздача учебных лицензий JetBrains IDEA
      • +
      • Начало выполнение вступительного задания
      • +
      +

        02.06: 1-е занятие

        +
      • Разбор домашнего задания вступительного занятия (вместе с Optional)
      • +
      • Обзор используемых в проекте технологий. Интеграция ПО
      • +
      • Maven
      • +
      • WAR. Веб-контейнер Tomcat. Сервлеты
      • +
      • Логирование
      • +
      • Уровни и зависимости логгирования. JMX
      • +
      • Домашнее задание 1-го занятия (HW1 + Optional)
      • +
      +

        09.06: 2-е занятие

        +
      • Разбор домашнего задания HW1 + Optional
      • +
      • Библиотека vs Фреймворк. Стандартные библиотеки Apache Commons, Guava
      • +
      • Слои приложения. Создание каркаса приложения
      • +
      • Обзор Spring Framework. Spring Context
      • +
      • Пояснения к HW2. Обработка Autowired
      • +
      • Домашнее задание (HW2 + Optional)
      • +
      +

        16.06: 3-е занятие

        +
      • Разбор домашнего задания HW2 + Optional
      • +
      • Жизненный цикл Spring контекста
      • +
      • Тестирование через JUnit
      • +
      • Spring Test
      • +
      • Базы данных. Обзор NoSQL и Java persistence solution без ORM
      • +
      • Настройка Database в IDEA
      • +
      • Скрипты инициализации базы. Spring Jdbc Template
      • +
      • Подготовка тестовых данных и тестирование UserService
      • +
      • Логирование тестов
      • +
      • Домашнее задание (HW3 + Optional)
      • +
      +

        23.06: 4-е занятие

        +
      • Разбор домашнего задания HW3 + Optional
      • +
      • Методы улучшения качества кода
      • +
      • Spring: инициализация и популирование DB
      • +
      • Подмена контекста при тестировании
      • +
      • ORM. Hibernate. JPA
      • +
      • Поддержка HSQLDB
      • +
      • Домашнее задание (HW4 + Optional)
      • +
      +

        30.06: 5-е занятие

        +
      • Разбор вопросов
      • +
      • Разбор домашнего задания HW4 + Optional
      • +
      • Транзакции
      • +
      • Профили Maven и Spring
      • +
      • Пул коннектов
      • +
      • Spring Data JPA
      • +
      • Spring кэш
      • +
      • Домашнее задание (HW5 + Optional)
      • +
      +

        07.07: 6-е занятие

        +
      • Разбор домашнего задания HW5 + Optional
      • +
      • Кэш Hibernate
      • +
      • Spring Web
      • +
      • JPS, JSTL, internationalization
      • +
      • Динамическое изменение профиля при запуске
      • +
      • Конфигурирование Tomcat через maven plugin. Jndi-lookup
      • +
      • Spring Web MVC
      • +
      • Spring Internationalization
      • +
      • Домашнее задание (HW6 + Optional)
      • +
      +

        14.07: 7-е занятие

        +
      • Разбор домашнего задания HW6 + Optional
      • +
      • Автогенерация DDL по модели
      • +
      • Тестирование Spring MVC
      • +
      • REST контроллеры
      • +
      • Тестирование REST контроллеров. Jackson
      • +
      • jackson-datatype-hibernate. Тестирование через матчеры
      • +
      • Тестирование через SoapUi. UTF-8
      • +
      • Домашнее задание (HW7 + Optional)
      • +
      +

        21.07: 8-е занятие

        +
      • Разбор домашнего задания HW7 + Optional
      • +
      • WebJars. jQuery и JavaScript frameworks
      • +
      • Bootstrap
      • +
      • AJAX. Datatables. jQuery
      • +
      • jQuery notifications plugin
      • +
      • Добавление Spring Security
      • +
      • Домашнее задание (HW8 + Optional)
      • +
      +

        28.07: 9-е занятие

        +
      • Разбор домашнего задания HW8 + Optional
      • +
      • Spring Binding
      • +
      • Spring Validation
      • +
      • Перевод DataTables на Ajax
      • +
      • Форма login / logout
      • +
      • Реализация собственного провайдера авторицазии
      • +
      • Принцип работы Spring Security. Проксирование
      • +
      • Spring Security Test
      • +
      • Cookie. Session
      • +
      • Домашнее задание (HW9 + Optional)
      • +
      +

        04.08: 10-е занятие

        +
      • Разбор домашнего задания HW10 + Optional
      • +
      • Spring Security Taglib. Method Security Expressions
      • +
      • Интерсепторы. Редактирование профиля. JSP tag files
      • +
      • Форма регистрации
      • +
      • Обработка исключений в Spring
      • +
      • Encoding password
      • +
      • Защита от межсайтовой подделки запросов (CSRF)
      • +
      • Домашнее задание (HW10)
      • +
      +

        11.08: Заключительное занятие

        +
      • Рефакторинг
      • +
      • Разбор домашнего задания HW10 + Optional
      • +
      • Деплой приложения в Heroku
      • +
      • Возможные доработки приложения
      • +
      • Опрос участников проекта
      • +
      • Домашнее задание по проекту: составление резюме
      • +
      +

      Поторопись, если хочешь значительно поднять свой уровень владения Java Enterprise и принять участие в разработке!

      \ No newline at end of file From bc140609a634575df14ae128bceb8e9d57e8258a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 25 May 2016 12:04:42 +0300 Subject: [PATCH 147/936] topjava tomorrow --- resources/mails/topjava_tomorrow.html | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava_tomorrow.html b/resources/mails/topjava_tomorrow.html index c78dbea..4df7d0a 100644 --- a/resources/mails/topjava_tomorrow.html +++ b/resources/mails/topjava_tomorrow.html @@ -3,7 +3,7 @@ - ЗАВТРА, 26.05 старт 'Java Enterprise (Topjava)' + ЗАВТРА, 26.05 старт проекта 'Java Enterprise (Topjava)'

      Здравствуй firstName!
      @@ -18,9 +18,10 @@

      Напомню, что завтра, 26.05 старт проекта Java
    • Раздача учебных лицензий JetBrains IDEA
    • Выполнение и проверка (у кого участие с проверкой) вступительного задания
    -Решение вступительное задание желательно присылать до 31.05, чтобы я успел сделать ревью кода.
    +Решение вступительное задание желательно присылать до 31.05, чтобы я успел сделать ревью кода. +

    Первое занятие будет 02.06 - +

    • Стоимость участия без проверки домашних заданий: 8300 руб.
      @@ -30,7 +31,7 @@

      Напомню, что завтра, 26.05 старт проекта Java добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при устройстве на работу).

    • -
    • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
    • +
    • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
    • Скидка для участников других проектов: 700 руб. (без проверки ДЗ) и 1500 руб (с проверкой).
    • Способы оплаты
    • Курс рубля

    • From 85c14a6b5fdaef07dbf9bd362fbe40459b0e8894 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 25 May 2016 12:06:38 +0300 Subject: [PATCH 148/936] topjava tomorrow --- resources/mails/topjava_tomorrow.html | 4 ---- 1 file changed, 4 deletions(-) diff --git a/resources/mails/topjava_tomorrow.html b/resources/mails/topjava_tomorrow.html index 4df7d0a..7d59404 100644 --- a/resources/mails/topjava_tomorrow.html +++ b/resources/mails/topjava_tomorrow.html @@ -18,10 +18,6 @@

      Напомню, что завтра, 26.05 старт проекта Java
    • Раздача учебных лицензий JetBrains IDEA
    • Выполнение и проверка (у кого участие с проверкой) вступительного задания
    -Решение вступительное задание желательно присылать до 31.05, чтобы я успел сделать ревью кода. -

    -Первое занятие будет 02.06 -

    • Стоимость участия без проверки домашних заданий: 8300 руб.
      From 509b59c807180eb5700989e87a148d13bf124ef4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 26 May 2016 02:08:14 +0300 Subject: [PATCH 149/936] topjava_1st day --- resources/mails/topjava_1st_day.html | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 resources/mails/topjava_1st_day.html diff --git a/resources/mails/topjava_1st_day.html b/resources/mails/topjava_1st_day.html new file mode 100644 index 0000000..1b5d412 --- /dev/null +++ b/resources/mails/topjava_1st_day.html @@ -0,0 +1,47 @@ + + + + Начало проекта 'Java Enterprise (TopJava)' + +

      + Здравствуй firstName!
      +

      +Рад сообщить, что сегодня начало проекта.
      +Группа у нас будет большая, поэтому будет много вопросов и общения. +

      + Для начала занятий у тебя должен быть доступ к Google Drive папке Topjava7 и в группу Slack.
      + Если чего-то не хватает, проверь почту и напиши мне в skype: grigory.kislin +

      +

      Здесь я буду вести общий проект topjava07 в гитхаб.
      +На заглавной странице - расписание занятий.
      +Рассылка первого занятия будет в четверг, 02.06 +

      +До этого необходимо установить необходимое ПО, настроить проект и выполнить домашнее задание по инструкции из +вступительного занятия. +Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй +инструкциям. Особое внимание обращаю на Wiki по ведению проекта в Git, необходимо строго следовать этим правилам. +Обсуждение вступительного занятия происходит в канале Slack #entrance_lesson.
      +

      +Если у тебя есть проверка ДЗ, то решение вступительного желательно присылать до вечера 31.05. +

      +Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Лучше подготовится заранее по ресурсам. + +

      + Добавляйся в группу VK: практика Java (Web/ Enterprise)
      +

      +

      + Удачи в освоении материалов и выполнении задания,
      + Григорий Кислин
      + skype: grigory.kislin +

      +

      + Java Online Projects +

      + \ No newline at end of file From 49434eee0eb158144c9af10b7eb4deab9bc51640 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 26 May 2016 03:14:36 +0300 Subject: [PATCH 150/936] Small update --- resources/mails/topjava_1st_day.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava_1st_day.html b/resources/mails/topjava_1st_day.html index 1b5d412..ea86b3a 100644 --- a/resources/mails/topjava_1st_day.html +++ b/resources/mails/topjava_1st_day.html @@ -20,7 +20,7 @@

      Здесь я буду вести общий вступительного занятия. Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй -инструкциям. Особое внимание обращаю на Wiki по ведению проекта в Git, необходимо строго следовать этим правилам. +инструкциям. Особое внимание обращаю на wiki по ведению проекта в Git, необходимо строго следовать этим правилам. Обсуждение вступительного занятия происходит в канале Slack #entrance_lesson.

      Если у тебя есть проверка ДЗ, то решение вступительного желательно присылать до вечера 31.05. From cbfb679c3d6e23a1b19f74c0d530d26ed1da8315 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 27 May 2016 00:50:33 +0300 Subject: [PATCH 151/936] Add TS template --- resources/mails/topjava_1st_day.html | 2 +- resources/mails/topjava_start_TS.html | 71 +++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 resources/mails/topjava_start_TS.html diff --git a/resources/mails/topjava_1st_day.html b/resources/mails/topjava_1st_day.html index ea86b3a..2d3238b 100644 --- a/resources/mails/topjava_1st_day.html +++ b/resources/mails/topjava_1st_day.html @@ -23,7 +23,7 @@

      Здесь я буду вести общий wiki по ведению проекта в Git, необходимо строго следовать этим правилам. Обсуждение вступительного занятия происходит в канале Slack #entrance_lesson.

      -Если у тебя есть проверка ДЗ, то решение вступительного желательно присылать до вечера 31.05. +Если у тебя есть проверка ДЗ, то решение вступительного задания желательно присылать до вечера 31.05.

      Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Лучше подготовится заранее по ресурсам.
        diff --git a/resources/mails/topjava_start_TS.html b/resources/mails/topjava_start_TS.html new file mode 100644 index 0000000..b008fd3 --- /dev/null +++ b/resources/mails/topjava_start_TS.html @@ -0,0 +1,71 @@ + + + + Участие в проекте 'Java Enterprise (TopJava)' + +

        + Здравствуй firstName!
        +

        +Поздравляю тебя с участием на проекте Java Enterprise (Topjava), 7-й выпуск!
        +

        Проект

        +

        Здесь я буду вести общий проект topjava07 в гитхаб.
        + Форк лучше далать от него (см. вступительное ниже), хотя большой разницы нет.
        + На заглавной странице - расписание занятий.
        + Рассылка первого занятия будет в четверг, 02.06 +

        +

        Вступительное занятие

        +До первого занятия 02.06 необходимо установить необходимое ПО, настроить проект и выполнить домашнее задание по +инструкции из +вступительного занятия. +Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй + инструкциям. Особое внимание обращаю на wiki по ведению + проекта в Git, необходимо строго следовать этим правилам. +

        +Решение вступительного задания желательно присылать до вечера 31.05 (договорились в нашу группу skype). +

        +

        Заполнение регистрационной формы

        +Общение на проекте будет вестись в Slack. Заполни пожалуйста пустые поля регистрационной формы, + и на почту придет приглашение в группу Slack topjava7. Для доступа к + материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. +

        + Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал.
        + Обсуждение вступительного занятия происходит в канале Slack #entrance_lesson.
        +

        +
          Каналы Slack: +
        • #flooding: оффтопик
        • +
        • #general: общие вопросы
        • +
        • #git: вопросы по git
        • +
        • #idea: вопросы по idea
        • +
        • #interview_job: вопросы прохождения интервью, + работа, вакансии +
        • +
        + +Форматирование сообщениq в + slack
        +Desktop/ Mobile приложение Slack +

        + До 02.06 (первого занятия) материалы Google Drive не нужны. Заполняй форму, я дам доступ в понедельник, как вернусь. +

        +

        Ресурсы

        +Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Лучше подготовится заранее по ресурсам. + + +

        + Завтра меня не будет, вернусь к вам в понедельник.
        + Удачи в освоении материалов и выполнении задания,
        + Григорий Кислин
        + skype: grigory.kislin +

        +

        + Java Online Projects +

        + \ No newline at end of file From 31701f8a8656d33ebdd95932519023144207a075 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 27 May 2016 00:56:01 +0300 Subject: [PATCH 152/936] Fix TS template --- resources/mails/topjava_start_TS.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava_start_TS.html b/resources/mails/topjava_start_TS.html index b008fd3..421f5d8 100644 --- a/resources/mails/topjava_start_TS.html +++ b/resources/mails/topjava_start_TS.html @@ -21,14 +21,14 @@

        Вступительное занятие

        инструкциям. Особое внимание обращаю на wiki по ведению проекта в Git, необходимо строго следовать этим правилам.

        -Решение вступительного задания желательно присылать до вечера 31.05 (договорились в нашу группу skype). +Решение вступительного задания желательно присылать до вечера 31.05 (договорились в нашу группу skype).

        Заполнение регистрационной формы

        -Общение на проекте будет вестись в Slack. Заполни пожалуйста пустые поля регистрационной формы, и на почту придет приглашение в группу Slack topjava7. Для доступа к - материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. + материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно.

        Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал.
        Обсуждение вступительного занятия происходит в канале Slack Date: Fri, 27 May 2016 01:23:40 +0300 Subject: [PATCH 153/936] Add GD access --- resources/mails/topjava_JR_GD.html | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 resources/mails/topjava_JR_GD.html diff --git a/resources/mails/topjava_JR_GD.html b/resources/mails/topjava_JR_GD.html new file mode 100644 index 0000000..8a8a239 --- /dev/null +++ b/resources/mails/topjava_JR_GD.html @@ -0,0 +1,26 @@ + + + + Доступ к Google Drive + +

        + Здравствуй firstName!
        +

        +Всем, кто заполнил поле gmail формы выслал доступ к Google Drive. +

        + По ссылке на почте будут доступны все материалы проекта, но проект эволюционирует, поэтому патчи текущего выпуска + будут отличаться. Видео возможно также будут редактироваться / дополнятся. + Все актуальные материалы нашего выпуска будут находится в папке Topjava7
        + Напрямую ходить в Google Drive не придется, все материалы будут доступны по ссылкам урока. +

        +

        + Завтра меня не будет, вернусь к вам в понедельник: тогда и решим все оставшиеся проблемы
        + Удачи в освоении материалов и выполнении задания,
        + Григорий Кислин
        + skype: grigory.kislin +

        +

        + Java Online Projects +

        + \ No newline at end of file From a4219014d6f85712c28d711341b6d79abb830604 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 27 May 2016 01:25:53 +0300 Subject: [PATCH 154/936] Fix GD access --- resources/mails/topjava_JR_GD.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava_JR_GD.html b/resources/mails/topjava_JR_GD.html index 8a8a239..c5b4f36 100644 --- a/resources/mails/topjava_JR_GD.html +++ b/resources/mails/topjava_JR_GD.html @@ -15,7 +15,7 @@ Напрямую ходить в Google Drive не придется, все материалы будут доступны по ссылкам урока.

        - Завтра меня не будет, вернусь к вам в понедельник: тогда и решим все оставшиеся проблемы
        + Завтра меня не будет, вернусь к вам в понедельник: тогда и решим все оставшиеся проблемы.
        Удачи в освоении материалов и выполнении задания,
        Григорий Кислин
        skype: grigory.kislin From 57b00ab336b343df3c6ab1cba7d93cf1a35bf8c3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 30 May 2016 11:58:54 +0300 Subject: [PATCH 155/936] Add topjava first --- resources/mails/topjava_first_lesson.html | 152 ++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 resources/mails/topjava_first_lesson.html diff --git a/resources/mails/topjava_first_lesson.html b/resources/mails/topjava_first_lesson.html new file mode 100644 index 0000000..671cf41 --- /dev/null +++ b/resources/mails/topjava_first_lesson.html @@ -0,0 +1,152 @@ + + + + + + Проект Java Enterprise (Topjava): рассылка первого занятия 02.06.2016 + +

        + Здравствуй firstName!
        +

        +Проект Java Enterprise (Topjava) стартовал, участники собраны в группе Slack (общение по темам), розданы права на материалы, делается вступительное задание.
        +Расслка первого урока будет 02.06, у тебя еще есть возможность принять участие. +Не упусти шанс кардинально поднять свой уровень Java разработчика. +
          +
        • + Стоимость участия без проверки домашних заданий: 8300 руб.
          + сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом. +
        • +
        • Стоимость полного пакета: 16500 руб. + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при + устройстве на работу). +
        • +
        • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
        • + Скидка для участников других проектов: 700 руб. (без проверки ДЗ) и 1500 руб (с проверкой). +
        • Способы оплаты
        • +
        • Курс рубля

        • +
        • Вопросы по проекту
        • +
        • Ресурсы для подготовки
        • +
        +

        Перед оплатой пожалуйста свяжись со мной в скайпе: grigory.kislin (или тел. +7 921 855 0482)

        +
        +

        Отзывы реальных участиников предыдущих выпусков. +

        Расписание занятий проекта:

        +рассылка занятий происходит по четвергам, для участников с проверкой домашнего задания желательно присылать + ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. +
          +
        • Сбор группы в Slack и Skype
        • +
        • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
        • +
        • Раздача учебных лицензий JetBrains IDEA
        • +
        • Начало выполнение вступительного задания
        • +
        +

          02.06: 1-е занятие

          +
        • Разбор домашнего задания вступительного занятия (вместе с Optional)
        • +
        • Обзор используемых в проекте технологий. Интеграция ПО
        • +
        • Maven
        • +
        • WAR. Веб-контейнер Tomcat. Сервлеты
        • +
        • Логирование
        • +
        • Уровни и зависимости логгирования. JMX
        • +
        • Домашнее задание 1-го занятия (HW1 + Optional)
        • +
        +

          09.06: 2-е занятие

          +
        • Разбор домашнего задания HW1 + Optional
        • +
        • Библиотека vs Фреймворк. Стандартные библиотеки Apache Commons, Guava
        • +
        • Слои приложения. Создание каркаса приложения
        • +
        • Обзор Spring Framework. Spring Context
        • +
        • Пояснения к HW2. Обработка Autowired
        • +
        • Домашнее задание (HW2 + Optional)
        • +
        +

          16.06: 3-е занятие

          +
        • Разбор домашнего задания HW2 + Optional
        • +
        • Жизненный цикл Spring контекста
        • +
        • Тестирование через JUnit
        • +
        • Spring Test
        • +
        • Базы данных. Обзор NoSQL и Java persistence solution без ORM
        • +
        • Настройка Database в IDEA
        • +
        • Скрипты инициализации базы. Spring Jdbc Template
        • +
        • Подготовка тестовых данных и тестирование UserService
        • +
        • Логирование тестов
        • +
        • Домашнее задание (HW3 + Optional)
        • +
        +

          23.06: 4-е занятие

          +
        • Разбор домашнего задания HW3 + Optional
        • +
        • Методы улучшения качества кода
        • +
        • Spring: инициализация и популирование DB
        • +
        • Подмена контекста при тестировании
        • +
        • ORM. Hibernate. JPA
        • +
        • Поддержка HSQLDB
        • +
        • Домашнее задание (HW4 + Optional)
        • +
        +

          30.06: 5-е занятие

          +
        • Разбор вопросов
        • +
        • Разбор домашнего задания HW4 + Optional
        • +
        • Транзакции
        • +
        • Профили Maven и Spring
        • +
        • Пул коннектов
        • +
        • Spring Data JPA
        • +
        • Spring кэш
        • +
        • Домашнее задание (HW5 + Optional)
        • +
        +

          07.07: 6-е занятие

          +
        • Разбор домашнего задания HW5 + Optional
        • +
        • Кэш Hibernate
        • +
        • Spring Web
        • +
        • JPS, JSTL, internationalization
        • +
        • Динамическое изменение профиля при запуске
        • +
        • Конфигурирование Tomcat через maven plugin. Jndi-lookup
        • +
        • Spring Web MVC
        • +
        • Spring Internationalization
        • +
        • Домашнее задание (HW6 + Optional)
        • +
        +

          14.07: 7-е занятие

          +
        • Разбор домашнего задания HW6 + Optional
        • +
        • Автогенерация DDL по модели
        • +
        • Тестирование Spring MVC
        • +
        • REST контроллеры
        • +
        • Тестирование REST контроллеров. Jackson
        • +
        • jackson-datatype-hibernate. Тестирование через матчеры
        • +
        • Тестирование через SoapUi. UTF-8
        • +
        • Домашнее задание (HW7 + Optional)
        • +
        +

          21.07: 8-е занятие

          +
        • Разбор домашнего задания HW7 + Optional
        • +
        • WebJars. jQuery и JavaScript frameworks
        • +
        • Bootstrap
        • +
        • AJAX. Datatables. jQuery
        • +
        • jQuery notifications plugin
        • +
        • Добавление Spring Security
        • +
        • Домашнее задание (HW8 + Optional)
        • +
        +

          28.07: 9-е занятие

          +
        • Разбор домашнего задания HW8 + Optional
        • +
        • Spring Binding
        • +
        • Spring Validation
        • +
        • Перевод DataTables на Ajax
        • +
        • Форма login / logout
        • +
        • Реализация собственного провайдера авторицазии
        • +
        • Принцип работы Spring Security. Проксирование
        • +
        • Spring Security Test
        • +
        • Cookie. Session
        • +
        • Домашнее задание (HW9 + Optional)
        • +
        +

          04.08: 10-е занятие

          +
        • Разбор домашнего задания HW10 + Optional
        • +
        • Spring Security Taglib. Method Security Expressions
        • +
        • Интерсепторы. Редактирование профиля. JSP tag files
        • +
        • Форма регистрации
        • +
        • Обработка исключений в Spring
        • +
        • Encoding password
        • +
        • Защита от межсайтовой подделки запросов (CSRF)
        • +
        • Домашнее задание (HW10)
        • +
        +

          11.08: Заключительное занятие

          +
        • Рефакторинг
        • +
        • Разбор домашнего задания HW10 + Optional
        • +
        • Деплой приложения в Heroku
        • +
        • Возможные доработки приложения
        • +
        • Опрос участников проекта
        • +
        • Домашнее задание по проекту: составление резюме
        • +
        +

        +

        + \ No newline at end of file From bb3df6f61d62328072818ffb0b96067346e0b9b7 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 30 May 2016 12:02:56 +0300 Subject: [PATCH 156/936] Add topjava first --- resources/mails/topjava_first_lesson.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava_first_lesson.html b/resources/mails/topjava_first_lesson.html index 671cf41..75e9448 100644 --- a/resources/mails/topjava_first_lesson.html +++ b/resources/mails/topjava_first_lesson.html @@ -29,7 +29,7 @@

      Перед оплатой пожалуйста свяжись со мной в скайпе: grigory.kislin (или тел. +7 921 855 0482)


      -

      Отзывы реальных участиников предыдущих выпусков. +

      Отзывы реальных участиников предыдущих выпусков.

      Расписание занятий проекта:

      рассылка занятий происходит по четвергам, для участников с проверкой домашнего задания желательно присылать ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. From 4a3e281feed46e234cb212f3a15da8f8d97f152f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 30 May 2016 12:08:16 +0300 Subject: [PATCH 157/936] Fix topjava first --- resources/mails/topjava_first_lesson.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava_first_lesson.html b/resources/mails/topjava_first_lesson.html index 75e9448..3309f79 100644 --- a/resources/mails/topjava_first_lesson.html +++ b/resources/mails/topjava_first_lesson.html @@ -9,7 +9,7 @@ Здравствуй firstName!

      Проект Java Enterprise (Topjava) стартовал, участники собраны в группе Slack (общение по темам), розданы права на материалы, делается вступительное задание.
      -Расслка первого урока будет 02.06, у тебя еще есть возможность принять участие. +Рассылка первого урока будет 02.06, у тебя еще есть возможность принять участие. Не упусти шанс кардинально поднять свой уровень Java разработчика.
      • From ab30b59406d02734fbf6781e2886a65fd87e2d0b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 2 Jun 2016 11:59:59 +0300 Subject: [PATCH 158/936] Update to topjav07 --- resources/mails/topjava/lesson/lesson01.html | 14 +++++++------- resources/mails/topjava/lesson/lesson02.html | 4 ++-- resources/mails/topjava/lesson/lesson03.html | 6 +++--- resources/mails/topjava/lesson/lesson04.html | 6 +++--- resources/mails/topjava/lesson/lesson05.html | 6 +++--- resources/mails/topjava/lesson/lesson06.html | 6 +++--- resources/mails/topjava/lesson/lesson07.html | 6 +++--- resources/mails/topjava/lesson/lesson08.html | 6 +++--- resources/mails/topjava/lesson/lesson09.html | 6 +++--- resources/mails/topjava/lesson/lesson10.html | 6 +++--- resources/mails/topjava/lesson/topjava_final.html | 8 ++++---- 11 files changed, 37 insertions(+), 37 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson01.html b/resources/mails/topjava/lesson/lesson01.html index 70d1dd6..1d6db48 100644 --- a/resources/mails/topjava/lesson/lesson01.html +++ b/resources/mails/topjava/lesson/lesson01.html @@ -7,17 +7,17 @@

        Здравствуй firstName!

        -Поздравляю тебя с первым занятием нашего +Поздравляю тебя с первым занятием нашего проекта.

        - Здесь я буду вести проект паралельно с вами.
        - Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
        + Здесь я буду вести проект паралельно с вами.
        + Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
        В случае проблем с накаткой патчей в вашу ветку master всегда можно взять код, на который патчи будут ложиться без проблем, - например UserMealsUtil в формате Raw.
        - Занятия буду выкладывать в каталог doc и ветке doc проекта.
        + например UserMealsUtil в формате Raw. Решение проблем с патчами есть в Wiki Git

        - Если Google Drive отказывает в доступе к материалам урока: + Занятия буду выкладывать в каталоге doc ветки doc проекта.
        + Если Google Drive отказывает в доступе к материалам урока:

        • попробуй выйти из google аккаунта и снова зайти;
        • попробуй зайти в google аккаунт в приватном окне Ctrl+Shift+N в хроме, Ctrl+Shift+P в FF;
        • @@ -25,7 +25,7 @@

        - Домашнее задание (у кого есть проверка) желательно присылать до вечера 08.03.
        + Домашнее задание (у кого есть проверка) желательно присылать до вечера 07.06.
        Удачи в освоении материалов и выполнении задания!

        diff --git a/resources/mails/topjava/lesson/lesson02.html b/resources/mails/topjava/lesson/lesson02.html index 8c5b38c..67c43f2 100644 --- a/resources/mails/topjava/lesson/lesson02.html +++ b/resources/mails/topjava/lesson/lesson02.html @@ -7,10 +7,10 @@

        Здравствуй firstName!

        -Готово второе достаточно сложное занятие нашего проекта "Каркас приложения, добавление Spring".
        +Готово второе достаточно сложное занятие нашего проекта "Каркас приложения, добавление Spring".

        Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
        + href="https://github.com/JavaWebinar/topjava07/commits/master">в моей ветка master.
        В случае проблем с накаткой патчей в вашу смотрите в Git Wiki "Patch не накатывается (предлагает merge)".

        diff --git a/resources/mails/topjava/lesson/lesson03.html b/resources/mails/topjava/lesson/lesson03.html index eeea19f..facec8d 100644 --- a/resources/mails/topjava/lesson/lesson03.html +++ b/resources/mails/topjava/lesson/lesson03.html @@ -7,11 +7,11 @@

        Здравствуй firstName!

        -Третье занятие нашего проекта: тестирование, JUnit и начинаем работать с DB.
        +Третье занятие нашего проекта: тестирование, JUnit и начинаем работать с DB.
        Если с SQL и RDBMS не работали- прочтите основы по ссылкам.

        - Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
        - Обсуждение урока и ДЗ в slack #lesson03 + Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
        + Обсуждение урока и ДЗ в slack #lesson03

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 24.03.
        diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index fde5eb1..7e59e93 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -8,13 +8,13 @@ Здравствуй firstName!

        -Четвертое занятие нашего проекта: популирование данных через Spring, JPA/ Hibernate, HSQLDB. +Четвертое занятие нашего проекта: популирование данных через Spring, JPA/ Hibernate, HSQLDB.

        Из за бага вставки в HSQLDB исправил в последнем патче версию hsqldb с 2.3.3 на 2.3.2. Если патч уже накатили, можете только у себя поправить. Материалов по JPA огромное количество. Чтобы не утонуть- не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW04.

        - Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
        - Обсуждение урока и ДЗ в slack #lesson04 + Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
        + Обсуждение урока и ДЗ в slack #lesson04

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 29.03.
        diff --git a/resources/mails/topjava/lesson/lesson05.html b/resources/mails/topjava/lesson/lesson05.html index 30d22e4..b9741ad 100644 --- a/resources/mails/topjava/lesson/lesson05.html +++ b/resources/mails/topjava/lesson/lesson05.html @@ -8,12 +8,12 @@ Здравствуй firstName!

        -Готово пятое занятие нашего проекта.
        +Готово пятое занятие нашего проекта.
        На следующем уроке перейдем к слою web.

        - Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        - Обсуждение урока и ДЗ в slack #lesson05 + Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        + Обсуждение урока и ДЗ в slack #lesson05

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 07.03
        diff --git a/resources/mails/topjava/lesson/lesson06.html b/resources/mails/topjava/lesson/lesson06.html index fe1b352..6a317c7 100644 --- a/resources/mails/topjava/lesson/lesson06.html +++ b/resources/mails/topjava/lesson/lesson06.html @@ -8,12 +8,12 @@ Здравствуй firstName!

        -Готово шестое занятие нашего проекта.
        +Готово шестое занятие нашего проекта.
        Начинаем изучать Spring-MVC и слой Web.

        - Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        - Обсуждение урока и ДЗ в slack #lesson06 + Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        + Обсуждение урока и ДЗ в slack #lesson06

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 12.04
        diff --git a/resources/mails/topjava/lesson/lesson07.html b/resources/mails/topjava/lesson/lesson07.html index c2a0107..93b2777 100644 --- a/resources/mails/topjava/lesson/lesson07.html +++ b/resources/mails/topjava/lesson/lesson07.html @@ -8,12 +8,12 @@ Здравствуй firstName!

        -Выложил седьмое занятие нашего проекта.
        +Выложил седьмое занятие нашего проекта.
        REST контроллеры и тестирование контроллеров.

        - Перед накаткой патча 0 код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        - Обсуждение урока и ДЗ в slack #lesson07 + Перед накаткой патча 0 код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        + Обсуждение урока и ДЗ в slack #lesson07

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 19.04
        diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index 0e1c14d..7422208 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -8,12 +8,12 @@ Здравствуй firstName!

        -Выложил восьмое занятие нашего проекта.
        +Выложил восьмое занятие нашего проекта.
        CSS (Bootstrap), JavaScript (jQuery + plugins), AJAX, добавление к REST контроллерам базовой авторизации.

        - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и HW8 в Slack #lesson08 + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. + Обсуждение урока и HW8 в Slack #lesson08

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 26.04
        diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index 2be896d..1843231 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -8,12 +8,12 @@ Здравствуй firstName!

        -Выложил девятое занятие нашего проекта.
        +Выложил девятое занятие нашего проекта.
        Наконец делаем настоящую авторизацию, ее тестирование и отрисовку таблицы по AJAX.

        - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и HW9 в Slack #lesson09 + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. + Обсуждение урока и HW9 в Slack #lesson09

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 03.05
        diff --git a/resources/mails/topjava/lesson/lesson10.html b/resources/mails/topjava/lesson/lesson10.html index 8618657..9679750 100644 --- a/resources/mails/topjava/lesson/lesson10.html +++ b/resources/mails/topjava/lesson/lesson10.html @@ -8,12 +8,12 @@ Здравствуй firstName!

        -Выложил десятое занятие нашего проекта.
        +Выложил десятое занятие нашего проекта.
        На заключительное занятие остается HW10, выбор локали и деплой в heroku.

        - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и HW10 в Slack #lesson10 + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. + Обсуждение урока и HW10 в Slack #lesson10

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 11.05 (меня не будет с 07.05 по 10.05)
        diff --git a/resources/mails/topjava/lesson/topjava_final.html b/resources/mails/topjava/lesson/topjava_final.html index 10f6849..353defc 100644 --- a/resources/mails/topjava/lesson/topjava_final.html +++ b/resources/mails/topjava/lesson/topjava_final.html @@ -8,7 +8,7 @@

        Здравствуй firstName!

        -

        Несколько комментариев к заключительному занятию +

        Несколько комментариев к заключительному занятию проекта:

        • Я сделал код для деплоя в Heroku в ветке мастер, из за чего некоторые тесты не проходять.
          @@ -17,13 +17,13 @@

          Несколько комментариев к ветку heroku, в которой - откатил обработку ошибок к варианту урока 10 с дефолтными методами интерфейса.
          При такой реализации все работает, обновил + появилось еще с прошлого проекта. Как воркараунд сделал ветку heroku, в которой + откатил обработку ошибок к варианту урока 10 с дефолтными методами интерфейса.
          При такой реализации все работает, обновил демо из этой ветки (необходим Ctrl+F5 для сброса кэша).

        Шли мне на ревью свое резюме.
        - Выпускные задания от участников с проверкой принимаю на ревью до 02.06 + Выпускные задания от участников с проверкой принимаю на ревью до 02.06 (если проверки нет то возможно оплатить отдельно).

        Ссылки проекта:

        From 14bc21d6efff4daac9f5e3fce9d8661e183aaee0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 2 Jun 2016 12:06:20 +0300 Subject: [PATCH 159/936] Fix lesson01 --- resources/mails/topjava/lesson/lesson01.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson01.html b/resources/mails/topjava/lesson/lesson01.html index 1d6db48..09d9d3b 100644 --- a/resources/mails/topjava/lesson/lesson01.html +++ b/resources/mails/topjava/lesson/lesson01.html @@ -11,9 +11,9 @@ проекта.

        Здесь я буду вести проект паралельно с вами.
        - Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master.
        - В случае проблем с накаткой патчей в вашу ветку master всегда можно взять код, на который патчи будут ложиться без проблем, - например UserMealsUtil в формате Raw. Решение проблем с патчами есть в Wiki Git + Перед началом урока код в ветке master вашего проекта должна быть в том же состоянии, что и в моей ветка master. + В случае проблем с накаткой патчей всегда можно взять код, на который патчи будут ложиться без проблем, + например UserMealsUtil в формате Raw. Решение проблем с патчами есть в Wiki Git.

        Занятия буду выкладывать в каталоге doc ветки doc проекта.
        @@ -28,7 +28,7 @@ Домашнее задание (у кого есть проверка) желательно присылать до вечера 07.06.
        Удачи в освоении материалов и выполнении задания!

        -

        +

        \ No newline at end of file From 2be355b9fd0aa54725033d40c3636608de266834 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 2 Jun 2016 12:07:54 +0300 Subject: [PATCH 160/936] Fix lesson01 --- resources/mails/topjava/lesson/lesson01.html | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson01.html b/resources/mails/topjava/lesson/lesson01.html index 09d9d3b..75bf399 100644 --- a/resources/mails/topjava/lesson/lesson01.html +++ b/resources/mails/topjava/lesson/lesson01.html @@ -26,7 +26,6 @@

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 07.06.
        - Удачи в освоении материалов и выполнении задания!

        From 60c397f4a0e86c421b084f0e685dbb5a95acb17a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 2 Jun 2016 17:30:37 +0300 Subject: [PATCH 161/936] Add slack registration template --- .../mails/javaops/slack_registration.html | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 resources/mails/javaops/slack_registration.html diff --git a/resources/mails/javaops/slack_registration.html b/resources/mails/javaops/slack_registration.html new file mode 100644 index 0000000..f65cd6a --- /dev/null +++ b/resources/mails/javaops/slack_registration.html @@ -0,0 +1,21 @@ + + + + + + Регистрация в группе Slack "Java Online Projects". + + +

        + Здравствуй firstName!
        +

        +Группа skype "Online Projects" с общением выпускников и участников проектов на все темы IT (помощь, отзывы о работах, обсуждение тестовых заданий, вакансии, цены на рынке труда, события, интересные видео по теме и пр.) +переезжает на Slack! По каждой теме будет свой канал, иначе уже сложно ориенитоваться в потоке информации. +

        +Проверь пожалуйста свои данные регистрационной формы. +Галочка "размещение своих данных в закрытой статистике группы" говорит о том, что участники проектов смогут увидеть твои контактные данные в статистике (приделаю позже). +

        +После сохранения формы на почту должно прийти приглашение в новую группу. Welcome! +

        +

        + From e2ceda3c1ee10d8c39dcc232355a1628ce1ec616 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 2 Jun 2016 23:41:53 +0300 Subject: [PATCH 162/936] Implement registration for javaops --- db_migration/2016-06-01.sql | 2 + .../mails/javaops/slack_registration.html | 2 +- .../static/plugins/bootstrap-combobox.css | 44 ++ .../static/plugins/bootstrap-combobox.js | 462 ++++++++++++++++++ resources/view/fragments.html | 2 + resources/view/participation.html | 63 ++- resources/view/registration_javaops.html | 28 ++ ...tration.html => registration_topjava.html} | 0 .../javaops/config/IntegrationProperties.java | 15 +- src/main/java/ru/javaops/model/GroupType.java | 2 +- src/main/java/ru/javaops/model/User.java | 11 + .../javaops/repository/ProjectRepository.java | 21 + .../javaops/service/IntegrationService.java | 6 +- .../ru/javaops/service/ProjectService.java | 43 ++ .../ru/javaops/service/UserServiceImpl.java | 2 +- src/main/java/ru/javaops/to/UserTo.java | 2 +- src/main/java/ru/javaops/to/UserToExt.java | 14 +- src/main/java/ru/javaops/util/UserUtil.java | 1 + .../javaops/web/SubscriptionController.java | 41 +- src/main/resources/application.yaml | 2 +- src/main/resources/import.sql | 6 + 21 files changed, 728 insertions(+), 41 deletions(-) create mode 100644 db_migration/2016-06-01.sql create mode 100644 resources/static/plugins/bootstrap-combobox.css create mode 100644 resources/static/plugins/bootstrap-combobox.js create mode 100644 resources/view/registration_javaops.html rename resources/view/{registration.html => registration_topjava.html} (100%) create mode 100644 src/main/java/ru/javaops/repository/ProjectRepository.java create mode 100644 src/main/java/ru/javaops/service/ProjectService.java diff --git a/db_migration/2016-06-01.sql b/db_migration/2016-06-01.sql new file mode 100644 index 0000000..47badbd --- /dev/null +++ b/db_migration/2016-06-01.sql @@ -0,0 +1,2 @@ +ALTER TABLE USERS ADD STATS_AGREE BOOL DEFAULT FALSE; +UPDATE USERS SET STATS_AGREE=FALSE; \ No newline at end of file diff --git a/resources/mails/javaops/slack_registration.html b/resources/mails/javaops/slack_registration.html index f65cd6a..4f6ef2d 100644 --- a/resources/mails/javaops/slack_registration.html +++ b/resources/mails/javaops/slack_registration.html @@ -12,7 +12,7 @@ Группа skype "Online Projects" с общением выпускников и участников проектов на все темы IT (помощь, отзывы о работах, обсуждение тестовых заданий, вакансии, цены на рынке труда, события, интересные видео по теме и пр.) переезжает на Slack! По каждой теме будет свой канал, иначе уже сложно ориенитоваться в потоке информации.

        -Проверь пожалуйста свои данные регистрационной формы. +Проверь пожалуйста свои данные регистрационной формы. Галочка "размещение своих данных в закрытой статистике группы" говорит о том, что участники проектов смогут увидеть твои контактные данные в статистике (приделаю позже).

        После сохранения формы на почту должно прийти приглашение в новую группу. Welcome! diff --git a/resources/static/plugins/bootstrap-combobox.css b/resources/static/plugins/bootstrap-combobox.css new file mode 100644 index 0000000..df83705 --- /dev/null +++ b/resources/static/plugins/bootstrap-combobox.css @@ -0,0 +1,44 @@ +@media (min-width: 768px) { + .form-search .combobox-container, + .form-inline .combobox-container { + display: inline-block; + margin-bottom: 0; + vertical-align: top; + } + .form-search .combobox-container .input-group-addon, + .form-inline .combobox-container .input-group-addon { + width: auto; + } +} +.combobox-selected .caret { + display: none; +} +/* :not doesn't work in IE8 */ +.combobox-container:not(.combobox-selected) .glyphicon-remove { + display: none; +} +.typeahead-long { + max-height: 300px; + overflow-y: auto; +} +.control-group.error .combobox-container .add-on { + color: #B94A48; + border-color: #B94A48; +} +.control-group.error .combobox-container .caret { + border-top-color: #B94A48; +} +.control-group.warning .combobox-container .add-on { + color: #C09853; + border-color: #C09853; +} +.control-group.warning .combobox-container .caret { + border-top-color: #C09853; +} +.control-group.success .combobox-container .add-on { + color: #468847; + border-color: #468847; +} +.control-group.success .combobox-container .caret { + border-top-color: #468847; +} diff --git a/resources/static/plugins/bootstrap-combobox.js b/resources/static/plugins/bootstrap-combobox.js new file mode 100644 index 0000000..70725b1 --- /dev/null +++ b/resources/static/plugins/bootstrap-combobox.js @@ -0,0 +1,462 @@ +/* ============================================================= + * bootstrap-combobox.js v1.1.7 + * ============================================================= + * Copyright 2012 Daniel Farrell + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + +!function( $ ) { + + "use strict"; + + /* COMBOBOX PUBLIC CLASS DEFINITION + * ================================ */ + + var Combobox = function ( element, options ) { + this.options = $.extend({}, $.fn.combobox.defaults, options); + this.template = this.options.template || this.template + this.$source = $(element); + this.$container = this.setup(); + this.$element = this.$container.find('input[type=text]'); + this.$target = this.$container.find('input[type=hidden]'); + this.$button = this.$container.find('.dropdown-toggle'); + this.$menu = $(this.options.menu).appendTo('body'); + this.matcher = this.options.matcher || this.matcher; + this.sorter = this.options.sorter || this.sorter; + this.highlighter = this.options.highlighter || this.highlighter; + this.shown = false; + this.selected = false; + this.refresh(); + this.transferAttributes(); + this.listen(); + }; + + Combobox.prototype = { + + constructor: Combobox + + , setup: function () { + var combobox = $(this.template()); + this.$source.before(combobox); + this.$source.hide(); + return combobox; + } + + , disable: function() { + this.$element.prop('disabled', true); + this.$button.attr('disabled', true); + this.disabled = true; + this.$container.addClass('combobox-disabled'); + } + + , enable: function() { + this.$element.prop('disabled', false); + this.$button.attr('disabled', false); + this.disabled = false; + this.$container.removeClass('combobox-disabled'); + } + , parse: function () { + var that = this + , map = {} + , source = [] + , selected = false + , selectedValue = ''; + this.$source.find('option').each(function() { + var option = $(this); + if (option.val() === '') { + that.options.placeholder = option.text(); + return; + } + map[option.text()] = option.val(); + source.push(option.text()); + if (option.prop('selected')) { + selected = option.text(); + selectedValue = option.val(); + } + }) + this.map = map; + if (selected) { + this.$element.val(selected); + this.$target.val(selectedValue); + this.$container.addClass('combobox-selected'); + this.selected = true; + } + return source; + } + + , transferAttributes: function() { + this.options.placeholder = this.$source.attr('data-placeholder') || this.options.placeholder + if(this.options.appendId !== "undefined") { + this.$element.attr('id', this.$source.attr('id') + this.options.appendId); + } + this.$element.attr('placeholder', this.options.placeholder) + this.$target.prop('name', this.$source.prop('name')) + this.$target.val(this.$source.val()) + this.$source.removeAttr('name') // Remove from source otherwise form will pass parameter twice. + this.$element.attr('required', this.$source.attr('required')) + this.$element.attr('rel', this.$source.attr('rel')) + this.$element.attr('title', this.$source.attr('title')) + this.$element.attr('class', this.$source.attr('class')) + this.$element.attr('tabindex', this.$source.attr('tabindex')) + this.$source.removeAttr('tabindex') + if (this.$source.attr('disabled')!==undefined) + this.disable(); + } + + , select: function () { + var val = this.$menu.find('.active').attr('data-value'); + this.$element.val(this.updater(val)).trigger('change'); + this.$target.val(this.map[val]).trigger('change'); + this.$source.val(this.map[val]).trigger('change'); + this.$container.addClass('combobox-selected'); + this.selected = true; + return this.hide(); + } + + , updater: function (item) { + return item; + } + + , show: function () { + var pos = $.extend({}, this.$element.position(), { + height: this.$element[0].offsetHeight + }); + + this.$menu + .insertAfter(this.$element) + .css({ + top: pos.top + pos.height + , left: pos.left + }) + .show(); + + $('.dropdown-menu').on('mousedown', $.proxy(this.scrollSafety, this)); + + this.shown = true; + return this; + } + + , hide: function () { + this.$menu.hide(); + $('.dropdown-menu').off('mousedown', $.proxy(this.scrollSafety, this)); + this.$element.on('blur', $.proxy(this.blur, this)); + this.shown = false; + return this; + } + + , lookup: function (event) { + this.query = this.$element.val(); + return this.process(this.source); + } + + , process: function (items) { + var that = this; + + items = $.grep(items, function (item) { + return that.matcher(item); + }) + + items = this.sorter(items); + + if (!items.length) { + return this.shown ? this.hide() : this; + } + + return this.render(items.slice(0, this.options.items)).show(); + } + + , template: function() { + if (this.options.bsVersion == '2') { + return '
        ' + } else { + return '
        ' + } + } + + , matcher: function (item) { + return ~item.toLowerCase().indexOf(this.query.toLowerCase()); + } + + , sorter: function (items) { + var beginswith = [] + , caseSensitive = [] + , caseInsensitive = [] + , item; + + while (item = items.shift()) { + if (!item.toLowerCase().indexOf(this.query.toLowerCase())) {beginswith.push(item);} + else if (~item.indexOf(this.query)) {caseSensitive.push(item);} + else {caseInsensitive.push(item);} + } + + return beginswith.concat(caseSensitive, caseInsensitive); + } + + , highlighter: function (item) { + var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'); + return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { + return '' + match + ''; + }) + } + + , render: function (items) { + var that = this; + + items = $(items).map(function (i, item) { + i = $(that.options.item).attr('data-value', item); + i.find('a').html(that.highlighter(item)); + return i[0]; + }) + + items.first().addClass('active'); + this.$menu.html(items); + return this; + } + + , next: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , next = active.next(); + + if (!next.length) { + next = $(this.$menu.find('li')[0]); + } + + next.addClass('active'); + } + + , prev: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , prev = active.prev(); + + if (!prev.length) { + prev = this.$menu.find('li').last(); + } + + prev.addClass('active'); + } + + , toggle: function () { + if (!this.disabled) { + if (this.$container.hasClass('combobox-selected')) { + this.clearTarget(); + this.triggerChange(); + this.clearElement(); + } else { + if (this.shown) { + this.hide(); + } else { + this.clearElement(); + this.lookup(); + } + } + } + } + + , scrollSafety: function(e) { + if (e.target.tagName == 'UL') { + this.$element.off('blur'); + } + } + , clearElement: function () { + this.$element.val('').focus(); + } + + , clearTarget: function () { + this.$source.val(''); + this.$target.val(''); + this.$container.removeClass('combobox-selected'); + this.selected = false; + } + + , triggerChange: function () { + this.$source.trigger('change'); + } + + , refresh: function () { + this.source = this.parse(); + this.options.items = this.source.length; + } + + , listen: function () { + this.$element + .on('focus', $.proxy(this.focus, this)) + .on('blur', $.proxy(this.blur, this)) + .on('keypress', $.proxy(this.keypress, this)) + .on('keyup', $.proxy(this.keyup, this)); + + if (this.eventSupported('keydown')) { + this.$element.on('keydown', $.proxy(this.keydown, this)); + } + + this.$menu + .on('click', $.proxy(this.click, this)) + .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) + .on('mouseleave', 'li', $.proxy(this.mouseleave, this)); + + this.$button + .on('click', $.proxy(this.toggle, this)); + } + + , eventSupported: function(eventName) { + var isSupported = eventName in this.$element; + if (!isSupported) { + this.$element.setAttribute(eventName, 'return;'); + isSupported = typeof this.$element[eventName] === 'function'; + } + return isSupported; + } + + , move: function (e) { + if (!this.shown) {return;} + + switch(e.keyCode) { + case 9: // tab + case 13: // enter + case 27: // escape + e.preventDefault(); + break; + + case 38: // up arrow + e.preventDefault(); + this.prev(); + this.fixMenuScroll(); + break; + + case 40: // down arrow + e.preventDefault(); + this.next(); + this.fixMenuScroll(); + break; + } + + e.stopPropagation(); + } + + , fixMenuScroll: function(){ + var active = this.$menu.find('.active'); + if(active.length){ + var top = active.position().top; + var bottom = top + active.height(); + var scrollTop = this.$menu.scrollTop(); + var menuHeight = this.$menu.height(); + if(bottom > menuHeight){ + this.$menu.scrollTop(scrollTop + bottom - menuHeight); + } else if(top < 0){ + this.$menu.scrollTop(scrollTop + top); + } + } + } + + , keydown: function (e) { + this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]); + this.move(e); + } + + , keypress: function (e) { + if (this.suppressKeyPressRepeat) {return;} + this.move(e); + } + + , keyup: function (e) { + switch(e.keyCode) { + case 40: // down arrow + if (!this.shown){ + this.toggle(); + } + break; + case 39: // right arrow + case 38: // up arrow + case 37: // left arrow + case 36: // home + case 35: // end + case 16: // shift + case 17: // ctrl + case 18: // alt + break; + + case 9: // tab + case 13: // enter + if (!this.shown) {return;} + this.select(); + break; + + case 27: // escape + if (!this.shown) {return;} + this.hide(); + break; + + default: + this.clearTarget(); + this.lookup(); + } + + e.stopPropagation(); + e.preventDefault(); + } + + , focus: function (e) { + this.focused = true; + } + + , blur: function (e) { + var that = this; + this.focused = false; + var val = this.$element.val(); + if (!this.selected && val !== '' ) { + this.$element.val(''); + this.$source.val('').trigger('change'); + this.$target.val('').trigger('change'); + } + if (!this.mousedover && this.shown) {setTimeout(function () { that.hide(); }, 200);} + } + + , click: function (e) { + e.stopPropagation(); + e.preventDefault(); + this.select(); + this.$element.focus(); + } + + , mouseenter: function (e) { + this.mousedover = true; + this.$menu.find('.active').removeClass('active'); + $(e.currentTarget).addClass('active'); + } + + , mouseleave: function (e) { + this.mousedover = false; + } + }; + + /* COMBOBOX PLUGIN DEFINITION + * =========================== */ + $.fn.combobox = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('combobox') + , options = typeof option == 'object' && option; + if(!data) {$this.data('combobox', (data = new Combobox(this, options)));} + if (typeof option == 'string') {data[option]();} + }); + }; + + $.fn.combobox.defaults = { + bsVersion: '3' + , menu: '' + , item: '
      • ' + }; + + $.fn.combobox.Constructor = Combobox; + +}( window.jQuery ); diff --git a/resources/view/fragments.html b/resources/view/fragments.html index 2ea2e7e..ec6dadc 100644 --- a/resources/view/fragments.html +++ b/resources/view/fragments.html @@ -5,6 +5,7 @@ + @@ -32,6 +33,7 @@ + diff --git a/resources/view/participation.html b/resources/view/participation.html index 3c2c379..6ee1c9f 100644 --- a/resources/view/participation.html +++ b/resources/view/participation.html @@ -4,9 +4,10 @@ Регистрация - - - + + + +
      -


      Темы тестового собеседования:

      +
      +

      Темы тестового собеседования:

      Core Java, Servlet/JSP/Tomcat, REST, SQL

      @@ -60,6 +61,7 @@


      Темы тестового собеседования:

    • 35 мин: 950 руб.
    • 1 час: 1450 руб.
    +

    Детали в скайпе: grigory.kislin

    Skype From fedccaaf9d9f8f703f04efe8dc14b8ee25a5aaa3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 23 Jun 2016 23:37:05 +0300 Subject: [PATCH 180/936] Update topjava lesson04 --- resources/mails/topjava/lesson/lesson04.html | 32 ++++++++++++-------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index 1213f82..aab449c 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -8,19 +8,27 @@ Здравствуй firstName!

    -Четвертое занятие нашего проекта: популирование данных через Spring, JPA/ Hibernate, HSQLDB. + Четвертое занятие нашего проекта: популирование + данных через Spring, JPA/ Hibernate, HSQLDB.

    -Из за бага вставки в HSQLDB исправил в последнем патче версию hsqldb с 2.3.3 на 2.3.2. Если патч уже накатили, можете только у себя поправить. -Материалов по JPA огромное количество. Чтобы не утонуть- не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW04. +Материалов по JPA огромное количество. Чтобы не утонуть- не надо пытаться освоить все сразу. Пока достаточно того, что +нужно для выполнения HW4.

    - Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
    - Обсуждение урока и ДЗ в slack #lesson04 -

    -

    - Домашнее задание (у кого есть проверка) желательно присылать до вечера 29.03.
    - Удачи в освоении материалов и выполнении этого важного задания! -

    -

    -

    + Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
    + Обсуждение урока и ДЗ в slack #lesson04 +

    +

    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 28.06.
    +

    +

    + + После выполнения этого достаточно несложного HW4 можно приступать к выполнению выпускного проекта + +

    +Удачи в освоении материалов и выполнении задания! +

    +

    \ No newline at end of file From db9c858c4bc075e133dafd6e606c6eb6496255d9 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 00:30:26 +0300 Subject: [PATCH 181/936] Add list statistic --- resources/view/statsForbidden.html | 28 +++++++++++++++++++ .../view/{user_list.html => userList.html} | 16 ++--------- .../exception/GlobalExceptionHandler.java | 4 +-- src/main/java/ru/javaops/model/User.java | 2 +- .../ru/javaops/repository/UserRepository.java | 4 +-- .../java/ru/javaops/service/UserService.java | 2 +- .../ru/javaops/service/UserServiceImpl.java | 4 ++- .../java/ru/javaops/web/PageController.java | 11 +++++--- 8 files changed, 46 insertions(+), 25 deletions(-) create mode 100644 resources/view/statsForbidden.html rename resources/view/{user_list.html => userList.html} (71%) diff --git a/resources/view/statsForbidden.html b/resources/view/statsForbidden.html new file mode 100644 index 0000000..7fac1a7 --- /dev/null +++ b/resources/view/statsForbidden.html @@ -0,0 +1,28 @@ + + + + + + Java Online Projects + + + + + + +
    +
    +

    Вы можете смотреть список,
    если согласны на размещением своих данных в закрытой статистике группы.

    +

    Пожалуйста отредактируйте свои данные.

    +
    +
    + + \ No newline at end of file diff --git a/resources/view/user_list.html b/resources/view/userList.html similarity index 71% rename from resources/view/user_list.html rename to resources/view/userList.html index 6c0fbe1..e9044f2 100644 --- a/resources/view/user_list.html +++ b/resources/view/userList.html @@ -25,28 +25,18 @@

    User list

    - - - + + - - - - - - + - - - -
    ФИОРегионИмяГород Обо мнеwebsiteКомпания skypegithubvk
    diff --git a/src/main/java/ru/javaops/config/exception/GlobalExceptionHandler.java b/src/main/java/ru/javaops/config/exception/GlobalExceptionHandler.java index 53d138d..669c852 100644 --- a/src/main/java/ru/javaops/config/exception/GlobalExceptionHandler.java +++ b/src/main/java/ru/javaops/config/exception/GlobalExceptionHandler.java @@ -41,8 +41,6 @@ public ModelAndView defaultHandler(HttpServletRequest req, Throwable e) throws E } private ModelAndView processException(String msg) { - ModelAndView mav = new ModelAndView("exception"); - mav.addObject("message", msg); - return mav; + return new ModelAndView("exception", "message", msg); } } \ No newline at end of file diff --git a/src/main/java/ru/javaops/model/User.java b/src/main/java/ru/javaops/model/User.java index c7cb6b9..9055300 100644 --- a/src/main/java/ru/javaops/model/User.java +++ b/src/main/java/ru/javaops/model/User.java @@ -81,7 +81,7 @@ public class User extends BaseEntity { @Enumerated(EnumType.STRING) @CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id")) @Column(name = "role") - @ElementCollection(fetch = FetchType.EAGER) + @ElementCollection(fetch = FetchType.LAZY) private Set roles; @OneToMany(mappedBy = "group") diff --git a/src/main/java/ru/javaops/repository/UserRepository.java b/src/main/java/ru/javaops/repository/UserRepository.java index 9bd847a..a6af4d5 100644 --- a/src/main/java/ru/javaops/repository/UserRepository.java +++ b/src/main/java/ru/javaops/repository/UserRepository.java @@ -29,6 +29,6 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM User u WHERE LOWER(u.location) LIKE CONCAT('%', :location, '%')") Set findByLocation(@Param("location") String location); - @Query("SELECT u FROM User u WHERE u.statsAgree=TRUE") - Set findAgreeStatsUsers(); + @Query("SELECT u FROM User u WHERE u.statsAgree=TRUE ORDER BY u.location") + Set findAllForStats(); } \ No newline at end of file diff --git a/src/main/java/ru/javaops/service/UserService.java b/src/main/java/ru/javaops/service/UserService.java index 4d5943a..cefdd16 100644 --- a/src/main/java/ru/javaops/service/UserService.java +++ b/src/main/java/ru/javaops/service/UserService.java @@ -30,5 +30,5 @@ public interface UserService { Set findByLocation(String location); - Set findAgreeStatsUsers(); + Set findAllForStats(); } diff --git a/src/main/java/ru/javaops/service/UserServiceImpl.java b/src/main/java/ru/javaops/service/UserServiceImpl.java index 926188c..a101182 100644 --- a/src/main/java/ru/javaops/service/UserServiceImpl.java +++ b/src/main/java/ru/javaops/service/UserServiceImpl.java @@ -96,5 +96,7 @@ public Set findByLocation(String location) { return userRepository.findByLocation(location.toLowerCase()); } - public Set findAgreeStatsUsers() { return userRepository.findAgreeStatsUsers(); } + public Set findAllForStats() { + return userRepository.findAllForStats(); + } } diff --git a/src/main/java/ru/javaops/web/PageController.java b/src/main/java/ru/javaops/web/PageController.java index a04c1dc..2f9961f 100644 --- a/src/main/java/ru/javaops/web/PageController.java +++ b/src/main/java/ru/javaops/web/PageController.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import ru.javaops.model.User; import ru.javaops.service.UserService; @@ -17,9 +18,11 @@ public class PageController { @Autowired private UserService userService; - @RequestMapping(value = "/user_list", method = GET) - public ModelAndView usersInfo() { - Set userSet = userService.findAgreeStatsUsers(); - return new ModelAndView("user_list", "users", userSet); + @RequestMapping(value = "/users", method = GET) + public ModelAndView usersInfo(@RequestParam("key") String key, @RequestParam("email") String email) { + Set userSet = userService.findAllForStats(); + return (userSet.stream().filter(u -> u.getEmail().equals(email)).findAny().isPresent()) ? + new ModelAndView("userList", "users", userSet) : + new ModelAndView("statsForbidden"); } } From 32ababd94e9dac0f918d91ae549e7f47c6d14899 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 01:17:17 +0300 Subject: [PATCH 182/936] Update statistics --- resources/view/userList.html | 5 +-- .../ru/javaops/repository/UserRepository.java | 5 ++- .../java/ru/javaops/service/UserService.java | 3 +- .../ru/javaops/service/UserServiceImpl.java | 3 +- src/main/java/ru/javaops/to/UserStat.java | 44 +++++++++++++++++++ .../java/ru/javaops/web/PageController.java | 4 +- 6 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 src/main/java/ru/javaops/to/UserStat.java diff --git a/resources/view/userList.html b/resources/view/userList.html index e9044f2..bc95de8 100644 --- a/resources/view/userList.html +++ b/resources/view/userList.html @@ -1,6 +1,6 @@ - + Java Online Projects @@ -20,7 +20,6 @@
    -

    User list

    @@ -35,7 +34,7 @@

    User list

    - + diff --git a/src/main/java/ru/javaops/repository/UserRepository.java b/src/main/java/ru/javaops/repository/UserRepository.java index a6af4d5..2baad14 100644 --- a/src/main/java/ru/javaops/repository/UserRepository.java +++ b/src/main/java/ru/javaops/repository/UserRepository.java @@ -6,6 +6,7 @@ import org.springframework.transaction.annotation.Transactional; import ru.javaops.model.RegisterType; import ru.javaops.model.User; +import ru.javaops.to.UserStat; import java.util.Set; @@ -29,6 +30,6 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM User u WHERE LOWER(u.location) LIKE CONCAT('%', :location, '%')") Set findByLocation(@Param("location") String location); - @Query("SELECT u FROM User u WHERE u.statsAgree=TRUE ORDER BY u.location") - Set findAllForStats(); + @Query("SELECT new ru.javaops.to.UserStat(u.fullName, u.email, u.location, u.aboutMe, u.skype) FROM User u WHERE u.statsAgree=TRUE ORDER BY u.location") + Set findAllForStats(); } \ No newline at end of file diff --git a/src/main/java/ru/javaops/service/UserService.java b/src/main/java/ru/javaops/service/UserService.java index cefdd16..84aee09 100644 --- a/src/main/java/ru/javaops/service/UserService.java +++ b/src/main/java/ru/javaops/service/UserService.java @@ -2,6 +2,7 @@ import ru.javaops.model.RegisterType; import ru.javaops.model.User; +import ru.javaops.to.UserStat; import ru.javaops.to.UserToExt; import java.util.Set; @@ -30,5 +31,5 @@ public interface UserService { Set findByLocation(String location); - Set findAllForStats(); + Set findAllForStats(); } diff --git a/src/main/java/ru/javaops/service/UserServiceImpl.java b/src/main/java/ru/javaops/service/UserServiceImpl.java index a101182..56fd280 100644 --- a/src/main/java/ru/javaops/service/UserServiceImpl.java +++ b/src/main/java/ru/javaops/service/UserServiceImpl.java @@ -11,6 +11,7 @@ import ru.javaops.model.RegisterType; import ru.javaops.model.User; import ru.javaops.repository.UserRepository; +import ru.javaops.to.UserStat; import ru.javaops.to.UserToExt; import ru.javaops.util.UserUtil; @@ -96,7 +97,7 @@ public Set findByLocation(String location) { return userRepository.findByLocation(location.toLowerCase()); } - public Set findAllForStats() { + public Set findAllForStats() { return userRepository.findAllForStats(); } } diff --git a/src/main/java/ru/javaops/to/UserStat.java b/src/main/java/ru/javaops/to/UserStat.java new file mode 100644 index 0000000..b195276 --- /dev/null +++ b/src/main/java/ru/javaops/to/UserStat.java @@ -0,0 +1,44 @@ +package ru.javaops.to; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.text.WordUtils; + +/** + * gkislin + * 29.06.2016 + */ +public class UserStat { + private final String fullName; + private final String email; + private final String location; + private final String aboutMe; + private final String skype; + + public UserStat(String fullName, String email, String location, String aboutMe, String skype) { + this.fullName = WordUtils.capitalize(fullName); + this.email = email; + this.location = WordUtils.capitalize(location, ' ', '-', '.'); + this.aboutMe = StringUtils.replace(aboutMe, "\n", "
    "); + this.skype = skype; + } + + public String getFullName() { + return fullName; + } + + public String getEmail() { + return email; + } + + public String getLocation() { + return location; + } + + public String getAboutMe() { + return aboutMe; + } + + public String getSkype() { + return skype; + } +} diff --git a/src/main/java/ru/javaops/web/PageController.java b/src/main/java/ru/javaops/web/PageController.java index 2f9961f..4592857 100644 --- a/src/main/java/ru/javaops/web/PageController.java +++ b/src/main/java/ru/javaops/web/PageController.java @@ -5,8 +5,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; -import ru.javaops.model.User; import ru.javaops.service.UserService; +import ru.javaops.to.UserStat; import java.util.Set; @@ -20,7 +20,7 @@ public class PageController { @RequestMapping(value = "/users", method = GET) public ModelAndView usersInfo(@RequestParam("key") String key, @RequestParam("email") String email) { - Set userSet = userService.findAllForStats(); + Set userSet = userService.findAllForStats(); return (userSet.stream().filter(u -> u.getEmail().equals(email)).findAny().isPresent()) ? new ModelAndView("userList", "users", userSet) : new ModelAndView("statsForbidden"); From 7a5a937e8ad06f0fd386e34654b2f743e6b0a74e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 01:33:52 +0300 Subject: [PATCH 183/936] Fix capitalization --- src/main/java/ru/javaops/to/UserStat.java | 2 +- src/test/java/ru/javaops/util/PasswordUtilTest.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/javaops/to/UserStat.java b/src/main/java/ru/javaops/to/UserStat.java index b195276..abeafd7 100644 --- a/src/main/java/ru/javaops/to/UserStat.java +++ b/src/main/java/ru/javaops/to/UserStat.java @@ -17,7 +17,7 @@ public class UserStat { public UserStat(String fullName, String email, String location, String aboutMe, String skype) { this.fullName = WordUtils.capitalize(fullName); this.email = email; - this.location = WordUtils.capitalize(location, ' ', '-', '.'); + this.location = WordUtils.capitalize(location, ' ', '-', '.', '/', ','); this.aboutMe = StringUtils.replace(aboutMe, "\n", "
    "); this.skype = skype; } diff --git a/src/test/java/ru/javaops/util/PasswordUtilTest.java b/src/test/java/ru/javaops/util/PasswordUtilTest.java index c033c7a..8c620fb 100644 --- a/src/test/java/ru/javaops/util/PasswordUtilTest.java +++ b/src/test/java/ru/javaops/util/PasswordUtilTest.java @@ -1,5 +1,6 @@ package ru.javaops.util; +import org.apache.commons.lang3.text.WordUtils; import org.junit.Test; import static org.apache.commons.lang3.StringUtils.capitalize; @@ -15,6 +16,7 @@ public class PasswordUtilTest { @Test public void test() throws Exception { System.out.println(substringBefore(capitalize("григорий Кислин"), " ")); + System.out.println(WordUtils.capitalize("Санкт,петербург", ' ', '-', '.',',')); } @Test From 556fa3453206688f07fd29a960563495b71727dd Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 01:53:59 +0300 Subject: [PATCH 184/936] Update + stats email --- resources/mails/javaops/user_stat.html | 20 ++++++++++++++++++++ resources/view/index.html | 14 +++++++------- 2 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 resources/mails/javaops/user_stat.html diff --git a/resources/mails/javaops/user_stat.html b/resources/mails/javaops/user_stat.html new file mode 100644 index 0000000..f18c0da --- /dev/null +++ b/resources/mails/javaops/user_stat.html @@ -0,0 +1,20 @@ + + + + + + Статистика выпускников "Java Online Projects". + + +

    + Здравствуй firstName!
    +

    +Сайт Java Online Projects продолжает развиваться, в том числе силами выпускников:)
    +Доработка от Александра (с моей коррекцией): статистика участников.
    +Следующая доработка: авторизация на сайт через github. Общение по доработкам в канале Slack javaops_ru. +

    + Напомню, что следующий курс topjava стартует 01.09. Повторное участие бесплатное. +

    +

    +

    + diff --git a/resources/view/index.html b/resources/view/index.html index b38b803..c43647c 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -113,20 +113,20 @@

    Участие в разработке Spring/JPA Enterprise приложе

    Наши истории (делимся опытом и успехом)


    -

    Техническое собеседование Java разработчик

    -

    Тестовое интервью

    -

    Core Java 8, OOP, JMM/Concurrency, Servlet/JSP, JPA, Spring MVC, REST, SQL, Maven

    -

    Техно Диасофт для СберТех

    -

    Core Java, Concurrency, JSP, Axis, SOAP, JSP, Oracle, JavaScript, JMS, Hibernate, J2EE, Git

    -

    Стажировка на Java Web и Java Enterprise

    Top Java Enterprise:
    наиболее востребованные технологии /инструменты /фреймворки Java Enterprise.

    -

    Старт 26.05.2016 (по четвергам с конца мая).

    +

    Старт 01.09.2016 (по четвергам с начала сентября).

    Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins
    Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе ролей

    +
    +

    Техническое собеседование Java разработчик

    +

    Тестовое интервью

    +

    Core Java 8, OOP, JMM/Concurrency, Servlet/JSP, JPA, Spring MVC, REST, SQL, Maven

    +

    Техно Диасофт для СберТех

    +

    Core Java, Concurrency, JSP, Axis, SOAP, JSP, Oracle, JavaScript, JMS, Hibernate, J2EE, Git

    From 8bd8220772dbaa6177e3f09dcedd2672df94fa20 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 01:55:29 +0300 Subject: [PATCH 185/936] Update index.html --- resources/view/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/view/index.html b/resources/view/index.html index c43647c..27a750f 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -116,7 +116,7 @@

    Наши истории (делимся опытом

    Стажировка на Java Web и Java Enterprise

    Top Java Enterprise:
    наиболее востребованные технологии /инструменты /фреймворки Java Enterprise.

    -

    Старт 01.09.2016 (по четвергам с начала сентября).

    +

    Старт 01.09.2016 (по четвергам с начала сентября).

    Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins
    Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе From cf23459885d668e76d895258e82d26708a845a1c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 02:07:53 +0300 Subject: [PATCH 186/936] Fix roles fetch --- src/main/java/ru/javaops/repository/UserRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/javaops/repository/UserRepository.java b/src/main/java/ru/javaops/repository/UserRepository.java index 2baad14..f622a3b 100644 --- a/src/main/java/ru/javaops/repository/UserRepository.java +++ b/src/main/java/ru/javaops/repository/UserRepository.java @@ -13,7 +13,7 @@ @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { @Query("SELECT u FROM User u " + - " LEFT JOIN u.roles WHERE u.email=:email") + " LEFT JOIN FETCH u.roles WHERE u.email=:email") User findByEmail(@Param("email") String email); @Query("SELECT DISTINCT(ug.user) FROM UserGroup ug " + From 66bc927038e8a85b0103e0eb97830a81793ce70f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 02:19:11 +0300 Subject: [PATCH 187/936] Update --- resources/mails/javaops/user_stat.html | 2 +- resources/view/participation.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/javaops/user_stat.html b/resources/mails/javaops/user_stat.html index f18c0da..b7e73be 100644 --- a/resources/mails/javaops/user_stat.html +++ b/resources/mails/javaops/user_stat.html @@ -13,7 +13,7 @@ Доработка от Александра (с моей коррекцией): статистика участников.
    Следующая доработка: авторизация на сайт через github. Общение по доработкам в канале Slack javaops_ru.

    - Напомню, что следующий курс topjava стартует 01.09. Повторное участие бесплатное. + Напомню, что следующий курс topjava стартует 01.09, повторное участие бесплатное.

    diff --git a/resources/view/participation.html b/resources/view/participation.html index f6ede5e..df3f181 100644 --- a/resources/view/participation.html +++ b/resources/view/participation.html @@ -81,7 +81,7 @@

    Регист
    -
    From b5f462ce4e60d90dd142d311c803e13137fb0d4c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 02:53:00 +0300 Subject: [PATCH 188/936] Add emailing by group types --- src/main/java/ru/javaops/model/GroupType.java | 3 +-- src/main/java/ru/javaops/repository/UserRepository.java | 5 +++++ src/main/java/ru/javaops/service/GroupService.java | 7 +++++-- src/main/java/ru/javaops/service/UserService.java | 3 +++ src/main/java/ru/javaops/service/UserServiceImpl.java | 6 ++++++ src/main/java/ru/javaops/web/MailController.java | 4 +++- 6 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/javaops/model/GroupType.java b/src/main/java/ru/javaops/model/GroupType.java index dbe7b4c..f02ec33 100644 --- a/src/main/java/ru/javaops/model/GroupType.java +++ b/src/main/java/ru/javaops/model/GroupType.java @@ -8,6 +8,5 @@ public enum GroupType { TEST, REGISTERED, FINISHED, - CURRENT, - SOURCE + CURRENT } diff --git a/src/main/java/ru/javaops/repository/UserRepository.java b/src/main/java/ru/javaops/repository/UserRepository.java index f622a3b..961d962 100644 --- a/src/main/java/ru/javaops/repository/UserRepository.java +++ b/src/main/java/ru/javaops/repository/UserRepository.java @@ -4,6 +4,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.transaction.annotation.Transactional; +import ru.javaops.model.GroupType; import ru.javaops.model.RegisterType; import ru.javaops.model.User; import ru.javaops.to.UserStat; @@ -20,6 +21,10 @@ public interface UserRepository extends JpaRepository { " WHERE ug.group.name=:groupName AND ug.user.active=TRUE") Set findByGroupName(@Param("groupName") String groupName); + @Query("SELECT DISTINCT(ug.user) FROM UserGroup ug " + + " WHERE ug.group.type IN (:groupTypes) AND ug.user.active=TRUE") + Set findByGroupType(@Param("groupTypes") GroupType[] groupTypes); + @Query("SELECT DISTINCT(ug.user) FROM UserGroup ug " + " WHERE ug.registerType=:registerType AND ug.group.name=:groupName AND ug.user.active=TRUE") Set findByGroupNameAndRegisterType(@Param("groupName") String groupName, @Param("registerType") RegisterType registerType); diff --git a/src/main/java/ru/javaops/service/GroupService.java b/src/main/java/ru/javaops/service/GroupService.java index 7e3cd3c..2de9a60 100644 --- a/src/main/java/ru/javaops/service/GroupService.java +++ b/src/main/java/ru/javaops/service/GroupService.java @@ -135,9 +135,12 @@ private static Group getGroupByProjectAndType(Collection groups, String p return group.get(); } - public Set filterUserByGroupNames(String includes, String excludes, RegisterType registerType, LocalDate startRegisteredDate, LocalDate endRegisteredDate) { + public Set filterUserByGroupNames(String includes, String excludes, RegisterType registerType, GroupType[] groupTypes, LocalDate startRegisteredDate, LocalDate endRegisteredDate) { final List groups = getAll(); - Set includeUsers = filterUserByGroupNames(groups, includes, registerType, startRegisteredDate, endRegisteredDate); + final Set includeUsers = (groupTypes == null || groupTypes.length == 0) ? + filterUserByGroupNames(groups, includes, registerType, startRegisteredDate, endRegisteredDate) : + userService.findByGroupTypes(groupTypes); + if (StringUtils.isNoneEmpty(excludes)) { Set excludeUsers = filterUserByGroupNames(groups, excludes, null, startRegisteredDate, endRegisteredDate); includeUsers.removeAll(excludeUsers); diff --git a/src/main/java/ru/javaops/service/UserService.java b/src/main/java/ru/javaops/service/UserService.java index 84aee09..a12fcdb 100644 --- a/src/main/java/ru/javaops/service/UserService.java +++ b/src/main/java/ru/javaops/service/UserService.java @@ -1,5 +1,6 @@ package ru.javaops.service; +import ru.javaops.model.GroupType; import ru.javaops.model.RegisterType; import ru.javaops.model.User; import ru.javaops.to.UserStat; @@ -21,6 +22,8 @@ public interface UserService { Set findByGroupName(String email); + Set findByGroupTypes(GroupType[] groupTypes); + Set findByGroupNameAndRegisterType(String groupName, RegisterType registerType); User findByEmailAndGroupId(String email, int groupId); diff --git a/src/main/java/ru/javaops/service/UserServiceImpl.java b/src/main/java/ru/javaops/service/UserServiceImpl.java index 56fd280..4af7a44 100644 --- a/src/main/java/ru/javaops/service/UserServiceImpl.java +++ b/src/main/java/ru/javaops/service/UserServiceImpl.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.javaops.LoggedUser; +import ru.javaops.model.GroupType; import ru.javaops.model.RegisterType; import ru.javaops.model.User; import ru.javaops.repository.UserRepository; @@ -70,6 +71,11 @@ public Set findByGroupName(String groupName) { return userRepository.findByGroupName(groupName); } + @Override + public Set findByGroupTypes(GroupType[] groupTypes) { + return userRepository.findByGroupType(groupTypes); + } + @Override public Set findByGroupNameAndRegisterType(String groupName, RegisterType registerType) { return userRepository.findByGroupNameAndRegisterType(groupName, registerType); diff --git a/src/main/java/ru/javaops/web/MailController.java b/src/main/java/ru/javaops/web/MailController.java index d75126d..acb55f6 100644 --- a/src/main/java/ru/javaops/web/MailController.java +++ b/src/main/java/ru/javaops/web/MailController.java @@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import ru.javaops.model.GroupType; import ru.javaops.model.RegisterType; import ru.javaops.model.User; import ru.javaops.service.GroupService; @@ -67,9 +68,10 @@ public ResponseEntity sendToUsers(@Param("template") String templat public ResponseEntity sendToGroup(@Param("template") String template, @Param("includes") String includes, @RequestParam(value = "excludes", required = false) String excludes, @RequestParam(value = "reg-type", required = false) RegisterType registerType, + @RequestParam(value = "group-types", required = false) GroupType[] groupTypes, @RequestParam(value = "startRegisteredDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startRegisteredDate, @RequestParam(value = "endRegisteredDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endRegisteredDate) { - return sendToGroup(template, groupService.filterUserByGroupNames(includes, excludes, registerType, startRegisteredDate, endRegisteredDate)); + return sendToGroup(template, groupService.filterUserByGroupNames(includes, excludes, registerType, groupTypes, startRegisteredDate, endRegisteredDate)); } @RequestMapping(value = "/resend", method = POST) From 99d76e5ba626a9d77bbf8d5133363fde2c463f23 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 02:56:00 +0300 Subject: [PATCH 189/936] Update user_stat --- resources/mails/javaops/user_stat.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/javaops/user_stat.html b/resources/mails/javaops/user_stat.html index b7e73be..a693b0e 100644 --- a/resources/mails/javaops/user_stat.html +++ b/resources/mails/javaops/user_stat.html @@ -9,7 +9,7 @@

    Здравствуй firstName!

    -Сайт Java Online Projects продолжает развиваться, в том числе силами выпускников:)
    +Сайт Java Online Projects продолжает развиваться, в том числе вашими силами.
    Доработка от Александра (с моей коррекцией): статистика участников.
    Следующая доработка: авторизация на сайт через github. Общение по доработкам в канале Slack javaops_ru.

    From 22893253d80d7783f89015159150670b3d97b6be Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 02:57:20 +0300 Subject: [PATCH 190/936] Update user_stat --- resources/mails/javaops/user_stat.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/javaops/user_stat.html b/resources/mails/javaops/user_stat.html index a693b0e..288a02e 100644 --- a/resources/mails/javaops/user_stat.html +++ b/resources/mails/javaops/user_stat.html @@ -3,13 +3,13 @@ - Статистика выпускников "Java Online Projects". + Статистика участников "Java Online Projects".

    Здравствуй firstName!

    -Сайт Java Online Projects продолжает развиваться, в том числе вашими силами.
    +Сайт Java Online Projects продолжает развиваться, в том числе силами участников.
    Доработка от Александра (с моей коррекцией): статистика участников.
    Следующая доработка: авторизация на сайт через github. Общение по доработкам в канале Slack javaops_ru.

    From 378e65ce4f67330db5c194499e6597727624130f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 11:52:42 +0300 Subject: [PATCH 191/936] Update readme.md --- readme.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 9485d5e..aff7dc8 100644 --- a/readme.md +++ b/readme.md @@ -6,7 +6,10 @@ - Spring Boot - H2 - Thymeleaf -- Рассмаривается на кандидат в UI: https://vaadin.com/elements +- Рассмаривается на кандидаты в UI: + - https://vaadin.com/elements + - https://www.sencha.com/products/gxt + - Angular 2 ### Сделано: - REST API From f67d132af2de13b4f1176a41c45462a3966d7757 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 11:55:16 +0300 Subject: [PATCH 192/936] Update readme.md --- readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index aff7dc8..0e55337 100644 --- a/readme.md +++ b/readme.md @@ -21,7 +21,8 @@ - Отписка ### Задачи: -- Сделать обновляемые (как Thymeleaf) шаблоны в формате md (см. `MarkdownUtil`) +- Сделать редактирование личных данных с авторизацией через github +- Сделать обновляемые (как Thymeleaf) шаблоны в формате md (см. `MarkdownUtil`) с кэшированием - Сделать ошибки в форме `participation.html` как в профиле проекта topjava - Интеграция From 36a3d233f7b92c9c36c1f087497702619c1072c5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 11:55:41 +0300 Subject: [PATCH 193/936] Update readme.md --- readme.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/readme.md b/readme.md index 0e55337..f6b494c 100644 --- a/readme.md +++ b/readme.md @@ -25,10 +25,6 @@ - Сделать обновляемые (как Thymeleaf) шаблоны в формате md (см. `MarkdownUtil`) с кэшированием - Сделать ошибки в форме `participation.html` как в профиле проекта topjava -- Интеграция - - Slack (приглашение в организацию) - - Google Drive (доступ к папке) - ### Работа: Запуск: `mvn spring-boot:run` From e5a02d228a3ea00db9dcd39e4ca8aa76d4d91592 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 29 Jun 2016 12:11:05 +0300 Subject: [PATCH 194/936] Update app.props --- src/main/resources/application-dev.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index a72869c..bd96566 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -27,7 +27,8 @@ app: host-url: http://localhost:8080 integration: vk-token: vk-token - slack-token: slack-token + slack-tokens.topjava: dummy-slack-token-topjava + slack-tokens.javaops: dummy-slack-token-javaops spring: mail.host: smtp.yandex.ru From a2bf024b7d8c2fbf6fc9c05385271f5fc0ea98eb Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 30 Jun 2016 17:40:13 +0300 Subject: [PATCH 195/936] update lesson5 --- resources/mails/topjava/lesson/lesson05.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson05.html b/resources/mails/topjava/lesson/lesson05.html index b9741ad..78519a3 100644 --- a/resources/mails/topjava/lesson/lesson05.html +++ b/resources/mails/topjava/lesson/lesson05.html @@ -16,7 +16,7 @@ Обсуждение урока и ДЗ в slack #lesson05

    - Домашнее задание (у кого есть проверка) желательно присылать до вечера 07.03
    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 05.07

    From 834f69c151027a86f7bf74875fd29479f77b98fb Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 7 Jul 2016 16:51:51 +0300 Subject: [PATCH 196/936] Update mails template --- resources/mails/topjava_early_price.html | 13 ++++++ resources/mails/topjava_info.html | 55 +++++++++++++++--------- topjava2.md | 1 + 3 files changed, 48 insertions(+), 21 deletions(-) create mode 100644 resources/mails/topjava_early_price.html diff --git a/resources/mails/topjava_early_price.html b/resources/mails/topjava_early_price.html new file mode 100644 index 0000000..8709034 --- /dev/null +++ b/resources/mails/topjava_early_price.html @@ -0,0 +1,13 @@ + + + + Ранняя цена на проект 'Java Enterprise (Topjava)'. Старт 01.09 + +

    + Здравствуй!
    +

    +

    Рад сообщить, при оплате до 01.08 действует льготная цена на проект Java Enterprise (Topjava):

    +
    +

    +

    + \ No newline at end of file diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index e6b8ea2..7a503e8 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -18,7 +18,8 @@

    Требования к участникам:

    Также необходим некоторый опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на первом занятии, кратко повторяя основы. Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно, но не принципиально. Весь - "Enterprise": Maven, Git (в том объеме, который нам нужен), Spring, Hibernate, REST даются с азов. Никаких специальных знаний Java EE не требуется. + "Enterprise": Maven, Git (в том объеме, который нам нужен), Spring, Hibernate, REST даются с азов. Никаких + специальных знаний Java EE не требуется.

    Основные достоинста проекта, взятые из отзывов участников:

    @@ -105,6 +106,24 @@

    На проекте


    +
      +
    • Стоимость участия без проверки домашних заданий: 8300 руб.
      + сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом.

      +
    • +
    • Стоимость полного пакета: 16500 руб.
      + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания + при устройстве на работу).

    • +
    • Для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.

    • +
    • Скидка на другие проекты: 700 руб. (без ДЗ) и 1500 руб (с ДЗ).

    • +
    • При оплате до 01.08 стоимость участия в проекте: 7600 руб. и 15000 руб.

    • +
    • Добавляйся в skype: grigory.kislin с пометкой topjava.

    • +
    • Способы оплаты (объязательно перед оплатой свяжитесь со мной)
    • +
    • Вопросы по проекту
    • +
    • Ресурсы для подготовки +
    • +
    • Курс рубля
    • +
    +

    Расписание занятий проекта:

    рассылка занятий происходит по четвергам, для участников с проверкой домашнего задания желательно присылать ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. @@ -113,10 +132,11 @@

    01.09: Старт 8-го выпуска

  • Сбор группы в Slack и Skype
  • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
  • Раздача учебных лицензий JetBrains IDEA
  • -
  • Начало выполнение вступительного задания
  • +
  • Проверка вступительного задания (для участников с проверкой + решения присылать до 06.09). +
  • -

    Расписание текущего проекта

    -

      02.06: 1-е занятие

      +

        08.09: 1-е занятие

      • Разбор домашнего задания вступительного занятия (вместе с Optional)
      • Обзор используемых в проекте технологий. Интеграция ПО
      • Maven
      • @@ -125,7 +145,7 @@

        Расписание текущего проекта

      • Уровни и зависимости логгирования. JMX
      • Домашнее задание 1-го занятия (HW1 + Optional)
      -

        09.06: 2-е занятие

        +

          15.09: 2-е занятие

        • Разбор домашнего задания HW1 + Optional
        • Библиотека vs Фреймворк. Стандартные библиотеки Apache Commons, Guava
        • Слои приложения. Создание каркаса приложения
        • @@ -133,7 +153,7 @@

          Расписание текущего проекта

        • Пояснения к HW2. Обработка Autowired
        • Домашнее задание (HW2 + Optional)
        -

          16.06: 3-е занятие

          +

            22.09: 3-е занятие

          • Разбор домашнего задания HW2 + Optional
          • Жизненный цикл Spring контекста
          • Тестирование через JUnit
          • @@ -145,7 +165,7 @@

            Расписание текущего проекта

          • Логирование тестов
          • Домашнее задание (HW3 + Optional)
          -

            23.06: 4-е занятие

            +

              29.09: 4-е занятие

            • Разбор домашнего задания HW3 + Optional
            • Методы улучшения качества кода
            • Spring: инициализация и популирование DB
            • @@ -154,7 +174,7 @@

              Расписание текущего проекта

            • Поддержка HSQLDB
            • Домашнее задание (HW4 + Optional)
            -

              30.06: 5-е занятие

              +

                06.10: 5-е занятие

              • Разбор вопросов
              • Разбор домашнего задания HW4 + Optional
              • Транзакции
              • @@ -164,7 +184,7 @@

                Расписание текущего проекта

              • Spring кэш
              • Домашнее задание (HW5 + Optional)
              -

                07.07: 6-е занятие

                +

                  13.10: 6-е занятие

                • Разбор домашнего задания HW5 + Optional
                • Кэш Hibernate
                • Spring Web
                • @@ -175,7 +195,7 @@

                  Расписание текущего проекта

                • Spring Internationalization
                • Домашнее задание (HW6 + Optional)
                -

                  14.07: 7-е занятие

                  +

                    20.10: 7-е занятие

                  • Разбор домашнего задания HW6 + Optional
                  • Автогенерация DDL по модели
                  • Тестирование Spring MVC
                  • @@ -185,7 +205,7 @@

                    Расписание текущего проекта

                  • Тестирование через SoapUi. UTF-8
                  • Домашнее задание (HW7 + Optional)
                  -

                    21.07: 8-е занятие

                    +

                      27.10: 8-е занятие

                    • Разбор домашнего задания HW7 + Optional
                    • WebJars. jQuery и JavaScript frameworks
                    • Bootstrap
                    • @@ -194,7 +214,7 @@

                      Расписание текущего проекта

                    • Добавление Spring Security
                    • Домашнее задание (HW8 + Optional)
                    -

                      28.07: 9-е занятие

                      +

                        03.11: 9-е занятие

                      • Разбор домашнего задания HW8 + Optional
                      • Spring Binding
                      • Spring Validation
                      • @@ -206,7 +226,7 @@

                        Расписание текущего проекта

                      • Cookie. Session
                      • Домашнее задание (HW9 + Optional)
                      -

                        04.08: 10-е занятие

                        +

                          10.11: 10-е занятие

                        • Разбор домашнего задания HW10 + Optional
                        • Spring Security Taglib. Method Security Expressions
                        • Интерсепторы. Редактирование профиля. JSP tag files
                        • @@ -216,7 +236,7 @@

                          Расписание текущего проекта

                        • Защита от межсайтовой подделки запросов (CSRF)
                        • Домашнее задание (HW10)
                        -

                          11.08: Заключительное занятие

                          +

                            17.11: Заключительное занятие

                          • Рефакторинг
                          • Разбор домашнего задания HW10 + Optional
                          • Деплой приложения в Heroku
                          • @@ -225,13 +245,6 @@

                            Расписание текущего проекта

                          • Домашнее задание по проекту: составление резюме

                          - Добавляйся в skype: grigory.kislin с пометкой topjava. -

                          Добавляйся в группу VK: Практика Java (Web/ Enterprise)
                          До встречи на проекте! diff --git a/topjava2.md b/topjava2.md index bbd3986..484a95f 100644 --- a/topjava2.md +++ b/topjava2.md @@ -120,6 +120,7 @@ additional-spring-configuration-metadata.json ## OAuth2 https://github.com/spring-cloud-samples/authserver +http://oauthbible.com/ ## Execution and Scheduling CompletionService over an ExecutorService From 6616dfad458edd3bc3195adf0283454b24147430 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 7 Jul 2016 16:56:15 +0300 Subject: [PATCH 197/936] Update mails template --- resources/mails/topjava_info.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 7a503e8..459643b 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -107,10 +107,10 @@

                          На проекте


                          -
                        • Стоимость участия без проверки домашних заданий: 8300 руб.
                          +

                        • Стоимость участия без проверки домашних заданий: 8300 руб.
                          сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом.

                        • -
                        • Стоимость полного пакета: 16500 руб.
                          +

                        • Стоимость полного пакета: 16500 руб.
                          добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при устройстве на работу).

                        • Для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.

                        • From 76d1090ae4cb2af6549f7d94eb1ccf136e0694ac Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 7 Jul 2016 17:40:24 +0300 Subject: [PATCH 198/936] Update topjava lessons --- resources/mails/topjava/lesson/lesson03.html | 2 +- resources/mails/topjava/lesson/lesson05.html | 2 +- resources/mails/topjava/lesson/lesson06.html | 4 ++-- resources/mails/topjava/lesson/lesson07.html | 2 +- resources/mails/topjava/lesson/lesson08.html | 2 +- resources/mails/topjava/lesson/lesson09.html | 2 +- resources/mails/topjava/lesson/lesson10.html | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson03.html b/resources/mails/topjava/lesson/lesson03.html index 6875920..ad93808 100644 --- a/resources/mails/topjava/lesson/lesson03.html +++ b/resources/mails/topjava/lesson/lesson03.html @@ -11,7 +11,7 @@ Если с SQL и RDBMS не работали- прочтите основы по ссылкам.

                          Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
                          - Обсуждение урока и ДЗ в slack #lesson03 + Обсуждение урока и ДЗ в slack #lesson03

                          Домашнее задание (у кого есть проверка) желательно присылать до вечера 21.06.
                          diff --git a/resources/mails/topjava/lesson/lesson05.html b/resources/mails/topjava/lesson/lesson05.html index 78519a3..81ef7a2 100644 --- a/resources/mails/topjava/lesson/lesson05.html +++ b/resources/mails/topjava/lesson/lesson05.html @@ -13,7 +13,7 @@

                          Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
                          - Обсуждение урока и ДЗ в slack #lesson05 + Обсуждение урока и ДЗ в slack #lesson05

                          Домашнее задание (у кого есть проверка) желательно присылать до вечера 05.07
                          diff --git a/resources/mails/topjava/lesson/lesson06.html b/resources/mails/topjava/lesson/lesson06.html index 6a317c7..b73c02a 100644 --- a/resources/mails/topjava/lesson/lesson06.html +++ b/resources/mails/topjava/lesson/lesson06.html @@ -13,10 +13,10 @@

                          Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
                          - Обсуждение урока и ДЗ в slack #lesson06 + Обсуждение урока и ДЗ в slack #lesson06

                          - Домашнее задание (у кого есть проверка) желательно присылать до вечера 12.04
                          + Домашнее задание (у кого есть проверка) желательно присылать до вечера 12.07

                          diff --git a/resources/mails/topjava/lesson/lesson07.html b/resources/mails/topjava/lesson/lesson07.html index 93b2777..7a448ab 100644 --- a/resources/mails/topjava/lesson/lesson07.html +++ b/resources/mails/topjava/lesson/lesson07.html @@ -13,7 +13,7 @@

                          Перед накаткой патча 0 код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
                          - Обсуждение урока и ДЗ в slack #lesson07 + Обсуждение урока и ДЗ в slack #lesson07

                          Домашнее задание (у кого есть проверка) желательно присылать до вечера 19.04
                          diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index 7422208..16b97e6 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -13,7 +13,7 @@

                          Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и HW8 в Slack #lesson08 + Обсуждение урока и HW8 в Slack #lesson08

                          Домашнее задание (у кого есть проверка) желательно присылать до вечера 26.04
                          diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index 1843231..9382c16 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -13,7 +13,7 @@

                          Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и HW9 в Slack #lesson09 + Обсуждение урока и HW9 в Slack #lesson09

                          Домашнее задание (у кого есть проверка) желательно присылать до вечера 03.05
                          diff --git a/resources/mails/topjava/lesson/lesson10.html b/resources/mails/topjava/lesson/lesson10.html index 9679750..34e54ff 100644 --- a/resources/mails/topjava/lesson/lesson10.html +++ b/resources/mails/topjava/lesson/lesson10.html @@ -13,7 +13,7 @@

                          Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и HW10 в Slack #lesson10 + Обсуждение урока и HW10 в Slack #lesson10

                          Домашнее задание (у кого есть проверка) желательно присылать до вечера 11.05 (меня не будет с 07.05 по 10.05)
                          From 738e6053f8093b9ed86de8a3a1d67b995a3a8987 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 14 Jul 2016 15:11:56 +0300 Subject: [PATCH 199/936] Update topjava lessons and test --- resources/mails/topjava/lesson/lesson07.html | 4 ++-- resources/vacation/test.html | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson07.html b/resources/mails/topjava/lesson/lesson07.html index 7a448ab..527e9d9 100644 --- a/resources/mails/topjava/lesson/lesson07.html +++ b/resources/mails/topjava/lesson/lesson07.html @@ -12,11 +12,11 @@ REST контроллеры и тестирование контроллеров.

                          - Перед накаткой патча 0 код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
                          + Перед накаткой патчей в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
                          Обсуждение урока и ДЗ в slack #lesson07

                          - Домашнее задание (у кого есть проверка) желательно присылать до вечера 19.04
                          + Домашнее задание (у кого есть проверка) желательно присылать до вечера 19.07

                          diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 4350a71..7f08a48 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -56,12 +56,18 @@

                          Темы тестового собеседования:

                          NoSQL, Git, Maven


                          + +
                          Время собеседования:
                          • 35 мин: 950 руб.
                          • 1 час: 1450 руб.
                          -
                          +

                          Детали в скайпе: grigory.kislin

                          Skype From 4829f47d7c5717332bd9e34217f6b5d40233499e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 15 Jul 2016 17:14:06 +0300 Subject: [PATCH 200/936] Add user-group feature --- resources/mails/confirm.html | 28 ++++++---- resources/mails/masterjava/masterjava_ad.html | 37 +++++++++++++ resources/mails/masterjava_register.html | 17 +++--- resources/view/userList.html | 3 +- src/main/java/ru/javaops/model/User.java | 14 +++-- .../java/ru/javaops/service/GroupService.java | 53 ++++++++++--------- .../java/ru/javaops/service/MailService.java | 19 +++---- src/main/java/ru/javaops/to/UserTo.java | 9 ++++ .../java/ru/javaops/util/ProjectUtil.java | 43 +++++++++++++++ src/main/java/ru/javaops/util/UserUtil.java | 2 +- .../javaops/web/SubscriptionController.java | 32 +++++++---- src/test/java/ru/javaops/UserTestData.java | 4 +- 12 files changed, 194 insertions(+), 67 deletions(-) create mode 100644 resources/mails/masterjava/masterjava_ad.html create mode 100644 src/main/java/ru/javaops/util/ProjectUtil.java diff --git a/resources/mails/confirm.html b/resources/mails/confirm.html index 096ea40..7c1b5bb 100644 --- a/resources/mails/confirm.html +++ b/resources/mails/confirm.html @@ -1,14 +1,22 @@ - - - - -

                          -

                          -

                          -

                          -

                          -

                          + + + + + +
                          +

                          Успешно добавлен в группу.

                          +

                          Добавлен в группу, уже присутствует в базе Java + Online Projects.

                          +

                          Уже есть в группе, повторная регистрация.

                          +
                          +

                          Имя: имя +

                          +

                          +

                          +

                          Телефон: 123-456 +

                          +
                          \ No newline at end of file diff --git a/resources/mails/masterjava/masterjava_ad.html b/resources/mails/masterjava/masterjava_ad.html new file mode 100644 index 0000000..4db4caa --- /dev/null +++ b/resources/mails/masterjava/masterjava_ad.html @@ -0,0 +1,37 @@ + + + + + + Участие в проекте 'Многопоточность. Веб сервисы.' + +

                          + Здравствуй!
                          +

                          +

                          + Рад сообщить, что 25.07 в 20.00 (GMT+3, Москва/Киев) будет бесплатный вебинар:
                          вступительное занятие по + обновленному проекту + Многопоточность. Веб сервисы
                          + разработка полнофункционального многомодульного Maven проекта с использованием веб-сервисов (SOAP, JAX-WS), REST + (JAX-RS) и JMX.
                          +

                          +Для участия необходимо зарегистрироваться и пройти материалы + вступительного задания.
                          +Выполнить вступительное задание желательно, но +не объязательно. +Проект стартует во второй половине августа, разбирать задание будем на первом уроке. +
                          +Предварительная стоимость участия: +
                            +
                          • без проверок домашних заданий: 8600 руб.
                          • +
                          • с проверками заданий: 16500 руб.
                          • +
                          • стоимость для участников Topjava: 7900 руб. и 15000 руб.
                          • +
                          • бесплатное повторное участие в формате рассылки материалов
                          • +
                          + +

                          + До встречи на вебинаре вступительного занятия! +

                          +

                          +

                          + \ No newline at end of file diff --git a/resources/mails/masterjava_register.html b/resources/mails/masterjava_register.html index af4253d..f171fdc 100644 --- a/resources/mails/masterjava_register.html +++ b/resources/mails/masterjava_register.html @@ -3,19 +3,22 @@ - Регистрация на проект 'Веб-сервисы. SOA-based (Microservices) архитектура' + Регистрация на проект 'Многопоточность. Веб сервисы.'

                          Здравствуй firstName!

                          -Спасибо за регистрацию на проекте Веб-сервисы. SOA-based (Microservices) архитектура!
                          -Я собираюсь его переработать, старт будет по готовности и по мере набора группы.
                          -Буду делать рассылку и держать в курсе. -Добавляйся в группу VK: Практика Java (Web/ Enterprise)
                          -До встречи на проекте!
                          + Спасибо за регистрацию на проекте Многопоточность. Веб сервисы.
                          +

                          +

                          + Перед вебинаром вступительного занятия (25.07 в 20.00, GMT+3) тебе придет ссылка на комнату.
                          + Сам проект стартует во второй половине августа, дата старта и программа проекта будут уточняться и рассылаться всем + зарегистрированным участникам. +

                          +

                          + До встречи на бесплатном вебинаре!

                          -

                          Ответы на вопросы.

                          \ No newline at end of file diff --git a/resources/view/userList.html b/resources/view/userList.html index bc95de8..9a96692 100644 --- a/resources/view/userList.html +++ b/resources/view/userList.html @@ -16,10 +16,11 @@ - + Редактировать мои данные

    diff --git a/src/main/java/ru/javaops/model/User.java b/src/main/java/ru/javaops/model/User.java index 9055300..dafbb60 100644 --- a/src/main/java/ru/javaops/model/User.java +++ b/src/main/java/ru/javaops/model/User.java @@ -43,6 +43,9 @@ public class User extends BaseEntity { @Size(max = 50) private String location; + @Size(max = 50) + private String phone; + @Size(max = 100) @Column(name = "info_source", length = 100) private String infoSource; @@ -90,16 +93,17 @@ public class User extends BaseEntity { public User() { } - public User(String email, String nameSurname, String location, String infoSource) { - this(null, email, nameSurname, location, infoSource); + public User(String email, String nameSurname, String location, String infoSource, String phone) { + this(null, email, nameSurname, location, infoSource, phone); } - public User(Integer id, String email, String fullName, String location, String infoSource) { + public User(Integer id, String email, String fullName, String location, String infoSource, String phone) { super(id); this.email = email; this.fullName = fullName; this.location = location; this.infoSource = infoSource; + this.phone = phone; } public String getEmail() { @@ -226,6 +230,10 @@ public void setStatsAgree(boolean statsAgree) { this.statsAgree = statsAgree; } + public String getPhone() { + return phone; + } + @Override public String toString() { return "User (" + diff --git a/src/main/java/ru/javaops/service/GroupService.java b/src/main/java/ru/javaops/service/GroupService.java index 2de9a60..89a7732 100644 --- a/src/main/java/ru/javaops/service/GroupService.java +++ b/src/main/java/ru/javaops/service/GroupService.java @@ -14,16 +14,20 @@ import ru.javaops.repository.PaymentRepository; import ru.javaops.repository.UserGroupRepository; import ru.javaops.to.UserTo; +import ru.javaops.util.ProjectUtil; +import ru.javaops.util.ProjectUtil.ProjectProps; import ru.javaops.util.TimeUtil; import ru.javaops.util.UserUtil; import java.time.LocalDate; -import java.util.*; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; /** * GKislin @@ -94,6 +98,27 @@ public UserGroup registerAtProject(UserTo userTo, ProjectProps projectProps, Str return userGroupRepository.save(userGroup); } + public UserGroup registerAtGroup(UserTo userTo, String groupName) { + log.info("add{} to group {}", userTo, groupName); + Group group = findByName(groupName); + User user = userService.findByEmail(userTo.getEmail()); + RegisterType registerType; + if (user == null) { + user = UserUtil.createFromTo(userTo); + userService.save(user); + registerType = RegisterType.FIRST_REGISTERED; + } else { + UserGroup ug = userGroupRepository.findByUserIdAndGroupId(user.getId(), group.getId()); + if (ug != null) { + return new UserGroup(user, group, RegisterType.REPEAT, null); + } + registerType = RegisterType.REGISTERED; + } + UserGroup userGroup = new UserGroup(user, group, registerType, null); + userGroupRepository.save(userGroup); + return userGroup; + } + public UserGroup moveOrCreate(User u, Group sourceGroup, Group targetGroup) { UserGroup ug = userGroupRepository.findByUserIdAndGroupId(u.getId(), sourceGroup.getId()); if (ug == null) { @@ -121,18 +146,7 @@ public UserGroup pay(String email, String projectName, Payment payment, Particip } public ProjectProps getProjectProps(String projectName) { - Collection groups = getAll(); - return new ProjectProps( - getGroupByProjectAndType(groups, projectName, GroupType.REGISTERED), - getGroupByProjectAndType(groups, projectName, GroupType.CURRENT)); - } - - private static Group getGroupByProjectAndType(Collection groups, String projectName, GroupType type) { - Optional group = groups.stream() - .filter(g -> g.getProject() != null && g.getProject().getName().equals(projectName) && (g.getType() == type)) - .findFirst(); - checkState(group.isPresent(), "В проекте %s отсутствуют группы c типом %s", projectName, type); - return group.get(); + return ProjectUtil.getProjectProps(projectName, getAll()); } public Set filterUserByGroupNames(String includes, String excludes, RegisterType registerType, GroupType[] groupTypes, LocalDate startRegisteredDate, LocalDate endRegisteredDate) { @@ -182,15 +196,4 @@ public boolean test(String name) { ).collect(Collectors.toList()); } - public static class ProjectProps { - public final Group registeredGroup; - public final Group currentGroup; - public final Project project; - - public ProjectProps(Group registeredGroup, Group currentGroup) { - this.registeredGroup = registeredGroup; - this.currentGroup = currentGroup; - this.project = registeredGroup.getProject(); - } - } } diff --git a/src/main/java/ru/javaops/service/MailService.java b/src/main/java/ru/javaops/service/MailService.java index 8ddcff2..686cb7c 100644 --- a/src/main/java/ru/javaops/service/MailService.java +++ b/src/main/java/ru/javaops/service/MailService.java @@ -118,8 +118,8 @@ private void cancelAll(Map, String> resultMap) { } @Async("mailExecutor") - public Future sendToUserAsync(String template, String email) { - return new AsyncResult<>(sendToUser(template, email)); + public Future sendWithTemplateAsync(String email, String template, final Map params) { + return new AsyncResult<>(sendWithTemplate(email, null, template, params)); } public String sendTest(String template) { @@ -136,23 +136,24 @@ public String sendToUser(String template, User user) { checkNotNull(user, "User must not be null"); String activationKey = subscriptionService.generateActivationKey(user.getEmail()); String subscriptionUrl = subscriptionService.getSubscriptionUrl(user.getEmail(), activationKey, false); - return sendToUserWithParams(template, user, ImmutableMap.of("user", user, "subscriptionUrl", subscriptionUrl, "activationKey", activationKey)); + String result = sendWithTemplate(user.getEmail(), user.getFullName(), template, + ImmutableMap.of("user", user, "subscriptionUrl", subscriptionUrl, "activationKey", activationKey)); + mailCaseRepository.save(new MailCase(user, template, result)); + return result; } - public String sendToUserWithParams(String template, User user, final Map params) { - checkNotNull(user, "User must not be null"); - LOG.debug("Sending {} email to '{}'", template, user.getEmail()); + public String sendWithTemplate(String toEmail, String toName, String template, final Map params) { + LOG.debug("Sending {} email to '{}'", template, toEmail); String content = getContent(template, params); final String subject = Util.getTitle(content); String result; try { - send(user.getEmail(), user.getFirstName(), subject, content, true, (String) params.get("subscriptionUrl")); + send(toEmail, toName, subject, content, true, (String) params.get("subscriptionUrl")); result = OK; } catch (MessagingException | MailException e) { result = e.getMessage(); - LOG.error("Sending to {} failed: \n{}", user.getEmail(), result); + LOG.error("Sending to {} failed: \n{}", toEmail, result); } - mailCaseRepository.save(new MailCase(user, template, result)); return result; } diff --git a/src/main/java/ru/javaops/to/UserTo.java b/src/main/java/ru/javaops/to/UserTo.java index 1136d36..886a9f0 100644 --- a/src/main/java/ru/javaops/to/UserTo.java +++ b/src/main/java/ru/javaops/to/UserTo.java @@ -13,6 +13,7 @@ public class UserTo { private String nameSurname; private String location; private String infoSource; + private String phone; public String getEmail() { return email; @@ -46,6 +47,14 @@ public void setInfoSource(String infoSource) { this.infoSource = infoSource; } + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + @Override public String toString() { return "UserTo (" + diff --git a/src/main/java/ru/javaops/util/ProjectUtil.java b/src/main/java/ru/javaops/util/ProjectUtil.java new file mode 100644 index 0000000..f32a3e0 --- /dev/null +++ b/src/main/java/ru/javaops/util/ProjectUtil.java @@ -0,0 +1,43 @@ +package ru.javaops.util; + +import ru.javaops.model.Group; +import ru.javaops.model.GroupType; +import ru.javaops.model.Project; + +import java.util.Collection; +import java.util.Optional; + +import static com.google.common.base.Preconditions.checkState; + +/** + * gkislin + * 13.07.2016 + */ +public class ProjectUtil { + + public static ProjectUtil.ProjectProps getProjectProps(String projectName, Collection groups) { + return new ProjectUtil.ProjectProps( + getGroupByProjectAndType(groups, projectName, GroupType.REGISTERED), + getGroupByProjectAndType(groups, projectName, GroupType.CURRENT)); + } + + private static Group getGroupByProjectAndType(Collection groups, String projectName, GroupType type) { + Optional group = groups.stream() + .filter(g -> g.getProject() != null && g.getProject().getName().equals(projectName) && (g.getType() == type)) + .findFirst(); + checkState(group.isPresent(), "В проекте %s отсутствуют группы c типом %s", projectName, type); + return group.get(); + } + + public static class ProjectProps { + public final Group registeredGroup; + public final Group currentGroup; + public final Project project; + + public ProjectProps(Group registeredGroup, Group currentGroup) { + this.registeredGroup = registeredGroup; + this.currentGroup = currentGroup; + this.project = registeredGroup.getProject(); + } + } +} diff --git a/src/main/java/ru/javaops/util/UserUtil.java b/src/main/java/ru/javaops/util/UserUtil.java index 2e505aa..c6eb9eb 100644 --- a/src/main/java/ru/javaops/util/UserUtil.java +++ b/src/main/java/ru/javaops/util/UserUtil.java @@ -16,7 +16,7 @@ public class UserUtil { static final Pattern GMAIL_EXP = Pattern.compile("\\@gmail\\."); public static User createFromTo(UserTo userTo) { - return tryFillGmail(new User(userTo.getEmail(), userTo.getNameSurname(), userTo.getLocation(), userTo.getInfoSource())); + return tryFillGmail(new User(userTo.getEmail(), userTo.getNameSurname(), userTo.getLocation(), userTo.getInfoSource(), userTo.getPhone())); } public static void updateFromToExt(User user, UserToExt userToExt) { diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index 1f1822a..b009e7f 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -10,9 +10,9 @@ import org.springframework.web.servlet.ModelAndView; import ru.javaops.model.*; import ru.javaops.service.*; -import ru.javaops.service.GroupService.ProjectProps; import ru.javaops.to.UserTo; import ru.javaops.to.UserToExt; +import ru.javaops.util.ProjectUtil.ProjectProps; import ru.javaops.util.Util; import javax.mail.MessagingException; @@ -62,6 +62,20 @@ public ModelAndView activate(@RequestParam("email") String email, @RequestParam( "subscriptionUrl", subscriptionService.getSubscriptionUrl(email, key, !activate))); } + @RequestMapping(value = "/register-group", method = RequestMethod.POST) + public ModelAndView registerInGroup(@RequestParam("group") String group, + @RequestParam("confirmMail") String confirmMail, + @RequestParam("callback") String callback, + @RequestParam("template") String template, + @Valid UserTo userTo, BindingResult result) throws MessagingException { + if (result.hasErrors()) { + throw new ValidationException(Util.getErrorMessage(result)); + } + UserGroup userGroup = groupService.registerAtGroup(userTo, group); + mailService.sendWithTemplateAsync(confirmMail, "confirm", ImmutableMap.of("userGroup", userGroup)); + return sendAndRedirect(callback, "http://javawebinar.ru/error.html", userGroup.getUser(), template); + } + @RequestMapping(value = "/register", method = RequestMethod.POST) public ModelAndView registerByProject(@RequestParam("project") String project, @RequestParam("channel") String channel, @@ -69,19 +83,19 @@ public ModelAndView registerByProject(@RequestParam("project") String project, if (result.hasErrors()) { throw new ValidationException(Util.getErrorMessage(result)); } - return register(channel, "http://javawebinar.ru/confirm.html", "http://javawebinar.ru/error.html", userTo, groupService.getProjectProps(project)); - } - - private ModelAndView register(String channel, String successUrl, String failUrl, - UserTo userTo, ProjectProps projectProps) throws MessagingException { + ProjectProps projectProps = groupService.getProjectProps(project); UserGroup userGroup = groupService.registerAtProject(userTo, projectProps, channel); String projectName = projectProps.project.getName(); - String template = projectName + (userGroup.getRegisterType() == RegisterType.REPEAT ? "_repeat" : "_register"); - String mailResult = mailService.sendToUser(template, userGroup.getUser()); - if (MailService.isOk(mailResult) && userGroup.getRegisterType() == RegisterType.REPEAT) { + if (userGroup.getRegisterType() == RegisterType.REPEAT) { integrationService.asyncSendSlackInvitation(userGroup.getUser().getEmail(), projectName); } + String template = projectName + (userGroup.getRegisterType() == RegisterType.REPEAT ? "_repeat" : "_register"); + return sendAndRedirect("http://javawebinar.ru/confirm.html", "http://javawebinar.ru/error.html", userGroup.getUser(), template); + } + + private ModelAndView sendAndRedirect(String successUrl, String failUrl, User user, String template) throws MessagingException { + String mailResult = mailService.sendToUser(template, user); return new ModelAndView("redirectToUrl", "redirectUrl", MailService.isOk(mailResult) ? successUrl : failUrl); } diff --git a/src/test/java/ru/javaops/UserTestData.java b/src/test/java/ru/javaops/UserTestData.java index cf2bf59..09591f3 100644 --- a/src/test/java/ru/javaops/UserTestData.java +++ b/src/test/java/ru/javaops/UserTestData.java @@ -12,6 +12,6 @@ public class UserTestData { public static final int USER_ID = 1; public static final int ADMIN_ID = 2; - public static final User USER = new User(USER_ID, "gkislin@yandex.ru", "Григорий Кислин", "Санкт-Петербург", "vk"); - public static final User ADMIN = new User(ADMIN_ID, "admin@javaops.ru", "Java_Online_Projects", "Москва", "habr"); + public static final User USER = new User(USER_ID, "gkislin@yandex.ru", "Григорий Кислин", "Санкт-Петербург", "vk", null); + public static final User ADMIN = new User(ADMIN_ID, "admin@javaops.ru", "Java_Online_Projects", "Москва", "habr", null); } From e7e7f81165087fef69597a49e65477f6ee59d1b1 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 15 Jul 2016 17:33:21 +0300 Subject: [PATCH 201/936] Update date- 26.05 --- resources/mails/masterjava/masterjava_ad.html | 2 +- resources/mails/masterjava_register.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/masterjava/masterjava_ad.html b/resources/mails/masterjava/masterjava_ad.html index 4db4caa..1f4cee8 100644 --- a/resources/mails/masterjava/masterjava_ad.html +++ b/resources/mails/masterjava/masterjava_ad.html @@ -9,7 +9,7 @@ Здравствуй!

    - Рад сообщить, что 25.07 в 20.00 (GMT+3, Москва/Киев) будет бесплатный вебинар:
    вступительное занятие по + Рад сообщить, что 26.07 в 20.00 (GMT+3, Москва/Киев) будет бесплатный вебинар:
    вступительное занятие по обновленному проекту Многопоточность. Веб сервисы
    разработка полнофункционального многомодульного Maven проекта с использованием веб-сервисов (SOAP, JAX-WS), REST diff --git a/resources/mails/masterjava_register.html b/resources/mails/masterjava_register.html index f171fdc..70280be 100644 --- a/resources/mails/masterjava_register.html +++ b/resources/mails/masterjava_register.html @@ -12,7 +12,7 @@ Спасибо за регистрацию на проекте Многопоточность. Веб сервисы.

    - Перед вебинаром вступительного занятия (25.07 в 20.00, GMT+3) тебе придет ссылка на комнату.
    + Перед вебинаром вступительного занятия (26.07 в 20.00, GMT+3) тебе придет ссылка на комнату.
    Сам проект стартует во второй половине августа, дата старта и программа проекта будут уточняться и рассылаться всем зарегистрированным участникам.

    From d8ae13e03ab694f9ed17b2f68f582661a28c4c1d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 15 Jul 2016 17:37:24 +0300 Subject: [PATCH 202/936] Update ad --- resources/mails/masterjava/masterjava_ad.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/masterjava/masterjava_ad.html b/resources/mails/masterjava/masterjava_ad.html index 1f4cee8..7844536 100644 --- a/resources/mails/masterjava/masterjava_ad.html +++ b/resources/mails/masterjava/masterjava_ad.html @@ -3,7 +3,7 @@ - Участие в проекте 'Многопоточность. Веб сервисы.' + Старт проекта 'Многопоточность. Веб сервисы.'

    Здравствуй!
    @@ -18,7 +18,7 @@ Для участия необходимо зарегистрироваться и пройти материалы вступительного задания.
    Выполнить вступительное задание желательно, но -не объязательно. +не объязательно.
    Проект стартует во второй половине августа, разбирать задание будем на первом уроке.


    Предварительная стоимость участия: @@ -30,7 +30,7 @@

    - До встречи на вебинаре вступительного занятия! + До встречи на бесплатном вебинаре вступительного занятия!

    From 4808cb17c1e3ee943d1657b0962382f3c5d70af3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 15 Jul 2016 17:43:31 +0300 Subject: [PATCH 203/936] Update ad --- resources/mails/masterjava/masterjava_ad.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/mails/masterjava/masterjava_ad.html b/resources/mails/masterjava/masterjava_ad.html index 7844536..c69fab3 100644 --- a/resources/mails/masterjava/masterjava_ad.html +++ b/resources/mails/masterjava/masterjava_ad.html @@ -11,9 +11,10 @@

    Рад сообщить, что 26.07 в 20.00 (GMT+3, Москва/Киев) будет бесплатный вебинар:
    вступительное занятие по обновленному проекту - Многопоточность. Веб сервисы
    + Многопоточность. Веб сервисы.
    разработка полнофункционального многомодульного Maven проекта с использованием веб-сервисов (SOAP, JAX-WS), REST (JAX-RS) и JMX.
    + Формат проекта: вебинары.

    Для участия необходимо зарегистрироваться и пройти материалы вступительного задания.
    From d663d6e578f1cda2ea513d7ce6655c8fac629267 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 15 Jul 2016 18:19:27 +0300 Subject: [PATCH 204/936] Update ad --- resources/mails/masterjava/masterjava_ad.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava/masterjava_ad.html b/resources/mails/masterjava/masterjava_ad.html index c69fab3..379e233 100644 --- a/resources/mails/masterjava/masterjava_ad.html +++ b/resources/mails/masterjava/masterjava_ad.html @@ -16,7 +16,7 @@ (JAX-RS) и JMX.

    Формат проекта: вебинары.

    -Для участия необходимо зарегистрироваться и пройти материалы +Для участия необходимо зарегистрироваться (если еще не регистрировались) и пройти материалы вступительного задания.
    Выполнить вступительное задание желательно, но не объязательно.
    From 42e40b723f42f68142a6b9286562a417246381cd Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 15 Jul 2016 18:24:36 +0300 Subject: [PATCH 205/936] Update nginx.conf --- config/nginx.conf.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/nginx.conf.conf b/config/nginx.conf.conf index b4d5c66..1b60552 100644 --- a/config/nginx.conf.conf +++ b/config/nginx.conf.conf @@ -13,7 +13,7 @@ http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; - keepalive_timeout 65; + keepalive_timeout 180; error_log /home/ec2-user/javaops/logs/nginx.error.log; access_log /home/ec2-user/javaops/logs/nginx.access.log; From 3a83472bea769d88ab559776100cc5d661921189 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 18 Jul 2016 18:19:13 +0300 Subject: [PATCH 206/936] Update jr confirm and index --- resources/mails/jr_confirm.html | 96 +++++++++++++++++++++++++++++++++ resources/view/index.html | 6 +-- 2 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 resources/mails/jr_confirm.html diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html new file mode 100644 index 0000000..1fa1ee2 --- /dev/null +++ b/resources/mails/jr_confirm.html @@ -0,0 +1,96 @@ + + + + Осенний набор на стажировку от Javarush + +

    + Здравствуй!
    +

    +

    Ваше решение тестового задания проверено. Результат положительный.
    + Вы зачислены на летний набор стажировки от Javarush: + детальная + информация на JavaRush инфо. +

    +

    Информация по проекту от преподавателя Кислина Григория:

    +Общение на проекте предлагаю на "ты".
    +Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю +(четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние +задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с +пройденной на занятии. +

    Вступительное занятие

    +До старта проекта 01.09 можно приступать в выполнению вступительного + занятия. +Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй +инструкциям. Особое внимание обращаю на wiki по ведению + проекта в Git, необходимо строго следовать этим правилам. +

    Проверка домашних заданий

    +Разбор домашний заданий происходит в начале каждого занятия.
    +Если у тебя подписка ментор, то свое решение вступительного задания нужно присылать на проверку начиная c +02.09 до вечера 06.09, остальных домашних заданий - до вечера вторника. +

    + Проверка заданий подразумевает ревью твоего кода. Ты увидишь именно свои ошибки в стиле, структурах данных, + алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания + это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в + гитхаб и шлют мне ссылку на репозиторий. Я проверяю и фидбэк пишу прямо в slack. Получается эффективно и + оперативно. Можно что-то переделать и снова поревьюится.
    + Если есть желание участвовать в проекте с проверкой заданий и нет подписки ментор, по поводу доплаты свяжись со мной отдельно по + skype: grigory.kislin
    +

    +

    IDE: JetBrains IDEA

    +

    + IDEA считается лучшей Java IDE, и по последней + статистике + IntelliJ is the number one IDE.
    + Netbeans хорош для новичков и индусов (в Индии его 80%).
    + В СПб на IDEA по моему опыту программируют 95% разработчиков.
    + Поэтому разработка проекта ведется в JetBrains IDEA, брать + версию + Ultimate
    + Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую + учебную лицензию JetBrains IDEA на год.
    Учебную лицензию на IDEA и доступ ко всем материалам проекта + буду + рассылать 01.09. + +

    Заполнение регистрационной формы

    +Общение на проекте будет вестись в Slack. Заполни пожалуйста все поля регистрационной формы, +и на почту придет приглашение в группу Slack. Для доступа к +материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. +Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. +Обсуждение вступительного занятия происходит в канале Slack #entrance_lesson.
    +
      Другие каналы Slack: +
    • #flooding: оффтопик
    • +
    • #general: общие вопросы
    • +
    • #git: вопросы по git
    • +
    • #idea: вопросы по idea
    • +
    • #interview_job: вопросы прохождения + интервью, + работа, вакансии +
    • +
    + +Форматирование сообщениq в + slack
    +Desktop/ Mobile приложение Slack +

    Ресурсы

    +Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Рекомендую также изучить полезные ресурсы. + +

    + Удачи в освоении материалов и выполнении задания,
    + Григорий Кислин
    + skype: grigory.kislin +

    +

    + Java Online Projects +

    + diff --git a/resources/view/index.html b/resources/view/index.html index 27a750f..0b9f449 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -113,9 +113,7 @@

    Участие в разработке Spring/JPA Enterprise приложе

    Наши истории (делимся опытом и успехом)


    -

    Стажировка на Java Web и Java Enterprise

    -

    Top Java Enterprise:
    наиболее - востребованные технологии /инструменты /фреймворки Java Enterprise.

    +

    Стажировка на Java Enterprise:

    Старт 01.09.2016 (по четвергам с начала сентября).

    Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins
    Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на @@ -125,8 +123,6 @@

    Старт 01.09.2016 (по четвергам с начала сентя

    Техническое собеседование Java разработчик

    Тестовое интервью

    Core Java 8, OOP, JMM/Concurrency, Servlet/JSP, JPA, Spring MVC, REST, SQL, Maven

    -

    Техно Диасофт для СберТех

    -

    Core Java, Concurrency, JSP, Axis, SOAP, JSP, Oracle, JavaScript, JMS, Hibernate, J2EE, Git

    From 48173796cc8c5c567f258bd2ff55344935684910 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 18 Jul 2016 18:24:11 +0300 Subject: [PATCH 207/936] Update home page --- resources/view/index.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/view/index.html b/resources/view/index.html index 0b9f449..f8f8898 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -120,6 +120,10 @@

    Старт 01.09.2016 (по четвергам с начала сентя основе ролей


    +

    Проект "Многопоточность. Веб сервисы."

    +

    Бесплатный вебинар 26.07 в 20.00 (GMT+3). Старт в конце августа.

    +

    Разработка полнофункционального многомодульного Maven проекта с использованием SOAP (JAX-WS) и REST (JAX-RS)

    +

    Техническое собеседование Java разработчик

    Тестовое интервью

    Core Java 8, OOP, JMM/Concurrency, Servlet/JSP, JPA, Spring MVC, REST, SQL, Maven

    From 8a501fe6c72a186798de1fbc999edf5f3c5b652a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 18 Jul 2016 18:31:10 +0300 Subject: [PATCH 208/936] Update mail template --- resources/mails/jr_confirm.html | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 1fa1ee2..032dc4f 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -33,25 +33,25 @@

    Проверка домашних заданий

    это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в гитхаб и шлют мне ссылку на репозиторий. Я проверяю и фидбэк пишу прямо в slack. Получается эффективно и оперативно. Можно что-то переделать и снова поревьюится.
    - Если есть желание участвовать в проекте с проверкой заданий и нет подписки ментор, по поводу доплаты свяжись со мной отдельно по + Если есть желание участвовать в проекте с проверкой заданий и нет подписки ментор, по поводу доплаты свяжись со мной + отдельно по skype: grigory.kislin

    IDE: JetBrains IDEA

    -

    - IDEA считается лучшей Java IDE, и по IDEA считается лучшей Java IDE, и по последней статистике - IntelliJ is the number one IDE.
    - Netbeans хорош для новичков и индусов (в Индии его 80%).
    - В СПб на IDEA по моему опыту программируют 95% разработчиков.
    - Поэтому разработка проекта ведется в JetBrains IDEA, брать +IntelliJ is the number one IDE.
    +Netbeans хорош для новичков и индусов (в Индии его 80%).
    +В СПб на IDEA по моему опыту программируют 95% разработчиков.
    +Поэтому разработка проекта ведется в JetBrains IDEA,
    брать версию Ultimate
    - Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую учебную лицензию JetBrains IDEA на год.
    Учебную лицензию на IDEA и доступ ко всем материалам проекта - буду - рассылать 01.09. +буду +рассылать 01.09.

    Заполнение регистрационной формы

    Общение на проекте будет вестись в Slack. Заполни пожалуйста все поля Date: Mon, 18 Jul 2016 18:40:45 +0300 Subject: [PATCH 209/936] Update mail template --- resources/mails/jr_confirm.html | 72 ++++++++++++++++----------------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 032dc4f..9c18737 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -17,42 +17,6 @@

    Информация по проекту от преподавателя К (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с пройденной на занятии. -

    Вступительное занятие

    -До старта проекта 01.09 можно приступать в выполнению
    вступительного - занятия. -Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй -инструкциям. Особое внимание обращаю на wiki по ведению - проекта в Git, необходимо строго следовать этим правилам. -

    Проверка домашних заданий

    -Разбор домашний заданий происходит в начале каждого занятия.
    -Если у тебя подписка ментор, то свое решение вступительного задания нужно присылать на проверку начиная c -02.09 до вечера 06.09, остальных домашних заданий - до вечера вторника. -

    - Проверка заданий подразумевает ревью твоего кода. Ты увидишь именно свои ошибки в стиле, структурах данных, - алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания - это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в - гитхаб и шлют мне ссылку на репозиторий. Я проверяю и фидбэк пишу прямо в slack. Получается эффективно и - оперативно. Можно что-то переделать и снова поревьюится.
    - Если есть желание участвовать в проекте с проверкой заданий и нет подписки ментор, по поводу доплаты свяжись со мной - отдельно по - skype: grigory.kislin
    -

    -

    IDE: JetBrains IDEA

    -IDEA считается лучшей Java IDE, и по последней - статистике -IntelliJ is the number one IDE.
    -Netbeans хорош для новичков и индусов (в Индии его 80%).
    -В СПб на IDEA по моему опыту программируют 95% разработчиков.
    -Поэтому разработка проекта ведется в JetBrains IDEA, брать - версию - Ultimate
    -Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую - учебную лицензию JetBrains IDEA на год.
    Учебную лицензию на IDEA и доступ ко всем материалам проекта -буду -рассылать 01.09. -

    Заполнение регистрационной формы

    Общение на проекте будет вестись в Slack. Заполни пожалуйста все поля Заполнение регистрационной формы

    работа, вакансии - Форматирование сообщениq в slack
    Desktop/ Mobile приложение Slack +

    IDE: JetBrains IDEA

    +IDEA считается лучшей Java IDE, и по последней + статистике +IntelliJ is the number one IDE.
    +Netbeans хорош для новичков и индусов (в Индии его 80%).
    +В СПб на IDEA по моему опыту программируют 95% разработчиков.
    +Поэтому разработка проекта ведется в JetBrains IDEA, брать + версию + Ultimate
    +Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую + учебную лицензию JetBrains IDEA на год.
    Учебную лицензию на IDEA и доступ ко всем материалам проекта +буду +рассылать 01.09. +

    Вступительное занятие

    +До старта проекта 01.09 можно приступать в выполнению вступительного + занятия. +Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй +инструкциям. Особое внимание обращаю на wiki по ведению + проекта в Git, необходимо строго следовать этим правилам. +

    Проверка домашних заданий

    +Разбор домашний заданий происходит в начале каждого занятия.
    +Если у тебя подписка ментор, то свое решение вступительного задания нужно присылать на проверку начиная c +02.09 до вечера 06.09, остальных домашних заданий - до вечера вторника. +

    + Проверка заданий подразумевает ревью твоего кода. Ты увидишь именно свои ошибки в стиле, структурах данных, + алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания + это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в + гитхаб и шлют мне ссылку на репозиторий. Я проверяю и фидбэк пишу в slack. Получается эффективно и + оперативно. Можно что-то переделать и снова поревьюится.
    + Если есть желание участвовать в проекте с проверкой заданий и нет подписки ментор, по поводу доплаты свяжись со мной + отдельно по + skype: grigory.kislin
    +

    Ресурсы

    Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Рекомендую также изучить полезные ресурсы. From ec8dcf8123c6519b2c17bd2424df8d574da72ad4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 18 Jul 2016 18:43:16 +0300 Subject: [PATCH 210/936] Update mail template --- resources/mails/jr_confirm.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 9c18737..475e614 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -7,7 +7,7 @@ Здравствуй!

    Ваше решение тестового задания проверено. Результат положительный.
    - Вы зачислены на летний набор стажировки от Javarush: + Вы зачислены на осенний набор стажировки от Javarush: детальная информация на JavaRush инфо.

    From 2e451c8791ac5f0116f90dad3de480d4125b5485 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 18 Jul 2016 18:46:10 +0300 Subject: [PATCH 211/936] Update mail template --- resources/mails/jr_confirm.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 475e614..67d4696 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -54,9 +54,9 @@

    IDE: JetBrains IDEA

    учебную лицензию JetBrains IDEA на год.
    Учебную лицензию на IDEA и доступ ко всем материалам проекта буду рассылать 01.09. -

    Вступительное занятие

    -До старта проекта 01.09 можно приступать в выполнению вступительного - занятия. +

    Вступительное занятие

    +До старта проекта 01.09 можно приступать в выполнению вступительного + занятия. Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй инструкциям. Особое внимание обращаю на wiki по ведению проекта в Git, необходимо строго следовать этим правилам. From 6a10b5c0a545fcedb672eaa8516bd6321a2c2d50 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 18 Jul 2016 18:50:42 +0300 Subject: [PATCH 212/936] Update view after save --- resources/view/registration_topjava.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/view/registration_topjava.html b/resources/view/registration_topjava.html index 8063cec..4730b50 100644 --- a/resources/view/registration_topjava.html +++ b/resources/view/registration_topjava.html @@ -22,10 +22,9 @@

    Спасибо за регистрацию!

    -

    +

    На почту должно прийти приглашение в группу Slack.

    -

    Если доступа к Google Drive еще нет, пришли мне в skype свой gmail.

    From 27a5722f2c3043b43f621da428574e141818cb54 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 19 Jul 2016 12:37:12 +0300 Subject: [PATCH 213/936] Refactor include in group --- resources/mails/confirm.html | 3 ++ src/main/java/ru/javaops/model/UserGroup.java | 4 +++ .../java/ru/javaops/service/GroupService.java | 7 +++-- .../javaops/web/SubscriptionController.java | 28 +++++++++++++------ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/resources/mails/confirm.html b/resources/mails/confirm.html index 7c1b5bb..173ee53 100644 --- a/resources/mails/confirm.html +++ b/resources/mails/confirm.html @@ -1,6 +1,7 @@ + @@ -18,5 +19,7 @@

    Телефон: 123-456

    +

    +

    \ No newline at end of file diff --git a/src/main/java/ru/javaops/model/UserGroup.java b/src/main/java/ru/javaops/model/UserGroup.java index 690e097..d4d4e9c 100644 --- a/src/main/java/ru/javaops/model/UserGroup.java +++ b/src/main/java/ru/javaops/model/UserGroup.java @@ -76,6 +76,10 @@ public void setParticipationType(ParticipationType participationType) { this.participationType = participationType; } + public void setRegisterType(RegisterType registerType) { + this.registerType = registerType; + } + public ParticipationType getParticipationType() { return participationType; } diff --git a/src/main/java/ru/javaops/service/GroupService.java b/src/main/java/ru/javaops/service/GroupService.java index 89a7732..4d9e5b2 100644 --- a/src/main/java/ru/javaops/service/GroupService.java +++ b/src/main/java/ru/javaops/service/GroupService.java @@ -98,7 +98,7 @@ public UserGroup registerAtProject(UserTo userTo, ProjectProps projectProps, Str return userGroupRepository.save(userGroup); } - public UserGroup registerAtGroup(UserTo userTo, String groupName) { + public UserGroup registerAtGroup(UserTo userTo, String groupName, String channel) { log.info("add{} to group {}", userTo, groupName); Group group = findByName(groupName); User user = userService.findByEmail(userTo.getEmail()); @@ -110,11 +110,12 @@ public UserGroup registerAtGroup(UserTo userTo, String groupName) { } else { UserGroup ug = userGroupRepository.findByUserIdAndGroupId(user.getId(), group.getId()); if (ug != null) { - return new UserGroup(user, group, RegisterType.REPEAT, null); + ug.setRegisterType(RegisterType.REPEAT); + return ug; } registerType = RegisterType.REGISTERED; } - UserGroup userGroup = new UserGroup(user, group, registerType, null); + UserGroup userGroup = new UserGroup(user, group, registerType, channel); userGroupRepository.save(userGroup); return userGroup; } diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index b009e7f..49e47c0 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -64,16 +64,28 @@ public ModelAndView activate(@RequestParam("email") String email, @RequestParam( @RequestMapping(value = "/register-group", method = RequestMethod.POST) public ModelAndView registerInGroup(@RequestParam("group") String group, - @RequestParam("confirmMail") String confirmMail, - @RequestParam("callback") String callback, + @RequestParam(value = "confirmMail", required = false) String confirmMail, + @RequestParam(value = "callback", required = false) String callback, + @RequestParam("channel") String channel, @RequestParam("template") String template, @Valid UserTo userTo, BindingResult result) throws MessagingException { if (result.hasErrors()) { throw new ValidationException(Util.getErrorMessage(result)); } - UserGroup userGroup = groupService.registerAtGroup(userTo, group); - mailService.sendWithTemplateAsync(confirmMail, "confirm", ImmutableMap.of("userGroup", userGroup)); - return sendAndRedirect(callback, "http://javawebinar.ru/error.html", userGroup.getUser(), template); + UserGroup userGroup = groupService.registerAtGroup(userTo, group, channel); + String mailResult = mailService.sendToUser(template, userGroup.getUser()); + ImmutableMap params = ImmutableMap.of("userGroup", userGroup, "result", mailResult); + + final ModelAndView mv; + if (callback != null) { + mv = getRedirectView(mailResult, callback, "http://javawebinar.ru/error.html"); + } else { + mv = new ModelAndView("confirm", params); + } + if (confirmMail != null) { + mailService.sendWithTemplateAsync(confirmMail, "confirm", params); + } + return mv; } @RequestMapping(value = "/register", method = RequestMethod.POST) @@ -91,11 +103,11 @@ public ModelAndView registerByProject(@RequestParam("project") String project, integrationService.asyncSendSlackInvitation(userGroup.getUser().getEmail(), projectName); } String template = projectName + (userGroup.getRegisterType() == RegisterType.REPEAT ? "_repeat" : "_register"); - return sendAndRedirect("http://javawebinar.ru/confirm.html", "http://javawebinar.ru/error.html", userGroup.getUser(), template); + String mailResult = mailService.sendToUser(template, userGroup.getUser()); + return getRedirectView(mailResult, "http://javawebinar.ru/confirm.html", "http://javawebinar.ru/error.html"); } - private ModelAndView sendAndRedirect(String successUrl, String failUrl, User user, String template) throws MessagingException { - String mailResult = mailService.sendToUser(template, user); + private ModelAndView getRedirectView(String mailResult, String successUrl, String failUrl) throws MessagingException { return new ModelAndView("redirectToUrl", "redirectUrl", MailService.isOk(mailResult) ? successUrl : failUrl); } From 2726a4719bb43fbc4386d97b867ee0d965323c81 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 21 Jul 2016 23:13:08 +0300 Subject: [PATCH 214/936] Update basejava --- resources/mails/basejava/urise_start.html | 25 +++++++++++++++++++++++ resources/mails/basejava_register.html | 21 +++++++++++-------- 2 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 resources/mails/basejava/urise_start.html diff --git a/resources/mails/basejava/urise_start.html b/resources/mails/basejava/urise_start.html new file mode 100644 index 0000000..ec4c982 --- /dev/null +++ b/resources/mails/basejava/urise_start.html @@ -0,0 +1,25 @@ + + + + + + Занятия на курсе 'Практика Java. Разработка Web приложения' + +

    + Здравствуй firstName!
    +

    +

    +Я адаптировал и начал вести свой обновленный курс Практика Java. Разработка Web приложения в рамках школы U-Rise. +Курс расширился (предполагается 16 занятий) и идет на платформе обучения в личном кабинете с контролем результатов. Мне помогает еще один преподаватель Станислав, который лично курирует процесс обучения. +

    +Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание. +

    + После этого можно регистрироваться по сслыке обучение JAVA + и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудте получить скидку в 5%, сказав что вы пришли с сайта JavaWebinar.ru от меня. +

    + Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    + До встречи на курсе! +

    +

    +

    + \ No newline at end of file diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 85efd10..af2e48a 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -3,20 +3,25 @@ - Регистрация на проект 'Практика Java. Разработка Web приложения' + Вступительное занятие на курсе 'Практика Java. Разработка Web приложения'

    Здравствуй firstName!

    - Спасибо за регистрацию на проекте Практика Java. Разработка Web - приложения!
    + Спасибо за интерес к курсу Практика Java. Разработка Web приложения!
    +

    +Я адаптировал и начал вести свой обновленный курс в рамках школы U-Rise. Курс идет на платформе обучения в личном кабинете с контролем результатов.
    +Мне помогает еще один преподаватель Станислав, который лично курирует процесс обучения. +
    +Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание. +

    + После этого можно регистрироваться по сслыке обучение JAVA + и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудте получить скидку в 5%, сказав что вы пришли с сайта JavaWebinar.ru от меня. +

    + Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    + До встречи на курсе!

    -Старт будет по мере набора группы.
    -Буду делать рассылку и держать в курсе. -Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    -До встречи на проекте!
    -

    Ответы на вопросы.

    \ No newline at end of file From bb08772f8dcd63d9c4a2109483f1a470377d7daa Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 21 Jul 2016 23:27:25 +0300 Subject: [PATCH 215/936] Fix basejava --- resources/mails/basejava/urise_start.html | 3 ++- resources/mails/basejava_register.html | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/mails/basejava/urise_start.html b/resources/mails/basejava/urise_start.html index ec4c982..119a783 100644 --- a/resources/mails/basejava/urise_start.html +++ b/resources/mails/basejava/urise_start.html @@ -14,8 +14,9 @@

    Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание.

    - После этого можно регистрироваться по сслыке обучение JAVA + После этого можно регистрироваться по сслыке обучение JAVA и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудте получить скидку в 5%, сказав что вы пришли с сайта JavaWebinar.ru от меня. +

    Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    До встречи на курсе! diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index af2e48a..3a3a871 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -16,8 +16,9 @@
    Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание.

    - После этого можно регистрироваться по сслыке обучение JAVA + После этого можно регистрироваться по сслыке обучение JAVA и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудте получить скидку в 5%, сказав что вы пришли с сайта JavaWebinar.ru от меня. +

    Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    До встречи на курсе! From 6c42068d6a01220fc83523ac97c7aeb7bf4b242b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 21 Jul 2016 23:30:12 +0300 Subject: [PATCH 216/936] Fix basejava --- resources/mails/basejava/urise_start.html | 2 +- resources/mails/basejava_register.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/basejava/urise_start.html b/resources/mails/basejava/urise_start.html index 119a783..a02f28d 100644 --- a/resources/mails/basejava/urise_start.html +++ b/resources/mails/basejava/urise_start.html @@ -14,7 +14,7 @@

    Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание.

    - После этого можно регистрироваться по сслыке обучение JAVA + После этого можно регистрироваться по сслыке обучение JAVA и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудте получить скидку в 5%, сказав что вы пришли с сайта JavaWebinar.ru от меня.

    diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 3a3a871..b9b2f7b 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -16,7 +16,7 @@
    Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание.

    - После этого можно регистрироваться по сслыке обучение JAVA + После этого можно регистрироваться по сслыке обучение JAVA и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудте получить скидку в 5%, сказав что вы пришли с сайта JavaWebinar.ru от меня.

    From 550d991993e26eb070635abce30d89fd8571ab16 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 21 Jul 2016 23:31:46 +0300 Subject: [PATCH 217/936] Fix basejava --- resources/mails/basejava_register.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index b9b2f7b..4c621d9 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -3,7 +3,7 @@ - Вступительное занятие на курсе 'Практика Java. Разработка Web приложения' + Вступительное занятие курса 'Практика Java. Разработка Web приложения'

    Здравствуй firstName!
    From 29646f2c9a2ecc6bdea688ef4e8a69194a20c18d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 21 Jul 2016 23:38:04 +0300 Subject: [PATCH 218/936] Fix basejava --- resources/mails/basejava/urise_start.html | 2 +- resources/mails/basejava_register.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/basejava/urise_start.html b/resources/mails/basejava/urise_start.html index a02f28d..f4037d7 100644 --- a/resources/mails/basejava/urise_start.html +++ b/resources/mails/basejava/urise_start.html @@ -14,7 +14,7 @@

    Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание.

    - После этого можно регистрироваться по сслыке обучение JAVA + После этого можно регистрироваться по сслыке обучение JAVA и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудте получить скидку в 5%, сказав что вы пришли с сайта JavaWebinar.ru от меня.

    diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 4c621d9..1f391fc 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -16,7 +16,7 @@
    Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание.

    - После этого можно регистрироваться по сслыке обучение JAVA + После этого можно регистрироваться по сслыке обучение JAVA и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудте получить скидку в 5%, сказав что вы пришли с сайта JavaWebinar.ru от меня.

    From 21a1fc3cf1decfaea8e0d5b41b7e19c42634dbb4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 21 Jul 2016 23:42:07 +0300 Subject: [PATCH 219/936] Update lesson08 --- resources/mails/topjava/lesson/lesson08.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index 16b97e6..fcc2248 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -16,7 +16,7 @@ Обсуждение урока и HW8 в Slack #lesson08

    - Домашнее задание (у кого есть проверка) желательно присылать до вечера 26.04
    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 26.07

    From 109897b1b272bbc068ee8fcbca246fe10f9d7ea2 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 21 Jul 2016 23:49:29 +0300 Subject: [PATCH 220/936] Fix basejava --- resources/mails/basejava/urise_start.html | 4 ++-- resources/mails/basejava_register.html | 2 +- src/test/java/ru/javaops/service/MailServiceTest.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/mails/basejava/urise_start.html b/resources/mails/basejava/urise_start.html index f4037d7..682bda1 100644 --- a/resources/mails/basejava/urise_start.html +++ b/resources/mails/basejava/urise_start.html @@ -3,7 +3,7 @@ - Занятия на курсе 'Практика Java. Разработка Web приложения' + Вступительное занятие курса 'Практика Java. Разработка Web приложения'

    Здравствуй firstName!
    @@ -15,7 +15,7 @@ Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание.

    После этого можно регистрироваться по сслыке обучение JAVA - и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудте получить скидку в 5%, сказав что вы пришли с сайта JavaWebinar.ru от меня. + и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудь получить скидку в 5%, сказав что пришел с сайта JavaWebinar.ru от меня.

    Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 1f391fc..c6ce7dc 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -17,7 +17,7 @@ Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание.

    После этого можно регистрироваться по сслыке обучение JAVA - и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудте получить скидку в 5%, сказав что вы пришли с сайта JavaWebinar.ru от меня. + и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудь получить скидку в 5%, сказав что пришел с сайта JavaWebinar.ru от меня.

    Добавляйся в группу VK: Практика Java (Web/ Enterprise)
    diff --git a/src/test/java/ru/javaops/service/MailServiceTest.java b/src/test/java/ru/javaops/service/MailServiceTest.java index 83bda10..1be7624 100644 --- a/src/test/java/ru/javaops/service/MailServiceTest.java +++ b/src/test/java/ru/javaops/service/MailServiceTest.java @@ -18,7 +18,7 @@ public class MailServiceTest extends ApplicationAbstractTest { @Test public void testGetContent() throws Exception { - String content = mailService.getContent("topjava/lesson/topjava_final", + String content = mailService.getContent("basejava_register", ImmutableMap.of("user", UserTestData.USER, "template", "topjava_register", "participation", "REGISTRATION", "result", "OK", "activationKey", "activationKey")); System.out.println("\n+++++"); System.out.println(Util.getTitle(content)); From 854bdabff81189fba851717f420d63ac1cdaaa82 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 25 Jul 2016 14:30:07 +0300 Subject: [PATCH 221/936] Correct topjava --- resources/mails/topjava_early_price.html | 14 +++++++++++--- resources/mails/topjava_info.html | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava_early_price.html b/resources/mails/topjava_early_price.html index 8709034..6ca919c 100644 --- a/resources/mails/topjava_early_price.html +++ b/resources/mails/topjava_early_price.html @@ -1,13 +1,21 @@ - Ранняя цена на проект 'Java Enterprise (Topjava)'. Старт 01.09 + Акция на проект 'Java Enterprise (Topjava)' изменилась до 30.08.

    Здравствуй!

    -

    Рад сообщить, при оплате до 01.08 действует льготная цена на проект Java Enterprise (Topjava):

    -
    +В связи с моей ограниченной доступностью в интернетнет с 30.07 по 13.08 льготная цена на проект Java Enterprise (Topjava) будет + действовать до 30.08. Пожалуйста поспешите, если хотете принять участие по цене акции: +
      +
    • 7600 руб. - участие в проекте и группе slack, помощь по проекту
    • +
    • 15000 руб. - добавляется проверка домашних заданий и ревью выпускного проекта
    • +
    • для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.
    • +
    • Способы оплаты
    • +
    • Курс рубля
    • +
    +

    Старт проекта: 01.09

    \ No newline at end of file diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 459643b..a41cbf7 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -115,7 +115,7 @@

    На проекте

    при устройстве на работу).

  • Для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.

  • Скидка на другие проекты: 700 руб. (без ДЗ) и 1500 руб (с ДЗ).

  • -
  • При оплате до 01.08 стоимость участия в проекте: 7600 руб. и 15000 руб.

  • +
  • При оплате до 30.07 стоимость участия в проекте: 7600 руб. и 15000 руб.

  • Добавляйся в skype: grigory.kislin с пометкой topjava.

  • Способы оплаты (объязательно перед оплатой свяжитесь со мной)
  • Вопросы по проекту
  • From ec9b0d2c793c6669e0c3048eceb27e3fcfaaca4f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 25 Jul 2016 14:38:15 +0300 Subject: [PATCH 222/936] Correct topjava --- resources/mails/topjava_early_price.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava_early_price.html b/resources/mails/topjava_early_price.html index 6ca919c..164b22d 100644 --- a/resources/mails/topjava_early_price.html +++ b/resources/mails/topjava_early_price.html @@ -7,7 +7,7 @@ Здравствуй!

    В связи с моей ограниченной доступностью в интернетнет с 30.07 по 13.08 льготная цена на проект Java Enterprise (Topjava) будет - действовать до 30.08. Пожалуйста поспешите, если хотете принять участие по цене акции: + действовать до 30.08. Пожалуйста поспеши, если хочешь принять участие по цене акции:
    • 7600 руб. - участие в проекте и группе slack, помощь по проекту
    • 15000 руб. - добавляется проверка домашних заданий и ревью выпускного проекта
    • From 550b6c4ea96668aa2d3a8639af9c4acdde9e6b34 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 26 Jul 2016 16:23:06 +0300 Subject: [PATCH 223/936] Add masterjava 1st --- .../mails/masterjava/masterjava_1st.html | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 resources/mails/masterjava/masterjava_1st.html diff --git a/resources/mails/masterjava/masterjava_1st.html b/resources/mails/masterjava/masterjava_1st.html new file mode 100644 index 0000000..7e16c34 --- /dev/null +++ b/resources/mails/masterjava/masterjava_1st.html @@ -0,0 +1,30 @@ + + + + + + Вступительное занятие проекта 'Многопоточность. Веб сервисы.' + +

      + Здравствуй!
      +

      +

      + Напомню, что СЕГОДНЯ, 26.07 в 20.00 (GMT+3, Москва/Киев) будет бесплатный вебинар:
      вступительное занятие + по обновленному проекту + Многопоточность. Веб сервисы.
      + разработка полнофункционального многомодульного Maven проекта с использованием веб-сервисов (SOAP, JAX-WS), REST + (JAX-RS) и JMX.
      + Проект стартует во второй половине августа. + +

      +

      + Встречу проведем на платформе Google Hangouts:
      + Определится с участием
      + Видео на YouTube +

      +

      + До встречи на вебинаре! +

      +

      +

      + \ No newline at end of file From 73a950a0457997ee87319ce47b07a48ad0e88337 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 26 Jul 2016 16:27:23 +0300 Subject: [PATCH 224/936] Fix masterjava 1st --- resources/mails/masterjava/masterjava_1st.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/resources/mails/masterjava/masterjava_1st.html b/resources/mails/masterjava/masterjava_1st.html index 7e16c34..f6e71fd 100644 --- a/resources/mails/masterjava/masterjava_1st.html +++ b/resources/mails/masterjava/masterjava_1st.html @@ -13,9 +13,7 @@ по обновленному проекту Многопоточность. Веб сервисы.
      разработка полнофункционального многомодульного Maven проекта с использованием веб-сервисов (SOAP, JAX-WS), REST - (JAX-RS) и JMX.
      - Проект стартует во второй половине августа. - + (JAX-RS) и JMX. Проект стартует во второй половине августа.

      Встречу проведем на платформе Google Hangouts:
      From 3ee5e1c26d20debf6bc6b0af73daf4af68a65807 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 28 Jul 2016 18:15:30 +0300 Subject: [PATCH 225/936] Update mail templates --- .../mails/masterjava/masterjava_1_lesson.html | 22 +++++++++++++++++++ resources/mails/masterjava_register.html | 11 ++++++---- resources/mails/topjava/lesson/lesson09.html | 2 +- 3 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 resources/mails/masterjava/masterjava_1_lesson.html diff --git a/resources/mails/masterjava/masterjava_1_lesson.html b/resources/mails/masterjava/masterjava_1_lesson.html new file mode 100644 index 0000000..37591fd --- /dev/null +++ b/resources/mails/masterjava/masterjava_1_lesson.html @@ -0,0 +1,22 @@ + + + + + + Вступительное занятие проекта 'Многопоточность. Веб сервисы.' + +

      + Здравствуй!
      +

      +

      + Выложил материалы (видео) первого занятия: многопоточность (также в плейлисте на YouTube).
      + Добавил в урок ссылок, подправил момент видео с реализацией ThreadLocal (реализуется через член класса Thread.threadLocals) +

      +

      + Проект стартует во второй половине августа/ начале сентября, дата старта и программа проекта будут уточняться и рассылаться всем + зарегистрированным участникам. Проверка вступительного задания будет для участников с проверкой ДЗ.
      + Следите за рассылкой и до встречи на проекте!
      +

      +

      +

      + \ No newline at end of file diff --git a/resources/mails/masterjava_register.html b/resources/mails/masterjava_register.html index 70280be..39aa8ce 100644 --- a/resources/mails/masterjava_register.html +++ b/resources/mails/masterjava_register.html @@ -9,15 +9,18 @@ Здравствуй firstName!

      - Спасибо за регистрацию на проекте Многопоточность. Веб сервисы.
      + Спасибо за регистрацию на проекте Многопоточность. Веб сервисы.

      - Перед вебинаром вступительного занятия (26.07 в 20.00, GMT+3) тебе придет ссылка на комнату.
      - Сам проект стартует во второй половине августа, дата старта и программа проекта будут уточняться и рассылаться всем + Проект стартует во второй половине августа/ начале сентября, дата старта и программа проекта будут уточняться и рассылаться всем зарегистрированным участникам.

      - До встречи на бесплатном вебинаре!
      + Смотри первое занятие и выполняй вступительное задание. +

      +

      + Следите за рассылкой и до встречи на проекте!

      diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index 9382c16..e86ea9d 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -16,7 +16,7 @@ Обсуждение урока и HW9 в Slack #lesson09

      - Домашнее задание (у кого есть проверка) желательно присылать до вечера 03.05
      + Домашнее задание (у кого есть проверка) желательно присылать до вечера 02.07

      From 13fdf2fe000ea7d2234e6ebf57d0420e2d3f0250 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 28 Jul 2016 18:20:34 +0300 Subject: [PATCH 226/936] Update mail templates --- resources/mails/topjava/lesson/lesson09.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index e86ea9d..7d8aef1 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -16,7 +16,7 @@ Обсуждение урока и HW9 в Slack #lesson09

      - Домашнее задание (у кого есть проверка) желательно присылать до вечера 02.07
      + Домашнее задание (у кого есть проверка) желательно присылать до вечера 02.08

      From d0c0c936b1eb2a096a10e3c22e8bf0cdc15f0904 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 28 Jul 2016 18:23:46 +0300 Subject: [PATCH 227/936] Update mail templates --- resources/mails/masterjava/masterjava_1_lesson.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava/masterjava_1_lesson.html b/resources/mails/masterjava/masterjava_1_lesson.html index 37591fd..757f9b3 100644 --- a/resources/mails/masterjava/masterjava_1_lesson.html +++ b/resources/mails/masterjava/masterjava_1_lesson.html @@ -3,7 +3,7 @@ - Вступительное занятие проекта 'Многопоточность. Веб сервисы.' + Видео первого занятие проекта 'Многопоточность. Веб сервисы.'

      Здравствуй!
      From f7841e4272dfed7226c5ccaaf8a69e6d5e7e568f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 29 Jul 2016 10:29:15 +0300 Subject: [PATCH 228/936] Update mail templates --- resources/mails/topjava_info.html | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index a41cbf7..89aa111 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -115,7 +115,6 @@

      На проекте

      при устройстве на работу).

    • Для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.

    • Скидка на другие проекты: 700 руб. (без ДЗ) и 1500 руб (с ДЗ).

    • -
    • При оплате до 30.07 стоимость участия в проекте: 7600 руб. и 15000 руб.

    • Добавляйся в skype: grigory.kislin с пометкой topjava.

    • Способы оплаты (объязательно перед оплатой свяжитесь со мной)
    • Вопросы по проекту
    • From a413b3182979b8883e8cec74f332bc3b5d7f3c2a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 29 Jul 2016 11:02:40 +0300 Subject: [PATCH 229/936] Update mail templates --- resources/mails/topjava_early_price.html | 27 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/resources/mails/topjava_early_price.html b/resources/mails/topjava_early_price.html index 164b22d..551d60f 100644 --- a/resources/mails/topjava_early_price.html +++ b/resources/mails/topjava_early_price.html @@ -1,21 +1,30 @@ - Акция на проект 'Java Enterprise (Topjava)' изменилась до 30.08. + Сегодня последний день скидки на 'Java Enterprise (Topjava)'.

      Здравствуй!

      -В связи с моей ограниченной доступностью в интернетнет с 30.07 по 13.08 льготная цена на проект Java Enterprise (Topjava) будет - действовать до 30.08. Пожалуйста поспеши, если хочешь принять участие по цене акции: +Сегодня последний день льготной цены на Java Enterprise (Topjava) -

      Старт проекта: 01.09

      +
        +
      • 7600 руб. - участие в проекте и группе slack, помощь по проекту
      • +
      • 15000 руб. - добавляется проверка домашних заданий и ревью выпускного проекта
      • +
      • для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.
      • +
      • Способы оплаты
      • +
      • Курс рубля
      • +
      +

      + Поторопись!
      + Старт проекта: 01.09

      \ No newline at end of file From 6a905cf6ff182c1d17fb694c4677e826892325ff Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 29 Jul 2016 14:59:27 +0300 Subject: [PATCH 230/936] Update index --- resources/view/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/view/index.html b/resources/view/index.html index f8f8898..2214954 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -121,7 +121,7 @@

      Старт 01.09.2016 (по четвергам с начала сентя ролей


      Проект "Многопоточность. Веб сервисы."

      -

      Бесплатный вебинар 26.07 в 20.00 (GMT+3). Старт в конце августа.

      +

      Старт в конце августа/начале сентября.

      Разработка полнофункционального многомодульного Maven проекта с использованием SOAP (JAX-WS) и REST (JAX-RS)


      Техническое собеседование Java разработчик

      From 69497f9b4c7fa6cf5b2f439e21bfa9b02f40c8ec Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 29 Jul 2016 15:25:48 +0300 Subject: [PATCH 231/936] Update index --- resources/view/index.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/view/index.html b/resources/view/index.html index 2214954..3aa6863 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -124,6 +124,10 @@

      Проект "Многопо

      Старт в конце августа/начале сентября.

      Разработка полнофункционального многомодульного Maven проекта с использованием SOAP (JAX-WS) и REST (JAX-RS)


      +

      Курс JavaSE + Web

      +

      Разработка WEB-приложения, основываясь на базовых темах курса: объектная модель, коллекции, система ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, SQL, персистентность в базу данных (PostgreSQL), сервлеты, JSP/JSTL, веб-контейнер Tomcat, HTML, модульные тесты JUnit, java.util.Logging, система контроля версий Git. + Деплой полученного приложения в облачный сервис Heroku.

      +

      Техническое собеседование Java разработчик

      Тестовое интервью

      Core Java 8, OOP, JMM/Concurrency, Servlet/JSP, JPA, Spring MVC, REST, SQL, Maven

      From 64bfb8b0c21dc65eb8eb64f8b35943332503e09d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 1 Aug 2016 22:50:57 +0300 Subject: [PATCH 232/936] Update jr confirm --- resources/mails/jr_confirm.html | 2 +- topjava2.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 67d4696..7c7b5ce 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -8,7 +8,7 @@

      Ваше решение тестового задания проверено. Результат положительный.
      Вы зачислены на осенний набор стажировки от Javarush: - детальная + детальная информация на JavaRush инфо.

      Информация по проекту от преподавателя Кислина Григория:

      diff --git a/topjava2.md b/topjava2.md index 484a95f..a58f0a8 100644 --- a/topjava2.md +++ b/topjava2.md @@ -5,6 +5,10 @@ - spring-projects/spring-boot - Building REST services with Spring +- https://springframework.guru/spring-boot-web-application-part-1-spring-initializr/ +- https://springframework.guru/spring-boot-web-application-part-2-using-thymeleaf/ +- https://springframework.guru/using-logback-spring-boot/ + spring-boot-starter-actuator: https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html 2. Profiles. From 06a4bfe96b6499aaacbba716b4058cc27cf28c4c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 4 Aug 2016 16:39:07 +0300 Subject: [PATCH 233/936] Update lesson10 --- resources/mails/topjava/lesson/lesson10.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson10.html b/resources/mails/topjava/lesson/lesson10.html index 34e54ff..1c56374 100644 --- a/resources/mails/topjava/lesson/lesson10.html +++ b/resources/mails/topjava/lesson/lesson10.html @@ -9,14 +9,14 @@

      Выложил десятое занятие нашего проекта.
      -На заключительное занятие остается HW10, выбор локали и деплой в heroku. +На заключительное занятие остается разбор HW10, рефакторинг и деплой в heroku.

      Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. Обсуждение урока и HW10 в Slack #lesson10

      - Домашнее задание (у кого есть проверка) желательно присылать до вечера 11.05 (меня не будет с 07.05 по 10.05)
      + Домашнее задание (у кого есть проверка) желательно присылать до вечера 09.08

      From 08ec673dd0fb17325312012b25cd888d7adb66b2 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 9 Aug 2016 15:55:26 +0300 Subject: [PATCH 234/936] Add habr --- resources/habr/fistJob.html | 126 +++++++++++++++++++++++++++++++++++ resources/habr/jsonView.html | 124 ++++++++++++++++++++++++++++++++++ 2 files changed, 250 insertions(+) create mode 100644 resources/habr/fistJob.html create mode 100644 resources/habr/jsonView.html diff --git a/resources/habr/fistJob.html b/resources/habr/fistJob.html new file mode 100644 index 0000000..bd9d51e --- /dev/null +++ b/resources/habr/fistJob.html @@ -0,0 +1,126 @@ + + + Из Java юниоров в разработчики: получаем первую работу. + +Здравствуйте!
      +Коротко о себе: Кислин Григорий, программирую с 1989г., с 2005 года в Java, с 2013 года работаю Java тренером (до +февраля этого года совмещал с +основной работой Java разработчиком). +Достаточно много моих выпускников получили первую работу, и я хочу поделится здесь опытом их трудоустройства. +

      От изучения Java до работы Java разработчиком - большое расстояние

      +Требования к кандидатам на эту вакансию достаточно высоки. +Типичное резюме начинающего разработчика выглядит так: +
      + Ищу позицию Java юниора в большой, стабильной компании, чтобы через 3 года стать специалистом...
      + Хорошо обучаем...
      + Оптыт работы: отсутствует
      + Прошел курсы... +
      +Если в вакансии указано, что набирают юниоров на обучение, то резюме соответствует позиции, но, к сожалению, +
        +
      • таких позиций единицы
      • +
      • по статистике на Украине (в Росии не нашел) количество присланных резюме на такую позицию + превашает 20 +
      • + . +
      +Причем, в основном позиции юниоров крупные компании закрывают своими стажерами. +Один из вариантов пойти на стажировку, но +
        +
      • здесь также большой конкурс
      • +
      • иногда условия обучения достаточно тяжелые и подойдут не всем: +
        + ... +
        + +
      • +
      • далеко не все, даже успешно окнончившие стажировку, получают работу
      • +
      +Для вакансий не-юниор разработчика (которых уже достаточно много) получается замкнутый круг: без опыта не получить +работы, а без работы не получить опыта. +На вопрос "кто виноват?" ответ очевиден - компании, которые не хотят вкладывать время и деньги в обучение, +а хотят получить уже готового специалиста. Остается главный вопрос: +

      Что делать?

      +Шаги всем, кто уже пытался трудоустроится, знакомы: +
        +
      • Хорошее резюме
      • +
      • Приглашения на собеседования и тренировка их прохождения
      • +
      • Получение оффера
      • +
      +Хорошее резюме означает, что его замечает HR и отправляет Вам приглашение на собеседование. +В интернете есть большое количество рекомендаций, как этого добиться: +
        +
      • +
      • +
      • +
      • +
      • +
      • +
      +Но, на мой взгляд, главное (см. видео Якова Фейна): + +

      Позиционируйте себя НЕ как юниора.

      +Для этого необходимо: +
        +
      • Хорошее понимание основ: как устроена память, что такое JMM, опыт работы с сервлетами, SQL
      • +
      • Уровень выше Java Core: основы Maven, Spring, JPA(Hibernate), REST. Также желательно основы + JavaScript и HTML/CSS +
      • +
      • Участие в средних размеров проекте на этом стеке. Это может быть собственный пэт-проект библиотеки, домашней + бухгалтерии или кормления кота. Хорошо, если в нем будет реальная потребность- тогда при его использовании Вы + постепенно будете приходить к оптимальным решениям. +
      • +
      +Материалов по Java технологиям в интернете море. Выбрать то, что Вам подходит, и освоить требует достаточно много сил и +времени. +Что касается их правильного применения в одном проекте - вопрос еще более сложный. Если хотите освоить все +самостоятельно, лучше всего подойдет изучение кода +референсной имплементации технологий Spring: Pet clinic. Хотя для того, чтобы с ним разобраться, нужен +определенный уровень. +Еще сложнее понять, почему сделано так, а не по другому. Если знаний/времени недостаточно, лучше пройти курсы Java +Enterprise, обязательно с написанием проекта на основе пройденных технологий на выходе. +Мои критерии тренинга: +
        +
      • Ведет преподаватель с опытом в Java разработке, лучше как синьор или архитектор
      • +
      • Максимальный охват: самые важные и необходимые Java разработчику темы, API, фреймворки, инструменты в одном + курсе. +
      • +
      • В течении тренинга разрабатывается законченный Enterprise проект. Темы идут не по отдельности (в воздухе) на + отстраненных примерах, а последовательно, в связке, как + дополнения к созданию единого работающего приложения. +
      • +
      • Последовательное возрастание сложности: от нуля до деплоя готового приложения в облако
      • +
      • Практика! Участники на протяжении всего курса должны работать с кодом проекта. Объязательны домашние задания. + Если дают только теорию (всего понемногу), то это, на мой взгляд, выброшенные деньги и время. Без практики любое + обучение (Java, английский, езда на велосипеде) ничего не стоит. +
      • +
      • Поддержка группы и преподавателя: возможность задать любой вопрос и получить на него квалифицированный ответ. +
      • +
      • Доступность и структурированность материалов
      • +
      • Оптимальное время для проработки пройденных тем и выполнения домашнего задания (должно хватать)
      • +
      • Ревью Вашего кода.
      • +
      • Помощь в составлении резюме и с трудоустройством. Если вам гарантируют по окончанию 100% трудоустройство- не + верьте. Чтобы трудоустроиться нужно гореть
      • +
      +После того, как у Вас будет опыт в Java Enterprise и готовый проект, +

      Сделайте новое резюме:

      +
        +
      • уберите слова "юниор" и "готов к обучению"
      • +
      • в квалификацию вставьте все изученные вами технологии
      • +
      • в опыте работы напишете об участие в Вашем проекте с его кратким описанием
      • +
      +Например:
      +

      Опыт работы

      +Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей +на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API: +
        +
      • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA
      • +
      • реализация и тестирование REST и AJAX контроллеров
      • +
      • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
      • +
      +Тогда HR выделит Ваше резюме, и Вы пройдете на следующий уровень: +"Приглашения на собеседования и тренировка их прохождения", что требует отдельной статьи:) +

      + Спасибо за внимание и желаю отличной IT карьеры. +

      + \ No newline at end of file diff --git a/resources/habr/jsonView.html b/resources/habr/jsonView.html new file mode 100644 index 0000000..79e7797 --- /dev/null +++ b/resources/habr/jsonView.html @@ -0,0 +1,124 @@ + + + Spring/Jackson + @JsonView: фильтруем JSON. + +Здравствуйте!
      +Недавно в проекте Spring столкнулся с задачей катомизации сериализации объекта User в JSON в зависимости от контроллера. +Для REST API контроллера нужно было возвращать хешированный пароль (поле user.password), а для контроллера отображения на UI- нет. +Можно решить задачу в "лоб", сделав нестолько TO (Data Transfer + Object), но в Spring 4.2+/Jackson 2.6 появилась возможность использовать +Jackson’s + Serialization Views. +Однако с статье есть подвох и для невнимательных читателей вьюхи работают не так, как он ожидает. +В результате мне пришлось немного покапаться в реализации Jackson чтобы понять, как все это работает. Коротко об этом "under cut". + +

      MapperFeature.DEFAULT_VIEW_INCLUSION

      + +В статье есть небольшое упоминание "In Spring MVC default configuration, MapperFeature.DEFAULT_VIEW_INCLUSION is set to false." +Это означает что по умолчанию поля, непомеченные аннотацией @JsonView исключаются. +Но если посмотреть в код MapperFeature то увидим: + +
      +    ...
      +    * Default value is enabled, meaning that non-annotated
      +    * properties are included in all views if there is no
      +    * {@link com.fasterxml.jackson.annotation.JsonView} annotation.
      +    *
      +    * Feature is enabled by default.
      +    */
      +    DEFAULT_VIEW_INCLUSION(true),
      +
      +
      +Т.е все с точностью до наоборот- все что непомечено включается. И если пометить только нужные для UI поля User: + +
      +public class User
      +    ...
      +
      +    @JsonView(View.UI.class)
      +    protected String email;
      +
      +    @JsonView(View.UI.class)
      +    protected boolean enabled = true;
      +
      +    protected String password;
      +
      +
      +и вызвать метод контроллера + +
      +@JsonView(View.UI.class)
      +@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
      +public User get(@PathVariable("id") int id) {
      +   return ...;
      +}
      +
      +
      +то в результат войдут как помеченные поля User (email, enabled, ..), так и все остальные (password). + +

      FilteredBeanPropertyWriter

      +Т.к. хочется исключить из контроллера UI только одно поле password, логично будет пометить только его. +Смотрим в код: если запрос контроллера и поля его результата аннотированы @JsonView, Jackson сериализует через +FilteredBeanPropertyWriter.serializeAsField. Для jackson-databind-2.8.0: + +
      +    final Class activeView = prov.getActiveView();
      +    if (activeView != null) {
      +        int i = 0, len = _views.length;
      +        for (; i < len; ++i) {
      +           if (_views[i].isAssignableFrom(activeView)) break;
      +        }
      +        // not included, bail out:
      +        if (i == len) {
      +            _delegate.serializeAsOmittedField(bean, jgen, prov);
      +            return;
      +        }
      +    }
      +    _delegate.serializeAsField(bean, jgen, prov);
      +
      +
      +Те. если view, которым помечено поле объекта совпадает или является суперклассом от view метода контроллера, +поле сериализуется. Иначе оно пропускается (serializeAsOmittedField). +

      Решение

      +В итоге: +
        +
      • создаем по одному View для каждого контекста сериализации
      • + +
        +public class View {
        +    public static class REST {}
        +    public static class UI {}
        +}
        +
        +
        +
      • помечаем в User исключаемые в UI поля тем View, в котором они должны присутствовать (REST)
      • + +
        +public class User
        +    ...
        +
        +    protected String email;
        +
        +    protected boolean enabled = true;
        +
        +    @JsonView(View.REST.class)
        +    protected String password;
        +
        +
        +
      • аннотируем метод контроллера UI соответствующим контекстом
      • + +
        +@JsonView(View.UI.class)
        +@RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
        +public User get(@PathVariable("id") int id) {
        +   return ...;
        +}
        +
        +
        + Теперь поле password в результат не попадет. В контроллере REST можно обойтись без @JsonView, тк. туда включаются + все поля User.
        + Спасибо за внимание! +

        + Надеюсь @JsonView сделают Ваши Spring приложения более красивыми и компактными. +

        +
      \ No newline at end of file From 754045a18476544735847de0b3a0d99940744595 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 9 Aug 2016 20:56:12 +0300 Subject: [PATCH 235/936] Add repeat --- db_migration/2016-08-09.sql | 1 + resources/mails/topjava_repeat.html | 23 +++++++-------- resources/view/already_registered.html | 28 +++++++++++++++++++ resources/view/userList.html | 2 +- .../ru/javaops/repository/UserRepository.java | 3 ++ .../java/ru/javaops/service/GroupService.java | 11 ++++---- .../java/ru/javaops/service/UserService.java | 2 ++ .../ru/javaops/service/UserServiceImpl.java | 4 +++ .../javaops/web/SubscriptionController.java | 20 +++++++++++-- 9 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 db_migration/2016-08-09.sql create mode 100644 resources/view/already_registered.html diff --git a/db_migration/2016-08-09.sql b/db_migration/2016-08-09.sql new file mode 100644 index 0000000..05f1bb7 --- /dev/null +++ b/db_migration/2016-08-09.sql @@ -0,0 +1 @@ +ALTER TABLE MAIL_CASEALTER COLUMN RESULT TEXT; \ No newline at end of file diff --git a/resources/mails/topjava_repeat.html b/resources/mails/topjava_repeat.html index 7ffa45c..62f0204 100644 --- a/resources/mails/topjava_repeat.html +++ b/resources/mails/topjava_repeat.html @@ -14,30 +14,27 @@

      Google Drive

      Проект эволюционирует, поэтому патчи текущего выпуска будут отличаться. Видео возможно также будут редактироваться / дополнятся. Все актуальные материалы нашего выпуска будут находится в папке Topjava7. + href="https://drive.google.com/open?id=0B9Ye2auQ_NsFYXdrbnlVRy11Vkk">папке Topjava8.

      Slack

      -Проверь почту- должно прийти приглашение в группу Slack topjava7 +Проверь почту- должно прийти приглашение в группу Slack topjava8
        Темы каналов: -
      • #entrance_lesson: вопросы по вступительному +
      • #entrance_lesson: вопросы по вступительному заданию
      • -
      • #flooding: оффтопик
      • -
      • #general: общие вопросы
      • -
      • #git: вопросы по git
      • -
      • #idea: вопросы по idea
      • -
      • #interview_job: вопросы прохождения интервью, +
      • #flooding: оффтопик
      • +
      • #general: общие вопросы
      • +
      • #git: вопросы по git
      • +
      • #idea: вопросы по idea
      • +
      • #interview_job: вопросы прохождения интервью, работа, вакансии
      Форматирование сообщениq в slack
      Desktop/ Mobile приложение Slack -

      Наш проект topjava07 в гитхаб, расписание занятий

      -Рассылка первого занятия будет в четверг, 02.06.
      -Если у тебя есть проверка ДЗ, то решение вступительного желательно присылать до вечера 31.05.
      -Повторное участие без проверки домашнего задания бесплатное, с проверкой доплата 7500 руб.
      -(варианты оплаты, курс рубля). +

      Наш проект topjava08 в гитхаб, расписание занятий

      +Рассылка первого занятия будет в четверг, 08.09.
      • Ресурсы для подготовки
      • Wiki по проекту
      • diff --git a/resources/view/already_registered.html b/resources/view/already_registered.html new file mode 100644 index 0000000..3790d11 --- /dev/null +++ b/resources/view/already_registered.html @@ -0,0 +1,28 @@ + + + + + + Java Online Projects + + + + + + +
        +
        +

        Вы уже зарегистрированы на новом проекте!

        + Поищите в почте: при первой регистрации должно было прийти приглашение в группу Slack. +
        +
        + + diff --git a/resources/view/userList.html b/resources/view/userList.html index 9a96692..f7659e2 100644 --- a/resources/view/userList.html +++ b/resources/view/userList.html @@ -16,7 +16,7 @@ - Редактировать мои данные +
        diff --git a/src/main/java/ru/javaops/repository/UserRepository.java b/src/main/java/ru/javaops/repository/UserRepository.java index 961d962..a58ab8a 100644 --- a/src/main/java/ru/javaops/repository/UserRepository.java +++ b/src/main/java/ru/javaops/repository/UserRepository.java @@ -29,6 +29,9 @@ public interface UserRepository extends JpaRepository { " WHERE ug.registerType=:registerType AND ug.group.name=:groupName AND ug.user.active=TRUE") Set findByGroupNameAndRegisterType(@Param("groupName") String groupName, @Param("registerType") RegisterType registerType); + @Query("SELECT ug.user FROM UserGroup ug WHERE ug.user.email=:email AND ug.group.project.id=:projectId") + User findByEmailAndProjectId(@Param("email") String email, @Param("projectId") int projectId); + @Query("SELECT ug.user FROM UserGroup ug WHERE ug.user.email=:email AND ug.group.id=:groupId") User findByEmailAndGroupId(@Param("email") String email, @Param("groupId") int groupId); diff --git a/src/main/java/ru/javaops/service/GroupService.java b/src/main/java/ru/javaops/service/GroupService.java index 4d9e5b2..6afb0ff 100644 --- a/src/main/java/ru/javaops/service/GroupService.java +++ b/src/main/java/ru/javaops/service/GroupService.java @@ -94,8 +94,11 @@ public UserGroup registerAtProject(UserTo userTo, ProjectProps projectProps, Str } userService.save(user); Group group = (registerType == RegisterType.REPEAT) ? projectProps.currentGroup : projectProps.registeredGroup; - UserGroup userGroup = new UserGroup(user, group, registerType, channel); - return userGroupRepository.save(userGroup); + return save(user, group, registerType, channel); + } + + public UserGroup save(User user, Group group, RegisterType registerType, String channel) { + return userGroupRepository.save(new UserGroup(user, group, registerType, channel)); } public UserGroup registerAtGroup(UserTo userTo, String groupName, String channel) { @@ -115,9 +118,7 @@ public UserGroup registerAtGroup(UserTo userTo, String groupName, String channel } registerType = RegisterType.REGISTERED; } - UserGroup userGroup = new UserGroup(user, group, registerType, channel); - userGroupRepository.save(userGroup); - return userGroup; + return save(user, group, registerType, channel); } public UserGroup moveOrCreate(User u, Group sourceGroup, Group targetGroup) { diff --git a/src/main/java/ru/javaops/service/UserService.java b/src/main/java/ru/javaops/service/UserService.java index a12fcdb..5edf272 100644 --- a/src/main/java/ru/javaops/service/UserService.java +++ b/src/main/java/ru/javaops/service/UserService.java @@ -28,6 +28,8 @@ public interface UserService { User findByEmailAndGroupId(String email, int groupId); + User findByEmailAndProjectId(String email, int projectId); + void save(User u); void update(UserToExt userTo); diff --git a/src/main/java/ru/javaops/service/UserServiceImpl.java b/src/main/java/ru/javaops/service/UserServiceImpl.java index 4af7a44..757b469 100644 --- a/src/main/java/ru/javaops/service/UserServiceImpl.java +++ b/src/main/java/ru/javaops/service/UserServiceImpl.java @@ -90,6 +90,10 @@ public User findByEmailAndGroupId(String email, int groupId) { return userRepository.findByEmailAndGroupId(email.toLowerCase(), groupId); } + public User findByEmailAndProjectId(String email, int projectId) { + return userRepository.findByEmailAndProjectId(email.toLowerCase(), projectId); + } + @Override @Transactional public void update(UserToExt userTo) { diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index 49e47c0..ff5c182 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -68,7 +68,7 @@ public ModelAndView registerInGroup(@RequestParam("group") String group, @RequestParam(value = "callback", required = false) String callback, @RequestParam("channel") String channel, @RequestParam("template") String template, - @Valid UserTo userTo, BindingResult result) throws MessagingException { + @Valid UserTo userTo, BindingResult result) { if (result.hasErrors()) { throw new ValidationException(Util.getErrorMessage(result)); } @@ -91,7 +91,7 @@ public ModelAndView registerInGroup(@RequestParam("group") String group, @RequestMapping(value = "/register", method = RequestMethod.POST) public ModelAndView registerByProject(@RequestParam("project") String project, @RequestParam("channel") String channel, - @Valid UserTo userTo, BindingResult result) throws MessagingException { + @Valid UserTo userTo, BindingResult result) { if (result.hasErrors()) { throw new ValidationException(Util.getErrorMessage(result)); } @@ -107,10 +107,24 @@ public ModelAndView registerByProject(@RequestParam("project") String project, return getRedirectView(mailResult, "http://javawebinar.ru/confirm.html", "http://javawebinar.ru/error.html"); } - private ModelAndView getRedirectView(String mailResult, String successUrl, String failUrl) throws MessagingException { + private ModelAndView getRedirectView(String mailResult, String successUrl, String failUrl) { return new ModelAndView("redirectToUrl", "redirectUrl", MailService.isOk(mailResult) ? successUrl : failUrl); } + @RequestMapping(value = "/repeat", method = RequestMethod.GET) + public ModelAndView repeat(@RequestParam("email") String email, @RequestParam("project") String projectName) throws MessagingException { + ProjectProps projectProps = groupService.getProjectProps(projectName); + User user = userService.findByEmailAndProjectId(email, projectProps.project.getId()); + checkNotNull(user, "Пользователь %s не найден в проекте %s", email, projectName); + if (userService.findByEmailAndGroupId(email, projectProps.currentGroup.getId()) != null) { + return new ModelAndView("already_registered"); + } + mailService.sendToUser(projectName + "_repeat", user); + IntegrationService.SlackResponse response = integrationService.sendSlackInvitation(email, projectName); + groupService.save(user, projectProps.currentGroup, RegisterType.REPEAT, "mail"); + return new ModelAndView("registration_" + projectName, ImmutableMap.of("response", response)); + } + @RequestMapping(value = "/participate", method = RequestMethod.GET) public ModelAndView participate(@RequestParam("email") String email, @RequestParam("key") String key, @RequestParam("project") String projectName) { User u; From 8731e7cd0552f93b73a7e7d6f9cf0d953553d639 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 11 Aug 2016 18:24:36 +0300 Subject: [PATCH 236/936] Add lesson11 --- db_migration/2016-08-09.sql | 2 +- resources/mails/topjava/lesson/lesson11.html | 83 +++++++++++++++++++ .../mails/topjava/lesson/topjava_final.html | 55 ------------ resources/view/registration_javaops.html | 1 + 4 files changed, 85 insertions(+), 56 deletions(-) create mode 100644 resources/mails/topjava/lesson/lesson11.html delete mode 100644 resources/mails/topjava/lesson/topjava_final.html diff --git a/db_migration/2016-08-09.sql b/db_migration/2016-08-09.sql index 05f1bb7..02a15f4 100644 --- a/db_migration/2016-08-09.sql +++ b/db_migration/2016-08-09.sql @@ -1 +1 @@ -ALTER TABLE MAIL_CASEALTER COLUMN RESULT TEXT; \ No newline at end of file +ALTER TABLE MAIL_CASE ALTER COLUMN RESULT TEXT; \ No newline at end of file diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html new file mode 100644 index 0000000..4f4f6ad --- /dev/null +++ b/resources/mails/topjava/lesson/lesson11.html @@ -0,0 +1,83 @@ + + + + + + Окончание проекта 'Java Enterprise (TopJava)' + +

        + Здравствуй firstName!
        +

        +Выложил заключительное занятие + нашего проекта. +
          +
        • + Если ты решил сделать доработку проекта, отдай мне свой код на ревью. Я включу ссылку на твой репозиторий в + список сделанных доработок для доступа к ним всех участников Topjava.

          +
        • +
        • Выпускной + проект от участников с проверкой ДЗ желательно сдать на ревью до 01.09 + (напомню, что лишние профили в коде и в pom.xml нужно удалить).

          +
        • +
        • Повторное участие в проекте без проверки домашних заданий бесплатное.
          + Зарегиструйся и тебе + придет ссылка на группу Slack topjava8 (там уже есть новые участники с JavaRush). + Здесь есть расписание topjava08. Приглашай знакомых, желающих стать java разработчиками или + повысить свою квалификацию. Со ссылкой на тебя даю скидку 5%.

          +
        • +
        • Группа Slack topjava7 к 01.09 будет удалена. Приглашаю в Slack Java Online Projects (кто еще не + вступил), где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, + вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) + По каждой теме сделан свой канал. Проверь свои контактные + данные. + Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут + увидеть твой город и skype в списке, а ты сможешь найти там разработчиков из своего города. + После сохранения формы на почту должно прийти приглашение в группу Slack и откроется ссылка на список + участников, отсортированный по городам.

          +
        • +
        • + ">Все материалы проекта останутся вам доступны (в течении topjava08 они будут постепенно переезжать в подпапку topjava08). Репозиторий + topjava07 до 01.09 будет заархивирован и положен в Google Drive вместе с уроками в формате markdown. + Для просмотра в Chrome файлов md я пользуюсь плагином + Markdown Preview (нужно в его параметрах разрешить открывать файл по ссылкам) или можно использовать плагин + IDEA Markdown support.

          +
        • +
        • + В конце августа-начале сентября я планирую запустить курс Многопоточность. Веб сервисы.
          + Посмотрите бесплатное первое + занятие: многопоточность, + это важная для разработчика тема, ее часто спрашивают на собеседованиях.

          + Предварительная стоимость участия: +
            +
          • без проверок домашних заданий: 8600 руб.
          • +
          • с проверками заданий: 16500 руб.
          • +
          • стоимость для участников Topjava: 7900 руб. и 15000 руб.
          • +
          • бесплатное повторное участие в формате рассылки материалов
          • +
          +
          Дата старта и программа проекта будут уточняться и рассылаться всем зарегистрированным участникам.

          + У вас также будут скидки на другие проекты (планируется topjava2 на Spring-Boot).
          + О всех новостях буду делать рассылку и публиковать в группе VK практика Java (Web/ Enterprise).

          +
        • +
        • + Наконец, если вы рассматриваете предложения о работе, занесите свои данные и ссылку на резюме в форму соискателя + Я ее рассылаю всем знакомым HR.
          + А после прохождения испытательного срока не забудте поделиться своей историей успеха. +

          +
        • +
        • + Можно еще участвовать в разработке сайта Java Online Projects (репозиторий в GitHub, канал в Slack), но тут пока почти никакой от меня поддержки, кроме выставления заданий. + Есть еще мысли сделать что то вроде фрилансовой конторы, но это планы после курса topjava2. +
        • +
        +

        Большая просьба ответить на 6 вопросов по проекту.
        +Важно: если проект понравился, напиши пожалуйста в VK отзыв о + проекте.

        +

        + Спасибо за участие и, надеюсь, до новой встречи! +

        +

        +

        + \ No newline at end of file diff --git a/resources/mails/topjava/lesson/topjava_final.html b/resources/mails/topjava/lesson/topjava_final.html deleted file mode 100644 index 353defc..0000000 --- a/resources/mails/topjava/lesson/topjava_final.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - Окончание проекта 'Java Enterprise (TopJava)' - -

        - Здравствуй firstName!
        -

        -

        Несколько комментариев к заключительному занятию - проекта:

        -
          -
        • Я сделал код для деплоя в Heroku в ветке мастер, из за чего некоторые тесты не проходять.
          - Добавил в ДЗ: найти этот код и проверить что без него все работает. -
        • -
        • - На heroku приложение не отрабатывает ExceptionInfoHandler по аннотации - @RestController (нотификация ошибок).
          У меня предположение, что это связано с обновлением java на heroku, - появилось еще с прошлого проекта. Как воркараунд сделал ветку heroku, в которой - откатил обработку ошибок к варианту урока 10 с дефолтными методами интерфейса.
          При такой реализации все работает, обновил - демо из этой ветки (необходим Ctrl+F5 для сброса кэша). -
        • -
        -

        Шли мне на ревью свое резюме.
        - Выпускные задания от участников с проверкой принимаю на ревью до 02.06 - (если проверки нет то возможно оплатить отдельно). -

        -

        Ссылки проекта:

        - -

        - Ваша скидка на другие проекты будет 700 руб. без проверки домашнего задания и 1500 руб. с проверкой.
        - О всех новостях буду делать рассылку и публиковать в группах vk и skype.

        - Если материал был для тебя сложный, возможно повторное участие на topjava07: без проверки ДЗ бесплатно, с проверкой доплата 7500 руб. - (варианты оплаты, курс рубля).
        - - Github topjava7 и расписание занятий. - Для регистрации на проект достаточно получить ссылку на вступительное занятие, должно прийти - письмо "Повторное участие" и приглашение в группу slack topjava7. Старт topjava07 будет 26.05, приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию. -

        -

        Добавляйся в группу VK: практика Java (Web/ Enterprise), -публикую там самое, на мой взгляд, интересное из мира IT и Java.

        -

        Важно: если проект понравился, напишите пожалуйста в VK отзыв о проекте.

        -

        - Спасибо за участие и, надеюсь, до новой встречи! -

        -

        -

        - \ No newline at end of file diff --git a/resources/view/registration_javaops.html b/resources/view/registration_javaops.html index afe704c..840b9f5 100644 --- a/resources/view/registration_javaops.html +++ b/resources/view/registration_javaops.html @@ -25,6 +25,7 @@

        Спасибо за регистрацию!

        На почту должно прийти приглашение в группу Slack.

        +

        Список участников, отсортированный по городам

        From aa968f699927a6ba26d68c348db48163a0132fb2 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 11 Aug 2016 19:06:17 +0300 Subject: [PATCH 237/936] Update lesson11 --- resources/mails/topjava/lesson/lesson08.html | 2 +- resources/mails/topjava/lesson/lesson09.html | 2 +- resources/mails/topjava/lesson/lesson10.html | 2 +- resources/mails/topjava/lesson/lesson11.html | 30 +++++++++++--------- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index fcc2248..4e39d60 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -13,7 +13,7 @@

        Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и HW8 в Slack #lesson08 + Обсуждение урока и ДЗ в Slack #lesson08

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 26.07
        diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index 7d8aef1..01a5a78 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -13,7 +13,7 @@

        Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и HW9 в Slack #lesson09 + Обсуждение урока и ДЗ в Slack #lesson09

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 02.08
        diff --git a/resources/mails/topjava/lesson/lesson10.html b/resources/mails/topjava/lesson/lesson10.html index 1c56374..9d75d02 100644 --- a/resources/mails/topjava/lesson/lesson10.html +++ b/resources/mails/topjava/lesson/lesson10.html @@ -13,7 +13,7 @@

        Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и HW10 в Slack #lesson10 + Обсуждение урока и ДЗ в Slack #lesson10

        Домашнее задание (у кого есть проверка) желательно присылать до вечера 09.08
        diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index 4f4f6ad..c840b54 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -9,7 +9,10 @@ Здравствуй firstName!

        Выложил заключительное занятие - нашего проекта. + нашего проекта.
        +Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        +Обсуждение урока и HW10 в Slack #lesson11
        +Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта.
        • Если ты решил сделать доработку проекта, отдай мне свой код на ревью. Я включу ссылку на твой репозиторий в @@ -20,9 +23,9 @@ (напомню, что лишние профили в коде и в pom.xml нужно удалить).

        • Повторное участие в проекте без проверки домашних заданий бесплатное.
          - Зарегиструйся и тебе + Зарегиструйся и тебе придет ссылка на группу Slack topjava8 (там уже есть новые участники с JavaRush). - Здесь есть расписание topjava08. Приглашай знакомых, желающих стать java разработчиками или + Здесь есть расписание topjava08. Приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию. Со ссылкой на тебя даю скидку 5%.

        • Группа Slack topjava7 к 01.09 будет удалена. Приглашаю в Slack Java Online Projects (кто еще не @@ -37,7 +40,7 @@ участников, отсортированный по городам.

        • - ">Все материалы проекта останутся вам доступны (в течении topjava08 они будут постепенно переезжать в подпапку topjava08). Репозиторий + Все материалы проекта останутся вам доступны (в течении нового курса они будут постепенно переезжать в подпапку Topjava8). Репозиторий topjava07 до 01.09 будет заархивирован и положен в Google Drive вместе с уроками в формате markdown. Для просмотра в Chrome файлов md я пользуюсь плагином @@ -45,16 +48,16 @@ IDEA Markdown support.

        • - В конце августа-начале сентября я планирую запустить курс Многопоточность. Веб сервисы.
          - Посмотрите бесплатное первое + В конце августа-начале сентября я планирую запустить курс Многопоточность. Веб сервисы.
          + Посмотри бесплатное первое занятие: многопоточность, это важная для разработчика тема, ее часто спрашивают на собеседованиях.

          Предварительная стоимость участия:
          • без проверок домашних заданий: 8600 руб.
          • с проверками заданий: 16500 руб.
          • -
          • стоимость для участников Topjava: 7900 руб. и 15000 руб.
          • +
          • стоимость для участников Topjava: 7900 руб. и 15000 руб. (курс рубля к USD)
          • бесплатное повторное участие в формате рассылки материалов

          Дата старта и программа проекта будут уточняться и рассылаться всем зарегистрированным участникам.

          @@ -62,9 +65,8 @@ О всех новостях буду делать рассылку и публиковать в группе VK практика Java (Web/ Enterprise).

        • - Наконец, если вы рассматриваете предложения о работе, занесите свои данные и ссылку на резюме в форму соискателя - Я ее рассылаю всем знакомым HR.
          - А после прохождения испытательного срока не забудте поделиться своей историей успеха. + Наконец, если вы рассматриваете предложения о работе, занесите свои данные и ссылку на резюме в форму соискателя. + Я ее рассылаю всем знакомым HR. А после прохождения испытательного срока не забудте поделиться своей историей успеха.

        • @@ -75,9 +77,9 @@

          Большая просьба ответить на 6 вопросов по проекту.
          Важно: если проект понравился, напиши пожалуйста в VK отзыв о проекте.

          -

          - Спасибо за участие и, надеюсь, до новой встречи! -

          +

          + Спасибо за участие в Topjava и, надеюсь, до новой встречи! +

          \ No newline at end of file From 3e48d29aeba0ea3db109628249ea7b3000e0fae5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 11 Aug 2016 19:43:21 +0300 Subject: [PATCH 238/936] Fix link to users in registration form Update lesson11 --- resources/mails/topjava/lesson/lesson11.html | 8 ++++---- resources/view/registration_javaops.html | 2 +- src/main/java/ru/javaops/service/UserService.java | 2 +- .../java/ru/javaops/service/UserServiceImpl.java | 3 ++- .../java/ru/javaops/web/SubscriptionController.java | 12 ++++++++---- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index c840b54..313edbc 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -61,17 +61,17 @@
        • бесплатное повторное участие в формате рассылки материалов

        Дата старта и программа проекта будут уточняться и рассылаться всем зарегистрированным участникам.

        - У вас также будут скидки на другие проекты (планируется topjava2 на Spring-Boot).
        + Также у участников Topjava будут скидки на другие проекты (осенью планируется topjava2 на Spring-Boot).
        О всех новостях буду делать рассылку и публиковать в группе VK практика Java (Web/ Enterprise).

      • - Наконец, если вы рассматриваете предложения о работе, занесите свои данные и ссылку на резюме в форму соискателя. - Я ее рассылаю всем знакомым HR. А после прохождения испытательного срока не забудте поделиться своей историей успеха. + Наконец, если ты рассматриваешь предложения о работе, занеси свои данные и ссылку на резюме в форму соискателя. + Я ее рассылаю всем знакомым HR. А после прохождения испытательного срока не забудь поделиться своей историей успеха!

      • Можно еще участвовать в разработке сайта Java Online Projects (репозиторий в GitHub, канал в Slack), но тут пока почти никакой от меня поддержки, кроме выставления заданий. - Есть еще мысли сделать что то вроде фрилансовой конторы, но это планы после курса topjava2. + Есть еще мысли сделать что-то вроде фрилансовой конторы, но это планы после курса topjava2.

      Большая просьба ответить на 6 вопросов по проекту.
      diff --git a/resources/view/registration_javaops.html b/resources/view/registration_javaops.html index 840b9f5..4c97e67 100644 --- a/resources/view/registration_javaops.html +++ b/resources/view/registration_javaops.html @@ -25,7 +25,7 @@

      Спасибо за регистрацию!

      На почту должно прийти приглашение в группу Slack.

      -

      Список участников, отсортированный по городам

      +

      Список участников, отсортированный по городам

      diff --git a/src/main/java/ru/javaops/service/UserService.java b/src/main/java/ru/javaops/service/UserService.java index 5edf272..f10b4c9 100644 --- a/src/main/java/ru/javaops/service/UserService.java +++ b/src/main/java/ru/javaops/service/UserService.java @@ -32,7 +32,7 @@ public interface UserService { void save(User u); - void update(UserToExt userTo); + User update(UserToExt userTo); Set findByLocation(String location); diff --git a/src/main/java/ru/javaops/service/UserServiceImpl.java b/src/main/java/ru/javaops/service/UserServiceImpl.java index 757b469..8a475cd 100644 --- a/src/main/java/ru/javaops/service/UserServiceImpl.java +++ b/src/main/java/ru/javaops/service/UserServiceImpl.java @@ -96,10 +96,11 @@ public User findByEmailAndProjectId(String email, int projectId) { @Override @Transactional - public void update(UserToExt userTo) { + public User update(UserToExt userTo) { User user = userRepository.findOne(userTo.getId()); UserUtil.updateFromToExt(user, userTo); userRepository.save(user); + return user; } @Override diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index ff5c182..45672d8 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -120,9 +120,14 @@ public ModelAndView repeat(@RequestParam("email") String email, @RequestParam("p return new ModelAndView("already_registered"); } mailService.sendToUser(projectName + "_repeat", user); - IntegrationService.SlackResponse response = integrationService.sendSlackInvitation(email, projectName); groupService.save(user, projectProps.currentGroup, RegisterType.REPEAT, "mail"); - return new ModelAndView("registration_" + projectName, ImmutableMap.of("response", response)); + return sendSlackInvitation(email, projectName); + } + + private ModelAndView sendSlackInvitation(String email, String projectName) { + IntegrationService.SlackResponse response = integrationService.sendSlackInvitation(email, projectName); + return new ModelAndView("registration_" + projectName, + ImmutableMap.of("response", response, "email", email, "activationKey", subscriptionService.generateActivationKey(email))); } @RequestMapping(value = "/participate", method = RequestMethod.GET) @@ -151,7 +156,6 @@ public ModelAndView save(@RequestParam("key") String key, @RequestParam("project throw new ValidationException(Util.getErrorMessage(result)); } userService.update(userToExt); - IntegrationService.SlackResponse response = integrationService.sendSlackInvitation(userToExt.getEmail(), project); - return new ModelAndView("registration_" + project, ImmutableMap.of("response", response)); + return sendSlackInvitation(userToExt.getEmail(), project); } } \ No newline at end of file From a9784cddedf4294cf2eba2cb989326cc02bfb2be Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 11 Aug 2016 19:44:54 +0300 Subject: [PATCH 239/936] Update lesson11 --- resources/mails/topjava/lesson/lesson11.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index 313edbc..9fc2155 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -74,7 +74,7 @@ Есть еще мысли сделать что-то вроде фрилансовой конторы, но это планы после курса topjava2.

    -

    Большая просьба ответить на 6 вопросов по проекту.
    +

    Большая просьба ответить на несколько вопросов по проекту.
    Важно: если проект понравился, напиши пожалуйста в VK отзыв о проекте.

    From 3b589011bdb4e0bf5852a6b3fc63e7e637e7dd4c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 16 Aug 2016 16:09:41 +0300 Subject: [PATCH 240/936] Update templates --- resources/mails/jr_confirm.html | 2 +- resources/mails/topjava/lesson/lesson11.html | 2 +- resources/mails/topjava_start.html | 85 ++++++++++++++++++++ 3 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 resources/mails/topjava_start.html diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 7c7b5ce..3b64ddb 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -36,7 +36,7 @@

    Заполнение регистрационной формы

    работа, вакансии -Форматирование сообщениq в +Форматирование сообщений в slack
    Desktop/ Mobile приложение Slack

    IDE: JetBrains IDEA

    diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index 9fc2155..fda45ff 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -23,7 +23,7 @@ (напомню, что лишние профили в коде и в pom.xml нужно удалить).

  • Повторное участие в проекте без проверки домашних заданий бесплатное.
    - Зарегиструйся и тебе + Зарегистрируйся и тебе придет ссылка на группу Slack topjava8 (там уже есть новые участники с JavaRush). Здесь есть расписание topjava08. Приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию. Со ссылкой на тебя даю скидку 5%.

    diff --git a/resources/mails/topjava_start.html b/resources/mails/topjava_start.html new file mode 100644 index 0000000..087a7ef --- /dev/null +++ b/resources/mails/topjava_start.html @@ -0,0 +1,85 @@ + + + + Участие в проекте 'Java Enterprise (TopJava)' + +

    + Здравствуй firstName!
    +

    +

    Поздравляю тебя с участием в проекте Java Enterprise (Topjava)!

    +Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю +(четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние +задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с +пройденной на занятии. +

    Заполнение регистрационной формы

    +Общение на проекте будет вестись в Slack. Заполни пожалуйста все поля регистрационной формы, +и на почту придет приглашение в группу Slack. Для доступа к +материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. +Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. +Обсуждение вступительного занятия происходит в канале Slack #entrance_lesson.
    +
      Другие каналы Slack: +
    • #flooding: оффтопик
    • +
    • #general: общие вопросы
    • +
    • #git: вопросы по git
    • +
    • #idea: вопросы по idea
    • +
    • #interview_job: вопросы прохождения + интервью, + работа, вакансии +
    • +
    +Форматирование сообщений в slack
    +Desktop/ Mobile приложение Slack +

    IDE: JetBrains IDEA

    +IDEA считается лучшей Java IDE, и по последней + статистике +IntelliJ is the number one IDE.
    +Netbeans хорош для новичков и индусов (в Индии его 80%).
    +В СПб на IDEA по моему опыту программируют 95% разработчиков.
    +Поэтому разработка проекта ведется в JetBrains IDEA, брать + версию + Ultimate
    +Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую + учебную лицензию JetBrains IDEA на год.
    Учебную лицензию на IDEA и доступ ко всем материалам проекта +буду +рассылать 01.09. +

    Вступительное занятие

    +До старта проекта 01.09 можно приступать в выполнению вступительного + занятия. +Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй +инструкциям. Особое внимание обращаю на wiki по ведению + проекта в Git, необходимо строго следовать этим правилам. +

    Проверка домашних заданий

    +Разбор домашний заданий происходит в начале каждого занятия.
    +Если у тебя участие с проверкой ДЗ, то свое решение вступительного задания нужно присылать на проверку начиная c +02.09 до вечера 06.09, остальных домашних заданий - до вечера вторника. +

    + Проверка заданий подразумевает ревью твоего кода. Ты увидишь именно свои ошибки в стиле, структурах данных, + алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания + это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в + гитхаб и шлют мне ссылку на репозиторий. Я проверяю и фидбэк пишу в slack. Получается эффективно и + оперативно. Можно что-то переделать и снова поревьюится.
    +

    +

    Ресурсы

    +Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Рекомендую также изучить полезные ресурсы. + +

    + Удачи в освоении материалов и выполнении задания,
    + Григорий Кислин
    + skype: grigory.kislin +

    +

    + Java Online Projects +

    + + \ No newline at end of file From 63e3ffaaee00b8c2c3c873d4363b8fd4ec4a272e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 16 Aug 2016 16:26:58 +0300 Subject: [PATCH 241/936] create it-rabota template --- resources/mails/vacation/it_rabota.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 resources/mails/vacation/it_rabota.html diff --git a/resources/mails/vacation/it_rabota.html b/resources/mails/vacation/it_rabota.html new file mode 100644 index 0000000..6de4bed --- /dev/null +++ b/resources/mails/vacation/it_rabota.html @@ -0,0 +1,19 @@ + + + + + + Сотрудничество с IT Rabota + + +

    + Здравствуйте!
    +

    +

    +В рамках сотрудничества Java Online Projects и IT Rabota +ответьте пожалуйста, удалось ли Вам устроится по их программе трудоустройства. Если нет - почему?
    +Буду очень признателен за ответ, заранее спасибо. +

    +

    +

    + From 2703ebd89c93b784c2d520938df44afc7ffabe0a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 16 Aug 2016 16:28:44 +0300 Subject: [PATCH 242/936] update it-rabota template --- resources/mails/topjava/lesson/final_fix.html | 88 +++++++++++++++++++ resources/mails/vacation/it_rabota.html | 3 +- 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 resources/mails/topjava/lesson/final_fix.html diff --git a/resources/mails/topjava/lesson/final_fix.html b/resources/mails/topjava/lesson/final_fix.html new file mode 100644 index 0000000..9036cf2 --- /dev/null +++ b/resources/mails/topjava/lesson/final_fix.html @@ -0,0 +1,88 @@ + + + + + + Окончание проекта 'Java Enterprise (TopJava)' + +

    + Здравствуй firstName!
    +

    +- Что надо знать о логировании прагматичному Java‑программисту +- Как начинающему Java-разработчику подружиться со своей базой данных? + +Выложил заключительное занятие + нашего проекта.
    +Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
    +Обсуждение урока и HW10 в Slack #lesson11
    +Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта. +
      +
    • + Если ты решил сделать доработку проекта, отдай мне свой код на ревью. Я включу ссылку на твой репозиторий в + список сделанных доработок для доступа к ним всех участников Topjava.

      +
    • +
    • Выпускной + проект от участников с проверкой ДЗ желательно сдать на ревью до 01.09 + (напомню, что лишние профили в коде и в pom.xml нужно удалить).

      +
    • +
    • Повторное участие в проекте без проверки домашних заданий бесплатное.
      + Зарегистрируйся и тебе + придет ссылка на группу Slack topjava8 (там уже есть новые участники с JavaRush). + Здесь есть расписание topjava08. Приглашай знакомых, желающих стать java разработчиками или + повысить свою квалификацию. Со ссылкой на тебя даю скидку 5%.

      +
    • +
    • Группа Slack topjava7 к 01.09 будет удалена. Приглашаю в Slack Java Online Projects (кто еще не + вступил), где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, + вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) + По каждой теме сделан свой канал. Проверь свои контактные + данные. + Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут + увидеть твой город и skype в списке, а ты сможешь найти там разработчиков из своего города. + После сохранения формы на почту должно прийти приглашение в группу Slack и откроется ссылка на список + участников, отсортированный по городам.

      +
    • +
    • + Все материалы проекта останутся вам доступны (в течении нового курса они будут постепенно переезжать в подпапку Topjava8). Репозиторий + topjava07 до 01.09 будет заархивирован и положен в Google Drive вместе с уроками в формате markdown. + Для просмотра в Chrome файлов md я пользуюсь плагином + Markdown Preview (нужно в его параметрах разрешить открывать файл по ссылкам) или можно использовать плагин + IDEA Markdown support.

      +
    • +
    • + В конце августа-начале сентября я планирую запустить курс Многопоточность. Веб сервисы.
      + Посмотри бесплатное первое + занятие: многопоточность, + это важная для разработчика тема, ее часто спрашивают на собеседованиях.

      + Предварительная стоимость участия: +
        +
      • без проверок домашних заданий: 8600 руб.
      • +
      • с проверками заданий: 16500 руб.
      • +
      • стоимость для участников Topjava: 7900 руб. и 15000 руб. (курс рубля к USD)
      • +
      • бесплатное повторное участие в формате рассылки материалов
      • +
      +
      Дата старта и программа проекта будут уточняться и рассылаться всем зарегистрированным участникам.

      + Также у участников Topjava будут скидки на другие проекты (осенью планируется topjava2 на Spring-Boot).
      + О всех новостях буду делать рассылку и публиковать в группе VK практика Java (Web/ Enterprise).

      +
    • +
    • + Наконец, если ты рассматриваешь предложения о работе, занеси свои данные и ссылку на резюме в форму соискателя. + Я ее рассылаю всем знакомым HR. А после прохождения испытательного срока не забудь поделиться своей историей успеха! +

      +
    • +
    • + Можно еще участвовать в разработке сайта Java Online Projects (репозиторий в GitHub, канал в Slack), но тут пока почти никакой от меня поддержки, кроме выставления заданий. + Есть еще мысли сделать что-то вроде фрилансовой конторы, но это планы после курса topjava2. +
    • +
    +

    Большая просьба ответить на несколько вопросов по проекту.
    +Важно: если проект понравился, напиши пожалуйста в VK отзыв о + проекте.

    +

    + Спасибо за участие в Topjava и, надеюсь, до новой встречи! +

    +

    +

    + \ No newline at end of file diff --git a/resources/mails/vacation/it_rabota.html b/resources/mails/vacation/it_rabota.html index 6de4bed..3357090 100644 --- a/resources/mails/vacation/it_rabota.html +++ b/resources/mails/vacation/it_rabota.html @@ -11,9 +11,10 @@

    В рамках сотрудничества Java Online Projects и IT Rabota -ответьте пожалуйста, удалось ли Вам устроится по их программе трудоустройства. Если нет - почему?
    +ответьте пожалуйста, удалось ли Вам устроится по их программе трудоустройства? Если нет - почему?
    Буду очень признателен за ответ, заранее спасибо.

    + From 2fe6dc82b0c34a3c91980d5bf99d24d3e9f9337b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 16 Aug 2016 16:33:24 +0300 Subject: [PATCH 243/936] update it-rabota template --- resources/mails/vacation/it_rabota.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/vacation/it_rabota.html b/resources/mails/vacation/it_rabota.html index 3357090..c0cf404 100644 --- a/resources/mails/vacation/it_rabota.html +++ b/resources/mails/vacation/it_rabota.html @@ -11,7 +11,7 @@

    В рамках сотрудничества Java Online Projects и IT Rabota -ответьте пожалуйста, удалось ли Вам устроится по их программе трудоустройства? Если нет - почему?
    +ответьте пожалуйста, удалось ли Вам найти работу по их программе трудоустройства? Если нет - почему?
    Буду очень признателен за ответ, заранее спасибо.

    From c8152761025580ef7d511e2aa39800c910023876 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 17 Aug 2016 17:39:37 +0300 Subject: [PATCH 244/936] Update 11 lesson --- .../mails/topjava/lesson/lesson11_add.html | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 resources/mails/topjava/lesson/lesson11_add.html diff --git a/resources/mails/topjava/lesson/lesson11_add.html b/resources/mails/topjava/lesson/lesson11_add.html new file mode 100644 index 0000000..17d7e76 --- /dev/null +++ b/resources/mails/topjava/lesson/lesson11_add.html @@ -0,0 +1,22 @@ + + + + + + Дополнение к последнему уроку проекта 'Java Enterprise (TopJava)' + +

    + Здравствуй firstName!
    +

    +

    + Сделал несколько обновлений к 11 + уроку: фикс для Сафари, правка тестов и локализация в JavaScript. +

    + +

    +

    + \ No newline at end of file From 91f3bc6575343d87275a4f2e851eb8eeecbf8ea6 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 19 Aug 2016 00:09:32 +0300 Subject: [PATCH 245/936] Update cities --- resources/view/participation.html | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/resources/view/participation.html b/resources/view/participation.html index df3f181..22185cc 100644 --- a/resources/view/participation.html +++ b/resources/view/participation.html @@ -65,17 +65,24 @@

    Регист + - - - - + + + + - + - + + + + + + + From 84a78890257bbb2a0c4b1528c8558e9e770577dd Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 25 Aug 2016 00:56:29 +0300 Subject: [PATCH 246/936] Update mail forms --- resources/habr/fistJob.html | 166 +++++++++++++---------------- resources/mails/jr_confirm.html | 2 +- resources/mails/topjava_start.html | 2 +- 3 files changed, 77 insertions(+), 93 deletions(-) diff --git a/resources/habr/fistJob.html b/resources/habr/fistJob.html index bd9d51e..a7e5d4f 100644 --- a/resources/habr/fistJob.html +++ b/resources/habr/fistJob.html @@ -1,126 +1,110 @@ +https://dou.ua/add-post/ + - Из Java юниоров в разработчики: получаем первую работу. + Из юниоров в разработчики: получаем первую работу. -Здравствуйте!
    -Коротко о себе: Кислин Григорий, программирую с 1989г., с 2005 года в Java, с 2013 года работаю Java тренером (до -февраля этого года совмещал с -основной работой Java разработчиком). -Достаточно много моих выпускников получили первую работу, и я хочу поделится здесь опытом их трудоустройства. -

    От изучения Java до работы Java разработчиком - большое расстояние

    -Требования к кандидатам на эту вакансию достаточно высоки. -Типичное резюме начинающего разработчика выглядит так: -
    - Ищу позицию Java юниора в большой, стабильной компании, чтобы через 3 года стать специалистом...
    - Хорошо обучаем...
    - Оптыт работы: отсутствует
    - Прошел курсы... -
    -Если в вакансии указано, что набирают юниоров на обучение, то резюме соответствует позиции, но, к сожалению, -
      -
    • таких позиций единицы
    • -
    • по статистике на Украине (в Росии не нашел) количество присланных резюме на такую позицию - превашает 20 -
    • - . -
    -Причем, в основном позиции юниоров крупные компании закрывают своими стажерами. -Один из вариантов пойти на стажировку, но + + +Здравствуйте! Коротко о себе: программирую с 1989 г., с 2005 года в Java, с 2013 года работаю Java-тренером (до января этого года совмещал с основной работой Java-разработчика). Достаточно много моих выпускников трудоустроились, и я хочу поделится своими соображениями, как получить работу Java-разработчика (и не только Java). + +

    От изучения Java до получения оффера работы - большое расстояние

    +Требования к кандидатам на вакансию Java разработчика достаточно высоки, см. пример тестового задания на джуниора от одного из аутсорсеров РБ. Конечно есть позиции и с меньшими требованиям, но их не так много и, по статистике на Украине (dou работает через прокси, в Росии не нашел), соотношение Отклики/Вакансии на такие позиции: от 20 до 50. + +Для вакансий с опытом работы (которых значительно больше) получается замкнутый круг: без опыта не получить работы, а без работы не получить опыта. На вопрос "Кто виноват?" ответ очевиден - компании, которые не хотят вкладывать время и деньги в обучение, а хотят получить уже готового специалиста. Остается главный вопрос: + +

    Что делать?

    + +Крупные компании в основном закрывают позиции юниоров своими стажерами. Один из вариантов трудоустройства - пойти на стажировку, но +
    • здесь также большой конкурс
    • -
    • иногда условия обучения достаточно тяжелые и подойдут не всем: -
      - ... -
      +
    • далеко не все, успешно окнончившие стажировку, получают работу
    • +
    • иногда условия обучения достаточно тяжелые и подойдут не всем. Из отзыва про стажировку в EPAMе РБ:
      Там все настолько жутко строго, что я до сих пор в шоке. У них там сильный отбор... все оценивается, дз, тесты, устные опросы, ну и в конце защита своего проекта. Нам назначают таски и ставят дедлайны. Не успел залить таск - все, до свиданья... Чувствую себя как в школе... Вплоть до того что у нас есть список из 200-230 вопросов примерно по всем темам, которые мы должны знать без запинки. Конспекты ведем(!), на каждый вопрос письменный ответ и это проверяется... Епам себе дрессирует программистов) по другому и не скажешь...
    +Шаги другого варианта хорошо знакомы (отличное видео Якова Фейна "Как стать профессиональным Java разработчиком"): -

  • -
  • далеко не все, даже успешно окнончившие стажировку, получают работу
  • - -Для вакансий не-юниор разработчика (которых уже достаточно много) получается замкнутый круг: без опыта не получить -работы, а без работы не получить опыта. -На вопрос "кто виноват?" ответ очевиден - компании, которые не хотят вкладывать время и деньги в обучение, -а хотят получить уже готового специалиста. Остается главный вопрос: -

    Что делать?

    -Шаги всем, кто уже пытался трудоустроится, знакомы:
    • Хорошее резюме
    • -
    • Приглашения на собеседования и тренировка их прохождения
    • +
    • Приглашения на собеседования и тренировка в их прохождении
    • Получение оффера
    • -
    -Хорошее резюме означает, что его замечает HR и отправляет Вам приглашение на собеседование. +
    +Хорошее (выделяющееся) резюме означает, что его замечает HR и отправляет вам приглашение на собеседование. + В интернете есть большое количество рекомендаций, как этого добиться: + -Но, на мой взгляд, главное (см. видео Якова Фейна): +Но, на мой взгляд, главное:

    Позиционируйте себя НЕ как юниора.

    Для этого необходимо: +
      -
    • Хорошее понимание основ: как устроена память, что такое JMM, опыт работы с сервлетами, SQL
    • -
    • Уровень выше Java Core: основы Maven, Spring, JPA(Hibernate), REST. Также желательно основы - JavaScript и HTML/CSS +
    • Хорошее понимание основ: как устроена память, что + такое JMM, опыт работы с сервлетами, JUnit, SQL
    • -
    • Участие в средних размеров проекте на этом стеке. Это может быть собственный пэт-проект библиотеки, домашней - бухгалтерии или кормления кота. Хорошо, если в нем будет реальная потребность- тогда при его использовании Вы - постепенно будете приходить к оптимальным решениям. +
    • Уровень выше Java Core: основы Maven, Spring (MVC, Security, Test), JPA(Hibernate), REST. Также желательно основы + JavaScript и HTML/CSS
    -Материалов по Java технологиям в интернете море. Выбрать то, что Вам подходит, и освоить требует достаточно много сил и -времени. -Что касается их правильного применения в одном проекте - вопрос еще более сложный. Если хотите освоить все -самостоятельно, лучше всего подойдет изучение кода -референсной имплементации технологий Spring: Pet clinic. Хотя для того, чтобы с ним разобраться, нужен -определенный уровень. -Еще сложнее понять, почему сделано так, а не по другому. Если знаний/времени недостаточно, лучше пройти курсы Java -Enterprise, обязательно с написанием проекта на основе пройденных технологий на выходе. -Мои критерии тренинга: +Материалов по Java фреймворкам и технологиям в интернете много. Но если вы хотите их освоить, а не прочитать/посмотреть и забыть, необходимо написать на них собственный пэт-проект. Это может быть проект домашней библиотеки или бухгалтерии, или кормления кота или... Хорошо, если в нем будет реальная потребность - тогда при его эксплуатации вы постепенно будете приходить к оптимальным решениям. + +Лучше всего делать его на основе небольшого проекта на популярном стеке, например референсной имплементации Spring Pet clinic. С первого раза сделать код красивым и правильным не подсилу даже синьору. Проект должен жить и нести его владельцу радость приобщения к красоте кода через рефакторинг. И, кроме понимания технолигий и развития чувства перкрасного, из работы над собственным проектом Вы получаете навыки нахождения красивых и практических решений для конкретных задач и решения конкретных проблем, из которых состоит ежедневная работа программиста. Для этого нужно: + +
      +
    • понимание, как работают фреймворки, на чем они основаны, какие паттерны используются
    • +
    • кругозор, навыки решения подобных задач
    • +
    • умение находить правильные решения в интернете (70-80% это умение выбрать из найденного в Stackoverflow)
    • +
    +Эта задача непростая и, если знаний, опыта, времени недостаточно, рекомендую пройти какой-нибудь тренинг Java Enterprise на этом стеке, обязательно с написанием проекта на основе пройденных технологий на выходе. Мои критерии тренинга: +
    • Ведет преподаватель с опытом в Java разработке, лучше как синьор или архитектор
    • -
    • Максимальный охват: самые важные и необходимые Java разработчику темы, API, фреймворки, инструменты в одном - курсе. -
    • -
    • В течении тренинга разрабатывается законченный Enterprise проект. Темы идут не по отдельности (в воздухе) на - отстраненных примерах, а последовательно, в связке, как - дополнения к созданию единого работающего приложения. +
    • Максимальный охват: самые важные и необходимые Java разработчику темы, API, фреймворки, инструменты в одном курсе.
    • +
    • В течении тренинга разрабатывается законченный Enterprise проект. Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, в связке, как дополнения к созданию единого работающего приложения.
    • Последовательное возрастание сложности: от нуля до деплоя готового приложения в облако
    • -
    • Практика! Участники на протяжении всего курса должны работать с кодом проекта. Объязательны домашние задания. - Если дают только теорию (всего понемногу), то это, на мой взгляд, выброшенные деньги и время. Без практики любое - обучение (Java, английский, езда на велосипеде) ничего не стоит. -
    • -
    • Поддержка группы и преподавателя: возможность задать любой вопрос и получить на него квалифицированный ответ. -
    • +
    • Практика! Участники на протяжении всего курса должны работать с кодом проекта. Объязательны домашние задания. Если дают только теорию (всего понемногу), то это, на мой взгляд, выброшенные деньги и время. Без практики любое обучение (Java, английский, езда на велосипеде) ничего не стоит.
    • +
    • Поддержка группы и преподавателя: возможность задать любой вопрос и получить на него квалифицированный ответ.
    • Доступность и структурированность материалов
    • -
    • Оптимальное время для проработки пройденных тем и выполнения домашнего задания (должно хватать)
    • Ревью Вашего кода.
    • -
    • Помощь в составлении резюме и с трудоустройством. Если вам гарантируют по окончанию 100% трудоустройство- не - верьте. Чтобы трудоустроиться нужно гореть
    • +
    • Помощь в составлении резюме и с трудоустройством. Если вам гарантируют по окончанию 100% трудоустройство - не верьте. Хорошо сказано в статье про работу разработчика: +
      Работа программиста – не столько профессия, сколько образ жизни. Обучение в университете, самообразование, хобби и, что немаловажно, страсть – ключевые составляющие успеха в этой сфере.
    -После того, как у Вас будет опыт в Java Enterprise и готовый проект, +После того, как у Вас будет опыт в собственном Java Enterprise проекте, +

    Сделайте новое резюме:

    +Типичное резюме Java юниора начинается так: +
    Начать карьеру как junior Java developer в современной, перспективной компании, чтобы через 3 года стать специалистом...
    + Хорошо обучаем...
    + Оптыт работы: отсутствует
    + Прошел курсы...
    +Нужно: +
      -
    • уберите слова "юниор" и "готов к обучению"
    • -
    • в квалификацию вставьте все изученные вами технологии
    • -
    • в опыте работы напишете об участие в Вашем проекте с его кратким описанием
    • +
    • уберать слова "начать карьеру", "юниор" и "готов к обучению"
    • +
    • вставить в квалификацию все изученные вами технологии
    • +
    • в опыте работы написать об участие в проекте с его кратким описанием
    -Например:
    -

    Опыт работы

    -Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей -на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API: +Например, ОПЫТ РАБОТЫ: +Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API: +
    • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA
    • реализация и тестирование REST и AJAX контроллеров
    • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
    -Тогда HR выделит Ваше резюме, и Вы пройдете на следующий уровень: -"Приглашения на собеседования и тренировка их прохождения", что требует отдельной статьи:) -

    - Спасибо за внимание и желаю отличной IT карьеры. -

    +С таким резюме вы можете не бояться обращаться на вакансии с требованием 1-2 года опыта и, возможно, пройдете на следующий уровень: "Приглашения на собеседования и тренировка в их прохождении", что уже требует отдельной статьи. + +Спасибо за внимание и желаю отличной карьеры в IT . \ No newline at end of file diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 3b64ddb..59e978f 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -25,7 +25,7 @@

    Заполнение регистрационной формы

    материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. Обсуждение вступительного занятия происходит в канале Slack #entrance_lesson.
    + href="https://topjava8.slack.com/messages/hw0/">#hw0.
      Другие каналы Slack:
    • #flooding: оффтопик
    • #general: общие вопросы
    • diff --git a/resources/mails/topjava_start.html b/resources/mails/topjava_start.html index 087a7ef..1ca32ea 100644 --- a/resources/mails/topjava_start.html +++ b/resources/mails/topjava_start.html @@ -19,7 +19,7 @@

      Заполнение регистрационной формы

      материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. Обсуждение вступительного занятия происходит в канале Slack #entrance_lesson.
      + href="https://topjava8.slack.com/messages/hw0/">#hw0.
        Другие каналы Slack:
      • #flooding: оффтопик
      • #general: общие вопросы
      • From a1197c9346cba42156bbe0f3c58d6c4e8180e30f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 30 Aug 2016 02:22:28 +0300 Subject: [PATCH 247/936] Update mail forms --- resources/mails/topjava_tomorrow.html | 176 +----------------- .../ru/javaops/config/MvcConfiguration.java | 1 + .../java/ru/javaops/model/BaseEntity.java | 1 + .../java/ru/javaops/model/RegisterType.java | 2 +- 4 files changed, 8 insertions(+), 172 deletions(-) diff --git a/resources/mails/topjava_tomorrow.html b/resources/mails/topjava_tomorrow.html index 7d59404..b0e9953 100644 --- a/resources/mails/topjava_tomorrow.html +++ b/resources/mails/topjava_tomorrow.html @@ -3,12 +3,12 @@ - ЗАВТРА, 26.05 старт проекта 'Java Enterprise (Topjava)' + Послезавтра, 01.09 старт проекта 'Java Enterprise (Topjava)'

        Здравствуй firstName!

        -

        Напомню, что завтра, 26.05 старт проекта Java Enterprise (Topjava)!

        +

        Напомню, что послезавтра, 01.09 старт проекта Java Enterprise (Topjava)!

        Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
        @@ -18,17 +18,18 @@

        Напомню, что завтра, 26.05 старт проекта Java
      • Раздача учебных лицензий JetBrains IDEA
      • Выполнение и проверка (у кого участие с проверкой) вступительного задания
      +Отзывы реальных участиников предыдущих выпусков
      +Демо приложения
      • Стоимость участия без проверки домашних заданий: 8300 руб.
        - сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом. + сюда входят все материалы, участие в группе slack, ответы на вопросы и помощь с проектом.
      • Стоимость полного пакета: 16500 руб. добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при устройстве на работу).
      • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
      • - Скидка для участников других проектов: 700 руб. (без проверки ДЗ) и 1500 руб (с проверкой).
      • Способы оплаты
      • Курс рубля

      • Вопросы по проекту
      • @@ -36,173 +37,6 @@

        Напомню, что завтра, 26.05 старт проекта Java

      Перед оплатой пожалуйста свяжись со мной в скайпе: grigory.kislin (или тел. +7 921 855 0482)


      -

      Основные достоинста проекта, взятые из отзывы реальных участиников предыдущих выпусков: -

      -

      Максимальный охват

      -Самые важные и необходимые Java разработчику темы, API, фреймворки, инструменты в одном курсе. - -

      Насыщенное и структурированное изложение как дополнение к проекту

      -Изложение материала "без воды" нацелено на практическое использование и дополняется материалом для самостоятельной -проработки. Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, в связке, как -дополнения к созданию единого работающего приложения. -Усвоение и понимание материала увеличивается в разы. - -

      Последовательная возрастание сложности с нуля

      -Сложность проекта возрастает постепенно, с кода "Hello Topjava" в main() вступительного задания до финальной версии. -Слон съедается по кусочкам. - -

      Совместная разработка

      -Участники на протяжении всего курса работают с кодом проекта. Выполнение домашних заданий закрепляет полученные -знания. -В результате проект становится "Твоим". - -

      Поддержка группы и преподавателя

      -Общение по любым вопросам: git, IDEA, домашние задания, зарплаты программиста, java консультации, архитектура, -трудоустройство, вакансии, новости IT и пр. - -

      Доступность и структурированность материалов

      -Все видео доступно для просмотра онлайн и скачивания. Записи разбиты по темам -и тщательно отредактированы. Большое количество подобранных ресурсов для углубления в детали. - -

      Оптимальное подобранное время

      -Занятия проходят раз в неделю, оптимальное время необходимое для проработки пройденных тем и выполнения домашнего -задания. - -

      Ревью Вашего кода.

      -Вы увидите именно свои ошибки в стиле, структурах данных, алгоритмах, кодировании. -Опыт равноценен нескольким годам работы разработчиком java. - -

      Помощь в составлении резюме и с трудоустройством.

      -Ваши формы соискателя я рассылаю всем знакомым HR, уже есть случаи трудоустройства выпускников. -Также в группе выпускников происходит активное общение на эту тему, коллеги делятся своим опытом трудоустройства, -публикуют вакансии со своей работы. -

      После проекта в твоем резюме появится раздел в опыте работы:

      -Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей -на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API: -
        -
      • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA
      • -
      • реализация и тестирование REST и AJAX контроллеров
      • -
      • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
      • -
      • твоя доработка проекта
      • -
      -
      -

      Расписание занятий проекта:

      -рассылка занятий происходит по четвергам, для участников с проверкой домашнего задания желательно присылать - ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. -

        26.05: Старт проекта

        -
      • Сбор группы в Slack и Skype
      • -
      • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
      • -
      • Раздача учебных лицензий JetBrains IDEA
      • -
      • Начало выполнение вступительного задания
      • -
      -

        02.06: 1-е занятие

        -
      • Разбор домашнего задания вступительного занятия (вместе с Optional)
      • -
      • Обзор используемых в проекте технологий. Интеграция ПО
      • -
      • Maven
      • -
      • WAR. Веб-контейнер Tomcat. Сервлеты
      • -
      • Логирование
      • -
      • Уровни и зависимости логгирования. JMX
      • -
      • Домашнее задание 1-го занятия (HW1 + Optional)
      • -
      -

        09.06: 2-е занятие

        -
      • Разбор домашнего задания HW1 + Optional
      • -
      • Библиотека vs Фреймворк. Стандартные библиотеки Apache Commons, Guava
      • -
      • Слои приложения. Создание каркаса приложения
      • -
      • Обзор Spring Framework. Spring Context
      • -
      • Пояснения к HW2. Обработка Autowired
      • -
      • Домашнее задание (HW2 + Optional)
      • -
      -

        16.06: 3-е занятие

        -
      • Разбор домашнего задания HW2 + Optional
      • -
      • Жизненный цикл Spring контекста
      • -
      • Тестирование через JUnit
      • -
      • Spring Test
      • -
      • Базы данных. Обзор NoSQL и Java persistence solution без ORM
      • -
      • Настройка Database в IDEA
      • -
      • Скрипты инициализации базы. Spring Jdbc Template
      • -
      • Подготовка тестовых данных и тестирование UserService
      • -
      • Логирование тестов
      • -
      • Домашнее задание (HW3 + Optional)
      • -
      -

        23.06: 4-е занятие

        -
      • Разбор домашнего задания HW3 + Optional
      • -
      • Методы улучшения качества кода
      • -
      • Spring: инициализация и популирование DB
      • -
      • Подмена контекста при тестировании
      • -
      • ORM. Hibernate. JPA
      • -
      • Поддержка HSQLDB
      • -
      • Домашнее задание (HW4 + Optional)
      • -
      -

        30.06: 5-е занятие

        -
      • Разбор вопросов
      • -
      • Разбор домашнего задания HW4 + Optional
      • -
      • Транзакции
      • -
      • Профили Maven и Spring
      • -
      • Пул коннектов
      • -
      • Spring Data JPA
      • -
      • Spring кэш
      • -
      • Домашнее задание (HW5 + Optional)
      • -
      -

        07.07: 6-е занятие

        -
      • Разбор домашнего задания HW5 + Optional
      • -
      • Кэш Hibernate
      • -
      • Spring Web
      • -
      • JPS, JSTL, internationalization
      • -
      • Динамическое изменение профиля при запуске
      • -
      • Конфигурирование Tomcat через maven plugin. Jndi-lookup
      • -
      • Spring Web MVC
      • -
      • Spring Internationalization
      • -
      • Домашнее задание (HW6 + Optional)
      • -
      -

        14.07: 7-е занятие

        -
      • Разбор домашнего задания HW6 + Optional
      • -
      • Автогенерация DDL по модели
      • -
      • Тестирование Spring MVC
      • -
      • REST контроллеры
      • -
      • Тестирование REST контроллеров. Jackson
      • -
      • jackson-datatype-hibernate. Тестирование через матчеры
      • -
      • Тестирование через SoapUi. UTF-8
      • -
      • Домашнее задание (HW7 + Optional)
      • -
      -

        21.07: 8-е занятие

        -
      • Разбор домашнего задания HW7 + Optional
      • -
      • WebJars. jQuery и JavaScript frameworks
      • -
      • Bootstrap
      • -
      • AJAX. Datatables. jQuery
      • -
      • jQuery notifications plugin
      • -
      • Добавление Spring Security
      • -
      • Домашнее задание (HW8 + Optional)
      • -
      -

        28.07: 9-е занятие

        -
      • Разбор домашнего задания HW8 + Optional
      • -
      • Spring Binding
      • -
      • Spring Validation
      • -
      • Перевод DataTables на Ajax
      • -
      • Форма login / logout
      • -
      • Реализация собственного провайдера авторицазии
      • -
      • Принцип работы Spring Security. Проксирование
      • -
      • Spring Security Test
      • -
      • Cookie. Session
      • -
      • Домашнее задание (HW9 + Optional)
      • -
      -

        04.08: 10-е занятие

        -
      • Разбор домашнего задания HW10 + Optional
      • -
      • Spring Security Taglib. Method Security Expressions
      • -
      • Интерсепторы. Редактирование профиля. JSP tag files
      • -
      • Форма регистрации
      • -
      • Обработка исключений в Spring
      • -
      • Encoding password
      • -
      • Защита от межсайтовой подделки запросов (CSRF)
      • -
      • Домашнее задание (HW10)
      • -
      -

        11.08: Заключительное занятие

        -
      • Рефакторинг
      • -
      • Разбор домашнего задания HW10 + Optional
      • -
      • Деплой приложения в Heroku
      • -
      • Возможные доработки приложения
      • -
      • Опрос участников проекта
      • -
      • Домашнее задание по проекту: составление резюме
      • -

      Поторопись, если хочешь значительно поднять свой уровень владения Java Enterprise и принять участие в разработке!

      diff --git a/src/main/java/ru/javaops/config/MvcConfiguration.java b/src/main/java/ru/javaops/config/MvcConfiguration.java index e96fd59..c7b3f8c 100644 --- a/src/main/java/ru/javaops/config/MvcConfiguration.java +++ b/src/main/java/ru/javaops/config/MvcConfiguration.java @@ -64,6 +64,7 @@ public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(activationKeyInterceptor()); } + @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); } diff --git a/src/main/java/ru/javaops/model/BaseEntity.java b/src/main/java/ru/javaops/model/BaseEntity.java index 1b0b547..c667fd0 100644 --- a/src/main/java/ru/javaops/model/BaseEntity.java +++ b/src/main/java/ru/javaops/model/BaseEntity.java @@ -24,6 +24,7 @@ protected BaseEntity(Integer id) { } @JsonIgnore + @Override public boolean isNew() { return super.isNew(); } diff --git a/src/main/java/ru/javaops/model/RegisterType.java b/src/main/java/ru/javaops/model/RegisterType.java index a6ed6c4..fda3caf 100644 --- a/src/main/java/ru/javaops/model/RegisterType.java +++ b/src/main/java/ru/javaops/model/RegisterType.java @@ -7,5 +7,5 @@ public enum RegisterType { REPEAT, FIRST_REGISTERED, - REGISTERED; + REGISTERED } From 9976a1ebf9282b867a81a04f19d721df73b855e0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 30 Aug 2016 18:44:42 +0300 Subject: [PATCH 248/936] Add template --- resources/mails/topjava_4_unregistered.html | 263 ++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 resources/mails/topjava_4_unregistered.html diff --git a/resources/mails/topjava_4_unregistered.html b/resources/mails/topjava_4_unregistered.html new file mode 100644 index 0000000..a1c2a6a --- /dev/null +++ b/resources/mails/topjava_4_unregistered.html @@ -0,0 +1,263 @@ + + + + + + Приглашаю 01.09 принять участие в учебном проекте 'Java Enterprise (Topjava)' + +

      + Здравствуй!
      +

      + +

      Приглашаю Вас принять участие в учебном проекте Topjava Enterprise

      +разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей + с + использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), + REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
      +

      На бесплатном вступительном занятии + подробно + разбирается работа с проектом в системе управления версиями Git. На занятиях мы последовательно разрабатываем + приложение с объяснениями и теоретическим материалом по всем темам проекта. + Домашние задания выполняются по всем темам занятий и являются частью проекта. На заключительном занятии каждый + участник деплоит свой + проект из github в облачный сервис Heroku. +

      +

      Требования к участникам:

      +На проекте мы не проходим синтаксис java: предполагается, что вы уже знаете, что такое классы, конструкторы, +аннотации, анонимные классы, исключения и пр. +Также необходим некоторый опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на +первом занятии, кратко повторяя основы. +Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно, но не принципиально. Весь +"Enterprise": Maven, Git (в том объеме, который нам нужен), Spring, Hibernate, REST даются с азов. Никаких + специальных знаний Java EE не требуется. +
      +

      Основные достоинста проекта, взятые из отзывов участников: +

      +

      Максимальный охват

      +Самые важные и необходимые Java разработчику темы, API, фреймворки, инструменты в одном курсе. + +

      Насыщенное и структурированное изложение как дополнение к проекту

      +Изложение материала "без воды" нацелено на практическое использование и дополняется материалом для самостоятельной +проработки. Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, в связке, как +дополнения к созданию единого работающего приложения. +Усвоение и понимание материала увеличивается в разы. + +

      Последовательная возрастание сложности с нуля

      +Сложность проекта возрастает постепенно, с кода "Hello Topjava" в main() вступительного задания до финальной версии. +Слон съедается по кусочкам. + +

      Совместная разработка

      +Участники на протяжении всего курса работают с кодом проекта. Выполнение домашних заданий закрепляет полученные +знания. +В результате проект становится "Твоим". + +

      Поддержка группы и преподавателя

      +Общение по любым вопросам: git, IDEA, домашние задания, зарплаты программиста, java консультации, архитектура, +трудоустройство, вакансии, новости IT и пр. + +

      Доступность и структурированность материалов

      +Все видео доступно для просмотра онлайн и скачивания. Записи разбиты по темам +и тщательно отредактированы. Большое количество подобранных ресурсов для углубления в детали. + +

      Оптимальное подобранное время

      +Занятия проходят раз в неделю, оптимальное время необходимое для проработки пройденных тем и выполнения домашнего +задания. + +

      Ревью Вашего кода.

      +Вы увидите именно свои ошибки в стиле, структурах данных, алгоритмах, кодировании. +Опыт равноценен нескольким годам работы разработчиком java. + +

      Помощь в составлении резюме и с трудоустройством.

      +Ваши формы соискателя я рассылаю всем знакомым HR, уже есть случаи трудоустройства выпускников. +Также в группе выпускников происходит активное общение на эту тему, коллеги делятся своим опытом трудоустройства, +публикуют вакансии со своей работы. +

      После проекта в твоем резюме появится раздел в опыте работы:

      +Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей +на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API: +
        +
      • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA
      • +
      • реализация и тестирование REST и AJAX контроллеров
      • +
      • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
      • +
      • твоя доработка проекта
      • +
      +

      На проекте

      +
        +
      • Основное внимание будет уделяться способам решения многочисленных проблем разработки в Spring/JPA, а + также + структурному (красивому и надежному) java кодированию и архитектуре приложения. +
      • +
      • Каждая итерация проекта закрепляется домашним заданием по реализации схожей функциональности. + Следующее + занятие + начинается с разбора домашних заданий. +
      • +
      • Большое внимание уделяется тестированию кода: в проекте 92 JUnit теста. +
      • +
      • Несмотря на относительно небольшой размер, приложение разрабатывается с нуля как большой проект + (например, мы используем кэш 2-го уровня Hibernate, настраиваем Jenkins для работы с ленивой загрузкой + Hibernate, делаем конверторы для типов LocalDateTime (Java 8 time API), + которые еще не поддерживаются ни JPA/Hibernate, ни Jackson/json). + Разбираются архитектурные паттерны: слои приложения и как правильно разбивать логику по слоям, когда + нужно + применят Data Transfer Object. + Т.е на выходе получается не учебный проект, а хорошо маштабируемый шаблон для большого проекта на всех + пройденных технологиях. +
      • +
      • Большое внимание уделяется деталям: популяция базы, использование транзакционности, тесты сервисов и + REST + контроллеров, насторойка EntityManagerFactory, + выбор реализации пула коннектов. Особое внимание уделяется работе с базой: мы делаем реализацию через Spring + JDBC, Spring ORM + и Spring Data Jpa. +
      • +
      • Используются самые востребованные на сегодняшний момент фреймворки: Maven, Spring Security 4 + вместе с Spring Security Test, наиболее удобный для работы с базой проект Spring Data Jpa, библиотека + логирования logback, реализующая SLF4J, повсеместно используемый Bootstrap и jQuery. +
      • +
      +
      +
        +
      • Стоимость участия без проверки домашних заданий: 8300 руб.
        + сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом.

        +
      • +
      • Стоимость полного пакета: 16500 руб.
        + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания + при устройстве на работу).

      • +
      • Для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.

      • +
      • Скидка на другие проекты: 700 руб. (без ДЗ) и 1500 руб (с ДЗ).

      • +
      • Добавляйся в skype: grigory.kislin с пометкой topjava.

      • +
      • Способы оплаты (объязательно перед оплатой свяжитесь со мной)
      • +
      • Вопросы по проекту
      • +
      • Ресурсы для подготовки +
      • +
      • Курс рубля
      • +
      +
      +

      Расписание занятий проекта:

      +рассылка занятий происходит по четвергам, для участников с проверкой домашнего задания желательно присылать + ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. +

      01.09: Старт 8-го выпуска

      +
        +
      • Сбор группы в Slack и Skype
      • +
      • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
      • +
      • Раздача учебных лицензий JetBrains IDEA
      • +
      • Проверка вступительного задания (для участников с проверкой + решения присылать до 06.09). +
      • +
      +

        08.09: 1-е занятие

        +
      • Разбор домашнего задания вступительного занятия (вместе с Optional)
      • +
      • Обзор используемых в проекте технологий. Интеграция ПО
      • +
      • Maven
      • +
      • WAR. Веб-контейнер Tomcat. Сервлеты
      • +
      • Логирование
      • +
      • Уровни и зависимости логгирования. JMX
      • +
      • Домашнее задание 1-го занятия (HW1 + Optional)
      • +
      +

        15.09: 2-е занятие

        +
      • Разбор домашнего задания HW1 + Optional
      • +
      • Библиотека vs Фреймворк. Стандартные библиотеки Apache Commons, Guava
      • +
      • Слои приложения. Создание каркаса приложения
      • +
      • Обзор Spring Framework. Spring Context
      • +
      • Пояснения к HW2. Обработка Autowired
      • +
      • Домашнее задание (HW2 + Optional)
      • +
      +

        22.09: 3-е занятие

        +
      • Разбор домашнего задания HW2 + Optional
      • +
      • Жизненный цикл Spring контекста
      • +
      • Тестирование через JUnit
      • +
      • Spring Test
      • +
      • Базы данных. Обзор NoSQL и Java persistence solution без ORM
      • +
      • Настройка Database в IDEA
      • +
      • Скрипты инициализации базы. Spring Jdbc Template
      • +
      • Подготовка тестовых данных и тестирование UserService
      • +
      • Логирование тестов
      • +
      • Домашнее задание (HW3 + Optional)
      • +
      +

        29.09: 4-е занятие

        +
      • Разбор домашнего задания HW3 + Optional
      • +
      • Методы улучшения качества кода
      • +
      • Spring: инициализация и популирование DB
      • +
      • Подмена контекста при тестировании
      • +
      • ORM. Hibernate. JPA
      • +
      • Поддержка HSQLDB
      • +
      • Домашнее задание (HW4 + Optional)
      • +
      +

        06.10: 5-е занятие

        +
      • Разбор вопросов
      • +
      • Разбор домашнего задания HW4 + Optional
      • +
      • Транзакции
      • +
      • Профили Maven и Spring
      • +
      • Пул коннектов
      • +
      • Spring Data JPA
      • +
      • Spring кэш
      • +
      • Домашнее задание (HW5 + Optional)
      • +
      +

        13.10: 6-е занятие

        +
      • Разбор домашнего задания HW5 + Optional
      • +
      • Кэш Hibernate
      • +
      • Spring Web
      • +
      • JPS, JSTL, internationalization
      • +
      • Динамическое изменение профиля при запуске
      • +
      • Конфигурирование Tomcat через maven plugin. Jndi-lookup
      • +
      • Spring Web MVC
      • +
      • Spring Internationalization
      • +
      • Домашнее задание (HW6 + Optional)
      • +
      +

        20.10: 7-е занятие

        +
      • Разбор домашнего задания HW6 + Optional
      • +
      • Автогенерация DDL по модели
      • +
      • Тестирование Spring MVC
      • +
      • REST контроллеры
      • +
      • Тестирование REST контроллеров. Jackson
      • +
      • jackson-datatype-hibernate. Тестирование через матчеры
      • +
      • Тестирование через SoapUi. UTF-8
      • +
      • Домашнее задание (HW7 + Optional)
      • +
      +

        27.10: 8-е занятие

        +
      • Разбор домашнего задания HW7 + Optional
      • +
      • WebJars. jQuery и JavaScript frameworks
      • +
      • Bootstrap
      • +
      • AJAX. Datatables. jQuery
      • +
      • jQuery notifications plugin
      • +
      • Добавление Spring Security
      • +
      • Домашнее задание (HW8 + Optional)
      • +
      +

        03.11: 9-е занятие

        +
      • Разбор домашнего задания HW8 + Optional
      • +
      • Spring Binding
      • +
      • Spring Validation
      • +
      • Перевод DataTables на Ajax
      • +
      • Форма login / logout
      • +
      • Реализация собственного провайдера авторицазии
      • +
      • Принцип работы Spring Security. Проксирование
      • +
      • Spring Security Test
      • +
      • Cookie. Session
      • +
      • Домашнее задание (HW9 + Optional)
      • +
      +

        10.11: 10-е занятие

        +
      • Разбор домашнего задания HW10 + Optional
      • +
      • Spring Security Taglib. Method Security Expressions
      • +
      • Интерсепторы. Редактирование профиля. JSP tag files
      • +
      • Форма регистрации
      • +
      • Обработка исключений в Spring
      • +
      • Encoding password
      • +
      • Защита от межсайтовой подделки запросов (CSRF)
      • +
      • Домашнее задание (HW10)
      • +
      +

        17.11: Заключительное занятие

        +
      • Рефакторинг
      • +
      • Разбор домашнего задания HW10 + Optional
      • +
      • Деплой приложения в Heroku
      • +
      • Возможные доработки приложения
      • +
      • Опрос участников проекта
      • +
      • Домашнее задание по проекту: составление резюме
      • +
      +
      +

      + Добавляйтесь в группу VK: Практика Java (Web/ Enterprise)
      + Надеюсь встретится на проекте! +

      +

      + \ No newline at end of file From 1049dc7a4a8b43f65eda3fdf4ff80ddc6cba9178 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 30 Aug 2016 18:59:32 +0300 Subject: [PATCH 249/936] Update template --- resources/mails/topjava_4_unregistered.html | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/resources/mails/topjava_4_unregistered.html b/resources/mails/topjava_4_unregistered.html index a1c2a6a..af70a0f 100644 --- a/resources/mails/topjava_4_unregistered.html +++ b/resources/mails/topjava_4_unregistered.html @@ -3,13 +3,11 @@ - Приглашаю 01.09 принять участие в учебном проекте 'Java Enterprise (Topjava)' + Приглашаю с 01.09 принять участие в учебном проекте 'Java Enterprise (Topjava)' -

      - Здравствуй!
      -

      - -

      Приглашаю Вас принять участие в учебном проекте Topjava Enterprise

      +Здравствуйте!
      +

      Приглашаю Вас принять участие в учебном проекте Topjava Enterprise
      + стартующим 01.09 (расписание занятий в конце письма)

      разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), @@ -28,9 +26,7 @@

      Требования к участникам:

      аннотации, анонимные классы, исключения и пр. Также необходим некоторый опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на первом занятии, кратко повторяя основы. -Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно, но не принципиально. Весь -"Enterprise": Maven, Git (в том объеме, который нам нужен), Spring, Hibernate, REST даются с азов. Никаких - специальных знаний Java EE не требуется. +Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно. Специальных знаний Java EE не требуется.

      Основные достоинста проекта, взятые из отзывов участников:

      From c174e33968e8d41188a1dc10372b2bd9ded6a4e5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 03:00:43 +0300 Subject: [PATCH 250/936] delete templates --- resources/mails/topjava_start.html | 85 --------------------------- resources/mails/topjava_start_TS.html | 71 ---------------------- 2 files changed, 156 deletions(-) delete mode 100644 resources/mails/topjava_start.html delete mode 100644 resources/mails/topjava_start_TS.html diff --git a/resources/mails/topjava_start.html b/resources/mails/topjava_start.html deleted file mode 100644 index 1ca32ea..0000000 --- a/resources/mails/topjava_start.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - Участие в проекте 'Java Enterprise (TopJava)' - -

      - Здравствуй firstName!
      -

      -

      Поздравляю тебя с участием в проекте Java Enterprise (Topjava)!

      -Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю -(четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние -задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с -пройденной на занятии. -

      Заполнение регистрационной формы

      -Общение на проекте будет вестись в Slack. Заполни пожалуйста все поля регистрационной формы, -и на почту придет приглашение в группу Slack. Для доступа к -материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. -Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. -Обсуждение вступительного занятия происходит в канале Slack #hw0.
      -
        Другие каналы Slack: -
      • #flooding: оффтопик
      • -
      • #general: общие вопросы
      • -
      • #git: вопросы по git
      • -
      • #idea: вопросы по idea
      • -
      • #interview_job: вопросы прохождения - интервью, - работа, вакансии -
      • -
      -Форматирование сообщений в slack
      -Desktop/ Mobile приложение Slack -

      IDE: JetBrains IDEA

      -IDEA считается лучшей Java IDE, и по последней - статистике -IntelliJ is the number one IDE.
      -Netbeans хорош для новичков и индусов (в Индии его 80%).
      -В СПб на IDEA по моему опыту программируют 95% разработчиков.
      -Поэтому разработка проекта ведется в JetBrains IDEA, брать - версию - Ultimate
      -Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую - учебную лицензию JetBrains IDEA на год.
      Учебную лицензию на IDEA и доступ ко всем материалам проекта -буду -рассылать 01.09. -

      Вступительное занятие

      -До старта проекта 01.09 можно приступать в выполнению вступительного - занятия. -Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй -инструкциям. Особое внимание обращаю на wiki по ведению - проекта в Git, необходимо строго следовать этим правилам. -

      Проверка домашних заданий

      -Разбор домашний заданий происходит в начале каждого занятия.
      -Если у тебя участие с проверкой ДЗ, то свое решение вступительного задания нужно присылать на проверку начиная c -02.09 до вечера 06.09, остальных домашних заданий - до вечера вторника. -

      - Проверка заданий подразумевает ревью твоего кода. Ты увидишь именно свои ошибки в стиле, структурах данных, - алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания - это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в - гитхаб и шлют мне ссылку на репозиторий. Я проверяю и фидбэк пишу в slack. Получается эффективно и - оперативно. Можно что-то переделать и снова поревьюится.
      -

      -

      Ресурсы

      -Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Рекомендую также изучить полезные ресурсы. - -

      - Удачи в освоении материалов и выполнении задания,
      - Григорий Кислин
      - skype: grigory.kislin -

      -

      - Java Online Projects -

      - - \ No newline at end of file diff --git a/resources/mails/topjava_start_TS.html b/resources/mails/topjava_start_TS.html deleted file mode 100644 index 421f5d8..0000000 --- a/resources/mails/topjava_start_TS.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - Участие в проекте 'Java Enterprise (TopJava)' - -

      - Здравствуй firstName!
      -

      -Поздравляю тебя с участием на проекте Java Enterprise (Topjava), 7-й выпуск!
      -

      Проект

      -

      Здесь я буду вести общий проект topjava07 в гитхаб.
      - Форк лучше далать от него (см. вступительное ниже), хотя большой разницы нет.
      - На заглавной странице - расписание занятий.
      - Рассылка первого занятия будет в четверг, 02.06 -

      -

      Вступительное занятие

      -До первого занятия 02.06 необходимо установить необходимое ПО, настроить проект и выполнить домашнее задание по -инструкции из -вступительного занятия. -Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй - инструкциям. Особое внимание обращаю на wiki по ведению - проекта в Git, необходимо строго следовать этим правилам. -

      -Решение вступительного задания желательно присылать до вечера 31.05 (договорились в нашу группу skype). -

      -

      Заполнение регистрационной формы

      -Общение на проекте будет вестись в Slack. Заполни пожалуйста пустые поля регистрационной формы, - и на почту придет приглашение в группу Slack topjava7. Для доступа к - материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. -

      - Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал.
      - Обсуждение вступительного занятия происходит в канале Slack #entrance_lesson.
      -

      -
        Каналы Slack: -
      • #flooding: оффтопик
      • -
      • #general: общие вопросы
      • -
      • #git: вопросы по git
      • -
      • #idea: вопросы по idea
      • -
      • #interview_job: вопросы прохождения интервью, - работа, вакансии -
      • -
      - -Форматирование сообщениq в - slack
      -Desktop/ Mobile приложение Slack -

      - До 02.06 (первого занятия) материалы Google Drive не нужны. Заполняй форму, я дам доступ в понедельник, как вернусь. -

      -

      Ресурсы

      -Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Лучше подготовится заранее по ресурсам. - - -

      - Завтра меня не будет, вернусь к вам в понедельник.
      - Удачи в освоении материалов и выполнении задания,
      - Григорий Кислин
      - skype: grigory.kislin -

      -

      - Java Online Projects -

      - \ No newline at end of file From f64e82acc85350ee54263c2d52ca7863ae9a642c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 18:27:50 +0300 Subject: [PATCH 251/936] Update GD template --- resources/mails/topjava_GD.html | 30 ++++++++++++++++++++++++++++++ resources/mails/topjava_JR_GD.html | 26 -------------------------- 2 files changed, 30 insertions(+), 26 deletions(-) create mode 100644 resources/mails/topjava_GD.html delete mode 100644 resources/mails/topjava_JR_GD.html diff --git a/resources/mails/topjava_GD.html b/resources/mails/topjava_GD.html new file mode 100644 index 0000000..dce2f49 --- /dev/null +++ b/resources/mails/topjava_GD.html @@ -0,0 +1,30 @@ + + + + Доступ к Google Drive + +

      + Здравствуй firstName!
      +

      +Сделал доступ к Google Drive. +

      + По ссылке в письме от Google будут доступны все материалы проекта, но проект эволюционирует, поэтому патчи текущего выпуска + будут отличаться. Видео возможно также будут редактироваться / дополнятся. + Все актуальные материалы нашего выпуска будут находится в папке Topjava8. Напрямую ходить в Google Drive не придется, все материалы будут доступны по ссылкам урока. +

      +

      + Если сслыка Google Drive не открывается, попробуй выйти из своего google аккаунта и снова зайти (или зайти в него в анонимном окне браузера). Проблемы пишите мне в личку (skype или slack)
      +

      +

      + Если вступительное задание уже сделано, посмотри на Полезные ресурсы + и wiki по Git и IDEA. + Также очень много полезного материала в группе VK: Практика Java (Web/ Enterprise)
      +

      +

      До встречи на первом уроке 08.09
      + Григорий Кислин
      + skype: grigory.kislin +

      + Java Online Projects +

      + \ No newline at end of file diff --git a/resources/mails/topjava_JR_GD.html b/resources/mails/topjava_JR_GD.html deleted file mode 100644 index c5b4f36..0000000 --- a/resources/mails/topjava_JR_GD.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - Доступ к Google Drive - -

      - Здравствуй firstName!
      -

      -Всем, кто заполнил поле gmail формы выслал доступ к Google Drive. -

      - По ссылке на почте будут доступны все материалы проекта, но проект эволюционирует, поэтому патчи текущего выпуска - будут отличаться. Видео возможно также будут редактироваться / дополнятся. - Все актуальные материалы нашего выпуска будут находится в папке Topjava7
      - Напрямую ходить в Google Drive не придется, все материалы будут доступны по ссылкам урока. -

      -

      - Завтра меня не будет, вернусь к вам в понедельник: тогда и решим все оставшиеся проблемы.
      - Удачи в освоении материалов и выполнении задания,
      - Григорий Кислин
      - skype: grigory.kislin -

      -

      - Java Online Projects -

      - \ No newline at end of file From 505cb24da3f7698fc0cc71881f102e82ce3a514f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 18:31:06 +0300 Subject: [PATCH 252/936] Fix GD template --- resources/mails/topjava_GD.html | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/mails/topjava_GD.html b/resources/mails/topjava_GD.html index dce2f49..6d33b33 100644 --- a/resources/mails/topjava_GD.html +++ b/resources/mails/topjava_GD.html @@ -24,6 +24,7 @@

      До встречи на первом уроке 08.09
      Григорий Кислин
      skype: grigory.kislin +

      Java Online Projects

      From 7b19547601bc8d3c784d787626b56e4520b0fbd1 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 20:01:08 +0300 Subject: [PATCH 253/936] Update topjava templates --- resources/mails/{ => topjava}/topjava_GD.html | 0 .../mails/topjava/topjava_participate.html | 85 +++++++++++++++++++ resources/mails/topjva_fill_form.html | 17 ---- 3 files changed, 85 insertions(+), 17 deletions(-) rename resources/mails/{ => topjava}/topjava_GD.html (100%) create mode 100644 resources/mails/topjava/topjava_participate.html delete mode 100644 resources/mails/topjva_fill_form.html diff --git a/resources/mails/topjava_GD.html b/resources/mails/topjava/topjava_GD.html similarity index 100% rename from resources/mails/topjava_GD.html rename to resources/mails/topjava/topjava_GD.html diff --git a/resources/mails/topjava/topjava_participate.html b/resources/mails/topjava/topjava_participate.html new file mode 100644 index 0000000..1ca32ea --- /dev/null +++ b/resources/mails/topjava/topjava_participate.html @@ -0,0 +1,85 @@ + + + + Участие в проекте 'Java Enterprise (TopJava)' + +

      + Здравствуй firstName!
      +

      +

      Поздравляю тебя с участием в проекте Java Enterprise (Topjava)!

      +Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю +(четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние +задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с +пройденной на занятии. +

      Заполнение регистрационной формы

      +Общение на проекте будет вестись в Slack. Заполни пожалуйста все поля регистрационной формы, +и на почту придет приглашение в группу Slack. Для доступа к +материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. +Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. +Обсуждение вступительного занятия происходит в канале Slack #hw0.
      +
        Другие каналы Slack: +
      • #flooding: оффтопик
      • +
      • #general: общие вопросы
      • +
      • #git: вопросы по git
      • +
      • #idea: вопросы по idea
      • +
      • #interview_job: вопросы прохождения + интервью, + работа, вакансии +
      • +
      +Форматирование сообщений в slack
      +Desktop/ Mobile приложение Slack +

      IDE: JetBrains IDEA

      +IDEA считается лучшей Java IDE, и по последней + статистике +IntelliJ is the number one IDE.
      +Netbeans хорош для новичков и индусов (в Индии его 80%).
      +В СПб на IDEA по моему опыту программируют 95% разработчиков.
      +Поэтому разработка проекта ведется в JetBrains IDEA, брать + версию + Ultimate
      +Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую + учебную лицензию JetBrains IDEA на год.
      Учебную лицензию на IDEA и доступ ко всем материалам проекта +буду +рассылать 01.09. +

      Вступительное занятие

      +До старта проекта 01.09 можно приступать в выполнению вступительного + занятия. +Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй +инструкциям. Особое внимание обращаю на wiki по ведению + проекта в Git, необходимо строго следовать этим правилам. +

      Проверка домашних заданий

      +Разбор домашний заданий происходит в начале каждого занятия.
      +Если у тебя участие с проверкой ДЗ, то свое решение вступительного задания нужно присылать на проверку начиная c +02.09 до вечера 06.09, остальных домашних заданий - до вечера вторника. +

      + Проверка заданий подразумевает ревью твоего кода. Ты увидишь именно свои ошибки в стиле, структурах данных, + алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания + это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в + гитхаб и шлют мне ссылку на репозиторий. Я проверяю и фидбэк пишу в slack. Получается эффективно и + оперативно. Можно что-то переделать и снова поревьюится.
      +

      +

      Ресурсы

      +Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Рекомендую также изучить полезные ресурсы. + +

      + Удачи в освоении материалов и выполнении задания,
      + Григорий Кислин
      + skype: grigory.kislin +

      +

      + Java Online Projects +

      + + \ No newline at end of file diff --git a/resources/mails/topjva_fill_form.html b/resources/mails/topjva_fill_form.html deleted file mode 100644 index 47c56a7..0000000 --- a/resources/mails/topjva_fill_form.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - Регистрационные данные, проект Java Enterprise (Topajava). - - -

      - Здравствуй firstName!
      -

      -Для доступа к материалам проекта нужен твой Gmail аккаунт.
      -Заполни пожалуйста пустые поля регистрационной - формы -

      -

      - From d848b5beba178f7e711c02b57e02f97842e62cb2 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 22:30:47 +0300 Subject: [PATCH 254/936] Update topjava templates --- resources/mails/topjava_info.html | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 89aa111..f2d7c20 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -124,15 +124,12 @@

      На проекте


    Расписание занятий проекта:

    - рассылка занятий происходит по четвергам, для участников с проверкой домашнего задания желательно присылать - ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. -

    01.09: Старт 8-го выпуска

    -
      + Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Домашние задания подобранны по темам занятия и требуют реализации функциональности, схожей с пройденной на занятии. +

        01.09: Старт проекта

      • Сбор группы в Slack и Skype
      • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
      • Раздача учебных лицензий JetBrains IDEA
      • -
      • Проверка вступительного задания (для участников с проверкой - решения присылать до 06.09). +
      • Выполнение и проверка вступительного задания

        08.09: 1-е занятие

        @@ -240,8 +237,6 @@

        01.09: Старт 8-го выпуска

      • Разбор домашнего задания HW10 + Optional
      • Деплой приложения в Heroku
      • Возможные доработки приложения
      • -
      • Опрос участников проекта
      • -
      • Домашнее задание по проекту: составление резюме

      From 4a40803eab84ddd816089fe7e3be33cb10241908 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 22:31:22 +0300 Subject: [PATCH 255/936] Update topjava templates --- .../{ => topjava}/topjava_4_unregistered.html | 43 +++++++---------- resources/mails/topjava_1st_day.html | 47 ------------------- 2 files changed, 18 insertions(+), 72 deletions(-) rename resources/mails/{ => topjava}/topjava_4_unregistered.html (87%) delete mode 100644 resources/mails/topjava_1st_day.html diff --git a/resources/mails/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html similarity index 87% rename from resources/mails/topjava_4_unregistered.html rename to resources/mails/topjava/topjava_4_unregistered.html index af70a0f..5a0e077 100644 --- a/resources/mails/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -3,30 +3,32 @@ - Приглашаю с 01.09 принять участие в учебном проекте 'Java Enterprise (Topjava)' + Участие в учебном проекте 'Java Enterprise (Topjava)' Здравствуйте!
      -

      Приглашаю Вас принять участие в учебном проекте Topjava Enterprise
      - стартующим 01.09 (расписание занятий в конце письма)

      +

      Предлагаю Вам качественно повысить свой уровень профессионализма в Java Enterprise и принять участие в учебном проекте Topjava Enterprise + (первый урок 08.09, расписание занятий в конце письма)

      разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей - с - использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), + с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
      +

      +Отзывы по проекту
      +Демо разрабатываемого приложения +

      На бесплатном вступительном занятии подробно разбирается работа с проектом в системе управления версиями Git. На занятиях мы последовательно разрабатываем приложение с объяснениями и теоретическим материалом по всем темам проекта. Домашние задания выполняются по всем темам занятий и являются частью проекта. На заключительном занятии каждый - участник деплоит свой - проект из github в облачный сервис Heroku. + участник деплоит свой проект из github в облачный сервис Heroku.

      Требования к участникам:

      На проекте мы не проходим синтаксис java: предполагается, что вы уже знаете, что такое классы, конструкторы, аннотации, анонимные классы, исключения и пр. -Также необходим некоторый опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на +Также необходим опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на первом занятии, кратко повторяя основы. -Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно. Специальных знаний Java EE не требуется. +Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно. Специальных знаний Java EE не требуется.

      Основные достоинста проекта, взятые из отзывов участников:

      @@ -68,7 +70,7 @@

      Помощь в составлении резюме и с трудоустр Ваши формы соискателя я рассылаю всем знакомым HR, уже есть случаи трудоустройства выпускников. Также в группе выпускников происходит активное общение на эту тему, коллеги делятся своим опытом трудоустройства, публикуют вакансии со своей работы. -

      После проекта в твоем резюме появится раздел в опыте работы:

      +

      После проекта в вашем резюме появится раздел в опыте работы:

      Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API:
        @@ -88,12 +90,11 @@

        На проекте

        занятие начинается с разбора домашних заданий. -
      • Большое внимание уделяется тестированию кода: в проекте 92 JUnit теста. +
      • Большое внимание уделяется тестированию кода: в проекте 96 JUnit тестов.
      • Несмотря на относительно небольшой размер, приложение разрабатывается с нуля как большой проект (например, мы используем кэш 2-го уровня Hibernate, настраиваем Jenkins для работы с ленивой загрузкой - Hibernate, делаем конверторы для типов LocalDateTime (Java 8 time API), - которые еще не поддерживаются ни JPA/Hibernate, ни Jackson/json). + Hibernate, делаем конверторы для типов LocalDateTime (Java 8 time API). Разбираются архитектурные паттерны: слои приложения и как правильно разбивать логику по слоям, когда нужно применят Data Transfer Object. @@ -122,25 +123,19 @@

        На проекте

        при устройстве на работу).

      • Для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.

      • Скидка на другие проекты: 700 руб. (без ДЗ) и 1500 руб (с ДЗ).

      • -
      • Добавляйся в skype: grigory.kislin с пометкой topjava.

      • +
      • Добавляйтесь в skype: grigory.kislin с пометкой topjava.

      • Способы оплаты (объязательно перед оплатой свяжитесь со мной)
      • Вопросы по проекту
      • -
      • Ресурсы для подготовки -
      • Курс рубля

      Расписание занятий проекта:

      -рассылка занятий происходит по четвергам, для участников с проверкой домашнего задания желательно присылать - ссылку github на решение до вечера следующего вторника, чтобы я успел сделать ревью кода. -

      01.09: Старт 8-го выпуска

      -
        +Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Домашние задания подобранны по темам занятия и требуют реализации функциональности, схожей с пройденной на занятии. +

          01.09: Старт проекта

        • Сбор группы в Slack и Skype
        • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
        • Раздача учебных лицензий JetBrains IDEA
        • -
        • Проверка вступительного задания (для участников с проверкой - решения присылать до 06.09). -
        • +
        • Выполнение и проверка вступительного задания

          08.09: 1-е занятие

        • Разбор домашнего задания вступительного занятия (вместе с Optional)
        • @@ -247,8 +242,6 @@

          01.09: Старт 8-го выпуска

        • Разбор домашнего задания HW10 + Optional
        • Деплой приложения в Heroku
        • Возможные доработки приложения
        • -
        • Опрос участников проекта
        • -
        • Домашнее задание по проекту: составление резюме

        diff --git a/resources/mails/topjava_1st_day.html b/resources/mails/topjava_1st_day.html deleted file mode 100644 index 2d3238b..0000000 --- a/resources/mails/topjava_1st_day.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - Начало проекта 'Java Enterprise (TopJava)' - -

        - Здравствуй firstName!
        -

        -Рад сообщить, что сегодня начало проекта.
        -Группа у нас будет большая, поэтому будет много вопросов и общения. -

        - Для начала занятий у тебя должен быть доступ к Google Drive папке Topjava7 и в группу Slack.
        - Если чего-то не хватает, проверь почту и напиши мне в skype: grigory.kislin -

        -

        Здесь я буду вести общий проект topjava07 в гитхаб.
        -На заглавной странице - расписание занятий.
        -Рассылка первого занятия будет в четверг, 02.06 -

        -До этого необходимо установить необходимое ПО, настроить проект и выполнить домашнее задание по инструкции из -вступительного занятия. -Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй -инструкциям. Особое внимание обращаю на wiki по ведению проекта в Git, необходимо строго следовать этим правилам. -Обсуждение вступительного занятия происходит в канале Slack #entrance_lesson.
        -

        -Если у тебя есть проверка ДЗ, то решение вступительного задания желательно присылать до вечера 31.05. -

        -Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Лучше подготовится заранее по ресурсам. - -

        - Добавляйся в группу VK: практика Java (Web/ Enterprise)
        -

        -

        - Удачи в освоении материалов и выполнении задания,
        - Григорий Кислин
        - skype: grigory.kislin -

        -

        - Java Online Projects -

        - \ No newline at end of file From 417013ba862ea507e246290b62708ff1156dd11e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 22:34:34 +0300 Subject: [PATCH 256/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index 5a0e077..b69fe80 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -3,7 +3,7 @@ - Участие в учебном проекте 'Java Enterprise (Topjava)' + Качественно поднимите свой уровень профессионализма в Java Enterprise Здравствуйте!

        Предлагаю Вам качественно повысить свой уровень профессионализма в Java Enterprise и принять участие в учебном проекте Topjava Enterprise From a97f2646f403cd8a31dfc08db5ba7344871246b8 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 22:45:02 +0300 Subject: [PATCH 257/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index b69fe80..1baea4e 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -6,7 +6,7 @@ Качественно поднимите свой уровень профессионализма в Java Enterprise Здравствуйте!
        -

        Предлагаю Вам качественно повысить свой уровень профессионализма в Java Enterprise и принять участие в учебном проекте Topjava Enterprise +

        Предлагаю Вам качественно повысить свой уровень профессионализма в Java Enterprise, приняв участие в проекте Topjava Enterprise (первый урок 08.09, расписание занятий в конце письма)

        разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), @@ -15,7 +15,7 @@

        Отзывы по проекту
        Демо разрабатываемого приложения

        -

        На На бесплатном вступительном занятии подробно разбирается работа с проектом в системе управления версиями Git. На занятиях мы последовательно разрабатываем @@ -27,7 +27,7 @@

        Требования к участникам:

        На проекте мы не проходим синтаксис java: предполагается, что вы уже знаете, что такое классы, конструкторы, аннотации, анонимные классы, исключения и пр. Также необходим опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на -первом занятии, кратко повторяя основы. +первом занятии. Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно. Специальных знаний Java EE не требуется.

        Основные достоинста проекта, взятые из отзывов участников: From 21c7a5c00e9b5f4c3733cc404e5880c1b782c4c9 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 22:49:24 +0300 Subject: [PATCH 258/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index 1baea4e..672c3d6 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -15,7 +15,8 @@

        Отзывы по проекту
        Демо разрабатываемого приложения

        -

        На На +бесплатном вступительном занятии подробно разбирается работа с проектом в системе управления версиями Git. На занятиях мы последовательно разрабатываем From e82476c60def050daf881deb9c23b03fb7d5b457 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 23:14:09 +0300 Subject: [PATCH 259/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index 672c3d6..29dff2f 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -3,7 +3,7 @@ - Качественно поднимите свой уровень профессионализма в Java Enterprise + Проект Java Enterprise Здравствуйте!

        Предлагаю Вам качественно повысить свой уровень профессионализма в Java Enterprise, приняв участие в проекте Topjava Enterprise From 31c92f0f6e655924e87ce8ec9c79f3b2594a9e7f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 23:15:04 +0300 Subject: [PATCH 260/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index 29dff2f..c278208 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -6,7 +6,7 @@ Проект Java Enterprise Здравствуйте!
        -

        Предлагаю Вам качественно повысить свой уровень профессионализма в Java Enterprise, приняв участие в проекте Topjava Enterprise +

        приняв участие в проекте Topjava Enterprise (первый урок 08.09, расписание занятий в конце письма)

        разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), From 294f6075dee0ce537165b54e1e3c81de3a72507f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 23:17:16 +0300 Subject: [PATCH 261/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index c278208..8e4e9ac 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -3,10 +3,10 @@ - Проект Java Enterprise + Участие в проекте Java Enterprise Здравствуйте!
        -

        приняв участие в проекте Topjava Enterprise +

        Участие в проекте Topjava Enterprise (первый урок 08.09, расписание занятий в конце письма)

        разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), From b83e15d3c8392a0d56aa3b4a3a2db7c497a25d73 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 23:22:39 +0300 Subject: [PATCH 262/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index 8e4e9ac..7a9066e 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -3,10 +3,10 @@ - Участие в проекте Java Enterprise + Качественно поднимите свой уровень профессионализма в Java Enterprise Здравствуйте!
        -

        Участие в проекте Topjava Enterprise +

        Предлагаю Вам качественно повысить свой уровень профессионализма в Java Enterprise, приняв участие в проекте Topjava Enterprise (первый урок 08.09, расписание занятий в конце письма)

        разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), @@ -248,6 +248,10 @@

        Расписание занятий проекта:

        Добавляйтесь в группу VK: Практика Java (Web/ Enterprise)
        Надеюсь встретится на проекте! -

        +

        +Григорий Кислин
        +skype: grigory.kislin +

        + Java Online Projects

        \ No newline at end of file From 877704ed00893aadc433d585dde3fc18ae98f5ac Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 23:25:39 +0300 Subject: [PATCH 263/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index 7a9066e..35cb3dd 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -16,7 +16,7 @@

        Демо разрабатываемого приложения

        На -бесплатном вступительном занятии подробно разбирается работа с проектом в системе управления версиями Git. На занятиях мы последовательно разрабатываем From 5cdf1ca01fef2abd7bf2126b09709f5a33bddb1e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 23:25:58 +0300 Subject: [PATCH 264/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index 35cb3dd..ca5c717 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -16,7 +16,7 @@

        Демо разрабатываемого приложения

        На -бесплатном вступительном занятии подробно разбирается работа с проектом в системе управления версиями Git. На занятиях мы последовательно разрабатываем From 6ae82a28f624c41d9554b024e913d455003cbf51 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 23:30:39 +0300 Subject: [PATCH 265/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index ca5c717..627c5ef 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -16,7 +16,7 @@

        Демо разрабатываемого приложения

        На -бесплатном вступительном занятии подробно разбирается работа с проектом в системе управления версиями Git. На занятиях мы последовательно разрабатываем From 86ca4a0076ca4f6c0c0a9e18ccc52125dbba11fe Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Sep 2016 23:35:10 +0300 Subject: [PATCH 266/936] Update topjava templates --- resources/mails/topjava/topjava_4_unregistered.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html index 627c5ef..81a09bb 100644 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ b/resources/mails/topjava/topjava_4_unregistered.html @@ -16,7 +16,7 @@

        Демо разрабатываемого приложения

        На -бесплатном вступительном занятии подробно разбирается работа с проектом в системе управления версиями Git. На занятиях мы последовательно разрабатываем From 889593afb6fea0b41310cbc2718a34f92a85bcac Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 2 Sep 2016 14:47:14 +0300 Subject: [PATCH 267/936] Fix tests --- .travis.yml | 1 + src/main/java/ru/javaops/config/AppConfig.java | 6 ++++-- src/test/java/ru/javaops/service/GroupServiceTest.java | 9 --------- 3 files changed, 5 insertions(+), 11 deletions(-) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..f5c99a7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: java \ No newline at end of file diff --git a/src/main/java/ru/javaops/config/AppConfig.java b/src/main/java/ru/javaops/config/AppConfig.java index 5dd0f09..c21c6ef 100644 --- a/src/main/java/ru/javaops/config/AppConfig.java +++ b/src/main/java/ru/javaops/config/AppConfig.java @@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import java.sql.SQLException; @@ -16,18 +17,19 @@ @Configuration public class AppConfig { - // @Profile("dev") + @Profile("dev") @Bean(initMethod = "start", destroyMethod = "stop") public Server h2WebServer() throws SQLException { return Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082"); } + @Profile("prod") @Bean(initMethod = "start", destroyMethod = "stop") public Server h2Server() throws SQLException { return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092"); } - @Autowired(required = true) + @Autowired public void configeJackson(ObjectMapper objectMapper) { objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); diff --git a/src/test/java/ru/javaops/service/GroupServiceTest.java b/src/test/java/ru/javaops/service/GroupServiceTest.java index 0bed340..c79137e 100644 --- a/src/test/java/ru/javaops/service/GroupServiceTest.java +++ b/src/test/java/ru/javaops/service/GroupServiceTest.java @@ -14,15 +14,6 @@ public class GroupServiceTest extends ApplicationAbstractTest { @Autowired private GroupService groupService; - @Test - public void testFindByName() throws Exception { - groupService.findByName("test"); - groupService.findByName("test"); - groupService.findByName("test"); - thrown.expect(NullPointerException.class); - groupService.findByName("dummy"); - } - @Test public void testFindByUser() throws Exception { System.out.println(groupService.findByUserId(UserTestData.USER_ID)); From 1c10ad604d93370ac5708d5217c89a8cde265f2c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 2 Sep 2016 15:48:37 +0300 Subject: [PATCH 268/936] Fix travis ci --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f5c99a7..6f1b2a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,2 @@ -language: java \ No newline at end of file +language: java +jdk: oraclejdk8 \ No newline at end of file From 7079bcebe70b7b080ed5a84917f4ee02c01c7604 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 2 Sep 2016 16:27:03 +0300 Subject: [PATCH 269/936] Fix travis ci --- .../mails/topjava/topjava_4_unregistered.html | 257 ------------------ .../service/SubscriptionServiceTest.java | 2 - 2 files changed, 259 deletions(-) delete mode 100644 resources/mails/topjava/topjava_4_unregistered.html diff --git a/resources/mails/topjava/topjava_4_unregistered.html b/resources/mails/topjava/topjava_4_unregistered.html deleted file mode 100644 index 81a09bb..0000000 --- a/resources/mails/topjava/topjava_4_unregistered.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - Качественно поднимите свой уровень профессионализма в Java Enterprise - -Здравствуйте!
        -

        Предлагаю Вам качественно повысить свой уровень профессионализма в Java Enterprise, приняв участие в проекте Topjava Enterprise - (первый урок 08.09, расписание занятий в конце письма)

        -разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей - с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), - REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
        -

        -Отзывы по проекту
        -Демо разрабатываемого приложения -

        -

        На -бесплатном вступительном занятии - подробно - разбирается работа с проектом в системе управления версиями Git. На занятиях мы последовательно разрабатываем - приложение с объяснениями и теоретическим материалом по всем темам проекта. - Домашние задания выполняются по всем темам занятий и являются частью проекта. На заключительном занятии каждый - участник деплоит свой проект из github в облачный сервис Heroku. -

        -

        Требования к участникам:

        -На проекте мы не проходим синтаксис java: предполагается, что вы уже знаете, что такое классы, конструкторы, -аннотации, анонимные классы, исключения и пр. -Также необходим опыт программирования на java. Желательно знание сервлетов. Мы начинаем использовать их на -первом занятии. -Знание SQL (на уровне Select/ Insert/ Update/ Delete), JavaScript желательно. Специальных знаний Java EE не требуется. -
        -

        Основные достоинста проекта, взятые из отзывов участников: -

        -

        Максимальный охват

        -Самые важные и необходимые Java разработчику темы, API, фреймворки, инструменты в одном курсе. - -

        Насыщенное и структурированное изложение как дополнение к проекту

        -Изложение материала "без воды" нацелено на практическое использование и дополняется материалом для самостоятельной -проработки. Темы идут не по отдельности (в воздухе) на отстраненных примерах, а последовательно, в связке, как -дополнения к созданию единого работающего приложения. -Усвоение и понимание материала увеличивается в разы. - -

        Последовательная возрастание сложности с нуля

        -Сложность проекта возрастает постепенно, с кода "Hello Topjava" в main() вступительного задания до финальной версии. -Слон съедается по кусочкам. - -

        Совместная разработка

        -Участники на протяжении всего курса работают с кодом проекта. Выполнение домашних заданий закрепляет полученные -знания. -В результате проект становится "Твоим". - -

        Поддержка группы и преподавателя

        -Общение по любым вопросам: git, IDEA, домашние задания, зарплаты программиста, java консультации, архитектура, -трудоустройство, вакансии, новости IT и пр. - -

        Доступность и структурированность материалов

        -Все видео доступно для просмотра онлайн и скачивания. Записи разбиты по темам -и тщательно отредактированы. Большое количество подобранных ресурсов для углубления в детали. - -

        Оптимальное подобранное время

        -Занятия проходят раз в неделю, оптимальное время необходимое для проработки пройденных тем и выполнения домашнего -задания. - -

        Ревью Вашего кода.

        -Вы увидите именно свои ошибки в стиле, структурах данных, алгоритмах, кодировании. -Опыт равноценен нескольким годам работы разработчиком java. - -

        Помощь в составлении резюме и с трудоустройством.

        -Ваши формы соискателя я рассылаю всем знакомым HR, уже есть случаи трудоустройства выпускников. -Также в группе выпускников происходит активное общение на эту тему, коллеги делятся своим опытом трудоустройства, -публикуют вакансии со своей работы. -

        После проекта в вашем резюме появится раздел в опыте работы:

        -Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей -на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API: -
          -
        • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA
        • -
        • реализация и тестирование REST и AJAX контроллеров
        • -
        • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
        • -
        • твоя доработка проекта
        • -
        -

        На проекте

        -
          -
        • Основное внимание будет уделяться способам решения многочисленных проблем разработки в Spring/JPA, а - также - структурному (красивому и надежному) java кодированию и архитектуре приложения. -
        • -
        • Каждая итерация проекта закрепляется домашним заданием по реализации схожей функциональности. - Следующее - занятие - начинается с разбора домашних заданий. -
        • -
        • Большое внимание уделяется тестированию кода: в проекте 96 JUnit тестов. -
        • -
        • Несмотря на относительно небольшой размер, приложение разрабатывается с нуля как большой проект - (например, мы используем кэш 2-го уровня Hibernate, настраиваем Jenkins для работы с ленивой загрузкой - Hibernate, делаем конверторы для типов LocalDateTime (Java 8 time API). - Разбираются архитектурные паттерны: слои приложения и как правильно разбивать логику по слоям, когда - нужно - применят Data Transfer Object. - Т.е на выходе получается не учебный проект, а хорошо маштабируемый шаблон для большого проекта на всех - пройденных технологиях. -
        • -
        • Большое внимание уделяется деталям: популяция базы, использование транзакционности, тесты сервисов и - REST - контроллеров, насторойка EntityManagerFactory, - выбор реализации пула коннектов. Особое внимание уделяется работе с базой: мы делаем реализацию через Spring - JDBC, Spring ORM - и Spring Data Jpa. -
        • -
        • Используются самые востребованные на сегодняшний момент фреймворки: Maven, Spring Security 4 - вместе с Spring Security Test, наиболее удобный для работы с базой проект Spring Data Jpa, библиотека - логирования logback, реализующая SLF4J, повсеместно используемый Bootstrap и jQuery. -
        • -
        -
        -
          -
        • Стоимость участия без проверки домашних заданий: 8300 руб.
          - сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом.

          -
        • -
        • Стоимость полного пакета: 16500 руб.
          - добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания - при устройстве на работу).

        • -
        • Для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.

        • -
        • Скидка на другие проекты: 700 руб. (без ДЗ) и 1500 руб (с ДЗ).

        • -
        • Добавляйтесь в skype: grigory.kislin с пометкой topjava.

        • -
        • Способы оплаты (объязательно перед оплатой свяжитесь со мной)
        • -
        • Вопросы по проекту
        • -
        • Курс рубля
        • -
        -
        -

        Расписание занятий проекта:

        -Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Домашние задания подобранны по темам занятия и требуют реализации функциональности, схожей с пройденной на занятии. -

          01.09: Старт проекта

          -
        • Сбор группы в Slack и Skype
        • -
        • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
        • -
        • Раздача учебных лицензий JetBrains IDEA
        • -
        • Выполнение и проверка вступительного задания
        • -
        -

          08.09: 1-е занятие

          -
        • Разбор домашнего задания вступительного занятия (вместе с Optional)
        • -
        • Обзор используемых в проекте технологий. Интеграция ПО
        • -
        • Maven
        • -
        • WAR. Веб-контейнер Tomcat. Сервлеты
        • -
        • Логирование
        • -
        • Уровни и зависимости логгирования. JMX
        • -
        • Домашнее задание 1-го занятия (HW1 + Optional)
        • -
        -

          15.09: 2-е занятие

          -
        • Разбор домашнего задания HW1 + Optional
        • -
        • Библиотека vs Фреймворк. Стандартные библиотеки Apache Commons, Guava
        • -
        • Слои приложения. Создание каркаса приложения
        • -
        • Обзор Spring Framework. Spring Context
        • -
        • Пояснения к HW2. Обработка Autowired
        • -
        • Домашнее задание (HW2 + Optional)
        • -
        -

          22.09: 3-е занятие

          -
        • Разбор домашнего задания HW2 + Optional
        • -
        • Жизненный цикл Spring контекста
        • -
        • Тестирование через JUnit
        • -
        • Spring Test
        • -
        • Базы данных. Обзор NoSQL и Java persistence solution без ORM
        • -
        • Настройка Database в IDEA
        • -
        • Скрипты инициализации базы. Spring Jdbc Template
        • -
        • Подготовка тестовых данных и тестирование UserService
        • -
        • Логирование тестов
        • -
        • Домашнее задание (HW3 + Optional)
        • -
        -

          29.09: 4-е занятие

          -
        • Разбор домашнего задания HW3 + Optional
        • -
        • Методы улучшения качества кода
        • -
        • Spring: инициализация и популирование DB
        • -
        • Подмена контекста при тестировании
        • -
        • ORM. Hibernate. JPA
        • -
        • Поддержка HSQLDB
        • -
        • Домашнее задание (HW4 + Optional)
        • -
        -

          06.10: 5-е занятие

          -
        • Разбор вопросов
        • -
        • Разбор домашнего задания HW4 + Optional
        • -
        • Транзакции
        • -
        • Профили Maven и Spring
        • -
        • Пул коннектов
        • -
        • Spring Data JPA
        • -
        • Spring кэш
        • -
        • Домашнее задание (HW5 + Optional)
        • -
        -

          13.10: 6-е занятие

          -
        • Разбор домашнего задания HW5 + Optional
        • -
        • Кэш Hibernate
        • -
        • Spring Web
        • -
        • JPS, JSTL, internationalization
        • -
        • Динамическое изменение профиля при запуске
        • -
        • Конфигурирование Tomcat через maven plugin. Jndi-lookup
        • -
        • Spring Web MVC
        • -
        • Spring Internationalization
        • -
        • Домашнее задание (HW6 + Optional)
        • -
        -

          20.10: 7-е занятие

          -
        • Разбор домашнего задания HW6 + Optional
        • -
        • Автогенерация DDL по модели
        • -
        • Тестирование Spring MVC
        • -
        • REST контроллеры
        • -
        • Тестирование REST контроллеров. Jackson
        • -
        • jackson-datatype-hibernate. Тестирование через матчеры
        • -
        • Тестирование через SoapUi. UTF-8
        • -
        • Домашнее задание (HW7 + Optional)
        • -
        -

          27.10: 8-е занятие

          -
        • Разбор домашнего задания HW7 + Optional
        • -
        • WebJars. jQuery и JavaScript frameworks
        • -
        • Bootstrap
        • -
        • AJAX. Datatables. jQuery
        • -
        • jQuery notifications plugin
        • -
        • Добавление Spring Security
        • -
        • Домашнее задание (HW8 + Optional)
        • -
        -

          03.11: 9-е занятие

          -
        • Разбор домашнего задания HW8 + Optional
        • -
        • Spring Binding
        • -
        • Spring Validation
        • -
        • Перевод DataTables на Ajax
        • -
        • Форма login / logout
        • -
        • Реализация собственного провайдера авторицазии
        • -
        • Принцип работы Spring Security. Проксирование
        • -
        • Spring Security Test
        • -
        • Cookie. Session
        • -
        • Домашнее задание (HW9 + Optional)
        • -
        -

          10.11: 10-е занятие

          -
        • Разбор домашнего задания HW10 + Optional
        • -
        • Spring Security Taglib. Method Security Expressions
        • -
        • Интерсепторы. Редактирование профиля. JSP tag files
        • -
        • Форма регистрации
        • -
        • Обработка исключений в Spring
        • -
        • Encoding password
        • -
        • Защита от межсайтовой подделки запросов (CSRF)
        • -
        • Домашнее задание (HW10)
        • -
        -

          17.11: Заключительное занятие

          -
        • Рефакторинг
        • -
        • Разбор домашнего задания HW10 + Optional
        • -
        • Деплой приложения в Heroku
        • -
        • Возможные доработки приложения
        • -
        -
        -

        - Добавляйтесь в группу VK: Практика Java (Web/ Enterprise)
        - Надеюсь встретится на проекте! -

        -Григорий Кислин
        -skype: grigory.kislin -

        - Java Online Projects -

        - \ No newline at end of file diff --git a/src/test/java/ru/javaops/service/SubscriptionServiceTest.java b/src/test/java/ru/javaops/service/SubscriptionServiceTest.java index 94c4630..562f304 100644 --- a/src/test/java/ru/javaops/service/SubscriptionServiceTest.java +++ b/src/test/java/ru/javaops/service/SubscriptionServiceTest.java @@ -2,14 +2,12 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ActiveProfiles; import ru.javaops.ApplicationAbstractTest; /** * GKislin * 25.02.2016 */ -@ActiveProfiles("prod") public class SubscriptionServiceTest extends ApplicationAbstractTest { public static final String EMAIL = "gkislin@yandex.ru"; From 5226a25072d73559c778ec167adbcd9270189e8e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 2 Sep 2016 23:06:55 +0300 Subject: [PATCH 270/936] Add last_chance --- .../{ => topjava}/topjava_early_price.html | 0 .../mails/topjava/topjava_last_chance.html | 68 +++++++++++++++++++ .../mails/{ => topjava}/topjava_tomorrow.html | 0 3 files changed, 68 insertions(+) rename resources/mails/{ => topjava}/topjava_early_price.html (100%) create mode 100644 resources/mails/topjava/topjava_last_chance.html rename resources/mails/{ => topjava}/topjava_tomorrow.html (100%) diff --git a/resources/mails/topjava_early_price.html b/resources/mails/topjava/topjava_early_price.html similarity index 100% rename from resources/mails/topjava_early_price.html rename to resources/mails/topjava/topjava_early_price.html diff --git a/resources/mails/topjava/topjava_last_chance.html b/resources/mails/topjava/topjava_last_chance.html new file mode 100644 index 0000000..9b4a659 --- /dev/null +++ b/resources/mails/topjava/topjava_last_chance.html @@ -0,0 +1,68 @@ + + + + + + Последний шанс до 08.09 (первого урока) принять участие в проекте 'Java Enterprise (Topjava)' + +

        + Здравствуй firstName!
        +

        +

        Последний шанс принять принять участие в этом выпуске Java Enterprise (08.09-17.11)

        +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей + с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), + REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
        +Отзывы реальных участиников предыдущих выпусков
        +Демо приложения +

        + До 08.09 (первого урока) можно выполнять вступительное задание. + В группа Slack уже идет активное обсуждение вступительного задания и общение на темы трудоутройства, git, idea и пр. + После оплаты участия даю доступ ко всем материалам, учебную лицензию IDEA и приглашение в нашу группу. Следующий + выпуск будет только в начале декабря. +

        +

        + Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю + (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние + задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с + пройденной на занятии. +

        +

        + Проект постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками + изменилось очень многое. + Например только в прошлом выпуске проект дополнился JPA 2.1 EntityGraph, Jackson @JsonView, валидацией объектов REST, + локализацией в JavaScript, maven плагин перключили на Tomcat 8, зарефакторилась обработка ошибок и матчеров + тестирования. +

        +Вот основное, что можно получить из РАБОТЫ над проектом: +
          +
        • понимания технологий, как работают фреймворки, на чем они основаны, какие паттерны используются
        • +
        • навыки нахождения правильных практических решений для конкретных задач и решений конкретных проблем, из которых + состоит ежедневная работа программиста (~75% это умение выбрать из найденного на Stackoverflow) +
        • +
        • работа с инструментами: Git, IDEA, Maven, Tomcat, DB клиент, тестирование REST сервисов
        • +
        • привычка кодировать красиво
        • +
        • кругозор, навыки решения подобных задач
        • +
        +
          +
        • + Стоимость участия без проверки домашних заданий: 8300 руб.
          + сюда входят все материалы, участие в группе slack, ответы на вопросы и помощь с проектом. +
        • +
        • Стоимость полного пакета: 16500 руб. + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при + устройстве на работу). +
        • +
        • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
        • +
        • Способы оплаты
        • +
        • Курс рубля
        • +
        • Вопросы по проекту
        • +
        • Ресурсы для подготовки
        • +
        +

        Перед оплатой пожалуйста свяжись со мной в скайпе: grigory.kislin (или тел. +7 921 855 0482)

        +
        +

        Не упусти шанс значительно поднять свой уровень владения Java Enterprise и принять участие в + разработке!

        +

        +

        + \ No newline at end of file diff --git a/resources/mails/topjava_tomorrow.html b/resources/mails/topjava/topjava_tomorrow.html similarity index 100% rename from resources/mails/topjava_tomorrow.html rename to resources/mails/topjava/topjava_tomorrow.html From 98cdb9ac41b1323ae0042c36f18bc24099862c7d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 5 Sep 2016 01:48:29 +0300 Subject: [PATCH 271/936] Switch email to AWS --- src/main/java/ru/javaops/config/AppProperties.java | 10 +++++----- src/main/java/ru/javaops/service/MailService.java | 10 +++++----- src/main/java/ru/javaops/web/MailController.java | 4 ++++ src/main/resources/application.yaml | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/java/ru/javaops/config/AppProperties.java b/src/main/java/ru/javaops/config/AppProperties.java index 24b09c7..d299560 100644 --- a/src/main/java/ru/javaops/config/AppProperties.java +++ b/src/main/java/ru/javaops/config/AppProperties.java @@ -15,7 +15,7 @@ public class AppProperties { * Test email */ @NotNull - private String testEmail; + private String email; /** * Interval for update templates @@ -51,12 +51,12 @@ public void setHostUrl(String hostUrl) { this.hostUrl = hostUrl; } - public String getTestEmail() { - return testEmail; + public String getEmail() { + return email; } - public void setTestEmail(String testEmail) { - this.testEmail = testEmail; + public void setEmail(String email) { + this.email = email; } public int getCacheSeconds() { diff --git a/src/main/java/ru/javaops/service/MailService.java b/src/main/java/ru/javaops/service/MailService.java index 686cb7c..6a1bda5 100644 --- a/src/main/java/ru/javaops/service/MailService.java +++ b/src/main/java/ru/javaops/service/MailService.java @@ -74,7 +74,7 @@ public GroupResult sendToEmailList(String template, Collection emails) { public GroupResult sendToUserList(String template, Set users) { checkNotNull(template, " template must not be null"); checkNotNull(users, " users must not be null"); - users.add(getTestUser()); + users.add(getAppUser()); CompletionService completionService = new ExecutorCompletionService<>(mailExecutor); Map, String> resultMap = new HashMap<>(); users.forEach( @@ -105,8 +105,8 @@ public GroupResult sendToUserList(String template, Set users) { return groupResultBuilder.buildOK(); } - private User getTestUser() { - return userService.findByEmail(appProperties.getTestEmail()); + private User getAppUser() { + return userService.findByEmail(appProperties.getEmail()); } private void cancelAll(Map, String> resultMap) { @@ -123,7 +123,7 @@ public Future sendWithTemplateAsync(String email, String template, final } public String sendTest(String template) { - return sendToUser(template, getTestUser()); + return sendToUser(template, getAppUser()); } public String sendToUser(String template, String email) { @@ -167,7 +167,7 @@ public void send(String toEmail, String toName, String subject, String content, MimeMessageHelper message = new MimeMessageHelper(mimeMessage, "UTF-8"); try { message.setTo(new InternetAddress(toEmail, toName, "UTF-8")); - message.setFrom(mailProperties.getUsername(), "Java Online Projects"); + message.setFrom(appProperties.getEmail(), "Java Online Projects"); } catch (UnsupportedEncodingException e) { // dummy } message.setSubject(subject); diff --git a/src/main/java/ru/javaops/web/MailController.java b/src/main/java/ru/javaops/web/MailController.java index acb55f6..b4a5e55 100644 --- a/src/main/java/ru/javaops/web/MailController.java +++ b/src/main/java/ru/javaops/web/MailController.java @@ -1,6 +1,8 @@ package ru.javaops.web; import com.google.common.base.Splitter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.query.Param; import org.springframework.format.annotation.DateTimeFormat; @@ -31,6 +33,7 @@ @RestController @RequestMapping(value = "/api/mail", produces = MediaType.APPLICATION_JSON_VALUE) public class MailController { + private static final Logger LOG = LoggerFactory.getLogger(MailController.class); @Autowired private MailService mailService; @@ -89,6 +92,7 @@ private ResponseEntity sendToGroup(String template, Set users } private ResponseEntity getGroupResultResponseEntity(GroupResult groupResult) { + LOG.info(groupResult.toString()); return new ResponseEntity<>(groupResult, groupResult.isOk() ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR); } } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 0446412..7c79934 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,5 +1,5 @@ app: - test-email: javawebinar@yandex.ru + email: admin@javaops.ru mail.async: corePoolSize: 8 From 0544aa3d1b876b3e33f7e196da11ef4a594f1b7c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 5 Sep 2016 02:19:04 +0300 Subject: [PATCH 272/936] Add badges --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index f6b494c..86be906 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,10 @@ +https://api.travis-ci.org/gkislin/javaops.svg?branch=master + ## Разработка сайта для Java проектов http://javaops.ru [![Codacy Badge](https://api.codacy.com/project/badge/grade/300abd4332374403bec8fac9499b1127)](https://www.codacy.com/app/gkislin/javaops) +[![Build Status](https://travis-ci.org/gkislin/javaops.svg?branch=master)](https://travis-ci.org/gkislin/javaops) +[![Dependency Status](https://dependencyci.com/github/gkislin/javaops/badge)](https://dependencyci.com/github/gkislin/javaops) ### Стек: - Spring Boot From f9093f8231434ce84051e29d5df30936f23aa7fa Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 7 Sep 2016 01:54:06 +0300 Subject: [PATCH 273/936] Update masterjava templates --- .../mails/masterjava/masterjava_prepare.html | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 resources/mails/masterjava/masterjava_prepare.html diff --git a/resources/mails/masterjava/masterjava_prepare.html b/resources/mails/masterjava/masterjava_prepare.html new file mode 100644 index 0000000..ec2c664 --- /dev/null +++ b/resources/mails/masterjava/masterjava_prepare.html @@ -0,0 +1,29 @@ + + + + + + Новости проекта 'Многопоточность. Веб сервисы.' + +

        + Здравствуй!
        +

        +

        + Извиняюсь за паузу в старте проекта. Пока он еще зреет в голове, второе занятие планирую посвятить работе с XML (JAXB, StAX, XSD), запущу в сентябре. + Формат занятий - вебинары (с последующими записями), но возможно занятия будут проходить не каждую неделю, а по готовности. +

        +

        + Немного упростил Вступительное задание и обновил код: +осталось только реализовать метод MatrixUtil.concurrentMultiply. +Предлагаю, пока проект готовится, сделать небольшое соревнование: у кого быстрей получится (ограничение в количестве используемых потоков MainMatrix.THREAD_NUMBER). +Код шлите мне в личку в группе slack "Java Online Projects", а я буду публиковать результаты выполнения на своем компе в канале masterjava. +Предлагаю решения пока не публиковать (или меняйтесь в личке), а разберем их уже на втором уроке. +

        +

        + Можно (пока не обязательно, нужно будет перед 2м занятием) оплачивать участие: 7600 руб. без проверки ДЗ и 15000 руб. с проверкой. + У кого будет проверка, сразу буду давать свои замечания по присылаемому коду. +

        +Буду держать в курсе обновлений, +

        +

        + \ No newline at end of file From 3600b01840e856e6df655c3f66645e3dd9f31c88 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 7 Sep 2016 01:58:23 +0300 Subject: [PATCH 274/936] Update masterjava templates --- resources/mails/masterjava/masterjava_prepare.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/masterjava/masterjava_prepare.html b/resources/mails/masterjava/masterjava_prepare.html index ec2c664..8c54d07 100644 --- a/resources/mails/masterjava/masterjava_prepare.html +++ b/resources/mails/masterjava/masterjava_prepare.html @@ -10,10 +10,10 @@

        Извиняюсь за паузу в старте проекта. Пока он еще зреет в голове, второе занятие планирую посвятить работе с XML (JAXB, StAX, XSD), запущу в сентябре. - Формат занятий - вебинары (с последующими записями), но возможно занятия будут проходить не каждую неделю, а по готовности. + Формат занятий - вебинары (с последующими записями), но, возможно, занятия будут проходить не каждую неделю, а по готовности.

        - Немного упростил Вступительное задание и обновил код: + Немного упростил вступительное задание и обновил код: осталось только реализовать метод MatrixUtil.concurrentMultiply. Предлагаю, пока проект готовится, сделать небольшое соревнование: у кого быстрей получится (ограничение в количестве используемых потоков MainMatrix.THREAD_NUMBER). Код шлите мне в личку в группе slack "Java Online Projects", а я буду публиковать результаты выполнения на своем компе в канале masterjava. From 2e2c2d4dce7775728c8149efa3b13ac0721f3e65 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 7 Sep 2016 02:01:22 +0300 Subject: [PATCH 275/936] Update masterjava templates --- resources/mails/masterjava/masterjava_prepare.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/masterjava/masterjava_prepare.html b/resources/mails/masterjava/masterjava_prepare.html index 8c54d07..db7455a 100644 --- a/resources/mails/masterjava/masterjava_prepare.html +++ b/resources/mails/masterjava/masterjava_prepare.html @@ -20,8 +20,8 @@ Предлагаю решения пока не публиковать (или меняйтесь в личке), а разберем их уже на втором уроке.

        - Можно (пока не обязательно, нужно будет перед 2м занятием) оплачивать участие: 7600 руб. без проверки ДЗ и 15000 руб. с проверкой. - У кого будет проверка, сразу буду давать свои замечания по присылаемому коду. + Можно (пока не обязательно, нужно будет перед 2м занятием) оплачивать участие: 7600 руб. без проверки ДЗ и 15000 руб. с проверкой + (после оплаты отписывайтесь в skype grigory.kislin с вашим email). У кого будет проверка, сразу буду давать свои замечания по присылаемому коду.

        Буду держать в курсе обновлений,

        From eb8d4da5c3d5f6c935269ab87f6ff3c897ad1539 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 7 Sep 2016 02:02:59 +0300 Subject: [PATCH 276/936] Update masterjava templates --- resources/mails/masterjava/masterjava_prepare.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava/masterjava_prepare.html b/resources/mails/masterjava/masterjava_prepare.html index db7455a..bfaad26 100644 --- a/resources/mails/masterjava/masterjava_prepare.html +++ b/resources/mails/masterjava/masterjava_prepare.html @@ -20,7 +20,7 @@ Предлагаю решения пока не публиковать (или меняйтесь в личке), а разберем их уже на втором уроке.

        - Можно (пока не обязательно, нужно будет перед 2м занятием) оплачивать участие: 7600 руб. без проверки ДЗ и 15000 руб. с проверкой + Можно (пока не обязательно, нужно будет перед 2м занятием) оплачивать участие: 7900 руб. без проверки ДЗ и 15000 руб. с проверкой (после оплаты отписывайтесь в skype grigory.kislin с вашим email). У кого будет проверка, сразу буду давать свои замечания по присылаемому коду.

        Буду держать в курсе обновлений, From caedf120bf8fd50ab00dc344cc7c9c1eb2b671f5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 7 Sep 2016 02:19:59 +0300 Subject: [PATCH 277/936] Update topjava templates --- .../mails/topjava/topjava_tomorrow2.html | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 resources/mails/topjava/topjava_tomorrow2.html diff --git a/resources/mails/topjava/topjava_tomorrow2.html b/resources/mails/topjava/topjava_tomorrow2.html new file mode 100644 index 0000000..878f1a8 --- /dev/null +++ b/resources/mails/topjava/topjava_tomorrow2.html @@ -0,0 +1,42 @@ + + + + + + Завтра, 08.09, рассылка первого занятия проекта 'Java Enterprise (Topjava)' + +

        + Здравствуй firstName!
        +

        +

        Завтра, 08.09, рассылка первого занятия проекта Java Enterprise (08.09-17.11)

        +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей + с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), + REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
        +Отзывы реальных участиников предыдущих выпусков
        +Демо приложения +

        + Если твое решение вступительное задания не готово, можешь посмотреть на мое (через стримы и через циклы) при его разборе в материалах первого занятия. + Для этого надо оплатить учатие, после оплаты выдаю доступ сразу ко всем материалам проекта, учебную лицензию JetBrains IDEA и приглашение в группу Slack. +

        +
          +
        • + Стоимость участия без проверки домашних заданий: 8300 руб.
          + сюда входят все материалы, участие в группе slack, ответы на вопросы и помощь с проектом. +
        • +
        • Стоимость полного пакета: 16500 руб. + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при + устройстве на работу). +
        • +
        • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
        • +
        • Способы оплаты
        • +
        • Курс рубля
        • +
        • Вопросы по проекту
        • +
        • Ресурсы для подготовки
        • +
        +

        Перед оплатой пожалуйста свяжись со мной в скайпе: grigory.kislin (или тел. +7 921 855 0482)

        +
        +

        Не упусти шанс значительно поднять свой уровень владения Java Enterprise и принять участие в + разработке!

        +

        +

        + \ No newline at end of file From e50d89a6c6bc50a90ed7c04d503d24f940fa4613 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 7 Sep 2016 02:23:01 +0300 Subject: [PATCH 278/936] Update topjava templates --- resources/mails/topjava/topjava_tomorrow2.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/mails/topjava/topjava_tomorrow2.html b/resources/mails/topjava/topjava_tomorrow2.html index 878f1a8..11eb71e 100644 --- a/resources/mails/topjava/topjava_tomorrow2.html +++ b/resources/mails/topjava/topjava_tomorrow2.html @@ -16,7 +16,7 @@

        Завтра, 08.09, рассылка первого занятия прое Демо приложения

        Если твое решение вступительное задания не готово, можешь посмотреть на мое (через стримы и через циклы) при его разборе в материалах первого занятия. - Для этого надо оплатить учатие, после оплаты выдаю доступ сразу ко всем материалам проекта, учебную лицензию JetBrains IDEA и приглашение в группу Slack. + Для этого надо оплатить учатие. После оплаты выдаю доступ сразу ко всем материалам проекта, учебную лицензию JetBrains IDEA и приглашение в группу Slack.

        Перед оплатой пожалуйста свяжись со мной в скайпе: grigory.kislin (или тел. +7 921 855 0482)

        -

        Не упусти шанс значительно поднять свой уровень владения Java Enterprise и принять участие в разработке!

        From f1dc99a59cdc6cb652125456da63139f9c768521 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Sep 2016 12:05:11 +0300 Subject: [PATCH 279/936] Update topjava lessons --- resources/mails/topjava/lesson/final_fix.html | 10 +++++----- resources/mails/topjava/lesson/lesson01.html | 16 +++++++++------- resources/mails/topjava/lesson/lesson02.html | 6 +++--- resources/mails/topjava/lesson/lesson03.html | 4 ++-- resources/mails/topjava/lesson/lesson04.html | 6 +++--- resources/mails/topjava/lesson/lesson05.html | 4 ++-- resources/mails/topjava/lesson/lesson06.html | 4 ++-- resources/mails/topjava/lesson/lesson07.html | 4 ++-- resources/mails/topjava/lesson/lesson08.html | 4 ++-- resources/mails/topjava/lesson/lesson09.html | 4 ++-- resources/mails/topjava/lesson/lesson10.html | 4 ++-- resources/mails/topjava/lesson/lesson11.html | 10 +++++----- resources/mails/topjava/lesson/lesson11_add.html | 2 +- 13 files changed, 40 insertions(+), 38 deletions(-) diff --git a/resources/mails/topjava/lesson/final_fix.html b/resources/mails/topjava/lesson/final_fix.html index 9036cf2..2df3d9e 100644 --- a/resources/mails/topjava/lesson/final_fix.html +++ b/resources/mails/topjava/lesson/final_fix.html @@ -11,17 +11,17 @@ - Что надо знать о логировании прагматичному Java‑программисту - Как начинающему Java-разработчику подружиться со своей базой данных? -Выложил заключительное занятие +Выложил заключительное занятие нашего проекта.
        -Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        +Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        Обсуждение урока и HW10 в Slack #lesson11
        -Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта. +Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта.

        • Если ты решил сделать доработку проекта, отдай мне свой код на ревью. Я включу ссылку на твой репозиторий в список сделанных доработок для доступа к ним всех участников Topjava.

        • -
        • Выпускной +
        • Выпускной проект от участников с проверкой ДЗ желательно сдать на ревью до 01.09 (напомню, что лишние профили в коде и в pom.xml нужно удалить).

        • @@ -44,7 +44,7 @@
        • Все материалы проекта останутся вам доступны (в течении нового курса они будут постепенно переезжать в подпапку Topjava8). Репозиторий - topjava07 до 01.09 будет заархивирован и положен в Google Drive вместе с уроками в формате markdown. + topjava08 до 01.09 будет заархивирован и положен в Google Drive вместе с уроками в формате markdown. Для просмотра в Chrome файлов md я пользуюсь плагином Markdown Preview (нужно в его параметрах разрешить открывать файл по ссылкам) или можно использовать плагин diff --git a/resources/mails/topjava/lesson/lesson01.html b/resources/mails/topjava/lesson/lesson01.html index 24b4da7..6e9a33f 100644 --- a/resources/mails/topjava/lesson/lesson01.html +++ b/resources/mails/topjava/lesson/lesson01.html @@ -7,16 +7,18 @@

          Здравствуй firstName!

          -Поздравляю тебя с первым занятием нашего - проекта.
          +Поздравляю тебя с первым занятием нашего + проекта!

          - Здесь я буду вести проект паралельно с вами.
          - Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master. + Репозиторий на github, в котором я буду вести проект паралельно с вами.
          + Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master. В случае проблем с накаткой патчей всегда можно взять код, на который патчи будут ложиться без проблем, - например UserMealsUtil в формате Raw. Решение проблем с патчами есть в Wiki Git. + например UserMealsUtil в формате Raw. Решение проблем с патчами есть в Wiki Git. + В правилах работы с патчами на проекте написал, что делать apply patch лучше по одному, непосредственно перед видео на эту тему, а при просмотре видео сразу отслеживать все изменения кода проекта по изменению в патче. + Патчи можно закачивать архивом и распаковывать в корень (или отдельную папку) в проекте, я добавил *.patch в .gitignore, чтобы они не попадали в git.

          - Занятия буду выкладывать в каталоге doc ветки doc проекта.
          + Занятия буду выкладывать в каталоге doc ветки doc проекта.
          Если Google Drive отказывает в доступе к материалам урока:

          • попробуй выйти из google аккаунта и снова зайти;
          • @@ -25,7 +27,7 @@

          - Домашнее задание (у кого есть проверка) желательно присылать до вечера 07.06.
          + Домашнее задание (у кого есть проверка) желательно присылать до вечера 13.09.

          diff --git a/resources/mails/topjava/lesson/lesson02.html b/resources/mails/topjava/lesson/lesson02.html index 3ca130b..eac7e7b 100644 --- a/resources/mails/topjava/lesson/lesson02.html +++ b/resources/mails/topjava/lesson/lesson02.html @@ -7,11 +7,11 @@

          Здравствуй firstName!

          -Готово второе достаточно сложное занятие нашего проекта "Каркас приложения, добавление Spring".
          -После выполнения ДЗ объязательно сверься с подсказками. +Готово второе достаточно сложное занятие нашего проекта "Каркас приложения, добавление Spring".
          +После выполнения ДЗ объязательно сверься с подсказками.

          Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
          + href="https://github.com/JavaWebinar/topjava08/commits/master">в моей ветка master.
          В случае проблем с накаткой патчей смотри в Git Wiki "Patch не накатывается (предлагает merge)".

          diff --git a/resources/mails/topjava/lesson/lesson03.html b/resources/mails/topjava/lesson/lesson03.html index ad93808..4c75199 100644 --- a/resources/mails/topjava/lesson/lesson03.html +++ b/resources/mails/topjava/lesson/lesson03.html @@ -7,10 +7,10 @@

          Здравствуй firstName!

          -Третье занятие нашего проекта: JUnit тестирование и начало работы с DB.
          +Третье занятие нашего проекта: JUnit тестирование и начало работы с DB.
          Если с SQL и RDBMS не работали- прочтите основы по ссылкам.

          - Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
          + Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
          Обсуждение урока и ДЗ в slack #lesson03

          diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index aab449c..9b2ff8f 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -8,14 +8,14 @@ Здравствуй firstName!

          - Четвертое занятие нашего проекта: популирование + Четвертое занятие нашего проекта: популирование данных через Spring, JPA/ Hibernate, HSQLDB.

          Материалов по JPA огромное количество. Чтобы не утонуть- не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW4.

          Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
          + href="https://github.com/JavaWebinar/topjava08/commits/master">в моей ветка master.
          Обсуждение урока и ДЗ в slack #lesson04

          @@ -24,7 +24,7 @@

          После выполнения этого достаточно несложного HW4 можно приступать к выполнению выпускного проекта + href="https://github.com/JavaWebinar/topjava08/blob/doc/doc/lesson04.md#Выпускной-проект">выпускного проекта

          Удачи в освоении материалов и выполнении задания! diff --git a/resources/mails/topjava/lesson/lesson05.html b/resources/mails/topjava/lesson/lesson05.html index 81ef7a2..5991962 100644 --- a/resources/mails/topjava/lesson/lesson05.html +++ b/resources/mails/topjava/lesson/lesson05.html @@ -8,11 +8,11 @@ Здравствуй firstName!

          -Готово пятое занятие нашего проекта.
          +Готово пятое занятие нашего проекта.
          На следующем уроке перейдем к слою web.

          - Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          + Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          Обсуждение урока и ДЗ в slack #lesson05

          diff --git a/resources/mails/topjava/lesson/lesson06.html b/resources/mails/topjava/lesson/lesson06.html index b73c02a..92ee904 100644 --- a/resources/mails/topjava/lesson/lesson06.html +++ b/resources/mails/topjava/lesson/lesson06.html @@ -8,11 +8,11 @@ Здравствуй firstName!

          -Готово шестое занятие нашего проекта.
          +Готово шестое занятие нашего проекта.
          Начинаем изучать Spring-MVC и слой Web.

          - Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          + Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          Обсуждение урока и ДЗ в slack #lesson06

          diff --git a/resources/mails/topjava/lesson/lesson07.html b/resources/mails/topjava/lesson/lesson07.html index 527e9d9..cd9fa8f 100644 --- a/resources/mails/topjava/lesson/lesson07.html +++ b/resources/mails/topjava/lesson/lesson07.html @@ -8,11 +8,11 @@ Здравствуй firstName!

          -Выложил седьмое занятие нашего проекта.
          +Выложил седьмое занятие нашего проекта.
          REST контроллеры и тестирование контроллеров.

          - Перед накаткой патчей в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          + Перед накаткой патчей в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          Обсуждение урока и ДЗ в slack #lesson07

          diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index 4e39d60..0dea962 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -8,11 +8,11 @@ Здравствуй firstName!

          -Выложил восьмое занятие нашего проекта.
          +Выложил восьмое занятие нашего проекта.
          CSS (Bootstrap), JavaScript (jQuery + plugins), AJAX, добавление к REST контроллерам базовой авторизации.

          - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. Обсуждение урока и ДЗ в Slack #lesson08

          diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index 01a5a78..cc484fc 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -8,11 +8,11 @@ Здравствуй firstName!

          -Выложил девятое занятие нашего проекта.
          +Выложил девятое занятие нашего проекта.
          Наконец делаем настоящую авторизацию, ее тестирование и отрисовку таблицы по AJAX.

          - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. Обсуждение урока и ДЗ в Slack #lesson09

          diff --git a/resources/mails/topjava/lesson/lesson10.html b/resources/mails/topjava/lesson/lesson10.html index 9d75d02..7a558e8 100644 --- a/resources/mails/topjava/lesson/lesson10.html +++ b/resources/mails/topjava/lesson/lesson10.html @@ -8,11 +8,11 @@ Здравствуй firstName!

          -Выложил десятое занятие нашего проекта.
          +Выложил десятое занятие нашего проекта.
          На заключительное занятие остается разбор HW10, рефакторинг и деплой в heroku.

          - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. Обсуждение урока и ДЗ в Slack #lesson10

          diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index fda45ff..e97e18f 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -8,17 +8,17 @@

          Здравствуй firstName!

          -Выложил заключительное занятие +Выложил заключительное занятие нашего проекта.
          -Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          +Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          Обсуждение урока и HW10 в Slack #lesson11
          -Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта. +Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта.
          • Если ты решил сделать доработку проекта, отдай мне свой код на ревью. Я включу ссылку на твой репозиторий в список сделанных доработок для доступа к ним всех участников Topjava.

          • -
          • Выпускной +
          • Выпускной проект от участников с проверкой ДЗ желательно сдать на ревью до 01.09 (напомню, что лишние профили в коде и в pom.xml нужно удалить).

          • @@ -41,7 +41,7 @@
          • Все материалы проекта останутся вам доступны (в течении нового курса они будут постепенно переезжать в подпапку Topjava8). Репозиторий - topjava07 до 01.09 будет заархивирован и положен в Google Drive вместе с уроками в формате markdown. + topjava08 до 01.09 будет заархивирован и положен в Google Drive вместе с уроками в формате markdown. Для просмотра в Chrome файлов md я пользуюсь плагином Markdown Preview (нужно в его параметрах разрешить открывать файл по ссылкам) или можно использовать плагин diff --git a/resources/mails/topjava/lesson/lesson11_add.html b/resources/mails/topjava/lesson/lesson11_add.html index 17d7e76..228f8f4 100644 --- a/resources/mails/topjava/lesson/lesson11_add.html +++ b/resources/mails/topjava/lesson/lesson11_add.html @@ -9,7 +9,7 @@ Здравствуй firstName!

            - Сделал несколько обновлений к 11 + Сделал несколько обновлений к 11 уроку: фикс для Сафари, правка тестов и локализация в JavaScript.

              From c46ed10d2fe0c9600859c1cf4ce43da398c33e3f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Sep 2016 12:11:52 +0300 Subject: [PATCH 280/936] Update topjava lessons --- resources/mails/topjava/lesson/lesson01.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/mails/topjava/lesson/lesson01.html b/resources/mails/topjava/lesson/lesson01.html index 6e9a33f..4de4149 100644 --- a/resources/mails/topjava/lesson/lesson01.html +++ b/resources/mails/topjava/lesson/lesson01.html @@ -19,6 +19,8 @@

              Занятия буду выкладывать в каталоге doc ветки doc проекта.
              + Обсуждение занятия в ветке #lesson01 а Домашнего Задания в + #hw1 (если будем путаться в каналах, то сократим:)
              Если Google Drive отказывает в доступе к материалам урока:

              • попробуй выйти из google аккаунта и снова зайти;
              • From 9060e7c119dad1ca0f01d5b909968dc57928c0c6 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Sep 2016 22:45:34 +0300 Subject: [PATCH 281/936] Update codeclimate --- .codeclimate.yml | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index dd9c6a1..b943e97 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -6,23 +6,16 @@ engines: enabled: true config: languages: - - ruby + - java - javascript - - python - - php eslint: enabled: true fixme: enabled: true ratings: paths: - - "**.css" - - "**.inc" - "**.js" - - "**.jsx" - - "**.module" - - "**.php" - - "**.py" - - "**.rb" + - "**.java" exclude_paths: - config/ +- resources/static/ From 40644062a8dd80699fe98257b7133e3a9e92a06c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 9 Sep 2016 00:24:37 +0300 Subject: [PATCH 282/936] Update readme --- .codeclimate.yml | 21 ---- codeclimate-config.patch | 264 --------------------------------------- readme.md | 1 + 3 files changed, 1 insertion(+), 285 deletions(-) delete mode 100644 .codeclimate.yml delete mode 100644 codeclimate-config.patch diff --git a/.codeclimate.yml b/.codeclimate.yml deleted file mode 100644 index b943e97..0000000 --- a/.codeclimate.yml +++ /dev/null @@ -1,21 +0,0 @@ ---- -engines: - csslint: - enabled: true - duplication: - enabled: true - config: - languages: - - java - - javascript - eslint: - enabled: true - fixme: - enabled: true -ratings: - paths: - - "**.js" - - "**.java" -exclude_paths: -- config/ -- resources/static/ diff --git a/codeclimate-config.patch b/codeclimate-config.patch deleted file mode 100644 index 0c903b1..0000000 --- a/codeclimate-config.patch +++ /dev/null @@ -1,264 +0,0 @@ -diff --git a/.codeclimate.yml b/.codeclimate.yml -index e69de29..dd9c6a1 100644 ---- a/.codeclimate.yml -+++ b/.codeclimate.yml -@@ -0,0 +1,28 @@ -+--- -+engines: -+ csslint: -+ enabled: true -+ duplication: -+ enabled: true -+ config: -+ languages: -+ - ruby -+ - javascript -+ - python -+ - php -+ eslint: -+ enabled: true -+ fixme: -+ enabled: true -+ratings: -+ paths: -+ - "**.css" -+ - "**.inc" -+ - "**.js" -+ - "**.jsx" -+ - "**.module" -+ - "**.php" -+ - "**.py" -+ - "**.rb" -+exclude_paths: -+- config/ -diff --git a/.csslintrc b/.csslintrc -index e69de29..aacba95 100644 ---- a/.csslintrc -+++ b/.csslintrc -@@ -0,0 +1,2 @@ -+--exclude-exts=.min.css -+--ignore=adjoining-classes,box-model,ids,order-alphabetical,unqualified-attributes -diff --git a/.eslintignore b/.eslintignore -index e69de29..96212a3 100644 ---- a/.eslintignore -+++ b/.eslintignore -@@ -0,0 +1 @@ -+**/*{.,-}min.js -diff --git a/.eslintrc b/.eslintrc -index e69de29..9faa375 100644 ---- a/.eslintrc -+++ b/.eslintrc -@@ -0,0 +1,213 @@ -+ecmaFeatures: -+ modules: true -+ jsx: true -+ -+env: -+ amd: true -+ browser: true -+ es6: true -+ jquery: true -+ node: true -+ -+# http://eslint.org/docs/rules/ -+rules: -+ # Possible Errors -+ comma-dangle: [2, never] -+ no-cond-assign: 2 -+ no-console: 0 -+ no-constant-condition: 2 -+ no-control-regex: 2 -+ no-debugger: 2 -+ no-dupe-args: 2 -+ no-dupe-keys: 2 -+ no-duplicate-case: 2 -+ no-empty: 2 -+ no-empty-character-class: 2 -+ no-ex-assign: 2 -+ no-extra-boolean-cast: 2 -+ no-extra-parens: 0 -+ no-extra-semi: 2 -+ no-func-assign: 2 -+ no-inner-declarations: [2, functions] -+ no-invalid-regexp: 2 -+ no-irregular-whitespace: 2 -+ no-negated-in-lhs: 2 -+ no-obj-calls: 2 -+ no-regex-spaces: 2 -+ no-sparse-arrays: 2 -+ no-unexpected-multiline: 2 -+ no-unreachable: 2 -+ use-isnan: 2 -+ valid-jsdoc: 0 -+ valid-typeof: 2 -+ -+ # Best Practices -+ accessor-pairs: 2 -+ block-scoped-var: 0 -+ complexity: [2, 6] -+ consistent-return: 0 -+ curly: 0 -+ default-case: 0 -+ dot-location: 0 -+ dot-notation: 0 -+ eqeqeq: 2 -+ guard-for-in: 2 -+ no-alert: 2 -+ no-caller: 2 -+ no-case-declarations: 2 -+ no-div-regex: 2 -+ no-else-return: 0 -+ no-empty-label: 2 -+ no-empty-pattern: 2 -+ no-eq-null: 2 -+ no-eval: 2 -+ no-extend-native: 2 -+ no-extra-bind: 2 -+ no-fallthrough: 2 -+ no-floating-decimal: 0 -+ no-implicit-coercion: 0 -+ no-implied-eval: 2 -+ no-invalid-this: 0 -+ no-iterator: 2 -+ no-labels: 0 -+ no-lone-blocks: 2 -+ no-loop-func: 2 -+ no-magic-number: 0 -+ no-multi-spaces: 0 -+ no-multi-str: 0 -+ no-native-reassign: 2 -+ no-new-func: 2 -+ no-new-wrappers: 2 -+ no-new: 2 -+ no-octal-escape: 2 -+ no-octal: 2 -+ no-proto: 2 -+ no-redeclare: 2 -+ no-return-assign: 2 -+ no-script-url: 2 -+ no-self-compare: 2 -+ no-sequences: 0 -+ no-throw-literal: 0 -+ no-unused-expressions: 2 -+ no-useless-call: 2 -+ no-useless-concat: 2 -+ no-void: 2 -+ no-warning-comments: 0 -+ no-with: 2 -+ radix: 2 -+ vars-on-top: 0 -+ wrap-iife: 2 -+ yoda: 0 -+ -+ # Strict -+ strict: 0 -+ -+ # Variables -+ init-declarations: 0 -+ no-catch-shadow: 2 -+ no-delete-var: 2 -+ no-label-var: 2 -+ no-shadow-restricted-names: 2 -+ no-shadow: 0 -+ no-undef-init: 2 -+ no-undef: 0 -+ no-undefined: 0 -+ no-unused-vars: 0 -+ no-use-before-define: 0 -+ -+ # Node.js and CommonJS -+ callback-return: 2 -+ global-require: 2 -+ handle-callback-err: 2 -+ no-mixed-requires: 0 -+ no-new-require: 0 -+ no-path-concat: 2 -+ no-process-exit: 2 -+ no-restricted-modules: 0 -+ no-sync: 0 -+ -+ # Stylistic Issues -+ array-bracket-spacing: 0 -+ block-spacing: 0 -+ brace-style: 0 -+ camelcase: 0 -+ comma-spacing: 0 -+ comma-style: 0 -+ computed-property-spacing: 0 -+ consistent-this: 0 -+ eol-last: 0 -+ func-names: 0 -+ func-style: 0 -+ id-length: 0 -+ id-match: 0 -+ indent: 0 -+ jsx-quotes: 0 -+ key-spacing: 0 -+ linebreak-style: 0 -+ lines-around-comment: 0 -+ max-depth: 0 -+ max-len: 0 -+ max-nested-callbacks: 0 -+ max-params: 0 -+ max-statements: [2, 30] -+ new-cap: 0 -+ new-parens: 0 -+ newline-after-var: 0 -+ no-array-constructor: 0 -+ no-bitwise: 0 -+ no-continue: 0 -+ no-inline-comments: 0 -+ no-lonely-if: 0 -+ no-mixed-spaces-and-tabs: 0 -+ no-multiple-empty-lines: 0 -+ no-negated-condition: 0 -+ no-nested-ternary: 0 -+ no-new-object: 0 -+ no-plusplus: 0 -+ no-restricted-syntax: 0 -+ no-spaced-func: 0 -+ no-ternary: 0 -+ no-trailing-spaces: 0 -+ no-underscore-dangle: 0 -+ no-unneeded-ternary: 0 -+ object-curly-spacing: 0 -+ one-var: 0 -+ operator-assignment: 0 -+ operator-linebreak: 0 -+ padded-blocks: 0 -+ quote-props: 0 -+ quotes: 0 -+ require-jsdoc: 0 -+ semi-spacing: 0 -+ semi: 0 -+ sort-vars: 0 -+ space-after-keywords: 0 -+ space-before-blocks: 0 -+ space-before-function-paren: 0 -+ space-before-keywords: 0 -+ space-in-parens: 0 -+ space-infix-ops: 0 -+ space-return-throw-case: 0 -+ space-unary-ops: 0 -+ spaced-comment: 0 -+ wrap-regex: 0 -+ -+ # ECMAScript 6 -+ arrow-body-style: 0 -+ arrow-parens: 0 -+ arrow-spacing: 0 -+ constructor-super: 0 -+ generator-star-spacing: 0 -+ no-arrow-condition: 0 -+ no-class-assign: 0 -+ no-const-assign: 0 -+ no-dupe-class-members: 0 -+ no-this-before-super: 0 -+ no-var: 0 -+ object-shorthand: 0 -+ prefer-arrow-callback: 0 -+ prefer-const: 0 -+ prefer-reflect: 0 -+ prefer-spread: 0 -+ prefer-template: 0 -+ require-yield: 0 diff --git a/readme.md b/readme.md index 86be906..a0c3499 100644 --- a/readme.md +++ b/readme.md @@ -5,6 +5,7 @@ https://api.travis-ci.org/gkislin/javaops.svg?branch=master [![Codacy Badge](https://api.codacy.com/project/badge/grade/300abd4332374403bec8fac9499b1127)](https://www.codacy.com/app/gkislin/javaops) [![Build Status](https://travis-ci.org/gkislin/javaops.svg?branch=master)](https://travis-ci.org/gkislin/javaops) [![Dependency Status](https://dependencyci.com/github/gkislin/javaops/badge)](https://dependencyci.com/github/gkislin/javaops) +[![codebeat badge](https://codebeat.co/badges/37249a90-da08-4f9b-804f-2197296f91ff)](https://codebeat.co/projects/github-com-gkislin-javaops) ### Стек: - Spring Boot From 38cd5ab4706c7453a641a13928d27edb7f92dc84 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 9 Sep 2016 16:26:08 +0300 Subject: [PATCH 283/936] Update topjava info --- resources/mails/topjava_info.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index f2d7c20..e558046 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -123,7 +123,7 @@

                На проекте

              • Курс рубля

              -

              Расписание занятий проекта:

              +

              Расписание занятий текущего проекта (следующий стартует в начале декабря, буду делать рассылку):

              Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Домашние задания подобранны по темам занятия и требуют реализации функциональности, схожей с пройденной на занятии.

                01.09: Старт проекта

              • Сбор группы в Slack и Skype
              • From 08c74f4531e83dce5d0f817e35539471c3f4c9bd Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 15 Sep 2016 18:13:53 +0300 Subject: [PATCH 284/936] Update lesson02 --- resources/mails/topjava/lesson/lesson02.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson02.html b/resources/mails/topjava/lesson/lesson02.html index eac7e7b..5cc9b0d 100644 --- a/resources/mails/topjava/lesson/lesson02.html +++ b/resources/mails/topjava/lesson/lesson02.html @@ -16,7 +16,7 @@ Wiki "Patch не накатывается (предлагает merge)".

                - Домашнее задание (у кого есть проверка) желательно присылать до вечера 14.06
                + Домашнее задание (у кого есть проверка) желательно присылать до вечера 20.09
                Удачи в освоении материалов и выполнении этого важного задания!

                From 08f24020b50f4772a31804c1900a430170be4635 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 16 Sep 2016 22:48:40 +0300 Subject: [PATCH 285/936] Add payment --- resources/payment.html | 72 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 resources/payment.html diff --git a/resources/payment.html b/resources/payment.html new file mode 100644 index 0000000..ba384e5 --- /dev/null +++ b/resources/payment.html @@ -0,0 +1,72 @@ + + + + Реквизиты оплаты + + + + + + +

                +
                +

                Курс рубля

                +

                Реквизиты оплаты

                + + +
                + + \ No newline at end of file From c998d497230abbc9091190450ba9634a82c29199 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 16 Sep 2016 22:53:52 +0300 Subject: [PATCH 286/936] Add payment --- resources/payment.html | 2 ++ resources/story.html | 2 ++ 2 files changed, 4 insertions(+) diff --git a/resources/payment.html b/resources/payment.html index ba384e5..3d8235d 100644 --- a/resources/payment.html +++ b/resources/payment.html @@ -68,5 +68,7 @@

                Реквизиты оплаты

                +Skype + \ No newline at end of file diff --git a/resources/story.html b/resources/story.html index db01747..6d5bb33 100644 --- a/resources/story.html +++ b/resources/story.html @@ -45,5 +45,7 @@

                Каждое утро я просыпался с
                Ждем истории по окончанию испытательных сроков: Тимур, Андрей, Дмитрий, Евгений, Алексей, Азер, ... +
                Skype + \ No newline at end of file From e8b43c4427f9599250996e5f77cb5b8220d44dc4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 16 Sep 2016 22:56:28 +0300 Subject: [PATCH 287/936] Update index --- resources/view/fragments.html | 4 ++++ resources/view/index.html | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/view/fragments.html b/resources/view/fragments.html index ec6dadc..e5579f6 100644 --- a/resources/view/fragments.html +++ b/resources/view/fragments.html @@ -66,4 +66,8 @@ + + Skype + + \ No newline at end of file diff --git a/resources/view/index.html b/resources/view/index.html index 3aa6863..2a5b318 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -134,8 +134,8 @@

                Тестовое интервью

                -Skype + \ No newline at end of file From 1bb4483c18ca48d333f7cb95a550c71560661de6 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 17 Sep 2016 13:18:26 +0300 Subject: [PATCH 288/936] Update index --- resources/view/index.html | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index 2a5b318..7e1c9a1 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -21,7 +21,8 @@ grigory.kislin - + @@ -110,29 +111,35 @@

                Участие в разработке Spring/JPA Enterprise приложе

              -
              +

              Наши истории (делимся опытом и успехом)


              Стажировка на Java Enterprise:

              -

              Старт 01.09.2016 (по четвергам с начала сентября).

              -

              Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins
              +

              Старт в начале декабря.

              +

              Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins. Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе - ролей

              + ролей
              + Приложения проекта, задеплоенное в Heroku (будет у каждого участника) +


              Проект "Многопоточность. Веб сервисы."

              -

              Старт в конце августа/начале сентября.

              -

              Разработка полнофункционального многомодульного Maven проекта с использованием SOAP (JAX-WS) и REST (JAX-RS)

              +

              Старт в конце сентября.

              +

              Разработка полнофункционального многомодульного Maven проекта с использованием SOAP (JAX-WS) и REST + (JAX-RS)


              Курс JavaSE + Web

              -

              Разработка WEB-приложения, основываясь на базовых темах курса: объектная модель, коллекции, система ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, SQL, персистентность в базу данных (PostgreSQL), сервлеты, JSP/JSTL, веб-контейнер Tomcat, HTML, модульные тесты JUnit, java.util.Logging, система контроля версий Git. - Деплой полученного приложения в облачный сервис Heroku.

              +

              Разработка WEB-приложения, основываясь на базовых темах курса: объектная модель, коллекции, система + ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, SQL, персистентность в базу данных + (PostgreSQL), сервлеты, JSP/JSTL, веб-контейнер Tomcat, HTML, модульные тесты JUnit, java.util.Logging, + система контроля версий Git. + Деплой полученного приложения в облачный сервис Heroku.


              Техническое собеседование Java разработчик

              Тестовое интервью

              -

              Core Java 8, OOP, JMM/Concurrency, Servlet/JSP, JPA, Spring MVC, REST, SQL, Maven

              -
              - +

              Core Java 8, OOP, JMM/Concurrency, Servlet/JSP, JPA, Spring MVC, REST, SQL, Maven

              + + From e36e7cb9427c2f7fe89e502290494a78a173de01 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 17 Sep 2016 13:20:51 +0300 Subject: [PATCH 289/936] Fix index --- resources/view/index.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index 7e1c9a1..a5a8614 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -21,8 +21,7 @@ grigory.kislin - + @@ -111,7 +110,7 @@

              Участие в разработке Spring/JPA Enterprise приложе

            - +

            Наши истории (делимся опытом и успехом)


            Стажировка на Java Enterprise:

            From f661d3d71d3bae10c23cbffe6a8489695a8d9b6b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 19 Sep 2016 01:03:38 +0300 Subject: [PATCH 290/936] Add masterjava mail --- resources/mails/masterjava/2_lesson.html | 42 ++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 resources/mails/masterjava/2_lesson.html diff --git a/resources/mails/masterjava/2_lesson.html b/resources/mails/masterjava/2_lesson.html new file mode 100644 index 0000000..11095f7 --- /dev/null +++ b/resources/mails/masterjava/2_lesson.html @@ -0,0 +1,42 @@ + + + + + + Новости проекта 'Многопоточность. XML. Веб сервисы.' + +

            + Здравствуй!
            +

            +

            + Рад сообщить, что 23.09 (пятница) в 20.00 будет 2-е занятие masterjava: +

              +
            • разбор вступительного задания
            • +
            • прикручивание Microbenchmarking Framework JMH (от Алексея Шипилева)
            • +
            • XML технологии: XML. XSD, XPath, XSL(T) в Java: DOM, SAX, StAX, XSLT
            • +
            • домашнее задание по Java XML
            • +
            +Вебинар будет вестись в Adobe Connect (диагностика подключения) с одновременной записью. Удобно, что участники вебинара могут общаться голосом и в чате и +запись доступна сразу после вебинара. +Ограничение- 25 человек, включая меня. Те. после 24 человека можно будет участвовать по записям занятий и в слаке (записи +планирую редактировать и выкладывать в Google Doc), сейчас нас 9. +

            + Жду решений вступительное задание от всех для сравнивания скорости. + У кого есть проверка - обязательно, буду делать разбор. + Код шлите мне в личку в группе slack Java Online Projects, а я буду публиковать результаты выполнения на своем + компе в канале masterjava. +

            +

            +Если тебя еще нет в этой группе slak, проверь пожалуйста свои данные регистрационной формы +(если ссылка не работает и есть желание принять участие в masterjava - свяжись со мной в skype: grigory.kislin). +Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут увидеть твои контактные данные в статистике. +После сохранения формы на почту должно прийти приглашение в эту группу. Пока, думаю, будем общаться там, но по потребности можно будет создать новую. +

            +

            + Перед 2-м занятием нужно оплатить участие: 7900 руб. без проверки ДЗ и 15000 руб. с проверкой + (после оплаты отписывайтесь в skype grigory.kislin с вашим email). Если важно участие в вебинаре - поинтересуйтесь в skype текущим номером. +

            +Жду ваших вступительных ДЗ и до встречи на проекте, +

            +

            + \ No newline at end of file From a18a7b9fb1031b819ad76d6084646892cddfdaae Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 19 Sep 2016 01:06:24 +0300 Subject: [PATCH 291/936] Fix masterjava mail --- resources/mails/masterjava/2_lesson.html | 34 +++++++++++++++--------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/resources/mails/masterjava/2_lesson.html b/resources/mails/masterjava/2_lesson.html index 11095f7..99a2c90 100644 --- a/resources/mails/masterjava/2_lesson.html +++ b/resources/mails/masterjava/2_lesson.html @@ -8,33 +8,43 @@

            Здравствуй!

            -

            - Рад сообщить, что 23.09 (пятница) в 20.00 будет 2-е занятие masterjava: +Рад сообщить, что 23.09 (пятница) в 20.00 будет 2-е занятие masterjava:

            • разбор вступительного задания
            • прикручивание Microbenchmarking Framework JMH (от Алексея Шипилева)
            • XML технологии: XML. XSD, XPath, XSL(T) в Java: DOM, SAX, StAX, XSLT
            • домашнее задание по Java XML
            -Вебинар будет вестись в Adobe Connect (диагностика подключения) с одновременной записью. Удобно, что участники вебинара могут общаться голосом и в чате и +Вебинар будет вестись в Adobe Connect (диагностика + подключения) с одновременной записью. Удобно, что участники вебинара могут общаться голосом и в чате и запись доступна сразу после вебинара. -Ограничение- 25 человек, включая меня. Те. после 24 человека можно будет участвовать по записям занятий и в слаке (записи +Ограничение- 25 человек, включая меня. Те. после 24 человека можно будет участвовать по записям занятий и в слаке +(записи планирую редактировать и выкладывать в Google Doc), сейчас нас 9.

            - Жду решений вступительное задание от всех для сравнивания скорости. + Жду решений вступительное задание от всех + для сравнивания скорости. У кого есть проверка - обязательно, буду делать разбор. - Код шлите мне в личку в группе slack Java Online Projects, а я буду публиковать результаты выполнения на своем + Код шлите мне в личку в группе slack Java Online Projects, а я буду + публиковать результаты выполнения на своем компе в канале masterjava.

            -Если тебя еще нет в этой группе slak, проверь пожалуйста свои данные регистрационной формы -(если ссылка не работает и есть желание принять участие в masterjava - свяжись со мной в skype: grigory.kislin). -Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут увидеть твои контактные данные в статистике. -После сохранения формы на почту должно прийти приглашение в эту группу. Пока, думаю, будем общаться там, но по потребности можно будет создать новую. + Если тебя еще нет в этой группе slak, проверь пожалуйста свои данные регистрационной + формы + (если ссылка не работает и есть желание принять участие в masterjava - свяжись со мной в skype: + grigory.kislin). + Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут увидеть + твои контактные данные в статистике. + После сохранения формы на почту должно прийти приглашение в эту группу. Пока, думаю, будем общаться там, но по + потребности можно будет создать новую.

            - Перед 2-м занятием нужно оплатить участие: 7900 руб. без проверки ДЗ и 15000 руб. с проверкой - (после оплаты отписывайтесь в skype grigory.kislin с вашим email). Если важно участие в вебинаре - поинтересуйтесь в skype текущим номером. + Перед 2-м занятием нужно оплатить участие: 7900 руб. без + проверки ДЗ и 15000 руб. с проверкой + (после оплаты отписывайтесь в skype grigory.kislin с вашим email). Если важно участие в вебинаре - + поинтересуйтесь в skype текущим номером.

            Жду ваших вступительных ДЗ и до встречи на проекте,

            From bf4164966d8d5d0620df377832a11855abdb5334 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 19 Sep 2016 01:13:58 +0300 Subject: [PATCH 292/936] Fix masterjava mail --- resources/mails/masterjava/2_lesson.html | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/resources/mails/masterjava/2_lesson.html b/resources/mails/masterjava/2_lesson.html index 99a2c90..31a76c2 100644 --- a/resources/mails/masterjava/2_lesson.html +++ b/resources/mails/masterjava/2_lesson.html @@ -3,7 +3,7 @@ - Новости проекта 'Многопоточность. XML. Веб сервисы.' + Старт проекта 'Многопоточность. XML. Веб сервисы.'

            Здравствуй!
            @@ -15,17 +15,20 @@

          • XML технологии: XML. XSD, XPath, XSL(T) в Java: DOM, SAX, StAX, XSLT
          • домашнее задание по Java XML
          +План занятий еще будет уточняться в процессе проведения проекта. +

          Вебинар будет вестись в Adobe Connect (диагностика подключения) с одновременной записью. Удобно, что участники вебинара могут общаться голосом и в чате и запись доступна сразу после вебинара. -Ограничение- 25 человек, включая меня. Те. после 24 человека можно будет участвовать по записям занятий и в слаке +Ограничение: 25 человек, включая меня. Т.е. после 24-го человека можно будет участвовать по записям занятий и в слаке (записи планирую редактировать и выкладывать в Google Doc), сейчас нас 9. +

          Жду решений вступительное задание от всех для сравнивания скорости. - У кого есть проверка - обязательно, буду делать разбор. - Код шлите мне в личку в группе slack Java Online Projects, а я буду + У кого есть проверка буду делать разбор. + Сылку на github шлите мне в личку в группе slack Java Online Projects, а я буду публиковать результаты выполнения на своем компе в канале masterjava.

          @@ -37,13 +40,13 @@ grigory.kislin). Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут увидеть твои контактные данные в статистике. - После сохранения формы на почту должно прийти приглашение в эту группу. Пока, думаю, будем общаться там, но по - потребности можно будет создать новую. + После сохранения формы на почту должно прийти приглашение в эту группу. Пока, думаю, будем общаться там, но, по + потребности, можно будет создать новую.

          Перед 2-м занятием нужно оплатить участие: 7900 руб. без проверки ДЗ и 15000 руб. с проверкой - (после оплаты отписывайтесь в skype grigory.kislin с вашим email). Если важно участие в вебинаре - + (после оплаты отписывайтесь в skype grigory.kislin с вашим email). Если важно участие в вебинаре, перед оплатой поинтересуйтесь в skype текущим номером.

          Жду ваших вступительных ДЗ и до встречи на проекте, From c70fe54b84571fec7d509348c2ce11eb5e61f1ae Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 19 Sep 2016 01:16:16 +0300 Subject: [PATCH 293/936] Fix masterjava mail --- resources/mails/masterjava/2_lesson.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava/2_lesson.html b/resources/mails/masterjava/2_lesson.html index 31a76c2..4047487 100644 --- a/resources/mails/masterjava/2_lesson.html +++ b/resources/mails/masterjava/2_lesson.html @@ -47,7 +47,7 @@ Перед 2-м занятием нужно оплатить участие: 7900 руб. без проверки ДЗ и 15000 руб. с проверкой (после оплаты отписывайтесь в skype grigory.kislin с вашим email). Если важно участие в вебинаре, перед оплатой - поинтересуйтесь в skype текущим номером. + поинтересуйся в skype текущим номером.

          Жду ваших вступительных ДЗ и до встречи на проекте,

          From ee214d52cdc119d7183255651054fa12286f2e1d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 19 Sep 2016 01:35:35 +0300 Subject: [PATCH 294/936] Fix fragments --- resources/view/fragments.html | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/view/fragments.html b/resources/view/fragments.html index e5579f6..7f4e857 100644 --- a/resources/view/fragments.html +++ b/resources/view/fragments.html @@ -33,7 +33,6 @@ - From 804994378581829c16571b6a26b21a226be5b84b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 19 Sep 2016 01:37:13 +0300 Subject: [PATCH 295/936] Fix fragments --- resources/view/fragments.html | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/view/fragments.html b/resources/view/fragments.html index 7f4e857..42bd16e 100644 --- a/resources/view/fragments.html +++ b/resources/view/fragments.html @@ -5,7 +5,6 @@ - From bdef51c0e5709f280c0b1821e6037fe1f9549b86 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 01:32:47 +0300 Subject: [PATCH 296/936] Add masterjava reminder --- resources/habr/religion.html | 12 +++++++++ resources/mails/masterjava/reminder.html | 34 ++++++++++++++++++++++++ resources/view/participation.html | 8 ++++++ 3 files changed, 54 insertions(+) create mode 100644 resources/habr/religion.html create mode 100644 resources/mails/masterjava/reminder.html diff --git a/resources/habr/religion.html b/resources/habr/religion.html new file mode 100644 index 0000000..5aedb33 --- /dev/null +++ b/resources/habr/religion.html @@ -0,0 +1,12 @@ + + + Религия для программиста. + +Привет, Хабр!
          +Тема достаточно необычная для habr, но хочу написать именно об этом: как программисту перестать беспокоится и начать жить в соглагии с собой и с +тем безграничным, которое имеет много названий и частью которого мы все являемся. +


          +Для начала, как истинный программист, забил в поиск Google и был удивлен, но совсем не первый, кто пишет на эту тему:) +
          +Про себя скажу, что в определенный момент (после института), решил бросить программирования из-за выгорания и невозможности контролировать себя. Когда сидишь 2-3 недели без отрыва от клавиатуры и экрана, +наступает пересыщение и нежелание вообще подходить к нему в течении следующей недели. \ No newline at end of file diff --git a/resources/mails/masterjava/reminder.html b/resources/mails/masterjava/reminder.html new file mode 100644 index 0000000..9afc758 --- /dev/null +++ b/resources/mails/masterjava/reminder.html @@ -0,0 +1,34 @@ + + + + + + ЗАВТРА старт проекта 'Многопоточность. XML. Веб сервисы.' + +

          + Здравствуй!
          +

          +Напомню, что ЗАВТРА, 23.09 (пятница) в 20.00 будет 2-е занятие masterjava: +
            +
          • разбор вступительного задания
          • +
          • прикручивание Microbenchmarking Framework JMH (от Алексея Шипилева)
          • +
          • XML технологии: XML. XSD, XPath, XSL(T) в Java: DOM, SAX, StAX, XSLT
          • +
          • домашнее задание по Java XML
          • +
          +

          + Места есть (пока нас 15). Если есть желание заапгрейдить свой java скиллз - поторопись с оплатой:
          + 7900 руб. без проверки ДЗ и 15000 руб. с проверкой + (после оплаты отписывайтесь в skype grigory.kislin с вашим email). +

          + +

          +Вебинар будет вестись в Adobe Connect (диагностика + подключения) с одновременной записью. Удобно, что участники вебинара могут общаться голосом и в чате и +запись доступна сразу после вебинара. +Ограничение: 25 человек, включая меня. Т.е. после 24-го человека можно будет участвовать по записям занятий и в слаке +(записи планирую редактировать и выкладывать в Google Doc). +

          +Жду ваших вступительных ДЗ и до встречи на проекте, +

          +

          + \ No newline at end of file diff --git a/resources/view/participation.html b/resources/view/participation.html index 22185cc..d80b2e3 100644 --- a/resources/view/participation.html +++ b/resources/view/participation.html @@ -83,6 +83,14 @@

          Регист + + + + + + + + From 0f13868e3afd559f531409cededdd4e2475d1135 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 01:36:39 +0300 Subject: [PATCH 297/936] Update masterjava reminder --- resources/mails/masterjava/reminder.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava/reminder.html b/resources/mails/masterjava/reminder.html index 9afc758..d21c506 100644 --- a/resources/mails/masterjava/reminder.html +++ b/resources/mails/masterjava/reminder.html @@ -28,7 +28,7 @@ Ограничение: 25 человек, включая меня. Т.е. после 24-го человека можно будет участвовать по записям занятий и в слаке (записи планирую редактировать и выкладывать в Google Doc).

          -Жду ваших вступительных ДЗ и до встречи на проекте, +Надеюсь встретится на проекте,

          \ No newline at end of file From b59850bb6899b4adb4d2fda29aabe90b18ec3954 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 02:48:36 +0300 Subject: [PATCH 298/936] Add masterjava participate --- resources/mails/masterjava/participate.html | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 resources/mails/masterjava/participate.html diff --git a/resources/mails/masterjava/participate.html b/resources/mails/masterjava/participate.html new file mode 100644 index 0000000..ed039c6 --- /dev/null +++ b/resources/mails/masterjava/participate.html @@ -0,0 +1,41 @@ + + + + + + ЗАВТРА старт проекта 'Многопоточность. XML. Веб сервисы.' + +

          + Здравствуй!
          +

          +Напомню, что ЗАВТРА, 23.09 (пятница) в 20.00 будет 2-е занятие masterjava: +
            +
          • разбор вступительного задания
          • +
          • прикручивание Microbenchmarking Framework JMH (от Алексея Шипилева)
          • +
          • XML технологии: XML. XSD, XPath, XSL(T) в Java: DOM, SAX, StAX, XSLT
          • +
          • домашнее задание по Java XML
          • +
          +

          + Ссылка на комнату вебинара.
          + Логин: ваш email, пароль: masterjava23. Доступа туда пока нет, дам в пятницу. +

          +

          Настрой свой проект, чтобы забирать мои + изменения и пушить в свой репозиторий.. + Я оптимизировал однопоточную реализацию и пофиксил MailService- обновись. +

          +

          + У кого есть проверка ДЗ: жду решения вступительных заданий. Для остальных - если твое решение показывает результаты + лучше, чем + singleThreadMultiplyOpt, + шлите мне ссылку на репозиторий в личку JavaOPs slack - померяемся милисекундами:) +

          +

          + Вебинар будет вестись в Adobe Connect (диагностика + подключения) с одновременной записью. Удобно, что участники вебинара могут общаться голосом и в чате и + запись доступна сразу после вебинара (записи планирую редактировать и выкладывать в Google Doc, но не сразу). +

          +До встречи на проекте, +

          +

          + \ No newline at end of file From 7a1413ded22caeb2529b6a47d5da28fb6f4022d5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 02:51:09 +0300 Subject: [PATCH 299/936] Update masterjava participate --- resources/mails/masterjava/participate.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/mails/masterjava/participate.html b/resources/mails/masterjava/participate.html index ed039c6..0ddc9b4 100644 --- a/resources/mails/masterjava/participate.html +++ b/resources/mails/masterjava/participate.html @@ -17,11 +17,12 @@

        Ссылка на комнату вебинара.
        - Логин: ваш email, пароль: masterjava23. Доступа туда пока нет, дам в пятницу. + Логин: ваш email, пароль: masterjava23.
        + Доступа туда пока нет, дам в пятницу.

        Настрой свой проект, чтобы забирать мои - изменения и пушить в свой репозиторий.. - Я оптимизировал однопоточную реализацию и пофиксил MailService- обновись. + изменения и пушить в свой репозиторий.
        + Я оптимизировал однопоточную реализацию и пофиксил MailService - обновись.

        У кого есть проверка ДЗ: жду решения вступительных заданий. Для остальных - если твое решение показывает результаты From f53dc8126b7e27cac30801ad253a47237de8046f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 02:52:32 +0300 Subject: [PATCH 300/936] Update masterjava participate --- resources/mails/masterjava/participate.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava/participate.html b/resources/mails/masterjava/participate.html index 0ddc9b4..843378f 100644 --- a/resources/mails/masterjava/participate.html +++ b/resources/mails/masterjava/participate.html @@ -17,7 +17,7 @@

      Ссылка на комнату вебинара.
      - Логин: ваш email, пароль: masterjava23.
      + Логин: твой email, пароль: masterjava23.
      Доступа туда пока нет, дам в пятницу.

      Настрой свой проект, чтобы забирать мои From 407e6b3832127145b302236bc018a0cb54b97999 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 13:25:04 +0300 Subject: [PATCH 301/936] Update lesson3 --- resources/mails/topjava/lesson/lesson03.html | 27 +++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson03.html b/resources/mails/topjava/lesson/lesson03.html index 4c75199..1c4f6b8 100644 --- a/resources/mails/topjava/lesson/lesson03.html +++ b/resources/mails/topjava/lesson/lesson03.html @@ -7,15 +7,28 @@

      Здравствуй firstName!

      -Третье занятие нашего проекта: JUnit тестирование и начало работы с DB.
      +Третье занятие нашего проекта: JUnit + тестирование и начало работы с DB.
      Если с SQL и RDBMS не работали- прочтите основы по ссылкам.

      - Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
      - Обсуждение урока и ДЗ в slack #lesson03 -

      -

      - Домашнее задание (у кого есть проверка) желательно присылать до вечера 21.06.
      -

      + Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
      + Обсуждение урока в slack #lesson03, HW3 в #hw3. +

      +

      Приглашаю тебя в общую группу Slack Java Online Projects, где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, + вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) + По каждой теме сделан свой канал. Проверь свои контактные + данные. + Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут + увидеть твой город и skype в списке, а ты сможешь найти там разработчиков из своего города. + После сохранения формы на почту должно прийти приглашение в группу Slack и откроется ссылка на список + участников, отсортированный по городам.

      +

      +

      + Домашнее задание (у кого есть проверка) желательно присылать до вечера 27.09.
      +

      From 0e15e5579433cdae298a5ce44d07d97ebd3ac40f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 13:27:23 +0300 Subject: [PATCH 302/936] Update lesson3 --- resources/mails/topjava/lesson/lesson03.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson03.html b/resources/mails/topjava/lesson/lesson03.html index 1c4f6b8..42b393c 100644 --- a/resources/mails/topjava/lesson/lesson03.html +++ b/resources/mails/topjava/lesson/lesson03.html @@ -24,7 +24,7 @@ Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут увидеть твой город и skype в списке, а ты сможешь найти там разработчиков из своего города. После сохранения формы на почту должно прийти приглашение в группу Slack и откроется ссылка на список - участников, отсортированный по городам.

      + участников, отсортированный по городам.

      Домашнее задание (у кого есть проверка) желательно присылать до вечера 27.09.
      From 5ec103c18c63a17c33527c2d18ba12fbfe061a81 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 13:57:46 +0300 Subject: [PATCH 303/936] Fix statistic --- src/main/java/ru/javaops/repository/UserRepository.java | 9 +++++++-- src/main/java/ru/javaops/service/UserService.java | 3 ++- src/main/java/ru/javaops/service/UserServiceImpl.java | 8 +++++++- src/main/java/ru/javaops/web/PageController.java | 8 ++++---- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/ru/javaops/repository/UserRepository.java b/src/main/java/ru/javaops/repository/UserRepository.java index a58ab8a..8b19fde 100644 --- a/src/main/java/ru/javaops/repository/UserRepository.java +++ b/src/main/java/ru/javaops/repository/UserRepository.java @@ -9,6 +9,7 @@ import ru.javaops.model.User; import ru.javaops.to.UserStat; +import java.util.List; import java.util.Set; @Transactional(readOnly = true) @@ -38,6 +39,10 @@ public interface UserRepository extends JpaRepository { @Query("SELECT u FROM User u WHERE LOWER(u.location) LIKE CONCAT('%', :location, '%')") Set findByLocation(@Param("location") String location); - @Query("SELECT new ru.javaops.to.UserStat(u.fullName, u.email, u.location, u.aboutMe, u.skype) FROM User u WHERE u.statsAgree=TRUE ORDER BY u.location") - Set findAllForStats(); + @Query("SELECT new ru.javaops.to.UserStat(u.fullName, u.email, u.location, u.aboutMe, u.skype) FROM User u " + + "WHERE u.statsAgree=TRUE " + + "AND u.fullName IS NOT NULL " + + "AND u.location IS NOT NULL " + + "ORDER BY LOWER(u.location)") + List findAllForStats(); } \ No newline at end of file diff --git a/src/main/java/ru/javaops/service/UserService.java b/src/main/java/ru/javaops/service/UserService.java index f10b4c9..157f70b 100644 --- a/src/main/java/ru/javaops/service/UserService.java +++ b/src/main/java/ru/javaops/service/UserService.java @@ -6,6 +6,7 @@ import ru.javaops.to.UserStat; import ru.javaops.to.UserToExt; +import java.util.List; import java.util.Set; /** @@ -36,5 +37,5 @@ public interface UserService { Set findByLocation(String location); - Set findAllForStats(); + List findAllForStats(); } diff --git a/src/main/java/ru/javaops/service/UserServiceImpl.java b/src/main/java/ru/javaops/service/UserServiceImpl.java index 8a475cd..ed4018c 100644 --- a/src/main/java/ru/javaops/service/UserServiceImpl.java +++ b/src/main/java/ru/javaops/service/UserServiceImpl.java @@ -16,6 +16,7 @@ import ru.javaops.to.UserToExt; import ru.javaops.util.UserUtil; +import java.util.List; import java.util.Set; import static com.google.common.base.Preconditions.checkNotNull; @@ -46,6 +47,7 @@ public LoggedUser loadUserByUsername(final String email) { } + @Override @Transactional public void deleteByEmail(String email) { log.debug("Delete user " + email); @@ -62,6 +64,7 @@ public User findByEmail(String email) { return userRepository.findByEmail(email.toLowerCase()); } + @Override public User findExistedByEmail(String email) { return checkNotNull(findByEmail(email), "Пользователь %s не найден", email); } @@ -86,10 +89,12 @@ public void save(User u) { userRepository.save(u); } + @Override public User findByEmailAndGroupId(String email, int groupId) { return userRepository.findByEmailAndGroupId(email.toLowerCase(), groupId); } + @Override public User findByEmailAndProjectId(String email, int projectId) { return userRepository.findByEmailAndProjectId(email.toLowerCase(), projectId); } @@ -108,7 +113,8 @@ public Set findByLocation(String location) { return userRepository.findByLocation(location.toLowerCase()); } - public Set findAllForStats() { + @Override + public List findAllForStats() { return userRepository.findAllForStats(); } } diff --git a/src/main/java/ru/javaops/web/PageController.java b/src/main/java/ru/javaops/web/PageController.java index 4592857..92ea7c2 100644 --- a/src/main/java/ru/javaops/web/PageController.java +++ b/src/main/java/ru/javaops/web/PageController.java @@ -8,7 +8,7 @@ import ru.javaops.service.UserService; import ru.javaops.to.UserStat; -import java.util.Set; +import java.util.List; import static org.springframework.web.bind.annotation.RequestMethod.GET; @@ -20,9 +20,9 @@ public class PageController { @RequestMapping(value = "/users", method = GET) public ModelAndView usersInfo(@RequestParam("key") String key, @RequestParam("email") String email) { - Set userSet = userService.findAllForStats(); - return (userSet.stream().filter(u -> u.getEmail().equals(email)).findAny().isPresent()) ? - new ModelAndView("userList", "users", userSet) : + List userList = userService.findAllForStats(); + return (userList.stream().filter(u -> u.getEmail().equals(email)).findAny().isPresent()) ? + new ModelAndView("userList", "users", userList) : new ModelAndView("statsForbidden"); } } From 8b6e3288cdd5fc99d01b6c02979a9679e52713bb Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 14:15:51 +0300 Subject: [PATCH 304/936] Fix bootstrap --- resources/static/bootstrap-3.3.6/css/bootstrap.min.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/static/bootstrap-3.3.6/css/bootstrap.min.css b/resources/static/bootstrap-3.3.6/css/bootstrap.min.css index 4cf729e..243529a 100644 --- a/resources/static/bootstrap-3.3.6/css/bootstrap.min.css +++ b/resources/static/bootstrap-3.3.6/css/bootstrap.min.css @@ -2,5 +2,4 @@ * Bootstrap v3.3.6 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file From be4f6dfbdc054b7c481b21bd0ab1363b92918085 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 14:38:25 +0300 Subject: [PATCH 305/936] Fix userList --- resources/view/userList.html | 41 ++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/resources/view/userList.html b/resources/view/userList.html index f7659e2..f8e6b02 100644 --- a/resources/view/userList.html +++ b/resources/view/userList.html @@ -20,27 +20,26 @@

    - - - - - - - - - - - - - - - - -
    ИмяГородОбо мнеskype
    -
    +

    Редактировать мои данные.

    + + + + + + + + + + + + + + + + + +
    ИмяГородОбо мнеskype
    From a62280e4de9fcd000ee05e11ab3ed05417195eb6 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 14:42:54 +0300 Subject: [PATCH 306/936] Fix css --- resources/css/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/css/style.css b/resources/css/style.css index ecf84c5..46251cc 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -1,6 +1,7 @@ .box { text-align: center; vertical-align: middle; + align-content: center; } .pad, .box { From fe9b93fe27627dc539576bbfce9a28d13f3cad9d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Sep 2016 14:48:59 +0300 Subject: [PATCH 307/936] Fix userList --- resources/view/userList.html | 44 +++++++++++++++++------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/resources/view/userList.html b/resources/view/userList.html index f8e6b02..1ca45f6 100644 --- a/resources/view/userList.html +++ b/resources/view/userList.html @@ -18,29 +18,27 @@ -
    -
    -

    Редактировать мои данные.

    - - - - - - - - - - - - - - - - - -
    ИмяГородОбо мнеskype
    -
    +
    +

    Редактировать мои данные.

    + + + + + + + + + + + + + + + + + +
    ИмяГородОбо мнеskype
    From 78d42262a53a67ce460e7cf38d2f2c0a45e9f138 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 23 Sep 2016 00:35:27 +0300 Subject: [PATCH 308/936] Update payment --- resources/payment.html | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/resources/payment.html b/resources/payment.html index 3d8235d..c2a737c 100644 --- a/resources/payment.html +++ b/resources/payment.html @@ -29,7 +29,7 @@

    Реквизиты оплаты

  • С банковских карт или из кошелька в Яндекс.Деньгах.
    Сумму следует вводить с учетом комиссии (кошелек - 0.5%, банковская карта 2%).
    + 0.5%, банковская карта 2%). Для перевода НЕОБХОДИМА ИДЕНТИФИКАЦИЯ.
    @@ -43,12 +43,8 @@

    Реквизиты оплаты

  • Webmoney WMR: R335541240099, WMZ: Z354468526072

  • - Платежная система CONTACT -

    -
  • - Платежная система Золотая Корона -

  • -
  • + Платежная система CONTACT
    + Платежная система Золотая Корона
    Western Union

  • 
    From f997dd73388fb8474ebc265fe8655ba76f42b874 Mon Sep 17 00:00:00 2001
    From: Grigory Kislin 
    Date: Fri, 23 Sep 2016 18:39:05 +0300
    Subject: [PATCH 309/936] Add invite
    
    ---
     resources/mails/masterjava/invite.html | 27 ++++++++++++++++++++++++++
     1 file changed, 27 insertions(+)
     create mode 100644 resources/mails/masterjava/invite.html
    
    diff --git a/resources/mails/masterjava/invite.html b/resources/mails/masterjava/invite.html
    new file mode 100644
    index 0000000..86edf40
    --- /dev/null
    +++ b/resources/mails/masterjava/invite.html
    @@ -0,0 +1,27 @@
    +
    +
    +
    +
    +    
    +    СЕГОДНЯ в 20.00 (GMT+3.00) 2-е занятие Masterjava
    +
    +

    + Здравствуй!
    +

    +СЕГОДНЯ, 23.09 (пятница) в 20.00 состоится 2-е занятие Masterjava +

    + Ссылка на комнату вебинара
    + Логин: твой email, пароль: masterjava23
    + Доступ дал, проверь!
    + Запись будет доступна сразу после вебинара, через 2-4 дня я ее отредактирую и размещу в Google Doc. +

    +

    Настрой свой проект, чтобы забирать мои + изменения и пушить в свой репозиторий.
    + У кого еще нет доступа в группу https://javaops.slack.com, пришлите мне свой email в skype: + grigory.kislin +

    +До встречи в комнате вебинара, +

    +

    + \ No newline at end of file From 82d866f388e64e20ccbe0c06d49f293f8750a7d4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 24 Sep 2016 19:46:54 +0300 Subject: [PATCH 310/936] Add lesson 3 fix --- .../mails/topjava/lesson/lesson03_fix.html | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 resources/mails/topjava/lesson/lesson03_fix.html diff --git a/resources/mails/topjava/lesson/lesson03_fix.html b/resources/mails/topjava/lesson/lesson03_fix.html new file mode 100644 index 0000000..0d18b70 --- /dev/null +++ b/resources/mails/topjava/lesson/lesson03_fix.html @@ -0,0 +1,17 @@ + + + + Ошибка в классе Meal в патчах третьего урока + + +

    + Здравствуй firstName! +

    +1. Добавил в 3-е занятие картинку + по созданию базы и пользователя в через pgAdmin.
    +2. В классе Meal проекта ошибка: поле id перекрывает поле id базового класса BaseEntity. Удалите 12 и 13 строку. +

    +

    + + \ No newline at end of file From cc70289f641074dc0009676b9a988b41c81bcb62 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 29 Sep 2016 17:14:45 +0300 Subject: [PATCH 311/936] update lesson04 --- resources/habr/rss.html | 33 ++++++++++++++++++++ resources/mails/topjava/lesson/lesson04.html | 15 ++++----- 2 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 resources/habr/rss.html diff --git a/resources/habr/rss.html b/resources/habr/rss.html new file mode 100644 index 0000000..443b807 --- /dev/null +++ b/resources/habr/rss.html @@ -0,0 +1,33 @@ + + + Интегрируем мессенждеры: GitHub, RSS (в частности Java), вакансии под ваш запрос. + +

    +Привет, Хабр!
    +В последнее время набирают популярность команды мессанждеров по интересам. +Удобный интерфейс и разделение по каналом, общение в личке позволяет в них комфортно общаться большому (несколько сотен, а возможно и тысяч) человек. +Интеграция с другими приложениями делает этот инструмент общения еще более полезным (список приложений для Slack).
    +

    GitHub

    +К примеру, если ваша команда в Slack разрабатывает общий проект на github, можно сделать отдельный канал для отслеживания всех изменений в проекте и +подпистаться на него. Нарпимер в моем учебном проекте Java Enterprise изменения в канале публикуются так:

    +.
    +

    RSS новости

    +Еще более интересную возможность дает интеграция с RSS: оформление подписки на новости. Пример подписки на Типичный программист

    : +
    +Наиболее интересные каналы новостей по Java: + +

    Свежие вакансии

    +Наконец, вы можете настроить свой запрос (зарплата, позиция, опыт, профобласть, регион, график) на HH и взять RSS вашего запроса +и подписываться на него, в Channel выбирав себя. Интересующие именно вас вакансии будут доставляться вам в личку. +
    +Стоит иметь в виду, что быстрый отклик на вакансию имеет как плюсы, так и минусы, он особенно актуален для срочных вакансий. +
    +Буду признателен за другие примеры полезных интеграций. Спасибо за внимание и желаю отличной карьеры в IT . + + diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index 9b2ff8f..ed1c49b 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -9,22 +9,23 @@

    Четвертое занятие нашего проекта: популирование - данных через Spring, JPA/ Hibernate, HSQLDB. + данных через Spring, JPA/ Hibernate, HSQLDB. В патче 4_0_2_refactoring я сделал правку:
    +

    46: items="${mealList}" -> items="${meals}"
    + Если вы уже накатили патч, просто поправьте у себя и вчекиньте в master.

    -Материалов по JPA огромное количество. Чтобы не утонуть- не надо пытаться освоить все сразу. Пока достаточно того, что +Материалов по JPA огромное количество. Чтобы не утонуть - не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW4.

    - Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
    - Обсуждение урока и ДЗ в slack #lesson04 + Обсуждение урока в slack #lesson04, домашнего задания в slack #hw4

    - Домашнее задание (у кого есть проверка) желательно присылать до вечера 28.06.
    + Домашнее задание (у кого есть проверка) желательно присылать до вечера 04.10.

    После выполнения этого достаточно несложного HW4 можно приступать к выполнению выпускного проекта + href="https://github.com/JavaWebinar/topjava08/blob/doc/doc/lesson04.md#Выпускной-проект">выпускного + проекта

    Удачи в освоении материалов и выполнении задания! From d9f0b7723d8dac9555367120ffb06cdf8965e6f4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 29 Sep 2016 17:24:24 +0300 Subject: [PATCH 312/936] update lesson04 --- resources/mails/topjava/lesson/lesson04.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index ed1c49b..d2d0f05 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -9,7 +9,8 @@

    Четвертое занятие нашего проекта: популирование - данных через Spring, JPA/ Hibernate, HSQLDB. В патче 4_0_2_refactoring я сделал правку:
    + данных через Spring, JPA/ Hibernate, HSQLDB.
    + В патче 4_0_2_refactoring я сделал правку:

    46: items="${mealList}" -> items="${meals}"
    Если вы уже накатили патч, просто поправьте у себя и вчекиньте в master.

    From 08a04833b559f02c9a034926c8a524cf45ea0353 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 29 Sep 2016 17:26:16 +0300 Subject: [PATCH 313/936] update lesson04 --- resources/mails/topjava/lesson/lesson04.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index d2d0f05..f3b85cc 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -7,13 +7,12 @@

    Здравствуй firstName!

    -

    Четвертое занятие нашего проекта: популирование данных через Spring, JPA/ Hibernate, HSQLDB.
    В патче 4_0_2_refactoring я сделал правку:

    46: items="${mealList}" -> items="${meals}"
    - Если вы уже накатили патч, просто поправьте у себя и вчекиньте в master. -

    + Если ты уже накатил патч, просто поправьте у себя и вчекинь в master. +

    Материалов по JPA огромное количество. Чтобы не утонуть - не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW4.

    From a09df32720e31b6586429f52dc942daa3dbe9fb8 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 30 Sep 2016 15:30:56 +0300 Subject: [PATCH 314/936] Add masterjava lesson03 --- resources/mails/masterjava/lesson/invite.html | 27 +++++++++++++++++++ .../mails/masterjava/lesson/lesson2.html | 25 +++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 resources/mails/masterjava/lesson/invite.html create mode 100644 resources/mails/masterjava/lesson/lesson2.html diff --git a/resources/mails/masterjava/lesson/invite.html b/resources/mails/masterjava/lesson/invite.html new file mode 100644 index 0000000..86edf40 --- /dev/null +++ b/resources/mails/masterjava/lesson/invite.html @@ -0,0 +1,27 @@ + + + + + + СЕГОДНЯ в 20.00 (GMT+3.00) 2-е занятие Masterjava + +

    + Здравствуй!
    +

    +СЕГОДНЯ, 23.09 (пятница) в 20.00 состоится 2-е занятие Masterjava +

    + Ссылка на комнату вебинара
    + Логин: твой email, пароль: masterjava23
    + Доступ дал, проверь!
    + Запись будет доступна сразу после вебинара, через 2-4 дня я ее отредактирую и размещу в Google Doc. +

    +

    Настрой свой проект, чтобы забирать мои + изменения и пушить в свой репозиторий.
    + У кого еще нет доступа в группу https://javaops.slack.com, пришлите мне свой email в skype: + grigory.kislin +

    +До встречи в комнате вебинара, +

    +

    + \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson2.html b/resources/mails/masterjava/lesson/lesson2.html new file mode 100644 index 0000000..8a7f59e --- /dev/null +++ b/resources/mails/masterjava/lesson/lesson2.html @@ -0,0 +1,25 @@ + + + + + + СЕГОДНЯ в 20.00 (GMT+3.00) 3-е занятие Masterjava + +

    + Здравствуй!
    +

    +СЕГОДНЯ, 30.09 (пятница) в 20.00 состоится 3-е занятие Masterjava
    +Ссылка на комнату вебинара
    +Логин: твой email, пароль: masterjava23, если он не был переопределен ранее.
    +

    + Запись будет доступна сразу после вебинара, в Google Doc пока еще экспортировать не начал. + Возможно буду делать это позднее, в любом случае доступ к этим материалам у тебя будет (как и бесплатное участие в + следующий выпусках masterjava, которые уже планирую делать по рассылке) +

    +

    Наша группа Slack https://masterjava01.slack.com, похоже, что мы уже все там:) +

    +До встречи в комнате вебинара, +

    +

    + \ No newline at end of file From 61c86723ae4454ccdc5174975e01679ea6869d7c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 30 Sep 2016 15:32:38 +0300 Subject: [PATCH 315/936] Add masterjava lesson03 --- .../mails/masterjava/lesson/{lesson2.html => lesson3.html} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename resources/mails/masterjava/lesson/{lesson2.html => lesson3.html} (96%) diff --git a/resources/mails/masterjava/lesson/lesson2.html b/resources/mails/masterjava/lesson/lesson3.html similarity index 96% rename from resources/mails/masterjava/lesson/lesson2.html rename to resources/mails/masterjava/lesson/lesson3.html index 8a7f59e..45b808a 100644 --- a/resources/mails/masterjava/lesson/lesson2.html +++ b/resources/mails/masterjava/lesson/lesson3.html @@ -20,6 +20,6 @@

    Наша группа Slack https://masterjava01.slack.com, похоже, что мы уже все там:)

    До встречи в комнате вебинара, -

    +

    \ No newline at end of file From b77917e1f06dd865eb93a44b5aa9312d22759f82 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 5 Oct 2016 15:40:44 +0300 Subject: [PATCH 316/936] Update test vacancy --- resources/vacation/test.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 7f08a48..1742149 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -46,7 +46,7 @@

    Темы тестового собеседования:

    многопоточности
  • содержимое java.util.concurrent.*
  • -
  • паттернов проектирования
  • +
  • Паттернов проектирования
  • Транзакция. ACID. Уровни изоляции.
  • From 7283279ec9162aa261a23c95314b35d053943e30 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 5 Oct 2016 17:31:01 +0300 Subject: [PATCH 317/936] Update test vacancy --- resources/vacation/test.html | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 1742149..33deda7 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -39,17 +39,23 @@

    Темы тестового собеседования:

    Хорошее понимание:

    Опционально: JavaEE: JPA/Hibernate, DAO, Spring MVC, Java 8, JavaScript, AJAX, jQuery, принципы From c6a77421b993291116e4c9530af4fb3f06f8fddf Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 6 Oct 2016 02:34:41 +0300 Subject: [PATCH 318/936] Add masterjava delay lesson --- resources/mails/mailFragments.html | 10 ++++++++++ .../mails/masterjava/lesson/lesson4_delay.html | 15 +++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 resources/mails/masterjava/lesson/lesson4_delay.html diff --git a/resources/mails/mailFragments.html b/resources/mails/mailFragments.html index 5dc30be..ec7f30a 100644 --- a/resources/mails/mailFragments.html +++ b/resources/mails/mailFragments.html @@ -30,4 +30,14 @@ Java Online Projects

    +
    +

    + С лучшими пожеланиями,
    + Григорий Кислин
    + skype: grigory.kislin +

    +

    + Java Online Projects +

    +
    \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson4_delay.html b/resources/mails/masterjava/lesson/lesson4_delay.html new file mode 100644 index 0000000..f0d219b --- /dev/null +++ b/resources/mails/masterjava/lesson/lesson4_delay.html @@ -0,0 +1,15 @@ + + + + + + 4-е занятие Masterjava переносится на следующую пятницу, 14.09 + +

    + Здравствуй!
    +

    +4е занятие Masterjava переносится на следующую пятницу (14.10 в 20.00). +Я это время делаю видео 2-го и 3-го уроков и выкладываю их на Google Drive, а у тебя будет дополнительное время на выполнение домашнего задания. Спасибо за понимание. +

    +

    + \ No newline at end of file From c9e2f9091f5a64667c0f19239edd7c918a6a4a75 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 6 Oct 2016 02:39:15 +0300 Subject: [PATCH 319/936] Update masterjava delay lesson --- resources/mails/masterjava/lesson/lesson4_delay.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/masterjava/lesson/lesson4_delay.html b/resources/mails/masterjava/lesson/lesson4_delay.html index f0d219b..b841f31 100644 --- a/resources/mails/masterjava/lesson/lesson4_delay.html +++ b/resources/mails/masterjava/lesson/lesson4_delay.html @@ -8,8 +8,8 @@

    Здравствуй!

    -4е занятие Masterjava переносится на следующую пятницу (14.10 в 20.00). -Я это время делаю видео 2-го и 3-го уроков и выкладываю их на Google Drive, а у тебя будет дополнительное время на выполнение домашнего задания. Спасибо за понимание. +4-е занятие Masterjava переносится на следующую пятницу (14.10 в 20.00). +Я за это время сделаю видео 2-го и 3-го уроков и выложу их на Google Drive, а у тебя будет дополнительное время на выполнение домашнего задания. Спасибо за понимание.

    \ No newline at end of file From f2142c6d0b49955ea23025c74a80e9fd1eaa3881 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 6 Oct 2016 15:57:23 +0300 Subject: [PATCH 320/936] Update topjava lessons --- resources/mails/topjava/lesson/final_fix.html | 4 ++-- resources/mails/topjava/lesson/lesson03.html | 4 ++-- resources/mails/topjava/lesson/lesson04.html | 2 +- resources/mails/topjava/lesson/lesson05.html | 18 ++++++++++-------- resources/mails/topjava/lesson/lesson06.html | 2 +- resources/mails/topjava/lesson/lesson07.html | 2 +- resources/mails/topjava/lesson/lesson08.html | 2 +- resources/mails/topjava/lesson/lesson09.html | 2 +- resources/mails/topjava/lesson/lesson10.html | 2 +- resources/mails/topjava/lesson/lesson11.html | 4 ++-- 10 files changed, 22 insertions(+), 20 deletions(-) diff --git a/resources/mails/topjava/lesson/final_fix.html b/resources/mails/topjava/lesson/final_fix.html index 2df3d9e..0580fca 100644 --- a/resources/mails/topjava/lesson/final_fix.html +++ b/resources/mails/topjava/lesson/final_fix.html @@ -14,7 +14,7 @@ Выложил заключительное занятие нашего проекта.
    Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
    -Обсуждение урока и HW10 в Slack #lesson11
    +Обсуждение урока и HW10 в Slack #lesson11
    Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта.
    • @@ -31,7 +31,7 @@ Здесь есть расписание topjava08. Приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию. Со ссылкой на тебя даю скидку 5%.

    • -
    • Группа Slack topjava7 к 01.09 будет удалена. Приглашаю в Slack Java Online Projects (кто еще не +
    • Группа Slack topjava8 к 01.09 будет удалена. Приглашаю в Slack Java Online Projects (кто еще не вступил), где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) По каждой теме сделан свой канал. Проверь свои Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
      - Обсуждение урока в slack #lesson03, HW3 в #hw3. + Обсуждение урока в slack #lesson03, HW3 в #hw3.

      Приглашаю тебя в общую группу Slack Java Online Projects, где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index f3b85cc..4db2758 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -16,7 +16,7 @@ Материалов по JPA огромное количество. Чтобы не утонуть - не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW4.

      - Обсуждение урока в slack #lesson04, домашнего задания в slack #hw4 + Обсуждение урока в slack #lesson04, домашнего задания в slack #hw4

      Домашнее задание (у кого есть проверка) желательно присылать до вечера 04.10.
      diff --git a/resources/mails/topjava/lesson/lesson05.html b/resources/mails/topjava/lesson/lesson05.html index 5991962..629fa38 100644 --- a/resources/mails/topjava/lesson/lesson05.html +++ b/resources/mails/topjava/lesson/lesson05.html @@ -8,16 +8,18 @@ Здравствуй firstName!

      -Готово пятое занятие нашего проекта.
      -На следующем уроке перейдем к слою web. + Готово пятое занятие нашего проекта.
      + Заканчиваем с базой данных, на следующем уроке перейдем к слою web.

      - Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
      - Обсуждение урока и ДЗ в slack #lesson05 -

      -

      - Домашнее задание (у кого есть проверка) желательно присылать до вечера 05.07
      -

      + Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
      + Обсуждение урока в slack #lesson05, домашнего задания в + slack #hw5 +

      +

      + Домашнее задание (у кого есть проверка) желательно присылать до вечера 11.10
      +

      diff --git a/resources/mails/topjava/lesson/lesson06.html b/resources/mails/topjava/lesson/lesson06.html index 92ee904..9bdb3de 100644 --- a/resources/mails/topjava/lesson/lesson06.html +++ b/resources/mails/topjava/lesson/lesson06.html @@ -13,7 +13,7 @@

      Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
      - Обсуждение урока и ДЗ в slack #lesson06 + Обсуждение урока и ДЗ в slack #lesson06

      Домашнее задание (у кого есть проверка) желательно присылать до вечера 12.07
      diff --git a/resources/mails/topjava/lesson/lesson07.html b/resources/mails/topjava/lesson/lesson07.html index cd9fa8f..ec6e693 100644 --- a/resources/mails/topjava/lesson/lesson07.html +++ b/resources/mails/topjava/lesson/lesson07.html @@ -13,7 +13,7 @@

      Перед накаткой патчей в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
      - Обсуждение урока и ДЗ в slack #lesson07 + Обсуждение урока и ДЗ в slack #lesson07

      Домашнее задание (у кого есть проверка) желательно присылать до вечера 19.07
      diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index 0dea962..a87878a 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -13,7 +13,7 @@

      Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и ДЗ в Slack #lesson08 + Обсуждение урока и ДЗ в Slack #lesson08

      Домашнее задание (у кого есть проверка) желательно присылать до вечера 26.07
      diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index cc484fc..ebf3370 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -13,7 +13,7 @@

      Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и ДЗ в Slack #lesson09 + Обсуждение урока и ДЗ в Slack #lesson09

      Домашнее задание (у кого есть проверка) желательно присылать до вечера 02.08
      diff --git a/resources/mails/topjava/lesson/lesson10.html b/resources/mails/topjava/lesson/lesson10.html index 7a558e8..5e18fd2 100644 --- a/resources/mails/topjava/lesson/lesson10.html +++ b/resources/mails/topjava/lesson/lesson10.html @@ -13,7 +13,7 @@

      Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и ДЗ в Slack #lesson10 + Обсуждение урока и ДЗ в Slack #lesson10

      Домашнее задание (у кого есть проверка) желательно присылать до вечера 09.08
      diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index e97e18f..bdeffe6 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -11,7 +11,7 @@ Выложил заключительное занятие нашего проекта.
      Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
      -Обсуждение урока и HW10 в Slack #lesson11
      +Обсуждение урока и HW10 в Slack #lesson11
      Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта.

      • @@ -28,7 +28,7 @@ Здесь есть расписание topjava08. Приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию. Со ссылкой на тебя даю скидку 5%.

      • -
      • Группа Slack topjava7 к 01.09 будет удалена. Приглашаю в Slack Java Online Projects (кто еще не +
      • Группа Slack topjava8 к 01.09 будет удалена. Приглашаю в Slack Java Online Projects (кто еще не вступил), где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) По каждой теме сделан свой канал. Проверь свои Date: Thu, 6 Oct 2016 15:59:05 +0300 Subject: [PATCH 321/936] Update topjava lesson5 --- resources/mails/topjava/lesson/lesson05.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson05.html b/resources/mails/topjava/lesson/lesson05.html index 629fa38..e15ac4d 100644 --- a/resources/mails/topjava/lesson/lesson05.html +++ b/resources/mails/topjava/lesson/lesson05.html @@ -10,8 +10,6 @@

        Готово пятое занятие нашего проекта.
        Заканчиваем с базой данных, на следующем уроке перейдем к слою web. -

        -

        Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        Обсуждение урока в slack #lesson05, домашнего задания в From e64681d7c493c469f98f96140d14701819643038 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 12 Oct 2016 02:15:59 +0300 Subject: [PATCH 322/936] Add lesson3_info --- .../mails/masterjava/lesson/lesson3_info.html | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 resources/mails/masterjava/lesson/lesson3_info.html diff --git a/resources/mails/masterjava/lesson/lesson3_info.html b/resources/mails/masterjava/lesson/lesson3_info.html new file mode 100644 index 0000000..dace3f4 --- /dev/null +++ b/resources/mails/masterjava/lesson/lesson3_info.html @@ -0,0 +1,24 @@ + + + + + + Обновление в Masterjava + +

        + Здравствуй!
        +

        +

        Выложил видео 2-го + урока.
        + Дал всем доступ на видео в Google Drive, если не пускает, попробуй выйти-войти в аккаунт. +

        +

        + Обновил модули в репозитории нашего проекта (обновись).
        + Обновил картинку модулей в домашнем задании 3-го + урока. Остальные нужно доделать по аналогии.
        + Добавил в ДЗ ссылку Speed up insertion performance in PostgreSQL. +

        +4-е занятие будет в эту пятницу, в 20.00. Не тяните с выполнением ДЗ. +

        +

        + \ No newline at end of file From 203cbf7f905bc83e2a14c6379a2973aa502cbc2d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 12 Oct 2016 02:22:01 +0300 Subject: [PATCH 323/936] Update lesson3_info --- resources/mails/masterjava/lesson/lesson3_info.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/mails/masterjava/lesson/lesson3_info.html b/resources/mails/masterjava/lesson/lesson3_info.html index dace3f4..2580229 100644 --- a/resources/mails/masterjava/lesson/lesson3_info.html +++ b/resources/mails/masterjava/lesson/lesson3_info.html @@ -10,7 +10,8 @@

        Выложил видео 2-го урока.
        - Дал всем доступ на видео в Google Drive, если не пускает, попробуй выйти-войти в аккаунт. + Дал всем доступ на видео в Google Drive, если не пускает, попробуй выйти-войти в аккаунт.
        + Доступ к видео остается после окончания проекта.

        Обновил модули в репозитории нашего проекта (обновись).
        From abf81d5b2389e809e14b0000863ed88d8203241e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 14 Oct 2016 10:42:31 +0300 Subject: [PATCH 324/936] Update lesson6 --- resources/mails/topjava/lesson/lesson06.html | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson06.html b/resources/mails/topjava/lesson/lesson06.html index 9bdb3de..15dfabf 100644 --- a/resources/mails/topjava/lesson/lesson06.html +++ b/resources/mails/topjava/lesson/lesson06.html @@ -8,16 +8,19 @@ Здравствуй firstName!

        -Готово шестое занятие нашего проекта.
        -Начинаем изучать Spring-MVC и слой Web. + Вчера выложил шестое занятие нашего + проекта, прошу прощения за задержку рассылки почты.
        + Начинаем изучать Spring-MVC и слой Web.

        - Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        - Обсуждение урока и ДЗ в slack #lesson06 -

        -

        - Домашнее задание (у кого есть проверка) желательно присылать до вечера 12.07
        -

        + Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        + Обсуждение урока в slack #lesson06, домашнего задания в + slack #hw6 +

        +

        + Домашнее задание (у кого есть проверка) желательно присылать до вечера 18.10
        +

        From 577e12f27ad34410d5b4c596e255415ff0b1577d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 14 Oct 2016 16:31:15 +0300 Subject: [PATCH 325/936] Update lesson4 --- .../mails/masterjava/lesson/lesson4.html | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 resources/mails/masterjava/lesson/lesson4.html diff --git a/resources/mails/masterjava/lesson/lesson4.html b/resources/mails/masterjava/lesson/lesson4.html new file mode 100644 index 0000000..de18b1d --- /dev/null +++ b/resources/mails/masterjava/lesson/lesson4.html @@ -0,0 +1,22 @@ + + + + + + СЕГОДНЯ в 20.00 (GMT+3.00) 4-е занятие Masterjava + +

        + Здравствуй!
        +

        +СЕГОДНЯ, 14.10 (пятница) в 20.00 состоится 4-е занятие Masterjava
        +

        Ссылка на комнату вебинара

        +Обратите внимание: ДОМЕН поменялся. Если будут проблемы с куками- почисти или зайди в анонимной вкладке.
        +Логин: твой email, пароль сбросился, снова masterjava23 +

        + Запись будет доступна сразу после вебинара, в Google Doc позднее. +

        +До встречи в комнате вебинара, +

        +

        + \ No newline at end of file From e9bd091d99a80ae8e15e3bf10cb57f7d9fece8fa Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 17 Oct 2016 14:54:28 +0300 Subject: [PATCH 326/936] Update lesson5_delay --- .../masterjava/lesson/lesson5_delay.html | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 resources/mails/masterjava/lesson/lesson5_delay.html diff --git a/resources/mails/masterjava/lesson/lesson5_delay.html b/resources/mails/masterjava/lesson/lesson5_delay.html new file mode 100644 index 0000000..50e998b --- /dev/null +++ b/resources/mails/masterjava/lesson/lesson5_delay.html @@ -0,0 +1,32 @@ + + + + + + Обновление в Masterjava + +

        + Здравствуй!
        + Я пишу все новости в группу слак, на всякий случай задублирую письмом. +

        +

        + Полностью обработал и выложил видео + 3-го урока
        + На этой неделе выложу обработанное 4е занятие. Ссылки на необработанные видео:
        +

        +

        + Поправил scope для logback-classic (обновись), иначе логирование не попадает в модуль export. +

        +

        + Извиняюсь, я не успею к этой пятнице отредактировать 4й урок и сделать новый :( + Очень надеюсь, что после 5-го занятия уже будем вебинариться каждую пятницу
        + Принимаю ваши ДЗ (у кого проверка) до 27.10, вебинар будет в следующую пятницу, 28.10.
        + Для всех- шлите мне ваши реализации модуля persist, включу в занятие реализации на нескольких библиотеках. +

        +

        +

        + \ No newline at end of file From 958e54197205fa81de8a236db4da284902b5a988 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 17 Oct 2016 14:56:52 +0300 Subject: [PATCH 327/936] Update lesson5_delay --- resources/mails/masterjava/lesson/lesson5_delay.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/mails/masterjava/lesson/lesson5_delay.html b/resources/mails/masterjava/lesson/lesson5_delay.html index 50e998b..88a769b 100644 --- a/resources/mails/masterjava/lesson/lesson5_delay.html +++ b/resources/mails/masterjava/lesson/lesson5_delay.html @@ -9,10 +9,9 @@ Здравствуй!
        Я пишу все новости в группу слак, на всякий случай задублирую письмом.

        -

        - Полностью обработал и выложил видео +Полностью обработал и выложил видео 3-го урока
        - На этой неделе выложу обработанное 4е занятие. Ссылки на необработанные видео:
        +На этой неделе выложу обработанное 4е занятие. Ссылки на необработанные видео:

        • Часть 1
        • Часть 2
        • From 4522288db812bc051b7a60828f973118ee82fd22 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 20 Oct 2016 17:55:40 +0300 Subject: [PATCH 328/936] Update topjava lesson7 --- resources/mails/topjava/lesson/lesson07.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson07.html b/resources/mails/topjava/lesson/lesson07.html index ec6e693..b5b9619 100644 --- a/resources/mails/topjava/lesson/lesson07.html +++ b/resources/mails/topjava/lesson/lesson07.html @@ -13,10 +13,11 @@

          Перед накаткой патчей в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          - Обсуждение урока и ДЗ в slack #lesson07 + Обсуждение урока в slack #lesson07, домашнего задания в + slack #hw7

          - Домашнее задание (у кого есть проверка) желательно присылать до вечера 19.07
          + Домашнее задание (у кого есть проверка) желательно присылать до вечера 25.10

          From e475001bc0f1bab2b719c900d3bae29a221d5c95 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 21 Oct 2016 00:57:02 +0300 Subject: [PATCH 329/936] Update topjava info --- resources/mails/topjava_info.html | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index e558046..1bd5ed5 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -125,14 +125,14 @@

          На проекте


          Расписание занятий текущего проекта (следующий стартует в начале декабря, буду делать рассылку):

          Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Домашние задания подобранны по темам занятия и требуют реализации функциональности, схожей с пройденной на занятии. -

            01.09: Старт проекта

            +

              01.12: Старт проекта

            • Сбор группы в Slack и Skype
            • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
            • Раздача учебных лицензий JetBrains IDEA
            • Выполнение и проверка вступительного задания
            -

              08.09: 1-е занятие

              +

                08.12: 1-е занятие

              • Разбор домашнего задания вступительного занятия (вместе с Optional)
              • Обзор используемых в проекте технологий. Интеграция ПО
              • Maven
              • @@ -141,7 +141,7 @@

                Расписание занятий текущего проекта (сле
              • Уровни и зависимости логгирования. JMX
              • Домашнее задание 1-го занятия (HW1 + Optional)
              -

                15.09: 2-е занятие

                +

                  15.12: 2-е занятие

                • Разбор домашнего задания HW1 + Optional
                • Библиотека vs Фреймворк. Стандартные библиотеки Apache Commons, Guava
                • Слои приложения. Создание каркаса приложения
                • @@ -149,7 +149,7 @@

                  Расписание занятий текущего проекта (сле
                • Пояснения к HW2. Обработка Autowired
                • Домашнее задание (HW2 + Optional)
                -

                  22.09: 3-е занятие

                  +

                    22.12: 3-е занятие

                  • Разбор домашнего задания HW2 + Optional
                  • Жизненный цикл Spring контекста
                  • Тестирование через JUnit
                  • @@ -161,7 +161,7 @@

                    Расписание занятий текущего проекта (сле
                  • Логирование тестов
                  • Домашнее задание (HW3 + Optional)
                  -

                    29.09: 4-е занятие

                    +

                      29.12: 4-е занятие

                    • Разбор домашнего задания HW3 + Optional
                    • Методы улучшения качества кода
                    • Spring: инициализация и популирование DB
                    • @@ -170,7 +170,7 @@

                      Расписание занятий текущего проекта (сле
                    • Поддержка HSQLDB
                    • Домашнее задание (HW4 + Optional)
                    -

                      06.10: 5-е занятие

                      +

                        05.01: 5-е занятие

                      • Разбор вопросов
                      • Разбор домашнего задания HW4 + Optional
                      • Транзакции
                      • @@ -180,7 +180,7 @@

                        Расписание занятий текущего проекта (сле
                      • Spring кэш
                      • Домашнее задание (HW5 + Optional)
                      -

                        13.10: 6-е занятие

                        +

                          12.01: 6-е занятие

                        • Разбор домашнего задания HW5 + Optional
                        • Кэш Hibernate
                        • Spring Web
                        • @@ -191,7 +191,7 @@

                          Расписание занятий текущего проекта (сле
                        • Spring Internationalization
                        • Домашнее задание (HW6 + Optional)
                        -

                          20.10: 7-е занятие

                          +

                            19.01: 7-е занятие

                          • Разбор домашнего задания HW6 + Optional
                          • Автогенерация DDL по модели
                          • Тестирование Spring MVC
                          • @@ -201,7 +201,7 @@

                            Расписание занятий текущего проекта (сле
                          • Тестирование через SoapUi. UTF-8
                          • Домашнее задание (HW7 + Optional)
                          -

                            27.10: 8-е занятие

                            +

                              26.01: 8-е занятие

                            • Разбор домашнего задания HW7 + Optional
                            • WebJars. jQuery и JavaScript frameworks
                            • Bootstrap
                            • @@ -210,7 +210,7 @@

                              Расписание занятий текущего проекта (сле
                            • Добавление Spring Security
                            • Домашнее задание (HW8 + Optional)
                            -

                              03.11: 9-е занятие

                              +

                                02.02: 9-е занятие

                              • Разбор домашнего задания HW8 + Optional
                              • Spring Binding
                              • Spring Validation
                              • @@ -222,7 +222,7 @@

                                Расписание занятий текущего проекта (сле
                              • Cookie. Session
                              • Домашнее задание (HW9 + Optional)
                              -

                                10.11: 10-е занятие

                                +

                                  09.02: 10-е занятие

                                • Разбор домашнего задания HW10 + Optional
                                • Spring Security Taglib. Method Security Expressions
                                • Интерсепторы. Редактирование профиля. JSP tag files
                                • @@ -232,7 +232,7 @@

                                  Расписание занятий текущего проекта (сле
                                • Защита от межсайтовой подделки запросов (CSRF)
                                • Домашнее задание (HW10)
                                -

                                  17.11: Заключительное занятие

                                  +

                                    16.02: Заключительное занятие

                                  • Рефакторинг
                                  • Разбор домашнего задания HW10 + Optional
                                  • Деплой приложения в Heroku
                                  • From 66bb0e5530d4187d7665bd26fd19e7fd993eb4c3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 21 Oct 2016 00:59:05 +0300 Subject: [PATCH 330/936] Update index --- resources/view/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index a5a8614..f3c2777 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -114,7 +114,7 @@

                                    Участие в разработке Spring/JPA Enterprise приложе

                                    Наши истории (делимся опытом и успехом)


                                    Стажировка на Java Enterprise:

                                    -

                                    Старт в начале декабря.

                                    +

                                    Старт 01.09.

                                    Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins. Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе @@ -123,7 +123,7 @@

                                    Старт в начале декабря.


                                    Проект "Многопоточность. Веб сервисы."

                                    -

                                    Старт в конце сентября.

                                    +

                                    Проект идет. Следующий будет в феврале 2017

                                    Разработка полнофункционального многомодульного Maven проекта с использованием SOAP (JAX-WS) и REST (JAX-RS)


                                    From 69f98e7046e3dd6c8881bf36eeaa761a912daf7b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 24 Oct 2016 15:50:55 +0300 Subject: [PATCH 331/936] Update jr confirm --- resources/mails/jr_confirm.html | 46 +++++++++++++-------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 59e978f..28429b5 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -7,9 +7,7 @@ Здравствуй!

                                    Ваше решение тестового задания проверено. Результат положительный.
                                    - Вы зачислены на осенний набор стажировки от Javarush: - детальная - информация на JavaRush инфо. + Поздравляю!! Вы зачислены на стажировку от Javarush 01.12.2016

                                    Информация по проекту от преподавателя Кислина Григория:

                                    Общение на проекте предлагаю на "ты".
                                    @@ -25,16 +23,14 @@

                                    Заполнение регистрационной формы

                                    материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. Обсуждение вступительного занятия происходит в канале Slack #hw0.
                                    + href="https://topjava9.slack.com/messages/hw0/">#hw0.
                                      Другие каналы Slack: -
                                    • #flooding: оффтопик
                                    • -
                                    • #general: общие вопросы
                                    • -
                                    • #git: вопросы по git
                                    • -
                                    • #idea: вопросы по idea
                                    • -
                                    • #interview_job: вопросы прохождения - интервью, - работа, вакансии -
                                    • +
                                    • #flooding: оффтопик
                                    • +
                                    • #general: общие вопросы
                                    • +
                                    • #git: вопросы по git
                                    • +
                                    • #idea: вопросы по idea
                                    • +
                                    • #interview_job: прохождение интервью, работа, вакансии
                                    • +
                                    • #useful_resources: интересные ресурсы
                                    Форматирование сообщений в slack
                                    @@ -42,28 +38,22 @@

                                    Заполнение регистрационной формы

                                    IDE: JetBrains IDEA

                                    IDEA считается лучшей Java IDE, и по последней - статистике -IntelliJ is the number one IDE.
                                    + статистике IntelliJ is the number one IDE.
                                    Netbeans хорош для новичков и индусов (в Индии его 80%).
                                    -В СПб на IDEA по моему опыту программируют 95% разработчиков.
                                    -Поэтому разработка проекта ведется в JetBrains IDEA, брать - версию - Ultimate
                                    +Поэтому разработка проекта ведется в JetBrains IDEA, брать версию Ultimate
                                    Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую - учебную лицензию JetBrains IDEA на год.
                                    Учебную лицензию на IDEA и доступ ко всем материалам проекта -буду -рассылать 01.09. + учебную лицензию JetBrains IDEA на год.
                                    Учебную лицензию на IDEA и доступ ко всем материалам проекта буду рассылать 01.12.

                                    Вступительное занятие

                                    -До старта проекта 01.09 можно приступать в выполнению вступительного +До старта проекта 01.12 можно приступать в выполнению вступительного занятия. -Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй -инструкциям. Особое внимание обращаю на wiki по ведению - проекта в Git, необходимо строго следовать этим правилам. +Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри все видео занятия и следуй +инструкциям. Особое внимание обращаю на wiki по ведению + проекта в Git, необходимо строго следовать этим правилам.

                                    Проверка домашних заданий

                                    Разбор домашний заданий происходит в начале каждого занятия.
                                    Если у тебя подписка ментор, то свое решение вступительного задания нужно присылать на проверку начиная c -02.09 до вечера 06.09, остальных домашних заданий - до вечера вторника. +02.12 до вечера 06.12, остальных домашних заданий - до вечера вторника.

                                    Проверка заданий подразумевает ревью твоего кода. Ты увидишь именно свои ошибки в стиле, структурах данных, алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания @@ -75,8 +65,8 @@

                                    Проверка домашних заданий

                                    skype: grigory.kislin

                                    Ресурсы

                                    -Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Рекомендую также изучить полезные ресурсы. +Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Для подготовки к проекту рекомендую изучить полезные ресурсы.
                                    • Wiki по проекту
                                    • Wiki по GIT
                                    • From 99ed1ffeb46f19061ab83c2086115c45e9eeea51 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 24 Oct 2016 16:01:20 +0300 Subject: [PATCH 332/936] Update jr confirm --- resources/mails/jr_confirm.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 28429b5..234db1b 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -6,8 +6,8 @@

                                      Здравствуй!

                                      -

                                      Ваше решение тестового задания проверено. Результат положительный.
                                      - Поздравляю!! Вы зачислены на стажировку от Javarush 01.12.2016 +

                                      Ваше решение тестового задания проверено. Поздравляю, результат положительный!!
                                      + Вы зачислены на стажировку от Java Rush 01.12.2016

                                      Информация по проекту от преподавателя Кислина Григория:

                                      Общение на проекте предлагаю на "ты".
                                      From e4966258783192fd56de2cd018e85c79d9310a21 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 24 Oct 2016 16:15:38 +0300 Subject: [PATCH 333/936] Update jr confirm --- resources/mails/jr_confirm.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 234db1b..4b4fa4c 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -1,19 +1,19 @@ - Осенний набор на стажировку от Javarush + Набор на стажировку JavaRush 01.12.2016

                                      Здравствуй!

                                      Ваше решение тестового задания проверено. Поздравляю, результат положительный!!
                                      - Вы зачислены на стажировку от Java Rush 01.12.2016 + Вы зачислены на стажировку JavaRush 01.12.2016

                                      Информация по проекту от преподавателя Кислина Григория:

                                      Общение на проекте предлагаю на "ты".
                                      Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние -задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с +задания являются чаcтrunью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с пройденной на занятии.

                                      Заполнение регистрационной формы

                                      Общение на проекте будет вестись в Slack. Заполни пожалуйста все поля Date: Mon, 24 Oct 2016 16:18:51 +0300 Subject: [PATCH 334/936] Update index --- resources/view/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/view/index.html b/resources/view/index.html index f3c2777..110568d 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -114,7 +114,7 @@

                                      Участие в разработке Spring/JPA Enterprise приложе

                                      Наши истории (делимся опытом и успехом)


                                      Стажировка на Java Enterprise:

                                      -

                                      Старт 01.09.

                                      +

                                      Старт 01.12

                                      Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins. Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе From 05157150966408d2751457e8f3d220773c2f7e05 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 24 Oct 2016 19:06:07 +0300 Subject: [PATCH 335/936] Update early price --- .../mails/topjava/topjava_early_price.html | 32 ++++++++++++------- .../service/SubscriptionServiceTest.java | 2 +- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/resources/mails/topjava/topjava_early_price.html b/resources/mails/topjava/topjava_early_price.html index 551d60f..f8452d3 100644 --- a/resources/mails/topjava/topjava_early_price.html +++ b/resources/mails/topjava/topjava_early_price.html @@ -1,30 +1,40 @@ - Сегодня последний день скидки на 'Java Enterprise (Topjava)'. + До 31.10 неделя ЛЬГОТНОЙ ЦЕНЫ на 'Java Enterprise (Topjava)'.

                                      Здравствуй!

                                      -Сегодня последний день льготной цены на Java Enterprise (Topjava) +
                                      + Рад сообщить, что до 31.10 действует акция на проект Java Enterprise + (Topjava)
                                      + + Если ты еще в поиске работы Java разработчика, после проекта твои шансы получить работу + возрастут на порядок.

                                      + Если уже работаешь, но нет достаточно опыта в стеке Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), + Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API, это отличный шанс их быстро получить на хорошем уровне. +
                                      +

                                      + Cсылки проекта:

                                      -
                                        -
                                      • 7600 руб. - участие в проекте и группе slack, помощь по проекту
                                      • -
                                      • 15000 руб. - добавляется проверка домашних заданий и ревью выпускного проекта
                                      • -
                                      • для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.
                                      • -
                                      • Способы оплаты
                                      • -
                                      • Курс рубля
                                      • -
                                      +

                                      Поторопись!
                                      - Старт проекта: 01.09

                                      + Старт проекта: 01.12

    \ No newline at end of file diff --git a/src/test/java/ru/javaops/service/SubscriptionServiceTest.java b/src/test/java/ru/javaops/service/SubscriptionServiceTest.java index 562f304..edd8fd0 100644 --- a/src/test/java/ru/javaops/service/SubscriptionServiceTest.java +++ b/src/test/java/ru/javaops/service/SubscriptionServiceTest.java @@ -10,7 +10,7 @@ */ public class SubscriptionServiceTest extends ApplicationAbstractTest { - public static final String EMAIL = "gkislin@yandex.ru"; + public static final String EMAIL = "vasyl.malik@javarush.ru"; @Autowired private SubscriptionService subscriptionService; From d1fd0e67d71de0c294c6dc58ea7a13b991a26117 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 24 Oct 2016 19:09:04 +0300 Subject: [PATCH 336/936] Update early price --- resources/mails/topjava/topjava_early_price.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava/topjava_early_price.html b/resources/mails/topjava/topjava_early_price.html index f8452d3..fdfd594 100644 --- a/resources/mails/topjava/topjava_early_price.html +++ b/resources/mails/topjava/topjava_early_price.html @@ -9,6 +9,10 @@
    Рад сообщить, что до 31.10 действует акция на проект Java Enterprise (Topjava)
    + Если ты еще в поиске работы Java разработчика, после проекта твои шансы получить работу + возрастут на порядок.

    + Если уже работаешь, но нет достаточно опыта в стеке Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), + Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API, это отличный шанс их быстро получить на хорошем уровне. - Если ты еще в поиске работы Java разработчика, после проекта твои шансы получить работу - возрастут на порядок.

    - Если уже работаешь, но нет достаточно опыта в стеке Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), - Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API, это отличный шанс их быстро получить на хорошем уровне.

    Cсылки проекта: From 038651112a595ca00125cbc3c64c76a99184c963 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 24 Oct 2016 19:10:55 +0300 Subject: [PATCH 337/936] Update early price --- resources/mails/topjava/topjava_early_price.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_early_price.html b/resources/mails/topjava/topjava_early_price.html index fdfd594..be00b75 100644 --- a/resources/mails/topjava/topjava_early_price.html +++ b/resources/mails/topjava/topjava_early_price.html @@ -10,7 +10,7 @@ Рад сообщить, что до 31.10 действует акция на проект Java Enterprise (Topjava)
    Если ты еще в поиске работы Java разработчика, после проекта твои шансы получить работу - возрастут на порядок.

    + возрастут на порядок.
    Если уже работаешь, но нет достаточно опыта в стеке Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API, это отличный шанс их быстро получить на хорошем уровне.

      From e7be084324bea3474d63eb0d5ad3241d8bbd23ce Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 24 Oct 2016 19:12:23 +0300 Subject: [PATCH 338/936] Update early price --- resources/mails/topjava/topjava_early_price.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_early_price.html b/resources/mails/topjava/topjava_early_price.html index be00b75..9d0adfe 100644 --- a/resources/mails/topjava/topjava_early_price.html +++ b/resources/mails/topjava/topjava_early_price.html @@ -12,7 +12,7 @@ Если ты еще в поиске работы Java разработчика, после проекта твои шансы получить работу возрастут на порядок.
      Если уже работаешь, но нет достаточно опыта в стеке Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), - Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API, это отличный шанс их быстро получить на хорошем уровне. + Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
      , это отличный шанс получить его быстро и на хорошем уровне.
      • 7600 руб. - участие в проекте и группе slack, помощь по проекту
      • 15500 руб. - добавляется проверка домашних заданий и ревью выпускного проекта
      • From 4a641db87fb2e209ddf6e925a655927637dc436d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 25 Oct 2016 16:03:02 +0300 Subject: [PATCH 339/936] Update topjava info --- resources/mails/topjava_info.html | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 1bd5ed5..908f787 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -12,6 +12,12 @@ участник деплоит свой проект из github в облачный сервис Heroku.

        +

        + Если ты еще в поиске работы Java разработчика, после проекта твои шансы получить работу + возрастут на порядок.
        + Если уже работаешь, но нет достаточно опыта в стеке Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), + Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API, это отличный шанс получить его быстро и на хорошем уровне. +

        Требования к участникам:

        На проекте мы не проходим синтаксис java: предполагается, что вы уже знаете, что такое классы, конструкторы, аннотации, анонимные классы, исключения и пр. @@ -106,14 +112,15 @@

        На проекте


      +

      До 31.10 действуют специальные цены:

        -
      • Стоимость участия без проверки домашних заданий: 8300 руб.
        +

      • Стоимость участия без проверки домашних заданий: 7600 руб.
        сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом.

      • -
      • Стоимость полного пакета: 16500 руб.
        +

      • Стоимость полного пакета: 15500 руб.
        добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при устройстве на работу).

      • -
      • Для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.

      • +
      • Для всех: бесплатное участие в следующий выпусках проекта.

      • Скидка на другие проекты: 700 руб. (без ДЗ) и 1500 руб (с ДЗ).

      • Добавляйся в skype: grigory.kislin с пометкой topjava.

      • Способы оплаты (объязательно перед оплатой свяжитесь со мной)
      • From ac9aa1df68d4c974f74f166f2502c076cbbb0e76 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 25 Oct 2016 16:18:47 +0300 Subject: [PATCH 340/936] Update subscription controller --- resources/mails/topjava_info.html | 12 ++++++------ .../java/ru/javaops/web/SubscriptionController.java | 8 +++++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 908f787..e5c0138 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -12,12 +12,12 @@ участник деплоит свой проект из github в облачный сервис Heroku.

        -

        - Если ты еще в поиске работы Java разработчика, после проекта твои шансы получить работу - возрастут на порядок.
        - Если уже работаешь, но нет достаточно опыта в стеке Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), - Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API, это отличный шанс получить его быстро и на хорошем уровне. -

        +
          +
        • Если ты еще в поиске работы Java разработчика, после проекта твои шансы получить работу + возрастут на порядок.
        • +
        • Если уже работаешь, но нет достаточно опыта в стеке Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), + Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API, это отличный шанс получить его быстро и на хорошем уровне.
        • +

        Требования к участникам:

        На проекте мы не проходим синтаксис java: предполагается, что вы уже знаете, что такое классы, конструкторы, аннотации, анонимные классы, исключения и пр. diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index 45672d8..e28b2f9 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -91,6 +91,7 @@ public ModelAndView registerInGroup(@RequestParam("group") String group, @RequestMapping(value = "/register", method = RequestMethod.POST) public ModelAndView registerByProject(@RequestParam("project") String project, @RequestParam("channel") String channel, + @RequestParam("template") String template, @Valid UserTo userTo, BindingResult result) { if (result.hasErrors()) { throw new ValidationException(Util.getErrorMessage(result)); @@ -102,7 +103,12 @@ public ModelAndView registerByProject(@RequestParam("project") String project, if (userGroup.getRegisterType() == RegisterType.REPEAT) { integrationService.asyncSendSlackInvitation(userGroup.getUser().getEmail(), projectName); } - String template = projectName + (userGroup.getRegisterType() == RegisterType.REPEAT ? "_repeat" : "_register"); + + if (userGroup.getRegisterType() == RegisterType.REPEAT) { + template = projectName + "_repeat"; + } else if (template == null) { + template = projectName + "_register"; + } String mailResult = mailService.sendToUser(template, userGroup.getUser()); return getRedirectView(mailResult, "http://javawebinar.ru/confirm.html", "http://javawebinar.ru/error.html"); } From d9e861d373165387c278556d01dfc1b75141ceee Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 25 Oct 2016 16:20:44 +0300 Subject: [PATCH 341/936] Update subscription controller --- src/main/java/ru/javaops/web/SubscriptionController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index e28b2f9..9374bb6 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -91,7 +91,7 @@ public ModelAndView registerInGroup(@RequestParam("group") String group, @RequestMapping(value = "/register", method = RequestMethod.POST) public ModelAndView registerByProject(@RequestParam("project") String project, @RequestParam("channel") String channel, - @RequestParam("template") String template, + @RequestParam(value = "template", required = false) String template, @Valid UserTo userTo, BindingResult result) { if (result.hasErrors()) { throw new ValidationException(Util.getErrorMessage(result)); From aaab6e01c78dd3651b7c8ef31e92575bbce631e1 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 25 Oct 2016 22:21:26 +0300 Subject: [PATCH 342/936] Update test interview --- resources/vacation/test.html | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 33deda7..457d107 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -50,6 +50,7 @@

        Темы тестового собеседования:

        href="https://ru.wikipedia.org/wiki/Уровень_изолированности_транзакций">Уровни изоляции.
      • Паттернов проектирования
      • +
      • IoC, DI, IoC-контейнер
      • Приципов KISS, DRY, From f4f05285548ed3be47c3a34bdc0066388007da07 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 27 Oct 2016 00:09:10 +0300 Subject: [PATCH 343/936] Update participate --- resources/mails/topjava/topjava_participate.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava/topjava_participate.html b/resources/mails/topjava/topjava_participate.html index 1ca32ea..b8a4bdb 100644 --- a/resources/mails/topjava/topjava_participate.html +++ b/resources/mails/topjava/topjava_participate.html @@ -46,17 +46,17 @@

        IDE: JetBrains IDEA

        href="https://www.jetbrains.com/student/">студенческую учебную лицензию JetBrains IDEA на год.
        Учебную лицензию на IDEA и доступ ко всем материалам проекта буду -рассылать 01.09. +рассылать 01.12.

        Вступительное занятие

        -До старта проекта 01.09 можно приступать в выполнению вступительного +До старта проекта 01.12 можно приступать в выполнению вступительного занятия. Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй инструкциям. Особое внимание обращаю на wiki по ведению проекта в Git, необходимо строго следовать этим правилам.

        Проверка домашних заданий

        Разбор домашний заданий происходит в начале каждого занятия.
        -Если у тебя участие с проверкой ДЗ, то свое решение вступительного задания нужно присылать на проверку начиная c -02.09 до вечера 06.09, остальных домашних заданий - до вечера вторника. +Если у тебя участие с проверкой ДЗ, то свое решение вступительного задания желательно присылать на проверку начиная c +02.12 до вечера 06.12, остальных домашних заданий - до вечера вторника.

        Проверка заданий подразумевает ревью твоего кода. Ты увидишь именно свои ошибки в стиле, структурах данных, алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания From 965e73d2d5e72a759aed2abaddb98a4b245bcd4b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 27 Oct 2016 00:12:28 +0300 Subject: [PATCH 344/936] Update participate --- resources/mails/topjava/topjava_participate.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/mails/topjava/topjava_participate.html b/resources/mails/topjava/topjava_participate.html index b8a4bdb..1ba14f2 100644 --- a/resources/mails/topjava/topjava_participate.html +++ b/resources/mails/topjava/topjava_participate.html @@ -19,13 +19,13 @@

        Заполнение регистрационной формы

        материалам проекта нужен gmail аккаунт, поэтому поле gmail объязательно. Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. Обсуждение вступительного занятия происходит в канале Slack #hw0.
        + href="https://topjava9.slack.com/messages/hw0/">#hw0.
          Другие каналы Slack: -
        • #flooding: оффтопик
        • -
        • #general: общие вопросы
        • -
        • #git: вопросы по git
        • -
        • #idea: вопросы по idea
        • -
        • #interview_job: вопросы прохождения +
        • #flooding: оффтопик
        • +
        • #general: общие вопросы
        • +
        • #git: вопросы по git
        • +
        • #idea: вопросы по idea
        • +
        • #interview_job: вопросы прохождения интервью, работа, вакансии
        • From e3e3a844ccf5f91357e6ff47743809796611c8ca Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 27 Oct 2016 00:16:40 +0300 Subject: [PATCH 345/936] Update participate --- resources/mails/topjava/topjava_participate.html | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/resources/mails/topjava/topjava_participate.html b/resources/mails/topjava/topjava_participate.html index 1ba14f2..e7366a3 100644 --- a/resources/mails/topjava/topjava_participate.html +++ b/resources/mails/topjava/topjava_participate.html @@ -25,10 +25,8 @@

          Заполнение регистрационной формы

        • #general: общие вопросы
        • #git: вопросы по git
        • #idea: вопросы по idea
        • -
        • #interview_job: вопросы прохождения - интервью, - работа, вакансии -
        • +
        • #interview_job: вопросы прохождения интервью, работа, вакансии
        • +
        • #useful_resources: интересные ресурсы
        Форматирование сообщений в slack
        Desktop/ Mobile приложение Slack @@ -50,9 +48,9 @@

        IDE: JetBrains IDEA

        Вступительное занятие

        До старта проекта 01.12 можно приступать в выполнению вступительного занятия. -Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри видео и следуй -инструкциям. Особое внимание обращаю на wiki по ведению - проекта в Git, необходимо строго следовать этим правилам. +Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри все видео занятия и следуй +инструкциям. Особое внимание обращаю на wiki по ведению + проекта в Git, необходимо строго следовать этим правилам.

        Проверка домашних заданий

        Разбор домашний заданий происходит в начале каждого занятия.
        Если у тебя участие с проверкой ДЗ, то свое решение вступительного задания желательно присылать на проверку начиная c From c48179127362df0b3b8a083018bce0124a6aa46c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 27 Oct 2016 00:19:00 +0300 Subject: [PATCH 346/936] Update participate --- resources/mails/jr_confirm.html | 2 +- resources/mails/topjava/topjava_participate.html | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 4b4fa4c..b142c25 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -44,7 +44,7 @@

        IDE: JetBrains IDEA

        Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую учебную лицензию JetBrains IDEA на год.
        Учебную лицензию на IDEA и доступ ко всем материалам проекта буду рассылать 01.12. -

        Вступительное занятие

        +

        Вступительное занятие

        До старта проекта 01.12 можно приступать в выполнению вступительного занятия. Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри все видео занятия и следуй diff --git a/resources/mails/topjava/topjava_participate.html b/resources/mails/topjava/topjava_participate.html index e7366a3..8e48fc0 100644 --- a/resources/mails/topjava/topjava_participate.html +++ b/resources/mails/topjava/topjava_participate.html @@ -11,7 +11,7 @@

        Поздравляю тебя с участием в проекте Заполнение регистрационной формы

        +

        Заполнение регистрационной формы

        Общение на проекте будет вестись в Slack. Заполни пожалуйста все поля
        регистрационной формы, @@ -30,7 +30,7 @@

        Заполнение регистрационной формы

      Форматирование сообщений в slack
      Desktop/ Mobile приложение Slack -

      IDE: JetBrains IDEA

      +

      IDE: JetBrains IDEA

      IDEA считается лучшей Java IDE, и по последней статистике @@ -51,7 +51,7 @@

      Вступительное занятие

      Перед выполнением домашнего задания и чекином в свой репозиторий объязательно посмотри все видео занятия и следуй инструкциям. Особое внимание обращаю на wiki по ведению проекта в Git, необходимо строго следовать этим правилам. -

      Проверка домашних заданий

      +

      Проверка домашних заданий

      Разбор домашний заданий происходит в начале каждого занятия.
      Если у тебя участие с проверкой ДЗ, то свое решение вступительного задания желательно присылать на проверку начиная c 02.12 до вечера 06.12, остальных домашних заданий - до вечера вторника. @@ -62,7 +62,7 @@

      Проверка домашних заданий

      гитхаб и шлют мне ссылку на репозиторий. Я проверяю и фидбэк пишу в slack. Получается эффективно и оперативно. Можно что-то переделать и снова поревьюится.

      -

      Ресурсы

      +

      Ресурсы

      Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Рекомендую также изучить полезные ресурсы.
        From 0da8fcff7260fa77c84ed57acc22a49bb74a1a40 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 28 Oct 2016 16:38:52 +0300 Subject: [PATCH 347/936] Update lesson5_move --- .../mails/masterjava/lesson/lesson5_move.html | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 resources/mails/masterjava/lesson/lesson5_move.html diff --git a/resources/mails/masterjava/lesson/lesson5_move.html b/resources/mails/masterjava/lesson/lesson5_move.html new file mode 100644 index 0000000..73e9c82 --- /dev/null +++ b/resources/mails/masterjava/lesson/lesson5_move.html @@ -0,0 +1,29 @@ + +

        + + + + 5й урок Masterjava: 30.10 или 01.11 + +

        + Здравствуй!
        + Написал в #general слак, дублирую письмом. +

        +Из-за проблем со светом не успеваю сегодня сделать занятие. +Предлагаю провести его в это воскресенье 30.10 или вторник 01.11 в 20.00.
        +Напишите в слак, когда будет удобнее. +

        Уточнил ДЗ 4-го урока:

        +Сделать реализацию в несколько потоков и с учетом того, что пользователей может быть ООчень много. +

          +
        • делать вставку группами (chunk) по 2000 в транзакции и batch моде
        • +
        • не делать для каждой вставки nextval (но иметь возможность вставки с автогенерацией id)
        • +
        • результат импорта - количество успешных/неуспешных вставок и информация, по которой из исходного xml можно повторить импорт неуспешных пользователей
        • +
        +

        +

        + Принимаю ваши ДЗ
        + Для всех- шлите мне ваши реализации модуля persist, включу в занятие реализации на нескольких библиотеках. +

        +

        +

        + \ No newline at end of file From 0716ff9aa595d1fa0a5617dc74d1056fdc14dd7c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 28 Oct 2016 16:44:00 +0300 Subject: [PATCH 348/936] Update lesson5_move --- .../mails/masterjava/lesson/lesson5_move.html | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/resources/mails/masterjava/lesson/lesson5_move.html b/resources/mails/masterjava/lesson/lesson5_move.html index 73e9c82..0f3cef0 100644 --- a/resources/mails/masterjava/lesson/lesson5_move.html +++ b/resources/mails/masterjava/lesson/lesson5_move.html @@ -1,25 +1,28 @@

        - - - 5й урок Masterjava: 30.10 или 01.11 - + + + 5й урок Masterjava: 30.10 или 01.11 +

        Здравствуй!
        Написал в #general слак, дублирую письмом.

        -Из-за проблем со светом не успеваю сегодня сделать занятие. -Предлагаю провести его в это воскресенье 30.10 или вторник 01.11 в 20.00.
        -Напишите в слак, когда будет удобнее. -

        Уточнил ДЗ 4-го урока:

        +

        + Из-за проблем со светом не успеваю сегодня сделать занятие. + Предлагаю провести его в это воскресенье 30.10 или вторник 01.11 в 20.00.
        + Напишите в слак, когда будет удобнее. +

        +Уточнил ДЗ 4-го урока:
        Сделать реализацию в несколько потоков и с учетом того, что пользователей может быть ООчень много.
        • делать вставку группами (chunk) по 2000 в транзакции и batch моде
        • не делать для каждой вставки nextval (но иметь возможность вставки с автогенерацией id)
        • -
        • результат импорта - количество успешных/неуспешных вставок и информация, по которой из исходного xml можно повторить импорт неуспешных пользователей
        • +
        • результат импорта - количество успешных/неуспешных вставок и информация, по которой из исходного xml можно + повторить импорт неуспешных пользователей +
        -

        Принимаю ваши ДЗ
        Для всех- шлите мне ваши реализации модуля persist, включу в занятие реализации на нескольких библиотеках. From 2192efc0ba829a069698a36e35f3a89140f3b20d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 28 Oct 2016 16:44:47 +0300 Subject: [PATCH 349/936] Update lesson5_move --- resources/mails/masterjava/lesson/lesson5_move.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava/lesson/lesson5_move.html b/resources/mails/masterjava/lesson/lesson5_move.html index 0f3cef0..8f183c5 100644 --- a/resources/mails/masterjava/lesson/lesson5_move.html +++ b/resources/mails/masterjava/lesson/lesson5_move.html @@ -1,5 +1,5 @@ -

        + From 79e9d4f78576e933e61ccf540f0e850a4b8fdd64 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 28 Oct 2016 16:51:46 +0300 Subject: [PATCH 350/936] Update lesson5_move --- resources/mails/masterjava/lesson/lesson5_move.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/mails/masterjava/lesson/lesson5_move.html b/resources/mails/masterjava/lesson/lesson5_move.html index 8f183c5..3f37c6f 100644 --- a/resources/mails/masterjava/lesson/lesson5_move.html +++ b/resources/mails/masterjava/lesson/lesson5_move.html @@ -12,19 +12,20 @@

        Из-за проблем со светом не успеваю сегодня сделать занятие. Предлагаю провести его в это воскресенье 30.10 или вторник 01.11 в 20.00.
        - Напишите в слак, когда будет удобнее. + Напиши в слак, когда будет удобнее.

        Уточнил ДЗ 4-го урока:
        Сделать реализацию в несколько потоков и с учетом того, что пользователей может быть ООчень много.
          -
        • делать вставку группами (chunk) по 2000 в транзакции и batch моде
        • +
        • делать вставку группами (chunk) в транзакции и batch моде
        • +
        • количестово пользователей в chunk принимать с UI как параметр
        • не делать для каждой вставки nextval (но иметь возможность вставки с автогенерацией id)
        • результат импорта - количество успешных/неуспешных вставок и информация, по которой из исходного xml можно повторить импорт неуспешных пользователей

        - Принимаю ваши ДЗ
        + Принимаю ваши ДЗ.
        Для всех- шлите мне ваши реализации модуля persist, включу в занятие реализации на нескольких библиотеках.

        From 6b52ad220586b6547b4952e75e26aa56bd3013fc Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 28 Oct 2016 16:55:09 +0300 Subject: [PATCH 351/936] Update lesson5_move --- resources/mails/masterjava/lesson/lesson5_move.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/mails/masterjava/lesson/lesson5_move.html b/resources/mails/masterjava/lesson/lesson5_move.html index 3f37c6f..eab9087 100644 --- a/resources/mails/masterjava/lesson/lesson5_move.html +++ b/resources/mails/masterjava/lesson/lesson5_move.html @@ -7,12 +7,11 @@

        Здравствуй!
        - Написал в #general слак, дублирую письмом.

        Из-за проблем со светом не успеваю сегодня сделать занятие. Предлагаю провести его в это воскресенье 30.10 или вторник 01.11 в 20.00.
        - Напиши в слак, когда будет удобнее. + Напиши в #general слак, когда будет удобнее.

        Уточнил ДЗ 4-го урока:
        Сделать реализацию в несколько потоков и с учетом того, что пользователей может быть ООчень много. From 01d0032a1a999bc22a825c5b4b98575848f33f40 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 29 Oct 2016 16:51:19 +0300 Subject: [PATCH 352/936] Update topjava lesson8 --- resources/mails/topjava/lesson/lesson08.html | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index a87878a..4a3201b 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -8,15 +8,16 @@ Здравствуй firstName!

        -Выложил восьмое занятие нашего проекта.
        +В четвего выложил восьмое занятие нашего проекта.
        CSS (Bootstrap), JavaScript (jQuery + plugins), AJAX, добавление к REST контроллерам базовой авторизации.

        - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и ДЗ в Slack #lesson08 + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        + Обсуждение урока в slack #lesson08, домашнего задания в + slack #hw8

        - Домашнее задание (у кого есть проверка) желательно присылать до вечера 26.07
        + Домашнее задание (у кого есть проверка) желательно присылать до вечера 02.11

        From b7f7a97a54025c0eeca701dc4f9b54392fdcbc57 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 29 Oct 2016 16:52:33 +0300 Subject: [PATCH 353/936] Update topjava lesson8 --- resources/mails/topjava/lesson/lesson08.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index 4a3201b..07128fe 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -8,7 +8,7 @@ Здравствуй firstName!

        -В четвего выложил восьмое занятие нашего проекта.
        +В четверг выложил восьмое занятие нашего проекта.
        CSS (Bootstrap), JavaScript (jQuery + plugins), AJAX, добавление к REST контроллерам базовой авторизации.

        From ec0d15f07a1e49af0f51c88a31fb13d87f21f3a7 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 29 Oct 2016 16:54:47 +0300 Subject: [PATCH 354/936] Update topjava lesson8 --- resources/mails/topjava/lesson/lesson08.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index 07128fe..b5144ff 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -17,7 +17,7 @@ slack #hw8

        - Домашнее задание (у кого есть проверка) желательно присылать до вечера 02.11
        + Домашнее задание (у кого есть проверка) желательно присылать до вечера 01.11

        From 5aa904d42f72daba6a71327f752b6146fa1dec6f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 30 Oct 2016 00:56:14 +0300 Subject: [PATCH 355/936] Add early_price2 --- .../mails/topjava/topjava_early_price2.html | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 resources/mails/topjava/topjava_early_price2.html diff --git a/resources/mails/topjava/topjava_early_price2.html b/resources/mails/topjava/topjava_early_price2.html new file mode 100644 index 0000000..b3024ee --- /dev/null +++ b/resources/mails/topjava/topjava_early_price2.html @@ -0,0 +1,37 @@ + + + + ЗАВТРА, 31.10 заканчивается ЛЬГОТНАЯ ЦЕНА на 'Java Enterprise (Topjava)'. + +

        + Здравствуй!
        +

        +
        + Напомню, что ЗАВТРА, 31.10 заканчивается акция на проект Java + Enterprise + (Topjava)
        + +
        +

        + Старт проекта: 01.12
        +

        +

        +Из юниоров в разработчики: получаем первую работу +

        + Последний шанс принять участие в проекте по акции!

        +

        +

        + \ No newline at end of file From 4ca98438a529a11d89458121d00dad8f0a644518 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 30 Oct 2016 00:59:39 +0300 Subject: [PATCH 356/936] Update early_price2 --- resources/mails/topjava/topjava_early_price2.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_early_price2.html b/resources/mails/topjava/topjava_early_price2.html index b3024ee..c74bb7f 100644 --- a/resources/mails/topjava/topjava_early_price2.html +++ b/resources/mails/topjava/topjava_early_price2.html @@ -1,7 +1,7 @@ - ЗАВТРА, 31.10 заканчивается ЛЬГОТНАЯ ЦЕНА на 'Java Enterprise (Topjava)'. + ЗАВТРА, 31.10 заканчивается акция на 'Java Enterprise (Topjava)'.

        Здравствуй!
        From 4b7953183d1007f90b49af43be7004721baeff6b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 30 Oct 2016 01:00:41 +0300 Subject: [PATCH 357/936] Update early_price2 --- resources/mails/topjava/topjava_early_price2.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_early_price2.html b/resources/mails/topjava/topjava_early_price2.html index c74bb7f..9e1439e 100644 --- a/resources/mails/topjava/topjava_early_price2.html +++ b/resources/mails/topjava/topjava_early_price2.html @@ -7,7 +7,7 @@ Здравствуй!

        - Напомню, что ЗАВТРА, 31.10 заканчивается акция на проект Java + Напомню, что ЗАВТРА, 31.10 заканчивается акция на проект Java Enterprise (Topjava)
          From 8d7369f838d9433efd7e2ad2175ef7ca560a75e3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 30 Oct 2016 18:55:00 +0300 Subject: [PATCH 358/936] Add Sql handling --- resources/view/sqlResult.html | 39 +++++++++++++++++++ resources/view/{userList.html => users.html} | 0 src/main/java/ru/javaops/SqlResult.java | 17 ++++++++ .../javaops/repository/GroupRepository.java | 1 + .../ru/javaops/repository/SqlRepository.java | 33 ++++++++++++++++ .../java/ru/javaops/service/SqlService.java | 31 +++++++++++++++ .../java/ru/javaops/web/PageController.java | 18 +++++++-- 7 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 resources/view/sqlResult.html rename resources/view/{userList.html => users.html} (100%) create mode 100644 src/main/java/ru/javaops/SqlResult.java create mode 100644 src/main/java/ru/javaops/repository/SqlRepository.java create mode 100644 src/main/java/ru/javaops/service/SqlService.java diff --git a/resources/view/sqlResult.html b/resources/view/sqlResult.html new file mode 100644 index 0000000..00caa71 --- /dev/null +++ b/resources/view/sqlResult.html @@ -0,0 +1,39 @@ + + + + + + Java Online Projects + + + + + + +
          + + + + + + + + + + + + + + +
          +
          + + diff --git a/resources/view/userList.html b/resources/view/users.html similarity index 100% rename from resources/view/userList.html rename to resources/view/users.html diff --git a/src/main/java/ru/javaops/SqlResult.java b/src/main/java/ru/javaops/SqlResult.java new file mode 100644 index 0000000..f064662 --- /dev/null +++ b/src/main/java/ru/javaops/SqlResult.java @@ -0,0 +1,17 @@ +package ru.javaops; + +import java.util.List; + +/** + * gkislin + * 30.10.2016 + */ +public class SqlResult { + public SqlResult(List headers, List rows) { + this.headers = headers; + this.rows = rows; + } + + public List headers; + public List rows; +} diff --git a/src/main/java/ru/javaops/repository/GroupRepository.java b/src/main/java/ru/javaops/repository/GroupRepository.java index 04227e3..11d04f8 100644 --- a/src/main/java/ru/javaops/repository/GroupRepository.java +++ b/src/main/java/ru/javaops/repository/GroupRepository.java @@ -23,6 +23,7 @@ public interface GroupRepository extends JpaRepository { @Cacheable("group") Group findByName(@Param("name") String name); + @Override @Cacheable("groups") List findAll(Sort sort); } \ No newline at end of file diff --git a/src/main/java/ru/javaops/repository/SqlRepository.java b/src/main/java/ru/javaops/repository/SqlRepository.java new file mode 100644 index 0000000..1e87ed9 --- /dev/null +++ b/src/main/java/ru/javaops/repository/SqlRepository.java @@ -0,0 +1,33 @@ +package ru.javaops.repository; + +import org.parboiled.common.ImmutableList; +import org.springframework.stereotype.Repository; +import ru.javaops.SqlResult; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.util.Map; + +/** + * gkislin + * 30.10.2016 + */ + +@Repository +public class SqlRepository { + @PersistenceContext + private EntityManager em; + + public SqlResult execute(String sql, Map params) { +/* + Session session = em.unwrap(Session.class); + session.doWork((Connection connection)-> { + PreparedStatement ps = connection.prepareStatement(sql); + params.forEach((idx, value)->ps.setObject(idx, value)); + }); +*/ + Query query = em.createNativeQuery(sql); + return new SqlResult(ImmutableList.of("email, date"), query.getResultList()); + } +} diff --git a/src/main/java/ru/javaops/service/SqlService.java b/src/main/java/ru/javaops/service/SqlService.java new file mode 100644 index 0000000..8b140d8 --- /dev/null +++ b/src/main/java/ru/javaops/service/SqlService.java @@ -0,0 +1,31 @@ +package ru.javaops.service; + +import com.google.common.collect.ImmutableMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.javaops.SqlResult; +import ru.javaops.repository.SqlRepository; + +import java.util.Map; + +/** + * gkislin + * 30.10.2016 + */ +@Service +public class SqlService { + + @Autowired + private SqlRepository sqlRepository; + + public SqlResult executeSql(String sqlKey, Map params) { + if ("itedu".equals(sqlKey)) { + return sqlRepository.execute( + "SELECT u.EMAIL, FORMATDATETIME(u.REGISTERED_DATE, 'yyyy-MM-dd') date FROM USERS u " + + "JOIN USER_GROUP ug ON u.id=ug.USER_ID AND ug.CHANNEL='itedu' " + + "ORDER BY date DESC", + ImmutableMap.of()); + } + throw new IllegalStateException("Illegal Sql Key"); + } +} diff --git a/src/main/java/ru/javaops/web/PageController.java b/src/main/java/ru/javaops/web/PageController.java index 92ea7c2..d6b2bed 100644 --- a/src/main/java/ru/javaops/web/PageController.java +++ b/src/main/java/ru/javaops/web/PageController.java @@ -1,10 +1,13 @@ package ru.javaops.web; +import com.google.common.collect.ImmutableMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; +import ru.javaops.SqlResult; +import ru.javaops.service.SqlService; import ru.javaops.service.UserService; import ru.javaops.to.UserStat; @@ -18,11 +21,20 @@ public class PageController { @Autowired private UserService userService; + @Autowired + private SqlService sqlService; + @RequestMapping(value = "/users", method = GET) public ModelAndView usersInfo(@RequestParam("key") String key, @RequestParam("email") String email) { - List userList = userService.findAllForStats(); - return (userList.stream().filter(u -> u.getEmail().equals(email)).findAny().isPresent()) ? - new ModelAndView("userList", "users", userList) : + List users = userService.findAllForStats(); + return (users.stream().filter(u -> u.getEmail().equals(email)).findAny().isPresent()) ? + new ModelAndView("users", "users", users) : new ModelAndView("statsForbidden"); } + + @RequestMapping(value = "/sql", method = GET) + public ModelAndView sqlExecute(@RequestParam("sql_key") String sqlKey) { + SqlResult result = sqlService.executeSql(sqlKey, ImmutableMap.of()); + return new ModelAndView("sqlResult", "result", result); + } } From d1a4da3419fca24731d4a443b051092ef1a74e00 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 31 Oct 2016 23:05:12 +0300 Subject: [PATCH 359/936] update topjava info --- resources/mails/topjava_info.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index e5c0138..e5dbaf8 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -112,12 +112,11 @@

          На проекте


        -

        До 31.10 действуют специальные цены:

          -
        • Стоимость участия без проверки домашних заданий: 7600 руб.
          +

        • Стоимость участия без проверки домашних заданий: 8300 руб.
          сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом.

        • -
        • Стоимость полного пакета: 15500 руб.
          +

        • Стоимость полного пакета: 16500 руб.
          добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при устройстве на работу).

        • Для всех: бесплатное участие в следующий выпусках проекта.

        • From 381bfe06a385a3521cfd0cdd56790edc6d861e7b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 1 Nov 2016 16:27:02 +0300 Subject: [PATCH 360/936] Add masterjava lesson5 --- .../mails/masterjava/lesson/lesson5.html | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 resources/mails/masterjava/lesson/lesson5.html diff --git a/resources/mails/masterjava/lesson/lesson5.html b/resources/mails/masterjava/lesson/lesson5.html new file mode 100644 index 0000000..bbe88b9 --- /dev/null +++ b/resources/mails/masterjava/lesson/lesson5.html @@ -0,0 +1,22 @@ + + + + + + СЕГОДНЯ в 20.00 (GMT+3.00) 5-е занятие Masterjava + +

          + Здравствуй!
          +

          +СЕГОДНЯ, 01.11 в 20.00 состоится 5-е занятие Masterjava
          +

          Ссылка на комнату вебинара

          +Если будут проблемы с куками- почисти или зайди в анонимной вкладке.
          +Логин: твой email, пароль (если еще не менял): masterjava23 +

          + Запись будет доступна сразу после вебинара, в Google Doc позднее. +

          +До встречи в комнате вебинара, +

          +

          + \ No newline at end of file From a87249430860f88ea0d33639ba34353216099521 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 3 Nov 2016 13:03:27 +0300 Subject: [PATCH 361/936] update topjava lesson 09 --- resources/mails/topjava/lesson/lesson09.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index ebf3370..448a835 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -12,11 +12,12 @@ Наконец делаем настоящую авторизацию, ее тестирование и отрисовку таблицы по AJAX.

          - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и ДЗ в Slack #lesson09 + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          + Обсуждение урока в slack #lesson09, домашнего задания в + slack #hw9

          - Домашнее задание (у кого есть проверка) желательно присылать до вечера 02.08
          + Домашнее задание (у кого есть проверка) желательно присылать до вечера 08.11

          From 51feca952831978a9315a7c223afbea46c4d74bc Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 7 Nov 2016 00:38:48 +0300 Subject: [PATCH 362/936] add topjava lesson 09_fix --- .../mails/topjava/lesson/lesson09_fix.html | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 resources/mails/topjava/lesson/lesson09_fix.html diff --git a/resources/mails/topjava/lesson/lesson09_fix.html b/resources/mails/topjava/lesson/lesson09_fix.html new file mode 100644 index 0000000..4c79065 --- /dev/null +++ b/resources/mails/topjava/lesson/lesson09_fix.html @@ -0,0 +1,28 @@ + + + + Правки к уроку 9 + + +

          + Здравствуй firstName! +

          +В 9-м уроке сделал несколько правок: патч 9_13_fix.patch +
            +
          • вернул DELETE FROM в populateDB.sql, чтобы работал HSQLDB (TRUNCATE оставил в коментариях)
          • +
          • сделал "честную" авторизацию в RootControllerTest (через authentication метод) + утильный метод в + TestUtil
          • +
          • сделал mockAuthorize для SpringMain, в который не попадают фильтры
          • +
          +Напоминаю про ссылку на группу Slack Java Online Projects, где мы общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, + вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) в время и после проекта. + Проверь свои контактные + данные. + Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут + увидеть твой город и skype в списке, а ты сможешь найти там разработчиков из своего города. + После сохранения формы на почту должно прийти приглашение в группу Slack и откроется ссылка на список + участников, отсортированный по городам. +

          +

          + + \ No newline at end of file From 8484532526cde97116f4079c755657fdc40c6597 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 7 Nov 2016 00:46:18 +0300 Subject: [PATCH 363/936] update topjava lesson 09_fix --- resources/mails/topjava/lesson/lesson09_fix.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson09_fix.html b/resources/mails/topjava/lesson/lesson09_fix.html index 4c79065..5b455b9 100644 --- a/resources/mails/topjava/lesson/lesson09_fix.html +++ b/resources/mails/topjava/lesson/lesson09_fix.html @@ -14,8 +14,8 @@ TestUtil
        • сделал mockAuthorize для SpringMain, в который не попадают фильтры
        -Напоминаю про ссылку на группу Slack Java Online Projects, где мы общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, - вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) в время и после проекта. +Напоминаю про группу Slack Java Online Projects, где мы общаемся на IT темы (помощь с Java, отзывы о работах, обсуждение тестовых заданий, + вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) во время и после topjava. Проверь свои контактные данные. Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут From 0e3b883364f0ea0523563dfde068b7663eb1fc14 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 9 Nov 2016 13:51:59 +0300 Subject: [PATCH 364/936] Add webinar-urise --- resources/mails/basejava_urise.html | 17 ------------- resources/mails/javaops/webinar_urise.html | 29 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 17 deletions(-) delete mode 100644 resources/mails/basejava_urise.html create mode 100644 resources/mails/javaops/webinar_urise.html diff --git a/resources/mails/basejava_urise.html b/resources/mails/basejava_urise.html deleted file mode 100644 index 188d563..0000000 --- a/resources/mails/basejava_urise.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - Сегодня, 24.05 в 19.00 (GMT+3) БЕСПЛАТНОЕ онлайн занятие: Java разработка, практика и презентация курса: Java SE + Java Web. - -

        - Здравствуй firstName!
        -

        -

        - Недавно я начал преподавать в школе U-Rise и сегодня, 24.05 в 19.00 (Москва/Киев) буду проводить бесплатное онлайн занятие на тему Java разработки. -

        -Интересные факты, статистика, немного практики и ответы вживую на любой интересующий тебя вопрос по этой теме. -

        Приглашаю к участию в вебинаре

        -

        - \ No newline at end of file diff --git a/resources/mails/javaops/webinar_urise.html b/resources/mails/javaops/webinar_urise.html new file mode 100644 index 0000000..5a59719 --- /dev/null +++ b/resources/mails/javaops/webinar_urise.html @@ -0,0 +1,29 @@ + + + + + + ЗАВТРА, 10.11 в 19.00 Киев, 20.00 Москва вебинар: Java SE + Web + Enterprise. Трудоустройство. + Java-разработчика. + +

        + Здравствуй firstName!
        +

        +

        +

        Приглашаю тебя на бесплатный вебинар по актуальным темам:

        +

        Осваиваем Java SE + Web

        +
          +
        • Основные темы Java SE
        • +
        • Самые частые вопросы на собеседованиях
        • +
        • Первое Web приложение
        • +
        +

        Java Enterprise

        +
          +
        • Что востребовано на рынке
        • +
        • С чего начинать изучать
        • +
        • Составляем резюме. Первая работа
        • +
        +Статистика, полезные ресурсы, опыт трудоустойства и ответы вживую на любой интересующий тебя вопрос по этим темам. +

        Приглашаю к участию в вебинаре

        +

        + \ No newline at end of file From fa78c562fae10d4d46f3b432586727a284001b2b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 9 Nov 2016 13:53:39 +0300 Subject: [PATCH 365/936] Add webinar-urise --- resources/mails/javaops/webinar_urise.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/mails/javaops/webinar_urise.html b/resources/mails/javaops/webinar_urise.html index 5a59719..32482d9 100644 --- a/resources/mails/javaops/webinar_urise.html +++ b/resources/mails/javaops/webinar_urise.html @@ -9,8 +9,7 @@

        Здравствуй firstName!

        -

        -

        Приглашаю тебя на бесплатный вебинар по актуальным темам:

        +

        Приглашаю тебя на бесплатный вебинар по актуальным темам:

        Осваиваем Java SE + Web

        • Основные темы Java SE
        • From 1e567e30ee719d27ff7ddbf72825871d661494bd Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 9 Nov 2016 13:54:46 +0300 Subject: [PATCH 366/936] Update webinar-urise --- resources/mails/javaops/webinar_urise.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/mails/javaops/webinar_urise.html b/resources/mails/javaops/webinar_urise.html index 32482d9..851947d 100644 --- a/resources/mails/javaops/webinar_urise.html +++ b/resources/mails/javaops/webinar_urise.html @@ -3,8 +3,7 @@ - ЗАВТРА, 10.11 в 19.00 Киев, 20.00 Москва вебинар: Java SE + Web + Enterprise. Трудоустройство. - Java-разработчика. + ЗАВТРА, 10.11 в 19.00 Киев, 20.00 Москва вебинар: Java SE + Web + Enterprise. Трудоустройство.

          Здравствуй firstName!
          From 7d16a65b2c07576edf71f85a88aa2207dfd84ad0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 9 Nov 2016 15:32:27 +0300 Subject: [PATCH 367/936] Update topjava_repeat --- resources/mails/topjava_repeat.html | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/resources/mails/topjava_repeat.html b/resources/mails/topjava_repeat.html index 62f0204..0e71309 100644 --- a/resources/mails/topjava_repeat.html +++ b/resources/mails/topjava_repeat.html @@ -14,27 +14,24 @@

          Google Drive

          Проект эволюционирует, поэтому патчи текущего выпуска будут отличаться. Видео возможно также будут редактироваться / дополнятся. Все актуальные материалы нашего выпуска будут находится в папке Topjava8. + href="https://drive.google.com/drive/folders/0B9Ye2auQ_NsFY3lQck05WWt2eXM">папке TopJava9.

          Slack

          -Проверь почту- должно прийти приглашение в группу Slack topjava8 +Проверь почту- должно прийти приглашение в группу Slack topjava9
            Темы каналов: -
          • #entrance_lesson: вопросы по вступительному - заданию -
          • -
          • #flooding: оффтопик
          • -
          • #general: общие вопросы
          • -
          • #git: вопросы по git
          • -
          • #idea: вопросы по idea
          • -
          • #interview_job: вопросы прохождения интервью, - работа, вакансии -
          • +
          • #hw0: вопросы по вступительному заданию
          • +
          • #flooding: оффтопик
          • +
          • #general: общие вопросы
          • +
          • #git: вопросы по git
          • +
          • #idea: вопросы по idea
          • +
          • #interview_job: вопросы прохождения интервью, работа, вакансии
          • +
          • #useful_resources: интересные ресурсы
          Форматирование сообщениq в slack
          Desktop/ Mobile приложение Slack -

          Наш проект topjava08 в гитхаб, расписание занятий

          -Рассылка первого занятия будет в четверг, 08.09.
          +

          Наш проект topjava09 в гитхаб, расписание занятий

          +Рассылка первого занятия будет в четверг, 08.12.
          • Ресурсы для подготовки
          • Wiki по проекту
          • From 8110b9d4f9f658e25d7335c1cdc7c33b9567d601 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 10 Nov 2016 16:02:15 +0300 Subject: [PATCH 368/936] Update lesson10 --- resources/mails/topjava/lesson/lesson10.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson10.html b/resources/mails/topjava/lesson/lesson10.html index 5e18fd2..60b4eff 100644 --- a/resources/mails/topjava/lesson/lesson10.html +++ b/resources/mails/topjava/lesson/lesson10.html @@ -11,12 +11,14 @@ Выложил десятое занятие нашего проекта.
            На заключительное занятие остается разбор HW10, рефакторинг и деплой в heroku.

            +ВАЖНО: обновил патчи (они остались со старого проекта, можно было увидеть по дате).
            +Нужно откатиться обратно на обрано на 9_13_fix.patch: Reset Current Branch to Here -> Hard и скачать новые. Картинка есть в канале #lesson10.

            - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. - Обсуждение урока и ДЗ в Slack #lesson10 + Обсуждение урока в Slack #lesson10, домашнего задания в + #hw10

            - Домашнее задание (у кого есть проверка) желательно присылать до вечера 09.08
            + Домашнее задание (у кого есть проверка) желательно присылать до вечера 15.11

            From bd0fe2a913badc06d7f73f315d129b993d04d29e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 10 Nov 2016 16:06:33 +0300 Subject: [PATCH 369/936] Update lesson10 --- resources/mails/topjava/lesson/lesson10.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson10.html b/resources/mails/topjava/lesson/lesson10.html index 60b4eff..c559892 100644 --- a/resources/mails/topjava/lesson/lesson10.html +++ b/resources/mails/topjava/lesson/lesson10.html @@ -11,8 +11,7 @@ Выложил десятое занятие нашего проекта.
            На заключительное занятие остается разбор HW10, рефакторинг и деплой в heroku.

            -ВАЖНО: обновил патчи (они остались со старого проекта, можно было увидеть по дате).
            -Нужно откатиться обратно на обрано на 9_13_fix.patch: Reset Current Branch to Here -> Hard и скачать новые. Картинка есть в канале #lesson10. +ВАЖНО: обновил патчи (они остались со старого проекта, можно было увидеть по дате). Нужно откатиться обратно на обрано на 9_13_fix.patch: Reset Current Branch to Here->Hard и скачать новые. Картинка есть в канале #lesson10.

            Обсуждение урока в Slack #lesson10, домашнего задания в #hw10 From 3430f7d7cf86680aa2f5857ef13c6ce780d86be3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 11 Nov 2016 13:59:52 +0300 Subject: [PATCH 370/936] Add masterjava template --- .../mails/masterjava/lesson/lesson6_move.html | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 resources/mails/masterjava/lesson/lesson6_move.html diff --git a/resources/mails/masterjava/lesson/lesson6_move.html b/resources/mails/masterjava/lesson/lesson6_move.html new file mode 100644 index 0000000..32312af --- /dev/null +++ b/resources/mails/masterjava/lesson/lesson6_move.html @@ -0,0 +1,35 @@ + + + + + + 6й урок Masterjava будет 15.11, 20.00 (GMT+3) + +

            + Здравствуй!
            +

            +

            6-й урок Masterjava переносится на вторник, 15.11 в 20.00 (GMT+3).

            +Видео 5го урока пока еще в обработке (будет готово сегодня-завтра). Кое-что приходится дополнять: + +Об обновление урока сообщаю в канале #lesson5 +

            +В HW5 оставил только: +

              +
            • Добавить в export синхронизацию городов и групп/проектов.
            • +
            • Добавить пользователю ссылки на города/группы.
            • +
            +Принимаю ваши ДЗ. До встречи во вторник. +

            +

            +

            + \ No newline at end of file From b6ab368a13b42b699c6341ae72a27fc75866d20c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 11 Nov 2016 14:01:22 +0300 Subject: [PATCH 371/936] Update masterjava template --- resources/mails/masterjava/lesson/lesson6_move.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava/lesson/lesson6_move.html b/resources/mails/masterjava/lesson/lesson6_move.html index 32312af..4d791a4 100644 --- a/resources/mails/masterjava/lesson/lesson6_move.html +++ b/resources/mails/masterjava/lesson/lesson6_move.html @@ -16,7 +16,7 @@

            6-й урок Masterjava переносится на вторник, 15.11
          • поправил в видео отображение enum type в pgAdmin: надо поднять галочку Типы в Файл->Параметры (в самом конце списка)
          • -
          • добавил в урок ссылки на
            +
          • добавил в урок ссылки на
            Postgresql enum advantages/disadvantages
            ALTER Enum types since 9.1
          • From 9c2b6111002b52bf7a35a17a899ce1198f5ce2ce Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 11 Nov 2016 14:28:23 +0300 Subject: [PATCH 372/936] Update basejava template --- resources/mails/basejava_register.html | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index c6ce7dc..1a04882 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -11,13 +11,12 @@

            Спасибо за интерес к курсу Практика Java. Разработка Web приложения!

            -Я адаптировал и начал вести свой обновленный курс в рамках школы U-Rise. Курс идет на платформе обучения в личном кабинете с контролем результатов.
            -Мне помогает еще один преподаватель Станислав, который лично курирует процесс обучения. +Я адаптировал и обновил курс (стало 17 занятий) и теперь он идет на платформе обучения в личном кабинете с контролем результатов. Мне помогает еще один преподаватель Станислав, который лично курирует процесс обучения.
            -Курс расчитан на людей с разным уровнем знаний, поэтому, чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание. +Чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание. +После этого свяжитесь пожалуйста со мной в skype: grigory.kislin или Telegram gkislin.
            +По участию и всем организационным вопросам я свяжу вас с Артемом, организатором.

            - После этого можно регистрироваться по сслыке обучение JAVA - и с тобой свяжутся и порекомендуют нужный формат прохождения курса (для новичков, начинающих или продолжающих). Не забудь получить скидку в 5%, сказав что пришел с сайта JavaWebinar.ru от меня.

            Добавляйся в группу VK: Практика Java (Web/ Enterprise)
            From f1d751737bef30c3d2260de6a0c84c9a3713457a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 11 Nov 2016 14:35:50 +0300 Subject: [PATCH 373/936] Update basejava template --- resources/mails/basejava_register.html | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 1a04882..2dfc101 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -17,6 +17,7 @@ После этого свяжитесь пожалуйста со мной в skype: grigory.kislin или Telegram gkislin.
            По участию и всем организационным вопросам я свяжу вас с Артемом, организатором.

            +Если у вас достаточно знаний, то есть возможность пройти весь курс c проверкой куратором за 95$.

            Добавляйся в группу VK: Практика Java (Web/ Enterprise)
            From b51cc1796392baec7da2f3b97d7c386b410b4d94 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 11 Nov 2016 15:23:52 +0300 Subject: [PATCH 374/936] Update masterjava register info --- resources/mails/masterjava_register.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava_register.html b/resources/mails/masterjava_register.html index 39aa8ce..836c8b4 100644 --- a/resources/mails/masterjava_register.html +++ b/resources/mails/masterjava_register.html @@ -12,7 +12,7 @@ Спасибо за регистрацию на проекте Многопоточность. Веб сервисы.

            - Проект стартует во второй половине августа/ начале сентября, дата старта и программа проекта будут уточняться и рассылаться всем + Проект идет. Следующий выпуск планируется в феврале 2017г., дата старта и программа проекта будут уточняться и рассылаться всем зарегистрированным участникам.

            From 5e0cc1955678367a8c90b99793eb8b7ea7509368 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 11 Nov 2016 15:29:01 +0300 Subject: [PATCH 375/936] Update basejava register info --- resources/mails/basejava_register.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 2dfc101..b98da3e 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -11,13 +11,12 @@

            Спасибо за интерес к курсу Практика Java. Разработка Web приложения!

            -Я адаптировал и обновил курс (стало 17 занятий) и теперь он идет на платформе обучения в личном кабинете с контролем результатов. Мне помогает еще один преподаватель Станислав, который лично курирует процесс обучения. -
            +Я адаптировал и обновил этот курс (стало 17 занятий!) и теперь он идет на платформе обучения в личном кабинете с контролем результатов. Мне помогает еще один преподаватель Станислав, который лично курирует процесс обучения. Чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание. После этого свяжитесь пожалуйста со мной в skype: grigory.kislin или Telegram gkislin.
            По участию и всем организационным вопросам я свяжу вас с Артемом, организатором.

            -Если у вас достаточно знаний, то есть возможность пройти весь курс c проверкой куратором за 95$. +Если у вас достаточно знаний, то есть возможность пройти весь курс c проверкой куратором за месяц за 95$!.

            Добавляйся в группу VK: Практика Java (Web/ Enterprise)
            From 4b32582f28bce125b1744f8debcc378260d1dee1 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 11 Nov 2016 15:37:36 +0300 Subject: [PATCH 376/936] Update basejava register info --- resources/mails/basejava_register.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index b98da3e..3a7eff2 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -13,7 +13,7 @@

            Я адаптировал и обновил этот курс (стало 17 занятий!) и теперь он идет на платформе обучения в личном кабинете с контролем результатов. Мне помогает еще один преподаватель Станислав, который лично курирует процесс обучения. Чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание. -После этого свяжитесь пожалуйста со мной в skype: grigory.kislin или Telegram gkislin.
            +После этого свяжитесь пожалуйста со мной в skype: grigory.kislin или telegram gkislin.
            По участию и всем организационным вопросам я свяжу вас с Артемом, организатором.

            Если у вас достаточно знаний, то есть возможность пройти весь курс c проверкой куратором за месяц за 95$!. From 7cb1cad6c3b94ca7f5afd28034fd8a1b3f467fb0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 14 Nov 2016 12:34:34 +0300 Subject: [PATCH 377/936] Update info --- resources/mails/javaops/webinar_topjava.html | 21 ++++++++++++++++++++ resources/mails/topjava_info.html | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 resources/mails/javaops/webinar_topjava.html diff --git a/resources/mails/javaops/webinar_topjava.html b/resources/mails/javaops/webinar_topjava.html new file mode 100644 index 0000000..e40147c --- /dev/null +++ b/resources/mails/javaops/webinar_topjava.html @@ -0,0 +1,21 @@ + + + + + + Бесплатный вебинар: "Осваиваем Java Enterprise". 17.11 (четверг), 20.00 (GMT+3) + +

            + Здравствуй firstName!
            +

            +Приглашаю тебя на бесплатный ознакомительный вебинар по актуальной для каждого начинающего Java разработчика теме: +

            Осваиваем Java Enterprise

            +
              +
            • Статистика: что востребовано на рынке
            • +
            • С чего начинать изучение
            • +
            • Составляем резюме. Первая работа
            • +
            +

            Начало 17.11 (четверг) в 20.00 Москва, 19.00 Киев

            +Статистика, полезные ресурсы, структура типичного Enterprise приложения, опыт трудоустойства и ответы вживую на любой интересующий тебя вопрос по этим темам. +

            + \ No newline at end of file diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index e5dbaf8..84d4f77 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -132,7 +132,7 @@

            На проекте

            Расписание занятий текущего проекта (следующий стартует в начале декабря, буду делать рассылку):

            Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Домашние задания подобранны по темам занятия и требуют реализации функциональности, схожей с пройденной на занятии.

              01.12: Старт проекта

              -
            • Сбор группы в Slack и Skype
            • +
            • Сбор группы в Slack
            • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
            • Раздача учебных лицензий JetBrains IDEA
            • Выполнение и проверка вступительного задания From fad7d7bd1b7acf1aefe68ab56113e9fdf7ee6123 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 14 Nov 2016 13:14:31 +0300 Subject: [PATCH 378/936] Update info --- resources/mails/topjava_info.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 84d4f77..6ac63b6 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -129,7 +129,7 @@

              На проекте

            • Курс рубля

            -

            Расписание занятий текущего проекта (следующий стартует в начале декабря, буду делать рассылку):

            +

            Расписание занятий проекта:

            Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Домашние задания подобранны по темам занятия и требуют реализации функциональности, схожей с пройденной на занятии.

              01.12: Старт проекта

            • Сбор группы в Slack
            • @@ -245,6 +245,16 @@

              Расписание занятий текущего проекта (сле
            • Возможные доработки приложения

            +

            Также приглашаю на ознакомительный вебинар:
            + Осваиваем Java Enterprise

            +
              +
            • Статистика: что востребовано на рынке
            • +
            • С чего начинать изучение
            • +
            • Составляем резюме. Первая работа
            • +
            +

            Начало 17.11 (четверг) в 20.00 Москва, 19.00 Киев

            + Статистика, полезные ресурсы, структура типичного Enterprise приложения, опыт трудоустойства и ответы вживую на любой интересующий тебя вопрос по этим темам. +

            Добавляйся в группу VK: Практика Java (Web/ Enterprise)
            До встречи на проекте! From 2e0b4d873626186b6d686b5e55907b584d567584 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Nov 2016 16:23:32 +0300 Subject: [PATCH 379/936] Add webinar2 --- resources/mails/javaops/webinar2_topjava.html | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 resources/mails/javaops/webinar2_topjava.html diff --git a/resources/mails/javaops/webinar2_topjava.html b/resources/mails/javaops/webinar2_topjava.html new file mode 100644 index 0000000..aa5fbe5 --- /dev/null +++ b/resources/mails/javaops/webinar2_topjava.html @@ -0,0 +1,23 @@ + + + + + + Вебинар СЕГОДНЯ в 20.00 Москва, 19.00 Киев: "Осваиваем Java Enterprise" + +

            + Здравствуй firstName!
            +

            +Напоминаю, что СЕГОДНЯ в 20.00 GMT+3 состоится бесплатный вебинар: +

            Осваиваем Java Enterprise

            +
              +
            • Статистика: что востребовано на рынке
            • +
            • С чего начинать изучение
            • +
            • Что нужно, чтобы стать Java разработчиком
            • +
            +Для участия нужно в назначенное время зайти по ссылке: +

            Прямая трансляция "Осваиваем Java Enterprise"

            +Статистика, полезные ресурсы, структура типичного Enterprise приложения, опыт трудоустойства и ответы вживую на любой интересующий тебя вопрос по этим темам.
            +Слайды презентации +

            + \ No newline at end of file From f7e6fbc52b61e12fc8d504103cc256bbe827a667 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Nov 2016 16:28:06 +0300 Subject: [PATCH 380/936] Update webinar2 --- resources/mails/javaops/webinar2_topjava.html | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/mails/javaops/webinar2_topjava.html b/resources/mails/javaops/webinar2_topjava.html index aa5fbe5..74c0977 100644 --- a/resources/mails/javaops/webinar2_topjava.html +++ b/resources/mails/javaops/webinar2_topjava.html @@ -18,6 +18,7 @@

            Осваиваем Java Enterprise

            Для участия нужно в назначенное время зайти по ссылке:

            Прямая трансляция "Осваиваем Java Enterprise"

            Статистика, полезные ресурсы, структура типичного Enterprise приложения, опыт трудоустойства и ответы вживую на любой интересующий тебя вопрос по этим темам.
            +
            Слайды презентации

            \ No newline at end of file From 2c15512642c488938f7e5ed23f05c2a3e50f8c55 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Nov 2016 17:53:00 +0300 Subject: [PATCH 381/936] Update topjava lesson11 --- resources/mails/topjava/lesson/lesson11.html | 39 +++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index bdeffe6..c180b13 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -10,25 +10,24 @@

            Выложил заключительное занятие нашего проекта.
            -Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
            -Обсуждение урока и HW10 в Slack #lesson11
            -Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта. +Все патчи этого урока уже вчекинены в наш репозиторий и я обновил им демо приложение. +Обсуждение урока в Slack #lesson11
            • - Если ты решил сделать доработку проекта, отдай мне свой код на ревью. Я включу ссылку на твой репозиторий в + Если ты решил сделать доработку проекта, отдай мне свой код на ревью. Я включу ссылку на твой репозиторий в список сделанных доработок для доступа к ним всех участников Topjava.

            • Выпускной - проект от участников с проверкой ДЗ желательно сдать на ревью до 01.09 - (напомню, что лишние профили в коде и в pom.xml нужно удалить).

              + проект от участников с проверкой ДЗ желательно сдать на ревью до 08.12 + (добавил к нему рекомендации).

            • Повторное участие в проекте без проверки домашних заданий бесплатное.
              Зарегистрируйся и тебе - придет ссылка на группу Slack topjava8 (там уже есть новые участники с JavaRush). - Здесь есть расписание topjava08. Приглашай знакомых, желающих стать java разработчиками или - повысить свою квалификацию. Со ссылкой на тебя даю скидку 5%.

              + придет ссылка на группу Slack topjava9 (там уже есть новые участники). Первый урок будет 08.12.
              + Прект будем вести в репозитории topjava09, здесь же есть расписание. + Приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию!

            • -
            • Группа Slack topjava8 к 01.09 будет удалена. Приглашаю в Slack Java Online Projects (кто еще не +
            • Группа Slack topjava8 после 08.12 будет удалена, вступай в группу Java Online Projects (кто еще не вступил), где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) По каждой теме сделан свой канал. Проверь свои
            • - Все материалы проекта останутся вам доступны (в течении нового курса они будут постепенно переезжать в подпапку Topjava8). Репозиторий - topjava08 до 01.09 будет заархивирован и положен в Google Drive вместе с уроками в формате markdown. + Все материалы проекта останутся тебе доступны (в течении нового курса они будут постепенно переезжать в подпапку Topjava9). Для просмотра в Chrome файлов md я пользуюсь плагином Markdown Preview (нужно в его параметрах разрешить открывать файл по ссылкам) или можно использовать плагин IDEA Markdown support.

            • - В конце августа-начале сентября я планирую запустить курс Многопоточность. Веб сервисы.
              - Посмотри бесплатное первое - занятие: многопоточность, - это важная для разработчика тема, ее часто спрашивают на собеседованиях.

              - Предварительная стоимость участия: + В феврале 2017 г. планирую второй выпуск курса Многопоточность. Веб сервисы. + (темы поменяются на актуальные ближе к концу текущего выпуска)
              + Посмотри бесплатное первое занятие: многопоточность, это важная для разработчика тема, ее часто спрашивают на собеседованиях.

              + Предварительная стоимость участия в в проекте MasterJava (учитывая скидку участника Topjava, курс рубля к USD):
              • без проверок домашних заданий: 8600 руб.
              • -
              • с проверками заданий: 16500 руб.
              • -
              • стоимость для участников Topjava: 7900 руб. и 15000 руб. (курс рубля к USD)
              • +
              • с проверками заданий: 16800 руб.
              • бесплатное повторное участие в формате рассылки материалов

              Дата старта и программа проекта будут уточняться и рассылаться всем зарегистрированным участникам.

              - Также у участников Topjava будут скидки на другие проекты (осенью планируется topjava2 на Spring-Boot).
              + Также у участников TopJava будут скидки на другие проекты (осенью планируется topjava2 на Spring-Boot).
              О всех новостях буду делать рассылку и публиковать в группе VK практика Java (Web/ Enterprise).

            • @@ -78,7 +73,7 @@

              Большая просьба от Важно: если проект понравился, напиши пожалуйста в VK отзыв о проекте.

              - Спасибо за участие в Topjava и, надеюсь, до новой встречи! + Спасибо за участие в проекте TopJava, желаю отличной карьеры и, надеюсь, до новой встречи!

              From 2ec34eaeaf8a375665eb8c41fc0741c87f4bf957 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Nov 2016 17:56:11 +0300 Subject: [PATCH 382/936] Update topjava lesson11 --- resources/mails/topjava/lesson/lesson11.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index c180b13..f10133a 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -10,7 +10,7 @@

              Выложил заключительное занятие нашего проекта.
              -Все патчи этого урока уже вчекинены в наш репозиторий и я обновил им демо приложение. +Все патчи этого урока уже вчекинены в наш репозиторий и я обновил им демо приложение. Обсуждение урока в Slack #lesson11
              • From 15bafcf7214f49785383ba0e1b2548413658390a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Nov 2016 18:12:12 +0300 Subject: [PATCH 383/936] Update topjava lesson11 --- resources/mails/topjava/lesson/lesson11.html | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index f10133a..dc6a89f 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -21,7 +21,9 @@ проект от участников с проверкой ДЗ желательно сдать на ревью до 08.12 (добавил к нему рекомендации).

              • -
              • Повторное участие в проекте без проверки домашних заданий бесплатное.
                +
              • Повторное участие в проекте без проверки домашних заданий бесплатное.
                + Единственное условие (надеюсь не будет препятствием)- поделиться ссылкой на проект в VK или + Facebook
                .
                Зарегистрируйся и тебе придет ссылка на группу Slack topjava9 (там уже есть новые участники). Первый урок будет 08.12.
                Прект будем вести в репозитории topjava09, здесь же есть расписание. @@ -61,7 +63,7 @@
              • Наконец, если ты рассматриваешь предложения о работе, занеси свои данные и ссылку на резюме в форму соискателя. - Я ее рассылаю всем знакомым HR. А после прохождения испытательного срока не забудь поделиться своей историей успеха! + Я ее рассылаю всем знакомым HR.

              • @@ -69,9 +71,23 @@ Есть еще мысли сделать что-то вроде фрилансовой конторы, но это планы после курса topjava2.
              +

              После прохождения испытательного срока на работе не забудь поделиться своей историей успеха!

              Большая просьба ответить на несколько вопросов по проекту.
              Важно: если проект понравился, напиши пожалуйста в VK отзыв о проекте.

              + +Еще, сегодня (17.11) в 20.00 GMT+3 состоится бесплатный вебинар: +

              Осваиваем Java Enterprise

              +
                +
              • Статистика: что востребовано на рынке
              • +
              • С чего начинать изучение
              • +
              • Что нужно, чтобы стать Java разработчиком
              • +
              +Для участия нужно в назначенное время зайти по ссылке: +

              Прямая трансляция "Осваиваем Java Enterprise"

              +Статистика, полезные ресурсы, структура типичного Enterprise приложения, опыт трудоустойства и ответы вживую на любой интересующий тебя вопрос по этим темам.
              +
              +Слайды презентации

              Спасибо за участие в проекте TopJava, желаю отличной карьеры и, надеюсь, до новой встречи!

              From fce662a94771d80c47aa4e3420f3b57792f07bd2 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 17 Nov 2016 18:15:42 +0300 Subject: [PATCH 384/936] Update topjava lesson11 --- resources/mails/topjava/lesson/lesson11.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index dc6a89f..7133c59 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -10,7 +10,7 @@

              Выложил заключительное занятие нашего проекта.
              -Все патчи этого урока уже вчекинены в наш репозиторий и я обновил им демо приложение. +Все патчи этого урока уже вчекинены в наш репозиторий и я обновил им демо приложение.
              Обсуждение урока в Slack #lesson11
              • @@ -22,10 +22,11 @@ (добавил к нему рекомендации).

              • Повторное участие в проекте без проверки домашних заданий бесплатное.
                - Единственное условие (надеюсь не будет препятствием)- поделиться ссылкой на проект в VK или + Единственное условие (надеюсь не будет препятствием) - поделиться пожалуйста ссылкой на проект в VK или Facebook
                .
                Зарегистрируйся и тебе - придет ссылка на группу Slack topjava9 (там уже есть новые участники). Первый урок будет 08.12.
                + придет ссылка на группу Slack topjava9 (там уже есть новые участники).
                + Первый урок будет 08.12.
                Прект будем вести в репозитории topjava09, здесь же есть расписание. Приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию!

              • From 35c5b4224611936781b3b866c185f33498e3a569 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 18 Nov 2016 01:52:12 +0300 Subject: [PATCH 385/936] Add webinar3 --- resources/mails/javaops/webinar3_topjava.html | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 resources/mails/javaops/webinar3_topjava.html diff --git a/resources/mails/javaops/webinar3_topjava.html b/resources/mails/javaops/webinar3_topjava.html new file mode 100644 index 0000000..0cfa89e --- /dev/null +++ b/resources/mails/javaops/webinar3_topjava.html @@ -0,0 +1,21 @@ + + + + + + Запись вебинара ОСВАИВАЕМ JAVA ENTERPRISE + +

                + Здравствуй firstName!
                +

                +По ссылке доступна немного отредактированная в начале запись сегодняшнего вебинара +

                ОСВАИВАЕМ JAVA ENTERPRISE

                +Надеюсь, что он было интересно. + +

                + \ No newline at end of file From cc26613e90b587217170a8ee1c56a054e7b3a453 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 18 Nov 2016 01:54:53 +0300 Subject: [PATCH 386/936] Update webinar3 --- resources/mails/javaops/webinar3_topjava.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/mails/javaops/webinar3_topjava.html b/resources/mails/javaops/webinar3_topjava.html index 0cfa89e..12232a6 100644 --- a/resources/mails/javaops/webinar3_topjava.html +++ b/resources/mails/javaops/webinar3_topjava.html @@ -10,12 +10,14 @@

                По ссылке доступна немного отредактированная в начале запись сегодняшнего вебинара

                ОСВАИВАЕМ JAVA ENTERPRISE

                -Надеюсь, что он было интересно. -
                  +Надеюсь, что было интересно. +

                  Полезные ссылки из слайдов презентации: +

                  +

                  \ No newline at end of file From 5e41e8f2812b5bc8d9d65ff29b02196ddd737817 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 21 Nov 2016 19:19:51 +0300 Subject: [PATCH 387/936] Add topjava_10day --- resources/mails/topjava/topjava_10day.html | 45 ++++++++++++++++++++++ resources/vacation/test.html | 1 + 2 files changed, 46 insertions(+) create mode 100644 resources/mails/topjava/topjava_10day.html diff --git a/resources/mails/topjava/topjava_10day.html b/resources/mails/topjava/topjava_10day.html new file mode 100644 index 0000000..19491d1 --- /dev/null +++ b/resources/mails/topjava/topjava_10day.html @@ -0,0 +1,45 @@ + + + + + + Участие в 'Java Enterprise (Topjava)' + +

                  + Здравствуй firstName!
                  +

                  +

                  Напомню, что скоро старт проекта Java Enterprise (Topjava)!

                  +

                  +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей + с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), + REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API

                  +

                  + В группе Slack нас уже больше 100! (с учетом участников, которые пошли на повтор).
                  +Уже идут обсуждения в каналах #general, #hw0, #idea. Также сделал канал #rss с подпиской на интерсные публикации от +JUG.ru, Хабрабабр, Типичный программист.
                  +

                  +

                  + Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin (или тел. +7 921 855 0482). +

                  +

                  Если такой подписки нет и ты уже принял решение об участии, можно оплачивать и участвовать в проекте, чтобы ничего важного не пропустить.
                  После оплаты объязательны вышли мне в skype: grigory.kislin (или VK или sms +7 921 855 0482) свой email - я вышлю письмо участника с приглашением в группу проекта.

                  +
                    +
                  • + Стоимость участия без проверки домашних заданий: 8300 руб./ 128$
                    + сюда входят все материалы, участие в группе slack, ответы на вопросы и помощь с проектом. +
                  • +
                  • Стоимость полного пакета: 16500 руб./255$: + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при + устройстве на работу). +
                  • +
                  • Для всех: бесплатное участие в следующий выпусках проекта.
                  • +
                  • Способы оплаты
                  • +
                  +Вопросы по проекту
                  +Ресурсы для подготовки
                  +Отзывы реальных участиников предыдущих выпусков
                  +Демо приложения +
                  +

                  Поторопись, если хочешь значительно поднять свой уровень владения Java Enterprise и принять участие в разработке!

                  +

                  +

                  + \ No newline at end of file diff --git a/resources/vacation/test.html b/resources/vacation/test.html index 457d107..0976c44 100644 --- a/resources/vacation/test.html +++ b/resources/vacation/test.html @@ -67,6 +67,7 @@

                  Темы тестового собеседования:

                • Типичный теста на знание SQL на собеседованиях
                • Полезные ресурсы по всем темам трудоустройства
                • +
                • Собеседование - ответы на вопросы по разным темам

                Время собеседования: From d7d0d1ebdf2784379a0e9cb8d1c17a8fc2c68775 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 21 Nov 2016 19:20:54 +0300 Subject: [PATCH 388/936] Fix topjava_10day --- resources/mails/topjava/topjava_10day.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_10day.html b/resources/mails/topjava/topjava_10day.html index 19491d1..4825a0e 100644 --- a/resources/mails/topjava/topjava_10day.html +++ b/resources/mails/topjava/topjava_10day.html @@ -21,7 +21,8 @@

                Напомню, что скоро старт проекта Java Enterpri

                Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin (или тел. +7 921 855 0482).

                -

                Если такой подписки нет и ты уже принял решение об участии, можно оплачивать и участвовать в проекте, чтобы ничего важного не пропустить.
                После оплаты объязательны вышли мне в skype: grigory.kislin (или VK или sms +7 921 855 0482) свой email - я вышлю письмо участника с приглашением в группу проекта.

                +

                Если такой подписки нет и ты уже принял решение об участии, можно оплачивать и участвовать в проекте, чтобы ничего важного не пропустить.
                + После оплаты объязательны вышли мне в skype: grigory.kislin (или VK или sms +7 921 855 0482) свой email - я вышлю письмо участника с приглашением в группу проекта.

                • Стоимость участия без проверки домашних заданий: 8300 руб./ 128$
                  From 28624f1f0fab61109169bfcd0360ccf0907ff886 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 21 Nov 2016 19:23:57 +0300 Subject: [PATCH 389/936] Fix topjava_10day --- resources/mails/topjava/topjava_10day.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava/topjava_10day.html b/resources/mails/topjava/topjava_10day.html index 4825a0e..87c7007 100644 --- a/resources/mails/topjava/topjava_10day.html +++ b/resources/mails/topjava/topjava_10day.html @@ -3,7 +3,7 @@ - Участие в 'Java Enterprise (Topjava)' + Участие в 'Java Enterprise (Topjava)': не пропусти важное.

                  Здравствуй firstName!
                  @@ -21,8 +21,8 @@

                  Напомню, что скоро старт проекта Java Enterpri

                  Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin (или тел. +7 921 855 0482).

                  -

                  Если такой подписки нет и ты уже принял решение об участии, можно оплачивать и участвовать в проекте, чтобы ничего важного не пропустить.
                  - После оплаты объязательны вышли мне в skype: grigory.kislin (или VK или sms +7 921 855 0482) свой email - я вышлю письмо участника с приглашением в группу проекта.

                  +

                  Если такой подписки нет и ты уже принял решение об участии, можно оплачивать и участвовать в проекте, чтобы не пропустить ничего важного.

                  +

                  После оплаты объязательны вышли мне в skype: grigory.kislin (или VK или sms +7 921 855 0482) свой email - я вышлю письмо участника с приглашением в группу проекта.

                  • Стоимость участия без проверки домашних заданий: 8300 руб./ 128$
                    @@ -33,8 +33,8 @@

                    Если такой подписки нет и ты уже принял ре устройстве на работу).

                  • Для всех: бесплатное участие в следующий выпусках проекта.
                  • -
                  • Способы оплаты
                  +

                  Способы оплаты

                  Вопросы по проекту
                  Ресурсы для подготовки
                  Отзывы реальных участиников предыдущих выпусков
                  From 98a39992ba5e05e8bd52cccb404f9a28ea4815f8 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 21 Nov 2016 19:28:03 +0300 Subject: [PATCH 390/936] Update topjava_info --- resources/mails/topjava_info.html | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 6ac63b6..2f8b8e9 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -245,16 +245,6 @@

                  Расписание занятий проекта:

                • Возможные доработки приложения

                -

                Также приглашаю на ознакомительный вебинар:
                - Осваиваем Java Enterprise

                -
                  -
                • Статистика: что востребовано на рынке
                • -
                • С чего начинать изучение
                • -
                • Составляем резюме. Первая работа
                • -
                -

                Начало 17.11 (четверг) в 20.00 Москва, 19.00 Киев

                - Статистика, полезные ресурсы, структура типичного Enterprise приложения, опыт трудоустойства и ответы вживую на любой интересующий тебя вопрос по этим темам. -

                Добавляйся в группу VK: Практика Java (Web/ Enterprise)
                До встречи на проекте! From f8535f08e98f842b5923cd88344e66eb3a82fa65 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 22 Nov 2016 15:19:41 +0300 Subject: [PATCH 391/936] Update payment --- resources/payment.html | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/resources/payment.html b/resources/payment.html index c2a737c..fa8f92a 100644 --- a/resources/payment.html +++ b/resources/payment.html @@ -29,7 +29,8 @@

                Реквизиты оплаты

              • С банковских карт или из кошелька в Яндекс.Деньгах.
                Сумму следует вводить с учетом комиссии (кошелек - 0.5%, банковская карта 2%). Для перевода НЕОБХОДИМА ИДЕНТИФИКАЦИЯ.
                + 0.5%, банковская карта 2%).
                + Для перевода НЕОБХОДИМА ИДЕНТИФИКАЦИЯ.
                @@ -40,13 +41,17 @@

                Реквизиты оплаты

                Наличными или с другого сервиса, номер кошелька Yandex: 41001964807638

              • +
              • + Денежные переводы ВКонтакте (на карточку, Mastercard без комиссии, Visa 1%)

                +
              • Webmoney WMR: R335541240099, WMZ: Z354468526072

              • -

                - Платежная система CONTACT
                - Платежная система Золотая Корона
                - Western Union -

                +
              • +

                + Платежная система CONTACT
                + Платежная система Золотая Корона
                + Western Union +

              •  Получатель: Кислин Григорий Ефимович
                 Россия, г. Санкт-Петербург
                @@ -64,7 +69,8 @@ 

                Реквизиты оплаты

        -Skype +Skype \ No newline at end of file From d8e5ad17f86414ef8cdfb31d8ff013b5f293fac6 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 24 Nov 2016 18:05:06 +0300 Subject: [PATCH 392/936] Update topjava final --- .../mails/masterjava/lesson/lesson7_move.html | 35 +++++++++++++++++++ .../mails/topjava/lesson/lesson11_add.html | 22 ------------ .../mails/topjava/lesson/lesson11_final.html | 30 ++++++++++++++++ 3 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 resources/mails/masterjava/lesson/lesson7_move.html delete mode 100644 resources/mails/topjava/lesson/lesson11_add.html create mode 100644 resources/mails/topjava/lesson/lesson11_final.html diff --git a/resources/mails/masterjava/lesson/lesson7_move.html b/resources/mails/masterjava/lesson/lesson7_move.html new file mode 100644 index 0000000..3f130c6 --- /dev/null +++ b/resources/mails/masterjava/lesson/lesson7_move.html @@ -0,0 +1,35 @@ + + + + + + 7й урок Masterjava будет 28.11, 20.00 (GMT+3) + +

        + Здравствуй!
        +

        +

        6-й урок Masterjava переносится на вторник, 15.11 в 20.00 (GMT+3).

        +Видео 5го урока пока еще в обработке (будет готово сегодня-завтра). Кое-что приходится дополнять: + +Об обновление урока сообщаю в канале #lesson5 +

        +В HW5 оставил только: +

          +
        • Добавить в export синхронизацию городов и групп/проектов.
        • +
        • Добавить пользователю ссылки на города/группы.
        • +
        +Принимаю ваши ДЗ. До встречи во вторник. +

        +

        +

        + \ No newline at end of file diff --git a/resources/mails/topjava/lesson/lesson11_add.html b/resources/mails/topjava/lesson/lesson11_add.html deleted file mode 100644 index 228f8f4..0000000 --- a/resources/mails/topjava/lesson/lesson11_add.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - Дополнение к последнему уроку проекта 'Java Enterprise (TopJava)' - -

        - Здравствуй firstName!
        -

        -

        - Сделал несколько обновлений к 11 - уроку: фикс для Сафари, правка тестов и локализация в JavaScript. -

        - -

        -

        - \ No newline at end of file diff --git a/resources/mails/topjava/lesson/lesson11_final.html b/resources/mails/topjava/lesson/lesson11_final.html new file mode 100644 index 0000000..c9385d0 --- /dev/null +++ b/resources/mails/topjava/lesson/lesson11_final.html @@ -0,0 +1,30 @@ + + + + + + Окончание проекта 'Java Enterprise (TopJava)' + +

        + Здравствуй firstName!
        +

        +

        + Спасибо за участие в проекте Java Enterprise (TopJava)!
        + Надеюсь что проект прошел с пользой для тебя и ты уже, если еще не работаешь, то ходишь на собеседования и в процессе трудоустройства на Java разработчика. +

        +В недалеком будующем планирую сделать адресную рассылку вакансий и статистику по работе, пока это простая форма соискателя. +Если у тебя на работе есть вакансии для наших выпускников, публикуй их в кана #vacancies группы JavaOPs (после выполнения выпускного группу slack topjava8 удалю, общаемся в в этой группе).
        +
        +Если есть желание, можно также пройти со мной тестовое интервью. Здесь также есть полезные ссылки для подготовки (расценки внизу).
        +К этим выходным проект на github также заархивирую, положу в google drive и удалю (доступ в google drive у вас остается).
        +Напомню, что в феврале 2017 г. планирую второй выпуск курса Многопоточность. Веб сервисы, доступно 1-е занятие.
        +Спасибо всем, кто принял участие в опросе по проекту, там всего 6 вопросов. Кто не успел- ответьте плз! +

        Буду очень признателен за отзыв в VK (или slak личка, если нет аккаунта).
        + Новый выпуск стартует 01.12 (первое занятие 08.12), приглашай знакомых.

        +

        + Добавляйся в группу VK: практика Java (Web/ Enterprise), там много интерсных материалов по Java и IT
        +

        +До встречи на новых проектах, +

        +

        + \ No newline at end of file From ad0e07f7ae3c6d461419d03db7cab72495b6b2e3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 24 Nov 2016 18:15:54 +0300 Subject: [PATCH 393/936] Update topjava final --- resources/mails/topjava/lesson/lesson11_final.html | 12 ++++++------ resources/view/participation.html | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson11_final.html b/resources/mails/topjava/lesson/lesson11_final.html index c9385d0..f2c91d2 100644 --- a/resources/mails/topjava/lesson/lesson11_final.html +++ b/resources/mails/topjava/lesson/lesson11_final.html @@ -13,18 +13,18 @@ Надеюсь что проект прошел с пользой для тебя и ты уже, если еще не работаешь, то ходишь на собеседования и в процессе трудоустройства на Java разработчика.

        В недалеком будующем планирую сделать адресную рассылку вакансий и статистику по работе, пока это простая форма соискателя. -Если у тебя на работе есть вакансии для наших выпускников, публикуй их в кана #vacancies группы JavaOPs (после выполнения выпускного группу slack topjava8 удалю, общаемся в в этой группе).
        +Если у тебя на работе есть вакансии для наших выпускников, публикуй их в #vacancies группы JavaOPs (после выполнения выпускного группу slack topjava8 удалю, общаемся в этой группе (после сохранения формы должно прийти приглашение)).

        -Если есть желание, можно также пройти со мной тестовое интервью. Здесь также есть полезные ссылки для подготовки (расценки внизу).
        -К этим выходным проект на github также заархивирую, положу в google drive и удалю (доступ в google drive у вас остается).
        +Если есть желание, можно пройти со мной тестовое интервью (здесь также есть полезные ссылки для подготовки, расценки внизу).
        +К этим выходным проект github topjava08 заархивирую, положу в google drive и удалю (доступ в google drive у вас остается).
        Напомню, что в феврале 2017 г. планирую второй выпуск курса Многопоточность. Веб сервисы, доступно 1-е занятие.
        Спасибо всем, кто принял участие в опросе по проекту, там всего 6 вопросов. Кто не успел- ответьте плз! -

        Буду очень признателен за отзыв в VK (или slak личка, если нет аккаунта).
        +

        Буду очень признателен за отзыв в VK (или в личку slak, если нет VK аккаунта).
        Новый выпуск стартует 01.12 (первое занятие 08.12), приглашай знакомых.

        - Добавляйся в группу VK: практика Java (Web/ Enterprise), там много интерсных материалов по Java и IT
        + Добавляйся в группу VK: практика Java (Web/ Enterprise), все интересное публикую там

        -До встречи на новых проектах, +До встречи на новых проектах!

        \ No newline at end of file diff --git a/resources/view/participation.html b/resources/view/participation.html index d80b2e3..190566a 100644 --- a/resources/view/participation.html +++ b/resources/view/participation.html @@ -21,7 +21,7 @@

        -

        Регистрация на проект Java Enterprise

        +

        Регистрация на проект Java Enterprise


        From 2cbfe84cce6915115aa32a314f3535c85ed589f4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 24 Nov 2016 18:21:48 +0300 Subject: [PATCH 394/936] Update topjava final --- resources/mails/topjava/lesson/lesson11_final.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson11_final.html b/resources/mails/topjava/lesson/lesson11_final.html index f2c91d2..a33d804 100644 --- a/resources/mails/topjava/lesson/lesson11_final.html +++ b/resources/mails/topjava/lesson/lesson11_final.html @@ -13,16 +13,16 @@ Надеюсь что проект прошел с пользой для тебя и ты уже, если еще не работаешь, то ходишь на собеседования и в процессе трудоустройства на Java разработчика.

        В недалеком будующем планирую сделать адресную рассылку вакансий и статистику по работе, пока это простая форма соискателя. -Если у тебя на работе есть вакансии для наших выпускников, публикуй их в #vacancies группы JavaOPs (после выполнения выпускного группу slack topjava8 удалю, общаемся в этой группе (после сохранения формы должно прийти приглашение)).
        +Если у тебя на работе есть вакансии для наших выпускников, публикуй их в #vacancies группы JavaOPs (после выполнения выпускного группу slack topjava8 удалю, общаемся в этой группе (после сохранения формы должно прийти приглашение).

        Если есть желание, можно пройти со мной тестовое интервью (здесь также есть полезные ссылки для подготовки, расценки внизу).
        -К этим выходным проект github topjava08 заархивирую, положу в google drive и удалю (доступ в google drive у вас остается).
        -Напомню, что в феврале 2017 г. планирую второй выпуск курса Многопоточность. Веб сервисы, доступно 1-е занятие.
        +К этим выходным проект github topjava08 заархивирую, положу в google drive и удалю (доступ в google drive у тебя остается).
        +Напомню, что в феврале 2017 г. планирую второй выпуск курса Многопоточность. XML. Веб сервисы, доступно 1-е занятие.
        Спасибо всем, кто принял участие в опросе по проекту, там всего 6 вопросов. Кто не успел- ответьте плз!

        Буду очень признателен за отзыв в VK (или в личку slak, если нет VK аккаунта).
        Новый выпуск стартует 01.12 (первое занятие 08.12), приглашай знакомых.

        - Добавляйся в группу VK: практика Java (Web/ Enterprise), все интересное публикую там
        + Добавляйся в группу VK: практика Java (Web/ Enterprise), все интересное публикую там.

        До встречи на новых проектах!

        From d4689c2a03f5ce75f7709d681761e154f6e34143 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 24 Nov 2016 18:24:27 +0300 Subject: [PATCH 395/936] Update topjava final --- resources/mails/topjava/lesson/lesson11_final.html | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson11_final.html b/resources/mails/topjava/lesson/lesson11_final.html index a33d804..adcf740 100644 --- a/resources/mails/topjava/lesson/lesson11_final.html +++ b/resources/mails/topjava/lesson/lesson11_final.html @@ -10,15 +10,17 @@

        Спасибо за участие в проекте Java Enterprise (TopJava)!
        - Надеюсь что проект прошел с пользой для тебя и ты уже, если еще не работаешь, то ходишь на собеседования и в процессе трудоустройства на Java разработчика. + Надеюсь что проект прошел с пользой для тебя и ты, если еще не работаешь, то уже ходишь на собеседования и в процессе трудоустройства на Java разработчика.

        В недалеком будующем планирую сделать адресную рассылку вакансий и статистику по работе, пока это простая форма соискателя. -Если у тебя на работе есть вакансии для наших выпускников, публикуй их в #vacancies группы JavaOPs (после выполнения выпускного группу slack topjava8 удалю, общаемся в этой группе (после сохранения формы должно прийти приглашение).
        -
        -Если есть желание, можно пройти со мной тестовое интервью (здесь также есть полезные ссылки для подготовки, расценки внизу).
        +Если у тебя на работе есть вакансии для наших выпускников, публикуй их в #vacancies группы JavaOPs +(после выполнения выпускного проекта группу slack topjava8 удалю, общаемся в этой группе (после сохранения формы должно прийти приглашение).
        К этим выходным проект github topjava08 заархивирую, положу в google drive и удалю (доступ в google drive у тебя остается).
        +

        +Если есть желание, можно пройти со мной тестовое интервью (здесь также есть полезные ссылки для подготовки, расценки внизу).
        Напомню, что в феврале 2017 г. планирую второй выпуск курса Многопоточность. XML. Веб сервисы, доступно 1-е занятие.
        Спасибо всем, кто принял участие в опросе по проекту, там всего 6 вопросов. Кто не успел- ответьте плз! +

        Буду очень признателен за отзыв в VK (или в личку slak, если нет VK аккаунта).
        Новый выпуск стартует 01.12 (первое занятие 08.12), приглашай знакомых.

        From 93487d63d53d24cb2224356d0ca7aebdccefb549 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 24 Nov 2016 18:26:19 +0300 Subject: [PATCH 396/936] Update topjava final --- resources/mails/topjava/lesson/lesson11_final.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson11_final.html b/resources/mails/topjava/lesson/lesson11_final.html index adcf740..84057a6 100644 --- a/resources/mails/topjava/lesson/lesson11_final.html +++ b/resources/mails/topjava/lesson/lesson11_final.html @@ -14,10 +14,10 @@

        В недалеком будующем планирую сделать адресную рассылку вакансий и статистику по работе, пока это простая форма соискателя. Если у тебя на работе есть вакансии для наших выпускников, публикуй их в #vacancies группы JavaOPs -(после выполнения выпускного проекта группу slack topjava8 удалю, общаемся в этой группе (после сохранения формы должно прийти приглашение).
        -К этим выходным проект github topjava08 заархивирую, положу в google drive и удалю (доступ в google drive у тебя остается).
        +(после выполнения выпускного проекта группу slack topjava8 удалю, общаемся в этой группе (после сохранения формы должно прийти приглашение). +К этим выходным github репозиторий topjava08 заархивирую, положу в google drive и удалю (доступ в google drive у тебя остается).

        -Если есть желание, можно пройти со мной тестовое интервью (здесь также есть полезные ссылки для подготовки, расценки внизу).
        +Если есть желание, можно пройти со мной тестовое интервью (здесь также есть полезные ссылки для подготовки, расценки внизу). Напомню, что в феврале 2017 г. планирую второй выпуск курса Многопоточность. XML. Веб сервисы, доступно 1-е занятие.
        Спасибо всем, кто принял участие в опросе по проекту, там всего 6 вопросов. Кто не успел- ответьте плз!

        From 7d1f7a825f6beed518f2158c5fcd967fcc59733a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 24 Nov 2016 18:29:09 +0300 Subject: [PATCH 397/936] Update topjava final --- resources/mails/topjava/lesson/lesson11_final.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson11_final.html b/resources/mails/topjava/lesson/lesson11_final.html index 84057a6..b3d312a 100644 --- a/resources/mails/topjava/lesson/lesson11_final.html +++ b/resources/mails/topjava/lesson/lesson11_final.html @@ -17,11 +17,11 @@ (после выполнения выпускного проекта группу slack topjava8 удалю, общаемся в этой группе (после сохранения формы должно прийти приглашение). К этим выходным github репозиторий topjava08 заархивирую, положу в google drive и удалю (доступ в google drive у тебя остается).

        -Если есть желание, можно пройти со мной тестовое интервью (здесь также есть полезные ссылки для подготовки, расценки внизу). +Если есть желание, можно пройти со мной тестовое интервью (здесь также есть полезные ссылки для подготовки, расценки внизу).
        Напомню, что в феврале 2017 г. планирую второй выпуск курса Многопоточность. XML. Веб сервисы, доступно 1-е занятие.
        Спасибо всем, кто принял участие в опросе по проекту, там всего 6 вопросов. Кто не успел- ответьте плз!

        -

        Буду очень признателен за отзыв в VK (или в личку slak, если нет VK аккаунта).
        +

        Буду очень признателен за отзыв в VK (или в личку slak, если нет VK аккаунта).
        Новый выпуск стартует 01.12 (первое занятие 08.12), приглашай знакомых.

        Добавляйся в группу VK: практика Java (Web/ Enterprise), все интересное публикую там.
        From b010ce5953e0635d2dfe2c6c8133a95657319f0a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 25 Nov 2016 13:00:56 +0300 Subject: [PATCH 398/936] Add lesson07_move --- .../mails/masterjava/lesson/lesson7_move.html | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/resources/mails/masterjava/lesson/lesson7_move.html b/resources/mails/masterjava/lesson/lesson7_move.html index 3f130c6..3274a5f 100644 --- a/resources/mails/masterjava/lesson/lesson7_move.html +++ b/resources/mails/masterjava/lesson/lesson7_move.html @@ -3,33 +3,20 @@ - 7й урок Masterjava будет 28.11, 20.00 (GMT+3) + 7й урок Masterjava будет в понедельник, 28.11, 20.00 (GMT+3)

        Здравствуй!

        -

        6-й урок Masterjava переносится на вторник, 15.11 в 20.00 (GMT+3).

        -Видео 5го урока пока еще в обработке (будет готово сегодня-завтра). Кое-что приходится дополнять: - -Об обновление урока сообщаю в канале #lesson5 +Выложил видео всех предыдущих занятий (5го и 6го), ссылка на все уроки. +

        7-е занятие Masterjava будет в понедельник, 28.11 в 20.00 (GMT+3).

        -В HW5 оставил только: -

          -
        • Добавить в export синхронизацию городов и групп/проектов.
        • -
        • Добавить пользователю ссылки на города/группы.
        • -
        -Принимаю ваши ДЗ. До встречи во вторник. +Ссылка на комнату вебинара.
        +Логин: твой email
        +Пароль в первый раз: masterjava23

        +Принимаю ваши ДЗ (у кого есть проверка).
        +До встречи в понедельник.

        \ No newline at end of file From 4ae59fb55c1905f721af46eb095655c9c7dc433d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 25 Nov 2016 13:04:53 +0300 Subject: [PATCH 399/936] Remove lessons --- resources/mails/masterjava/lesson/invite.html | 27 -------------- .../mails/masterjava/lesson/lesson3.html | 25 ------------- .../mails/masterjava/lesson/lesson3_info.html | 25 ------------- .../mails/masterjava/lesson/lesson4.html | 22 ------------ .../masterjava/lesson/lesson4_delay.html | 15 -------- .../mails/masterjava/lesson/lesson5.html | 22 ------------ .../masterjava/lesson/lesson5_delay.html | 31 ---------------- .../mails/masterjava/lesson/lesson5_move.html | 32 ----------------- .../mails/masterjava/lesson/lesson6_move.html | 35 ------------------- .../mails/masterjava/lesson/lesson7_move.html | 22 ------------ 10 files changed, 256 deletions(-) delete mode 100644 resources/mails/masterjava/lesson/invite.html delete mode 100644 resources/mails/masterjava/lesson/lesson3.html delete mode 100644 resources/mails/masterjava/lesson/lesson3_info.html delete mode 100644 resources/mails/masterjava/lesson/lesson4.html delete mode 100644 resources/mails/masterjava/lesson/lesson4_delay.html delete mode 100644 resources/mails/masterjava/lesson/lesson5.html delete mode 100644 resources/mails/masterjava/lesson/lesson5_delay.html delete mode 100644 resources/mails/masterjava/lesson/lesson5_move.html delete mode 100644 resources/mails/masterjava/lesson/lesson6_move.html delete mode 100644 resources/mails/masterjava/lesson/lesson7_move.html diff --git a/resources/mails/masterjava/lesson/invite.html b/resources/mails/masterjava/lesson/invite.html deleted file mode 100644 index 86edf40..0000000 --- a/resources/mails/masterjava/lesson/invite.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - СЕГОДНЯ в 20.00 (GMT+3.00) 2-е занятие Masterjava - -

        - Здравствуй!
        -

        -СЕГОДНЯ, 23.09 (пятница) в 20.00 состоится 2-е занятие Masterjava -

        - Ссылка на комнату вебинара
        - Логин: твой email, пароль: masterjava23
        - Доступ дал, проверь!
        - Запись будет доступна сразу после вебинара, через 2-4 дня я ее отредактирую и размещу в Google Doc. -

        -

        Настрой свой проект, чтобы забирать мои - изменения и пушить в свой репозиторий.
        - У кого еще нет доступа в группу https://javaops.slack.com, пришлите мне свой email в skype: - grigory.kislin -

        -До встречи в комнате вебинара, -

        -

        - \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson3.html b/resources/mails/masterjava/lesson/lesson3.html deleted file mode 100644 index 45b808a..0000000 --- a/resources/mails/masterjava/lesson/lesson3.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - СЕГОДНЯ в 20.00 (GMT+3.00) 3-е занятие Masterjava - -

        - Здравствуй!
        -

        -СЕГОДНЯ, 30.09 (пятница) в 20.00 состоится 3-е занятие Masterjava
        -Ссылка на комнату вебинара
        -Логин: твой email, пароль: masterjava23, если он не был переопределен ранее.
        -

        - Запись будет доступна сразу после вебинара, в Google Doc пока еще экспортировать не начал. - Возможно буду делать это позднее, в любом случае доступ к этим материалам у тебя будет (как и бесплатное участие в - следующий выпусках masterjava, которые уже планирую делать по рассылке) -

        -

        Наша группа Slack https://masterjava01.slack.com, похоже, что мы уже все там:) -

        -До встречи в комнате вебинара, -

        -

        - \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson3_info.html b/resources/mails/masterjava/lesson/lesson3_info.html deleted file mode 100644 index 2580229..0000000 --- a/resources/mails/masterjava/lesson/lesson3_info.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - Обновление в Masterjava - -

        - Здравствуй!
        -

        -

        Выложил видео 2-го - урока.
        - Дал всем доступ на видео в Google Drive, если не пускает, попробуй выйти-войти в аккаунт.
        - Доступ к видео остается после окончания проекта. -

        -

        - Обновил модули в репозитории нашего проекта (обновись).
        - Обновил картинку модулей в домашнем задании 3-го - урока. Остальные нужно доделать по аналогии.
        - Добавил в ДЗ ссылку Speed up insertion performance in PostgreSQL. -

        -4-е занятие будет в эту пятницу, в 20.00. Не тяните с выполнением ДЗ. -

        -

        - \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson4.html b/resources/mails/masterjava/lesson/lesson4.html deleted file mode 100644 index de18b1d..0000000 --- a/resources/mails/masterjava/lesson/lesson4.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - СЕГОДНЯ в 20.00 (GMT+3.00) 4-е занятие Masterjava - -

        - Здравствуй!
        -

        -СЕГОДНЯ, 14.10 (пятница) в 20.00 состоится 4-е занятие Masterjava
        -

        Ссылка на комнату вебинара

        -Обратите внимание: ДОМЕН поменялся. Если будут проблемы с куками- почисти или зайди в анонимной вкладке.
        -Логин: твой email, пароль сбросился, снова masterjava23 -

        - Запись будет доступна сразу после вебинара, в Google Doc позднее. -

        -До встречи в комнате вебинара, -

        -

        - \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson4_delay.html b/resources/mails/masterjava/lesson/lesson4_delay.html deleted file mode 100644 index b841f31..0000000 --- a/resources/mails/masterjava/lesson/lesson4_delay.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - 4-е занятие Masterjava переносится на следующую пятницу, 14.09 - -

        - Здравствуй!
        -

        -4-е занятие Masterjava переносится на следующую пятницу (14.10 в 20.00). -Я за это время сделаю видео 2-го и 3-го уроков и выложу их на Google Drive, а у тебя будет дополнительное время на выполнение домашнего задания. Спасибо за понимание. -

        -

        - \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson5.html b/resources/mails/masterjava/lesson/lesson5.html deleted file mode 100644 index bbe88b9..0000000 --- a/resources/mails/masterjava/lesson/lesson5.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - СЕГОДНЯ в 20.00 (GMT+3.00) 5-е занятие Masterjava - -

        - Здравствуй!
        -

        -СЕГОДНЯ, 01.11 в 20.00 состоится 5-е занятие Masterjava
        -

        Ссылка на комнату вебинара

        -Если будут проблемы с куками- почисти или зайди в анонимной вкладке.
        -Логин: твой email, пароль (если еще не менял): masterjava23 -

        - Запись будет доступна сразу после вебинара, в Google Doc позднее. -

        -До встречи в комнате вебинара, -

        -

        - \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson5_delay.html b/resources/mails/masterjava/lesson/lesson5_delay.html deleted file mode 100644 index 88a769b..0000000 --- a/resources/mails/masterjava/lesson/lesson5_delay.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - Обновление в Masterjava - -

        - Здравствуй!
        - Я пишу все новости в группу слак, на всякий случай задублирую письмом. -

        -Полностью обработал и выложил видео - 3-го урока
        -На этой неделе выложу обработанное 4е занятие. Ссылки на необработанные видео:
        - -

        - Поправил scope для logback-classic (обновись), иначе логирование не попадает в модуль export. -

        -

        - Извиняюсь, я не успею к этой пятнице отредактировать 4й урок и сделать новый :( - Очень надеюсь, что после 5-го занятия уже будем вебинариться каждую пятницу
        - Принимаю ваши ДЗ (у кого проверка) до 27.10, вебинар будет в следующую пятницу, 28.10.
        - Для всех- шлите мне ваши реализации модуля persist, включу в занятие реализации на нескольких библиотеках. -

        -

        -

        - \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson5_move.html b/resources/mails/masterjava/lesson/lesson5_move.html deleted file mode 100644 index eab9087..0000000 --- a/resources/mails/masterjava/lesson/lesson5_move.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - 5й урок Masterjava: 30.10 или 01.11 - -

        - Здравствуй!
        -

        -

        - Из-за проблем со светом не успеваю сегодня сделать занятие. - Предлагаю провести его в это воскресенье 30.10 или вторник 01.11 в 20.00.
        - Напиши в #general слак, когда будет удобнее. -

        -Уточнил ДЗ 4-го урока:
        -Сделать реализацию в несколько потоков и с учетом того, что пользователей может быть ООчень много. -
          -
        • делать вставку группами (chunk) в транзакции и batch моде
        • -
        • количестово пользователей в chunk принимать с UI как параметр
        • -
        • не делать для каждой вставки nextval (но иметь возможность вставки с автогенерацией id)
        • -
        • результат импорта - количество успешных/неуспешных вставок и информация, по которой из исходного xml можно - повторить импорт неуспешных пользователей -
        • -
        -

        - Принимаю ваши ДЗ.
        - Для всех- шлите мне ваши реализации модуля persist, включу в занятие реализации на нескольких библиотеках. -

        -

        -

        - \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson6_move.html b/resources/mails/masterjava/lesson/lesson6_move.html deleted file mode 100644 index 4d791a4..0000000 --- a/resources/mails/masterjava/lesson/lesson6_move.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - 6й урок Masterjava будет 15.11, 20.00 (GMT+3) - -

        - Здравствуй!
        -

        -

        6-й урок Masterjava переносится на вторник, 15.11 в 20.00 (GMT+3).

        -Видео 5го урока пока еще в обработке (будет готово сегодня-завтра). Кое-что приходится дополнять: - -Об обновление урока сообщаю в канале #lesson5 -

        -В HW5 оставил только: -

          -
        • Добавить в export синхронизацию городов и групп/проектов.
        • -
        • Добавить пользователю ссылки на города/группы.
        • -
        -Принимаю ваши ДЗ. До встречи во вторник. -

        -

        -

        - \ No newline at end of file diff --git a/resources/mails/masterjava/lesson/lesson7_move.html b/resources/mails/masterjava/lesson/lesson7_move.html deleted file mode 100644 index 3274a5f..0000000 --- a/resources/mails/masterjava/lesson/lesson7_move.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - 7й урок Masterjava будет в понедельник, 28.11, 20.00 (GMT+3) - -

        - Здравствуй!
        -

        -Выложил видео всех предыдущих занятий (5го и 6го), ссылка на все уроки. -

        7-е занятие Masterjava будет в понедельник, 28.11 в 20.00 (GMT+3).

        -

        -Ссылка на комнату вебинара.
        -Логин: твой email
        -Пароль в первый раз: masterjava23 -

        -Принимаю ваши ДЗ (у кого есть проверка).
        -До встречи в понедельник. -

        -

        - \ No newline at end of file From b6b1ef899ac1ecf6f0decf764fcae60b21dd955b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Nov 2016 14:26:44 +0300 Subject: [PATCH 400/936] Add topjava on week --- resources/mails/topjava/topjava_on_week.html | 57 ++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 resources/mails/topjava/topjava_on_week.html diff --git a/resources/mails/topjava/topjava_on_week.html b/resources/mails/topjava/topjava_on_week.html new file mode 100644 index 0000000..1f55e14 --- /dev/null +++ b/resources/mails/topjava/topjava_on_week.html @@ -0,0 +1,57 @@ + + + + + + Обновления в проекте 'Java Enterprise (Topjava)' + +

        + Здравствуй firstName!
        +

        +

        +Старт Java Enterprise (Topjava) уже совсем скоро - в этот четверг, 01.12. +

        +

        +В wiki по проекту есть ответы на большинство ваших вопросов,
        + в требованиях к участникам никаких специальных знаний JavaEE для проекта не тербуется. +

        +Отзывы проекта пополнились несколькими с последнего выпуска + (01.09- 17.11), проект реально дает возможность устроится на позицию middle разработчика (особенно при выполнении всех Домашних Заданий). +

        +

          + TopJava постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками + изменилось очень многое.
          Нарпимер: +
        • 7й выпуск проекта дополнился JPA 2.1 EntityGraph, Jackson @JsonView, валидацией объектов REST, +локализацией в JavaScript, tomcat7-maven-plugin плагин перключили на Tomcat 8 (cargo-maven2-plugin), зарефакторилась обработка ошибок и матчеров +тестирования. +
        • +
        • в последнем 8м выпуске добавилась защита от XSS (Cross-Site Scripting), зарефакторилась работа с PK Hibernate в случае ленивой загрузки (баг call to id getter initializes proxy), + добавилась интеграция с Dependency Ci и Travis Ci (в дополнение к введенной ранее интеграции с + проверкой кода в Codacy), добавились тесты на профиль деплоя Heroku (общее количество JUnit тестов стало 102), добавилась локализация календаря, улучшился вид datatables и другие мелочи. + +
        • +
        + +
          +
        • + Стоимость участия без проверки домашних заданий: 8300 руб.
          + сюда входят все материалы, участие в группе slack, ответы на вопросы и помощь с проектом. +
        • +
        • Стоимость полного пакета: 16500 руб. + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при + устройстве на работу). +
        • +
        • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
        • +
        • Способы оплаты
        • +
        • Курс рубля

        • +
        +Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin или по почте.
        +Если такой подписки нет можно оплачивать участие и ответить на письмо, когда и куда была оплата (или в скайп grigory.kislin).
        +Я вышлю письмо участника с приглашением в группу проекта слак. +В каналах группы #general, #hw0, #idea уже много интересного. Также сделал канал #rss с подпиской на публикации от +JUG.ru, Хабрабабр, Типичный программист.
        +
        +Надеюсь увидеться на проекте. +

        +

        + \ No newline at end of file From 4983577b7925bd3a140af2c440fb7b24187256e5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Nov 2016 14:29:19 +0300 Subject: [PATCH 401/936] Update topjava on week --- resources/mails/topjava/topjava_on_week.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_on_week.html b/resources/mails/topjava/topjava_on_week.html index 1f55e14..43a85c6 100644 --- a/resources/mails/topjava/topjava_on_week.html +++ b/resources/mails/topjava/topjava_on_week.html @@ -12,7 +12,7 @@ Старт Java Enterprise (Topjava) уже совсем скоро - в этот четверг, 01.12.

        -В wiki по проекту есть ответы на большинство ваших вопросов,
        +В wiki по проекту есть ответы на большинство ваших вопросов,
        в требованиях к участникам никаких специальных знаний JavaEE для проекта не тербуется.

        Отзывы проекта пополнились несколькими с последнего выпуска From afc941bb858dd6d21f8adb0fc3a53eaac0506ec3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Nov 2016 14:29:59 +0300 Subject: [PATCH 402/936] Update topjava on week --- resources/mails/topjava/topjava_on_week.html | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/mails/topjava/topjava_on_week.html b/resources/mails/topjava/topjava_on_week.html index 43a85c6..7bfc032 100644 --- a/resources/mails/topjava/topjava_on_week.html +++ b/resources/mails/topjava/topjava_on_week.html @@ -17,7 +17,6 @@

        Отзывы проекта
        пополнились несколькими с последнего выпуска (01.09- 17.11), проект реально дает возможность устроится на позицию middle разработчика (особенно при выполнении всех Домашних Заданий). -

          TopJava постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками изменилось очень многое.
          Нарпимер: From b4a37aecca43cfda4ad2810304e40dcbf8a4af28 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Nov 2016 14:34:32 +0300 Subject: [PATCH 403/936] Update topjava on week --- resources/mails/topjava/topjava_on_week.html | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/resources/mails/topjava/topjava_on_week.html b/resources/mails/topjava/topjava_on_week.html index 7bfc032..b18dd78 100644 --- a/resources/mails/topjava/topjava_on_week.html +++ b/resources/mails/topjava/topjava_on_week.html @@ -17,9 +17,9 @@

          Отзывы проекта пополнились несколькими с последнего выпуска (01.09- 17.11), проект реально дает возможность устроится на позицию middle разработчика (особенно при выполнении всех Домашних Заданий). +TopJava постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками + изменилось очень многое. Нарпимер:
            - TopJava постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками - изменилось очень многое.
            Нарпимер:
          • 7й выпуск проекта дополнился JPA 2.1 EntityGraph, Jackson @JsonView, валидацией объектов REST, локализацией в JavaScript, tomcat7-maven-plugin плагин перключили на Tomcat 8 (cargo-maven2-plugin), зарефакторилась обработка ошибок и матчеров тестирования. @@ -30,7 +30,11 @@
          - +Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin или по почте.
          +Если такой подписки нет можно оплатить участие и ответить на письмо, когда и куда была оплата (или в скайп grigory.kislin).
          +Я вышлю письмо участника с приглашением в группу проекта слак. +В каналах группы #general, #hw0, #idea уже много интересного. Также сделал канал #rss с подпиской на публикации от +JUG.ru, Хабрабабр, Типичный программист.
          • Стоимость участия без проверки домашних заданий: 8300 руб.
            @@ -41,14 +45,7 @@ устройстве на работу).
          • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
          • -
          • Способы оплаты
          • -
          • Курс рубля

          -Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin или по почте.
          -Если такой подписки нет можно оплачивать участие и ответить на письмо, когда и куда была оплата (или в скайп grigory.kislin).
          -Я вышлю письмо участника с приглашением в группу проекта слак. -В каналах группы #general, #hw0, #idea уже много интересного. Также сделал канал #rss с подпиской на публикации от -JUG.ru, Хабрабабр, Типичный программист.

          Надеюсь увидеться на проекте.

          From afa0caaf608bb0faa41fbad789e122e8cbcf43a3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 28 Nov 2016 14:42:42 +0300 Subject: [PATCH 404/936] Update topjava on week --- resources/mails/topjava/topjava_on_week.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/topjava_on_week.html b/resources/mails/topjava/topjava_on_week.html index b18dd78..8ff85c2 100644 --- a/resources/mails/topjava/topjava_on_week.html +++ b/resources/mails/topjava/topjava_on_week.html @@ -18,7 +18,7 @@ Отзывы проекта пополнились несколькими с последнего выпуска (01.09- 17.11), проект реально дает возможность устроится на позицию middle разработчика (особенно при выполнении всех Домашних Заданий). TopJava постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками - изменилось очень многое. Нарпимер: +изменилось очень многое. Нарпимер:

          • 7й выпуск проекта дополнился JPA 2.1 EntityGraph, Jackson @JsonView, валидацией объектов REST, локализацией в JavaScript, tomcat7-maven-plugin плагин перключили на Tomcat 8 (cargo-maven2-plugin), зарефакторилась обработка ошибок и матчеров From 414e2ab0402d8c16c01832ccdefc1fddae6f9a40 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 30 Nov 2016 16:44:38 +0300 Subject: [PATCH 405/936] Update topjava tomorrow --- resources/mails/topjava/topjava_tomorrow.html | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/resources/mails/topjava/topjava_tomorrow.html b/resources/mails/topjava/topjava_tomorrow.html index b0e9953..21fd5c2 100644 --- a/resources/mails/topjava/topjava_tomorrow.html +++ b/resources/mails/topjava/topjava_tomorrow.html @@ -3,41 +3,45 @@ - Послезавтра, 01.09 старт проекта 'Java Enterprise (Topjava)' + ЗАВТРА, 01.12 старт проекта 'Java Enterprise (Topjava)'

            Здравствуй firstName!

            -

            Напомню, что послезавтра, 01.09 старт проекта Java Enterprise (Topjava)!

            +

            Напомню, что ЗАВТРА, 01.12 старт проекта Java Enterprise (Topjava)!

            +

            Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), - REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
            -

              -
            • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
            • -
            • Сбор группы в Slack
            • -
            • Раздача учебных лицензий JetBrains IDEA
            • -
            • Выполнение и проверка (у кого участие с проверкой) вступительного задания
            • -
            -Отзывы реальных участиников предыдущих выпусков
            -Демо приложения + REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API

            + Требования к участникам +

            +Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю +(четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Домашние задания +подобранны по темам занятия и требуют реализации функциональности, схожей с пройденной на занятии. Разбор домашних +заданий происходит в начале каждого урока. +

            +Завтра, 01.12, я буду раздавать доступ ко всем материалам проекта и начну принимать +решения вступительного задания.
            +Первое занятие (с разбором вступительного задания) будет 08.12 +

              +
            • Описание и план проекта
            • +
            • Ваши отзывы
            • +
            • Демо разрабатываемого приложения
            • +
            • Вопросы по проекту
            • - Стоимость участия без проверки домашних заданий: 8300 руб.
              - сюда входят все материалы, участие в группе slack, ответы на вопросы и помощь с проектом. -
            • -
            • Стоимость полного пакета: 16500 руб. - добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при - устройстве на работу). + Стоимость участия без проверки домашних заданий: 8300 руб./130$
              + сюда входят все материалы (с разбором домашних заданий), участие в группе slack, ответы на вопросы и помощь с проектом.
            • -
            • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
            • -
            • Способы оплаты
            • -
            • Курс рубля

            • -
            • Вопросы по проекту
            • -
            • Ресурсы для подготовки
            • +
            • Бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
            -

            Перед оплатой пожалуйста свяжись со мной в скайпе: grigory.kislin (или тел. +7 921 855 0482)

            +

            + Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin или по почте. +

            +

            Если подписки нет можно оплачивать и ответить на это письмо куда была оплата (или в skype grigory.kislin): я вышлю + письмо участника для включения в группу слак.


            -

            Поторопись, если хочешь значительно поднять свой уровень владения Java Enterprise и принять участие в разработке!

            +

            Поторопись, если хочешь получить реальную возможность устроится на позицию middle разработчика (особенно при выполнении всех Домашних Заданий)!

            \ No newline at end of file From 4f0599f2e9074185d5df1c6297ea61b953bb8b8f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 30 Nov 2016 16:47:23 +0300 Subject: [PATCH 406/936] Update topjava tomorrow --- resources/mails/topjava/topjava_tomorrow.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/topjava/topjava_tomorrow.html b/resources/mails/topjava/topjava_tomorrow.html index 21fd5c2..a409205 100644 --- a/resources/mails/topjava/topjava_tomorrow.html +++ b/resources/mails/topjava/topjava_tomorrow.html @@ -36,12 +36,12 @@

            Напомню, что ЗАВТРА, 01.12 старт проекта Java
          • Бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.

          - Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin или по почте. + Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin или по почте.

          Если подписки нет можно оплачивать и ответить на это письмо куда была оплата (или в skype grigory.kislin): я вышлю письмо участника для включения в группу слак.


          -

          Поторопись, если хочешь получить реальную возможность устроится на позицию middle разработчика (особенно при выполнении всех Домашних Заданий)!

          +

          Поторопись, если хочешь получить реальную возможность устроится на позицию middle разработчика!

          \ No newline at end of file From e4f8effcbeacded16a7e1c394600ea3b157c2d68 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Dec 2016 20:30:18 +0300 Subject: [PATCH 407/936] Update topjava --- resources/mails/topjava/topjava_GD.html | 31 ------------------- .../{ => topjava}/topjava_first_lesson.html | 0 2 files changed, 31 deletions(-) delete mode 100644 resources/mails/topjava/topjava_GD.html rename resources/mails/{ => topjava}/topjava_first_lesson.html (100%) diff --git a/resources/mails/topjava/topjava_GD.html b/resources/mails/topjava/topjava_GD.html deleted file mode 100644 index 6d33b33..0000000 --- a/resources/mails/topjava/topjava_GD.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - Доступ к Google Drive - -

          - Здравствуй firstName!
          -

          -Сделал доступ к Google Drive. -

          - По ссылке в письме от Google будут доступны все материалы проекта, но проект эволюционирует, поэтому патчи текущего выпуска - будут отличаться. Видео возможно также будут редактироваться / дополнятся. - Все актуальные материалы нашего выпуска будут находится в папке Topjava8. Напрямую ходить в Google Drive не придется, все материалы будут доступны по ссылкам урока. -

          -

          - Если сслыка Google Drive не открывается, попробуй выйти из своего google аккаунта и снова зайти (или зайти в него в анонимном окне браузера). Проблемы пишите мне в личку (skype или slack)
          -

          -

          - Если вступительное задание уже сделано, посмотри на Полезные ресурсы - и wiki по Git и IDEA. - Также очень много полезного материала в группе VK: Практика Java (Web/ Enterprise)
          -

          -

          До встречи на первом уроке 08.09
          - Григорий Кислин
          - skype: grigory.kislin -

          -

          - Java Online Projects -

          - \ No newline at end of file diff --git a/resources/mails/topjava_first_lesson.html b/resources/mails/topjava/topjava_first_lesson.html similarity index 100% rename from resources/mails/topjava_first_lesson.html rename to resources/mails/topjava/topjava_first_lesson.html From f4adb620fde38f8b744625f6440a69085c0b884e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 2 Dec 2016 00:19:17 +0300 Subject: [PATCH 408/936] Update topjava_info --- resources/mails/topjava_info.html | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index 2f8b8e9..ab05160 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -13,11 +13,13 @@ проект из github в облачный сервис Heroku.

            -
          • Если ты еще в поиске работы Java разработчика, после проекта твои шансы получить работу - возрастут на порядок.
          • -
          • Если уже работаешь, но нет достаточно опыта в стеке Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), - Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API, это отличный шанс получить его быстро и на хорошем уровне.
          • +
          • Если ты еще в поиске работы Java разработчика, после проекта твои шансы получить работу возрастут на порядок
          • +
          • Если уже работаешь, но нет достаточно опыта работы на этом самом востребованном в Enterprise стеке, это отличный шанс получить его быстро и на хорошем уровне.
          + Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Домашние задания подобранны по темам занятия и требуют реализации функциональности, схожей с пройденной на занятии. Разбор домашних заданий происходит в начале каждого урока. + Вопросы и обсуждение занятий и домашних заданий, общение на разные темы происходит в различных каналах группы проекта + (используем мессанджер Slack). +

          Первое занятие с разбором вступительного задания будет в рассылке 08.12

          Требования к участникам:

          На проекте мы не проходим синтаксис java: предполагается, что вы уже знаете, что такое классы, конструкторы, аннотации, анонимные классы, исключения и пр. From 65780ff85277cbfb43f75d04ea7adb148a85a5c5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 5 Dec 2016 01:48:37 +0300 Subject: [PATCH 409/936] Update topjava_last_chance --- .../mails/topjava/topjava_last_chance.html | 62 +++++++++---------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/resources/mails/topjava/topjava_last_chance.html b/resources/mails/topjava/topjava_last_chance.html index 9b4a659..1d6ecd4 100644 --- a/resources/mails/topjava/topjava_last_chance.html +++ b/resources/mails/topjava/topjava_last_chance.html @@ -3,37 +3,18 @@ - Последний шанс до 08.09 (первого урока) принять участие в проекте 'Java Enterprise (Topjava)' + Проект Topjava: в четверг (08.12) первое занятие с разбором вступительного задания

          Здравствуй firstName!

          -

          Последний шанс принять принять участие в этом выпуске Java Enterprise (08.09-17.11)

          -Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей - с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), - REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API
          -Отзывы реальных участиников предыдущих выпусков
          -Демо приложения -

          - До 08.09 (первого урока) можно выполнять вступительное задание. - В группа Slack уже идет активное обсуждение вступительного задания и общение на темы трудоутройства, git, idea и пр. - После оплаты участия даю доступ ко всем материалам, учебную лицензию IDEA и приглашение в нашу группу. Следующий - выпуск будет только в начале декабря. -

          +В этот четверг (08.12) будет рассылка первого занятия с разбором вступительного задания.
          +Еще можно принять участие в этом выпуске Topjava Java Enterprise (08.12-16.02), ничего не потеряв.

          - Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю - (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние - задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с - пройденной на занятии. +Уже начал проверять вступительные задания в группе slack, раздал доступ к материалам и до четверга раздаю полугодовые учебные ключи IDEA.
          +Следующий выпуск будет в середине марта.

          -

          - Проект постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками - изменилось очень многое. - Например только в прошлом выпуске проект дополнился JPA 2.1 EntityGraph, Jackson @JsonView, валидацией объектов REST, - локализацией в JavaScript, maven плагин перключили на Tomcat 8, зарефакторилась обработка ошибок и матчеров - тестирования. -

          -Вот основное, что можно получить из РАБОТЫ над проектом: +Основное, что можно получить из работы над проектом:
          • понимания технологий, как работают фреймворки, на чем они основаны, какие паттерны используются
          • навыки нахождения правильных практических решений для конкретных задач и решений конкретных проблем, из которых @@ -44,25 +25,38 @@

            Последний шанс принять принять участие в
          • привычка кодировать красиво
          • кругозор, навыки решения подобных задач
          +Поэтому мы учимся мыслить и работать как Java разработчики уже сейчас, потом это будет гораздо сложнее и стоить дороже. +Вот на мой взгляд хорошие советы новичкам. От себя я добавлю: +
            +
          • Учись грамотно формулировать проблему. Проблема "у меня не работает" может иметь тысячи причин. В процессе формулирования очень часто приходит ее решение.
          • +
          • Учись инвестигировать проблему. Внимательное чтение логов и умение дебажить - основные навыки разработчика. В логах надо читать верх самого нижнего эксепшена - там причина всей портянки.
          • +
          • Грамотно уделяй время каждой проблеме. Две крайности - сразу бросаться в чат или ко мне за помощью и бится нам ней часами. + Пробуй решить ее сам и в зависимости от проблемы выделяй на это разумное время.
          • +
          • - Стоимость участия без проверки домашних заданий: 8300 руб.
            + Стоимость участия без проверки домашних заданий: 8300 руб./130$
            сюда входят все материалы, участие в группе slack, ответы на вопросы и помощь с проектом.
          • -
          • Стоимость полного пакета: 16500 руб. +
          • Стоимость полного пакета: 16500 руб./255$ добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания при устройстве на работу).
          • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
          • -
          • Способы оплаты
          • -
          • Курс рубля
          • -
          • Вопросы по проекту
          • -
          • Ресурсы для подготовки
          -

          Перед оплатой пожалуйста свяжись со мной в скайпе: grigory.kislin (или тел. +7 921 855 0482)

          +

          + Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin или по почте. +

          +

          Если подписки нет можно оплачивать и ответить на это письмо куда была оплата (или в skype grigory.kislin): я вышлю + письмо участника проекта и дам доступ ко всем ресурсам.


          -

          Не упусти шанс значительно поднять свой уровень владения Java Enterprise и принять участие в - разработке!

          + +Отзывы реальных участиников предыдущих выпусков
          +Демо приложения
          +Вопросы по проекту
          +Ресурсы для подготовки
          + +

          Не упусти шанс стать Java Enterprise разработчиком!

          \ No newline at end of file From d3dc866a3429f6af49e7f0592a4d018b5cbfad4e Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 5 Dec 2016 01:53:26 +0300 Subject: [PATCH 410/936] Update topjava_last_chance --- resources/mails/topjava/topjava_last_chance.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/topjava_last_chance.html b/resources/mails/topjava/topjava_last_chance.html index 1d6ecd4..4ff2c98 100644 --- a/resources/mails/topjava/topjava_last_chance.html +++ b/resources/mails/topjava/topjava_last_chance.html @@ -11,7 +11,7 @@ В этот четверг (08.12) будет рассылка первого занятия с разбором вступительного задания.
          Еще можно принять участие в этом выпуске Topjava Java Enterprise (08.12-16.02), ничего не потеряв.

          -Уже начал проверять вступительные задания в группе slack, раздал доступ к материалам и до четверга раздаю полугодовые учебные ключи IDEA.
          +Уже начал проверять вступительные задания в группе slack, раздал доступ к материалам и до четверга раздаю полугодовые учебные ключи IDEA. Следующий выпуск будет в середине марта.

          Основное, что можно получить из работы над проектом: @@ -25,11 +25,11 @@
        • привычка кодировать красиво
        • кругозор, навыки решения подобных задач
        -Поэтому мы учимся мыслить и работать как Java разработчики уже сейчас, потом это будет гораздо сложнее и стоить дороже. +Мы учимся мыслить и работать как Java разработчики уже сейчас, потом это будет гораздо сложнее и стоить дороже. Вот на мой взгляд хорошие советы новичкам. От себя я добавлю:
        • Учись грамотно формулировать проблему. Проблема "у меня не работает" может иметь тысячи причин. В процессе формулирования очень часто приходит ее решение.
        • -
        • Учись инвестигировать проблему. Внимательное чтение логов и умение дебажить - основные навыки разработчика. В логах надо читать верх самого нижнего эксепшена - там причина всей портянки.
        • +
        • Учись исследовать проблему. Внимательное чтение логов и умение дебажить - основные навыки разработчика. В логах надо читать верх самого нижнего эксепшена - там причина всей портянки.
        • Грамотно уделяй время каждой проблеме. Две крайности - сразу бросаться в чат или ко мне за помощью и бится нам ней часами. Пробуй решить ее сам и в зависимости от проблемы выделяй на это разумное время.
        From 7a83191a18868b476aef558a18d86247ff96930c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 7 Dec 2016 18:55:16 +0300 Subject: [PATCH 411/936] Add IDEA registration --- resources/mails/idea_register.html | 22 +++++++ resources/view/registration_idea.html | 29 ++++++++++ resources/view/registration_topjava.html | 2 +- .../java/ru/javaops/model/IdeaCoupon.java | 57 +++++++++++++++++++ .../repository/IdeaCouponRepository.java | 16 ++++++ .../ru/javaops/service/IdeaCouponService.java | 36 ++++++++++++ .../java/ru/javaops/service/MailService.java | 8 ++- .../javaops/web/SubscriptionController.java | 24 ++++++++ 8 files changed, 191 insertions(+), 3 deletions(-) create mode 100644 resources/mails/idea_register.html create mode 100644 resources/view/registration_idea.html create mode 100644 src/main/java/ru/javaops/model/IdeaCoupon.java create mode 100644 src/main/java/ru/javaops/repository/IdeaCouponRepository.java create mode 100644 src/main/java/ru/javaops/service/IdeaCouponService.java diff --git a/resources/mails/idea_register.html b/resources/mails/idea_register.html new file mode 100644 index 0000000..841cc4c --- /dev/null +++ b/resources/mails/idea_register.html @@ -0,0 +1,22 @@ + + + + Регистрация IntelliJ IDEA + +

        + Здравствуй!
        +

        +Для персональной регистрации IntelliJ IDEA на полгода: +
          +
        • зайди по этой ссылке
        • +
        • выбери в New Subscription кнопку BUY NOW
        • +
        • следуй этой инструкции (с пункта 2)
        • +
        • под Product IntelliJ IDEA есть линк "Have a discount code?", введи туда + купон
        • +
        • после завершения заказа на почту приходит письмо с сертификатом. В IDEA я его активировал через Help -> Register...-> JetBrains Account -> email/password -> Activate.
          + Возможно также активировать по ссылке из письма и "Download activation code for offline usage" или через "Legacy license key"
        • +
        +Не спеши при регистрации. Если c нескольких раз не получилось, пиши в личку skype или slack. +

        +

        + \ No newline at end of file diff --git a/resources/view/registration_idea.html b/resources/view/registration_idea.html new file mode 100644 index 0000000..44b60e3 --- /dev/null +++ b/resources/view/registration_idea.html @@ -0,0 +1,29 @@ + + + + + + Java Online Projects + + + + + + +
        +
        +

        Спасибо за регистрацию!

        + +

        Проверь почту: должен прийти купон для бесплатной активации IDEA с подробной инструкцией

        +
        +
        + + diff --git a/resources/view/registration_topjava.html b/resources/view/registration_topjava.html index 4730b50..8903193 100644 --- a/resources/view/registration_topjava.html +++ b/resources/view/registration_topjava.html @@ -22,7 +22,7 @@

        Спасибо за регистрацию!

        -

        +

        На почту должно прийти приглашение в группу Slack.

        diff --git a/src/main/java/ru/javaops/model/IdeaCoupon.java b/src/main/java/ru/javaops/model/IdeaCoupon.java new file mode 100644 index 0000000..d7cc53e --- /dev/null +++ b/src/main/java/ru/javaops/model/IdeaCoupon.java @@ -0,0 +1,57 @@ +package ru.javaops.model; + +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import javax.persistence.*; +import java.time.LocalDate; + +/** + * gkislin + * 07.12.2016 + */ +@Entity +@Table(name = "idea_coupon", uniqueConstraints = { + @UniqueConstraint(columnNames = {"coupon"}, name = "idea_coupon_unique_idx"), + @UniqueConstraint(columnNames = {"user_id", "project_id"}, name = "idea_coupon_user_project_unique_idx") +}) +public class IdeaCoupon extends BaseEntity{ + @Column(name = "coupon") + private String coupon; + + @Column(name = "date") + private LocalDate date; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + @OnDelete(action = OnDeleteAction.CASCADE) + private User user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "project_id") + private Project project; + + public String getCoupon() { + return coupon; + } + + public void setCoupon(String coupon) { + this.coupon = coupon; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Project getProject() { + return project; + } + + public void setProject(Project project) { + this.project = project; + } +} diff --git a/src/main/java/ru/javaops/repository/IdeaCouponRepository.java b/src/main/java/ru/javaops/repository/IdeaCouponRepository.java new file mode 100644 index 0000000..a29a4b3 --- /dev/null +++ b/src/main/java/ru/javaops/repository/IdeaCouponRepository.java @@ -0,0 +1,16 @@ +package ru.javaops.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; +import ru.javaops.model.IdeaCoupon; + +@Transactional(readOnly = true) +public interface IdeaCouponRepository extends JpaRepository { + @Query("SELECT c FROM IdeaCoupon c WHERE c.user.id=:userId AND c.project.id=:projectId") + IdeaCoupon findByUserIdAndProjectId(@Param("userId") int userId, @Param("projectId") int projectId); + + @Query + IdeaCoupon getFirstByUserIdIsNull(); +} \ No newline at end of file diff --git a/src/main/java/ru/javaops/service/IdeaCouponService.java b/src/main/java/ru/javaops/service/IdeaCouponService.java new file mode 100644 index 0000000..b08e99c --- /dev/null +++ b/src/main/java/ru/javaops/service/IdeaCouponService.java @@ -0,0 +1,36 @@ +package ru.javaops.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.javaops.model.IdeaCoupon; +import ru.javaops.model.Project; +import ru.javaops.model.User; +import ru.javaops.repository.IdeaCouponRepository; + +/** + * GKislin + * 15.02.2016 + */ +@Service +public class IdeaCouponService { + private final Logger log = LoggerFactory.getLogger(IdeaCouponService.class); + + @Autowired + private IdeaCouponRepository ideaCouponRepository; + + public IdeaCoupon assignToUser(User user, Project project) { + IdeaCoupon ideaCoupon = ideaCouponRepository.findByUserIdAndProjectId(user.getId(), project.getId()); + if (ideaCoupon != null) { + throw new IllegalStateException( + String.format("Вы уже получали купон IDEA, проверьте почту
        На проекте %s можно получить купон только один раз", project.getName())); + } + ideaCoupon = ideaCouponRepository.getFirstByUserIdIsNull(); + ideaCoupon.setUser(user); + ideaCoupon.setProject(project); + ideaCouponRepository.save(ideaCoupon); + log.info("Assign IDEA coupon to " + user.getEmail()); + return ideaCoupon; + } +} diff --git a/src/main/java/ru/javaops/service/MailService.java b/src/main/java/ru/javaops/service/MailService.java index 6a1bda5..e510024 100644 --- a/src/main/java/ru/javaops/service/MailService.java +++ b/src/main/java/ru/javaops/service/MailService.java @@ -35,7 +35,7 @@ @Service public class MailService { private static final Locale LOCALE_RU = Locale.forLanguageTag("ru"); - private static final String OK = "OK"; + public static final String OK = "OK"; private static final Logger LOG = LoggerFactory.getLogger(MailService.class); @Autowired @@ -136,8 +136,12 @@ public String sendToUser(String template, User user) { checkNotNull(user, "User must not be null"); String activationKey = subscriptionService.generateActivationKey(user.getEmail()); String subscriptionUrl = subscriptionService.getSubscriptionUrl(user.getEmail(), activationKey, false); - String result = sendWithTemplate(user.getEmail(), user.getFullName(), template, + return sendWithTemplate(user, template, ImmutableMap.of("user", user, "subscriptionUrl", subscriptionUrl, "activationKey", activationKey)); + } + + public String sendWithTemplate(User user, String template, final Map params) { + String result = sendWithTemplate(user.getEmail(), user.getFullName(), template, params); mailCaseRepository.save(new MailCase(user, template, result)); return result; } diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index 9374bb6..56dc01f 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -18,6 +18,8 @@ import javax.mail.MessagingException; import javax.validation.Valid; import javax.validation.ValidationException; +import java.time.LocalDate; +import java.time.Month; import java.util.Date; import java.util.Optional; import java.util.Set; @@ -48,6 +50,9 @@ public class SubscriptionController { @Autowired private ProjectService projectService; + @Autowired + private IdeaCouponService ideaCouponService; + @RequestMapping(value = "/activate", method = RequestMethod.GET) public ModelAndView activate(@RequestParam("email") String email, @RequestParam("activate") boolean activate, @RequestParam("key") String key) { @@ -130,6 +135,25 @@ public ModelAndView repeat(@RequestParam("email") String email, @RequestParam("p return sendSlackInvitation(email, projectName); } + @RequestMapping(value = "/idea", method = RequestMethod.GET) + public ModelAndView ideaRegister(@RequestParam("email") String email, @RequestParam("group") String groupName) throws MessagingException { + + Group group = groupService.findByName(groupName); + if (group == null || group.getStartDate() == null || group.getStartDate().isBefore(LocalDate.of(2016, Month.OCTOBER, 1))) { + throw new IllegalArgumentException("Неверное имя группы"); + } + User user = userService.findByEmailAndGroupId(email, group.getId()); + checkNotNull(user, "Пользователь %s не найден в группе %s", email, groupName); + + IdeaCoupon coupon = ideaCouponService.assignToUser(user, group.getProject()); + String response = mailService.sendWithTemplate(user, "idea_register", ImmutableMap.of("user", user, "coupon", coupon.getCoupon())); + if (MailService.OK.equals(response)) { + return new ModelAndView("registration_idea"); + } else { + throw new IllegalStateException("Ошибка отправки почты" + response); + } + } + private ModelAndView sendSlackInvitation(String email, String projectName) { IntegrationService.SlackResponse response = integrationService.sendSlackInvitation(email, projectName); return new ModelAndView("registration_" + projectName, From 7ca08b1f30bfc66b808ff431c5328ac247857b0d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 7 Dec 2016 22:00:32 +0300 Subject: [PATCH 412/936] Update IDEA registration --- resources/mails/idea_register.html | 2 +- .../java/ru/javaops/repository/IdeaCouponRepository.java | 4 ++-- src/main/java/ru/javaops/service/IdeaCouponService.java | 5 ++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/resources/mails/idea_register.html b/resources/mails/idea_register.html index 841cc4c..79f949d 100644 --- a/resources/mails/idea_register.html +++ b/resources/mails/idea_register.html @@ -6,7 +6,7 @@

        Здравствуй!

        -Для персональной регистрации IntelliJ IDEA на полгода: +Для персональной регистрации учебной лицензии IntelliJ IDEA на полгода:
        • зайди по этой ссылке
        • выбери в New Subscription кнопку BUY NOW
        • diff --git a/src/main/java/ru/javaops/repository/IdeaCouponRepository.java b/src/main/java/ru/javaops/repository/IdeaCouponRepository.java index a29a4b3..6865fbd 100644 --- a/src/main/java/ru/javaops/repository/IdeaCouponRepository.java +++ b/src/main/java/ru/javaops/repository/IdeaCouponRepository.java @@ -11,6 +11,6 @@ public interface IdeaCouponRepository extends JpaRepository @Query("SELECT c FROM IdeaCoupon c WHERE c.user.id=:userId AND c.project.id=:projectId") IdeaCoupon findByUserIdAndProjectId(@Param("userId") int userId, @Param("projectId") int projectId); - @Query - IdeaCoupon getFirstByUserIdIsNull(); + @Query(value = "SELECT * FROM idea_coupon WHERE user_id IS NULL LIMIT 1", nativeQuery = true) + IdeaCoupon getUnused(); } \ No newline at end of file diff --git a/src/main/java/ru/javaops/service/IdeaCouponService.java b/src/main/java/ru/javaops/service/IdeaCouponService.java index b08e99c..9182b7e 100644 --- a/src/main/java/ru/javaops/service/IdeaCouponService.java +++ b/src/main/java/ru/javaops/service/IdeaCouponService.java @@ -26,7 +26,10 @@ public IdeaCoupon assignToUser(User user, Project project) { throw new IllegalStateException( String.format("Вы уже получали купон IDEA, проверьте почту
          На проекте %s можно получить купон только один раз", project.getName())); } - ideaCoupon = ideaCouponRepository.getFirstByUserIdIsNull(); + ideaCoupon = ideaCouponRepository.getUnused(); + if (ideaCoupon == null) { + throw new IllegalStateException("Закончились купоны IDEA, напиши плз в skype: grigory.kislin"); + } ideaCoupon.setUser(user); ideaCoupon.setProject(project); ideaCouponRepository.save(ideaCoupon); From fcc06776e23fa999c9d681c330b8d611d9e629b0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 7 Dec 2016 22:16:22 +0300 Subject: [PATCH 413/936] Update IDEA registration --- resources/mails/idea_register.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/mails/idea_register.html b/resources/mails/idea_register.html index 79f949d..3df7f4c 100644 --- a/resources/mails/idea_register.html +++ b/resources/mails/idea_register.html @@ -13,7 +13,8 @@
        • следуй этой инструкции (с пункта 2)
        • под Product IntelliJ IDEA есть линк "Have a discount code?", введи туда купон
        • -
        • после завершения заказа на почту приходит письмо с сертификатом. В IDEA я его активировал через Help -> Register...-> JetBrains Account -> email/password -> Activate.
          +
        • после завершения заказа на почту приходит письмо с сертификатом.
          + В IDEA я его активировал через Help -> Register...-> JetBrains Account -> email/password -> Activate.
          Возможно также активировать по ссылке из письма и "Download activation code for offline usage" или через "Legacy license key"
        Не спеши при регистрации. Если c нескольких раз не получилось, пиши в личку skype или slack. From 4d10b3860d5b620ded7a3805107e7df2681bab21 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Dec 2016 00:09:19 +0300 Subject: [PATCH 414/936] Update subscription --- .../java/ru/javaops/service/SubscriptionService.java | 4 ++-- .../java/ru/javaops/web/SubscriptionController.java | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/javaops/service/SubscriptionService.java b/src/main/java/ru/javaops/service/SubscriptionService.java index ed463a8..a2fa758 100644 --- a/src/main/java/ru/javaops/service/SubscriptionService.java +++ b/src/main/java/ru/javaops/service/SubscriptionService.java @@ -19,8 +19,8 @@ public String generateActivationKey(String email) { return PasswordUtil.getPasswordEncoder().encode(getSalted(email)); } - public void checkActivationKey(String email, String key) { - if (!PasswordUtil.isMatch(getSalted(email), key)) { + public void checkActivationKey(String value, String key) { + if (!PasswordUtil.isMatch(getSalted(value), key)) { throw new IllegalArgumentException("Неверный ключ активации"); } } diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index 56dc01f..9f2ded5 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -73,10 +73,13 @@ public ModelAndView registerInGroup(@RequestParam("group") String group, @RequestParam(value = "callback", required = false) String callback, @RequestParam("channel") String channel, @RequestParam("template") String template, + @RequestParam("secret") String secret, @Valid UserTo userTo, BindingResult result) { if (result.hasErrors()) { throw new ValidationException(Util.getErrorMessage(result)); } + subscriptionService.checkActivationKey(channel, secret); + UserGroup userGroup = groupService.registerAtGroup(userTo, group, channel); String mailResult = mailService.sendToUser(template, userGroup.getUser()); ImmutableMap params = ImmutableMap.of("userGroup", userGroup, "result", mailResult); @@ -123,7 +126,12 @@ private ModelAndView getRedirectView(String mailResult, String successUrl, Strin } @RequestMapping(value = "/repeat", method = RequestMethod.GET) - public ModelAndView repeat(@RequestParam("email") String email, @RequestParam("project") String projectName) throws MessagingException { + public ModelAndView repeat(@RequestParam("email") String email, + @RequestParam("project") String projectName, + @RequestParam("secret") String secret) throws MessagingException { + + subscriptionService.checkActivationKey(projectName, secret); + ProjectProps projectProps = groupService.getProjectProps(projectName); User user = userService.findByEmailAndProjectId(email, projectProps.project.getId()); checkNotNull(user, "Пользователь %s не найден в проекте %s", email, projectName); From 914e7ed6f17ca786ae05c417ff74fd2a8624c856 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Dec 2016 00:13:47 +0300 Subject: [PATCH 415/936] Update index --- resources/view/index.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index 110568d..ccb9d44 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -114,7 +114,7 @@

        Участие в разработке Spring/JPA Enterprise приложе

        Наши истории (делимся опытом и успехом)


        Стажировка на Java Enterprise:

        -

        Старт 01.12

        +

        Первое занятие 08.12

        Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins. Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе @@ -122,17 +122,17 @@

        Старт 01.12

        Приложения проекта, задеплоенное в Heroku (будет у каждого участника)


        -

        Проект "Многопоточность. Веб сервисы."

        +

        Проект "Многопоточность. XML. Веб сервисы."

        Проект идет. Следующий будет в феврале 2017

        Разработка полнофункционального многомодульного Maven проекта с использованием SOAP (JAX-WS) и REST (JAX-RS)


        -

        Курс JavaSE + Web

        +

        Курс JavaSE + Web

        Разработка WEB-приложения, основываясь на базовых темах курса: объектная модель, коллекции, система ввода-вывода, работа с файлами, сериализация, работа с XML, JSON, SQL, персистентность в базу данных (PostgreSQL), сервлеты, JSP/JSTL, веб-контейнер Tomcat, HTML, модульные тесты JUnit, java.util.Logging, система контроля версий Git. - Деплой полученного приложения в облачный сервис Heroku.

        + Деплой полученного приложения в облачный сервис Heroku. Личный кабинет + куратор


        Техническое собеседование Java разработчик

        Тестовое интервью

        From 63586b8ff001fe5accdb88da1192ac72898260f0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Dec 2016 14:52:33 +0300 Subject: [PATCH 416/936] Update topjava lessons --- resources/mails/topjava/lesson/final_fix.html | 20 ++++++++-------- resources/mails/topjava/lesson/lesson01.html | 24 ++++++++++--------- resources/mails/topjava/lesson/lesson02.html | 6 ++--- resources/mails/topjava/lesson/lesson03.html | 8 +++---- .../mails/topjava/lesson/lesson03_fix.html | 2 +- resources/mails/topjava/lesson/lesson04.html | 6 ++--- resources/mails/topjava/lesson/lesson05.html | 8 +++---- resources/mails/topjava/lesson/lesson06.html | 8 +++---- resources/mails/topjava/lesson/lesson07.html | 8 +++---- resources/mails/topjava/lesson/lesson08.html | 8 +++---- resources/mails/topjava/lesson/lesson09.html | 8 +++---- resources/mails/topjava/lesson/lesson10.html | 8 +++---- resources/mails/topjava/lesson/lesson11.html | 12 +++++----- .../mails/topjava/lesson/lesson11_final.html | 4 ++-- 14 files changed, 66 insertions(+), 64 deletions(-) diff --git a/resources/mails/topjava/lesson/final_fix.html b/resources/mails/topjava/lesson/final_fix.html index 0580fca..f6bfbe1 100644 --- a/resources/mails/topjava/lesson/final_fix.html +++ b/resources/mails/topjava/lesson/final_fix.html @@ -11,27 +11,27 @@ - Что надо знать о логировании прагматичному Java‑программисту - Как начинающему Java-разработчику подружиться со своей базой данных? -Выложил заключительное занятие +Выложил заключительное занятие нашего проекта.
        -Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        -Обсуждение урока и HW10 в Slack #lesson11
        -Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта. +Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        +Обсуждение урока и HW10 в Slack #lesson11
        +Последние изменения я вчекинил в ветку heroku и обновил ей демо проекта.
        • Если ты решил сделать доработку проекта, отдай мне свой код на ревью. Я включу ссылку на твой репозиторий в список сделанных доработок для доступа к ним всех участников Topjava.

        • -
        • Выпускной +
        • Выпускной проект от участников с проверкой ДЗ желательно сдать на ревью до 01.09 (напомню, что лишние профили в коде и в pom.xml нужно удалить).

        • Повторное участие в проекте без проверки домашних заданий бесплатное.
          Зарегистрируйся и тебе - придет ссылка на группу Slack topjava8 (там уже есть новые участники с JavaRush). - Здесь есть расписание topjava08. Приглашай знакомых, желающих стать java разработчиками или + придет ссылка на группу Slack topjava9 (там уже есть новые участники с JavaRush). + Здесь есть расписание topjava09. Приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию. Со ссылкой на тебя даю скидку 5%.

        • -
        • Группа Slack topjava8 к 01.09 будет удалена. Приглашаю в Slack Java Online Projects (кто еще не +
        • Группа Slack topjava9 к 01.09 будет удалена. Приглашаю в Slack Java Online Projects (кто еще не вступил), где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) По каждой теме сделан свой канал. Проверь свои
        • - Все материалы проекта останутся вам доступны (в течении нового курса они будут постепенно переезжать в подпапку Topjava8). Репозиторий - topjava08 до 01.09 будет заархивирован и положен в Google Drive вместе с уроками в формате markdown. + Все материалы проекта останутся вам доступны (в течении нового курса они будут постепенно переезжать в подпапку topjava9). Репозиторий + topjava09 до 01.09 будет заархивирован и положен в Google Drive вместе с уроками в формате markdown. Для просмотра в Chrome файлов md я пользуюсь плагином Markdown Preview (нужно в его параметрах разрешить открывать файл по ссылкам) или можно использовать плагин diff --git a/resources/mails/topjava/lesson/lesson01.html b/resources/mails/topjava/lesson/lesson01.html index 4de4149..02d0b67 100644 --- a/resources/mails/topjava/lesson/lesson01.html +++ b/resources/mails/topjava/lesson/lesson01.html @@ -3,33 +3,35 @@ Первое занятие проекта Java Enterprise (Topjava) - +

          Здравствуй firstName!

          -Поздравляю тебя с первым занятием нашего - проекта!
          +Поздравляю тебя с первым занятием нашего + проекта! Обычно ночью я выкладываю новое занятие в slack и днем делаю рассылку.

          - Репозиторий на github, в котором я буду вести проект паралельно с вами.
          - Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master. + Это репозиторий на github, в котором я буду вести проект паралельно с вами.
          + Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master. В случае проблем с накаткой патчей всегда можно взять код, на который патчи будут ложиться без проблем, - например UserMealsUtil в формате Raw. Решение проблем с патчами есть в Wiki Git. + например UserMealsUtil в формате Raw. Решение проблем с патчами есть в Wiki Git. В правилах работы с патчами на проекте написал, что делать apply patch лучше по одному, непосредственно перед видео на эту тему, а при просмотре видео сразу отслеживать все изменения кода проекта по изменению в патче. - Патчи можно закачивать архивом и распаковывать в корень (или отдельную папку) в проекте, я добавил *.patch в .gitignore, чтобы они не попадали в git. + Патчи можно закачивать архивом и распаковывать в корень (или отдельную папку) в проекте, я добавил *.patch в .gitignore, чтобы они не попадали в git. Если патчи удваиваются, попробуйте выйти из акаунта и снова войти.

          + Занятия буду выкладывать в каталоге doc ветки doc проекта.
          + Обсуждение занятия в ветке #lesson01 а домашнего задания (HW1) в + #hw1 (если будем путаться в каналах, то сократим)

          - Занятия буду выкладывать в каталоге doc ветки doc проекта.
          - Обсуждение занятия в ветке #lesson01 а Домашнего Задания в - #hw1 (если будем путаться в каналах, то сократим:)
          Если Google Drive отказывает в доступе к материалам урока:

            +
          • убедись, что ты в участник Google Group Topjava (если нет - оставь заявку)
          • попробуй выйти из google аккаунта и снова зайти;
          • попробуй зайти в google аккаунт в приватном окне Ctrl+Shift+N в хроме, Ctrl+Shift+P в FF;
          • напиши мне в личку в skype.

          +Купон на бесплатную регистрицию IntelliJ IDEA на полгода можно получить по этой ссылке и далее по инструкции в письме.

          - Домашнее задание (у кого есть проверка) желательно присылать до вечера 13.09.
          + Домашнее задание (у кого есть проверка) желательно присылать до вечера 13.12.

          diff --git a/resources/mails/topjava/lesson/lesson02.html b/resources/mails/topjava/lesson/lesson02.html index 5cc9b0d..a85a6ba 100644 --- a/resources/mails/topjava/lesson/lesson02.html +++ b/resources/mails/topjava/lesson/lesson02.html @@ -7,11 +7,11 @@

          Здравствуй firstName!

          -Готово второе достаточно сложное занятие нашего проекта "Каркас приложения, добавление Spring".
          -После выполнения ДЗ объязательно сверься с подсказками. +Готово второе достаточно сложное занятие нашего проекта "Каркас приложения, добавление Spring".
          +После выполнения ДЗ объязательно сверься с подсказками.

          Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
          + href="https://github.com/JavaWebinar/topjava09/commits/master">в моей ветка master.
          В случае проблем с накаткой патчей смотри в Git Wiki "Patch не накатывается (предлагает merge)".

          diff --git a/resources/mails/topjava/lesson/lesson03.html b/resources/mails/topjava/lesson/lesson03.html index 192cd45..c07a17d 100644 --- a/resources/mails/topjava/lesson/lesson03.html +++ b/resources/mails/topjava/lesson/lesson03.html @@ -7,14 +7,14 @@

          Здравствуй firstName!

          -Третье занятие нашего проекта: JUnit +Третье занятие нашего проекта: JUnit тестирование и начало работы с DB.
          Если с SQL и RDBMS не работали- прочтите основы по ссылкам.

          Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
          - Обсуждение урока в slack #lesson03, HW3 в #hw3. + href="https://github.com/JavaWebinar/topjava09/commits/master">в моей ветка master.
          + Обсуждение урока в slack #lesson03, HW3 в #hw3.

          Приглашаю тебя в общую группу Slack Java Online Projects, где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) diff --git a/resources/mails/topjava/lesson/lesson03_fix.html b/resources/mails/topjava/lesson/lesson03_fix.html index 0d18b70..884f323 100644 --- a/resources/mails/topjava/lesson/lesson03_fix.html +++ b/resources/mails/topjava/lesson/lesson03_fix.html @@ -8,7 +8,7 @@ Здравствуй firstName!

          1. Добавил в 3-е занятие картинку + href="https://github.com/JavaWebinar/topjava09/blob/doc/doc/lesson03.md#-6-Базы-данных-Обзор-nosql-и-java-persistence-solution-без-orm">картинку по созданию базы и пользователя в через pgAdmin.
          2. В классе Meal проекта ошибка: поле id перекрывает поле id базового класса BaseEntity. Удалите 12 и 13 строку.

          diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index 4db2758..9d2b65a 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -7,7 +7,7 @@

          Здравствуй firstName!

          - Четвертое занятие нашего проекта: популирование + Четвертое занятие нашего проекта: популирование данных через Spring, JPA/ Hibernate, HSQLDB.
          В патче 4_0_2_refactoring я сделал правку:
          46: items="${mealList}" -> items="${meals}"
          @@ -16,7 +16,7 @@ Материалов по JPA огромное количество. Чтобы не утонуть - не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW4.

          - Обсуждение урока в slack #lesson04, домашнего задания в slack #hw4 + Обсуждение урока в slack #lesson04, домашнего задания в slack #hw4

          Домашнее задание (у кого есть проверка) желательно присылать до вечера 04.10.
          @@ -24,7 +24,7 @@

          После выполнения этого достаточно несложного HW4 можно приступать к выполнению выпускного + href="https://github.com/JavaWebinar/topjava09/blob/doc/doc/lesson04.md#Выпускной-проект">выпускного проекта

          diff --git a/resources/mails/topjava/lesson/lesson05.html b/resources/mails/topjava/lesson/lesson05.html index e15ac4d..a8dd496 100644 --- a/resources/mails/topjava/lesson/lesson05.html +++ b/resources/mails/topjava/lesson/lesson05.html @@ -8,12 +8,12 @@ Здравствуй firstName!

          - Готово пятое занятие нашего проекта.
          + Готово пятое занятие нашего проекта.
          Заканчиваем с базой данных, на следующем уроке перейдем к слою web. Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          - Обсуждение урока в slack #lesson05, домашнего задания в - slack #hw5 + href="https://github.com/JavaWebinar/topjava09/commits/master">ветка master нашего проекта.
          + Обсуждение урока в slack #lesson05, домашнего задания в + slack #hw5

          Домашнее задание (у кого есть проверка) желательно присылать до вечера 11.10
          diff --git a/resources/mails/topjava/lesson/lesson06.html b/resources/mails/topjava/lesson/lesson06.html index 15dfabf..944d8d0 100644 --- a/resources/mails/topjava/lesson/lesson06.html +++ b/resources/mails/topjava/lesson/lesson06.html @@ -8,15 +8,15 @@ Здравствуй firstName!

          - Вчера выложил шестое занятие нашего + Вчера выложил шестое занятие нашего проекта, прошу прощения за задержку рассылки почты.
          Начинаем изучать Spring-MVC и слой Web.

          Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          - Обсуждение урока в slack #lesson06, домашнего задания в - slack #hw6 + href="https://github.com/JavaWebinar/topjava09/commits/master">ветка master нашего проекта.
          + Обсуждение урока в slack #lesson06, домашнего задания в + slack #hw6

          Домашнее задание (у кого есть проверка) желательно присылать до вечера 18.10
          diff --git a/resources/mails/topjava/lesson/lesson07.html b/resources/mails/topjava/lesson/lesson07.html index b5b9619..2866b16 100644 --- a/resources/mails/topjava/lesson/lesson07.html +++ b/resources/mails/topjava/lesson/lesson07.html @@ -8,13 +8,13 @@ Здравствуй firstName!

          -Выложил седьмое занятие нашего проекта.
          +Выложил седьмое занятие нашего проекта.
          REST контроллеры и тестирование контроллеров.

          - Перед накаткой патчей в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          - Обсуждение урока в slack #lesson07, домашнего задания в - slack #hw7 + Перед накаткой патчей в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          + Обсуждение урока в slack #lesson07, домашнего задания в + slack #hw7

          Домашнее задание (у кого есть проверка) желательно присылать до вечера 25.10
          diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index b5144ff..75f2259 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -8,13 +8,13 @@ Здравствуй firstName!

          -В четверг выложил восьмое занятие нашего проекта.
          +В четверг выложил восьмое занятие нашего проекта.
          CSS (Bootstrap), JavaScript (jQuery + plugins), AJAX, добавление к REST контроллерам базовой авторизации.

          - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          - Обсуждение урока в slack #lesson08, домашнего задания в - slack #hw8 + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          + Обсуждение урока в slack #lesson08, домашнего задания в + slack #hw8

          Домашнее задание (у кого есть проверка) желательно присылать до вечера 01.11
          diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index 448a835..49a8614 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -8,13 +8,13 @@ Здравствуй firstName!

          -Выложил девятое занятие нашего проекта.
          +Выложил девятое занятие нашего проекта.
          Наконец делаем настоящую авторизацию, ее тестирование и отрисовку таблицы по AJAX.

          - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          - Обсуждение урока в slack #lesson09, домашнего задания в - slack #hw9 + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
          + Обсуждение урока в slack #lesson09, домашнего задания в + slack #hw9

          Домашнее задание (у кого есть проверка) желательно присылать до вечера 08.11
          diff --git a/resources/mails/topjava/lesson/lesson10.html b/resources/mails/topjava/lesson/lesson10.html index c559892..77f1b64 100644 --- a/resources/mails/topjava/lesson/lesson10.html +++ b/resources/mails/topjava/lesson/lesson10.html @@ -8,13 +8,13 @@ Здравствуй firstName!

          -Выложил десятое занятие нашего проекта.
          +Выложил десятое занятие нашего проекта.
          На заключительное занятие остается разбор HW10, рефакторинг и деплой в heroku.

          -ВАЖНО: обновил патчи (они остались со старого проекта, можно было увидеть по дате). Нужно откатиться обратно на обрано на 9_13_fix.patch: Reset Current Branch to Here->Hard и скачать новые. Картинка есть в канале #lesson10. +ВАЖНО: обновил патчи (они остались со старого проекта, можно было увидеть по дате). Нужно откатиться обратно на обрано на 9_13_fix.patch: Reset Current Branch to Here->Hard и скачать новые. Картинка есть в канале #lesson10.

          - Обсуждение урока в Slack #lesson10, домашнего задания в - #hw10 + Обсуждение урока в Slack #lesson10, домашнего задания в + #hw10

          Домашнее задание (у кого есть проверка) желательно присылать до вечера 15.11
          diff --git a/resources/mails/topjava/lesson/lesson11.html b/resources/mails/topjava/lesson/lesson11.html index 7133c59..b15c30f 100644 --- a/resources/mails/topjava/lesson/lesson11.html +++ b/resources/mails/topjava/lesson/lesson11.html @@ -8,18 +8,18 @@

          Здравствуй firstName!

          -Выложил заключительное занятие +Выложил заключительное занятие нашего проекта.
          Все патчи этого урока уже вчекинены в наш репозиторий и я обновил им демо приложение.
          -Обсуждение урока в Slack #lesson11
          +Обсуждение урока в Slack #lesson11
          • - Если ты решил сделать доработку проекта, отдай мне свой код на ревью. Я включу ссылку на твой репозиторий в + Если ты решил сделать доработку проекта, отдай мне свой код на ревью. Я включу ссылку на твой репозиторий в список сделанных доработок для доступа к ним всех участников Topjava.

          • -
          • Выпускной +
          • Выпускной проект от участников с проверкой ДЗ желательно сдать на ревью до 08.12 - (добавил к нему рекомендации).

            + (добавил к нему рекомендации).

          • Повторное участие в проекте без проверки домашних заданий бесплатное.
            Единственное условие (надеюсь не будет препятствием) - поделиться пожалуйста ссылкой на проект в VK или @@ -30,7 +30,7 @@ Прект будем вести в репозитории topjava09, здесь же есть расписание. Приглашай знакомых, желающих стать java разработчиками или повысить свою квалификацию!

          • -
          • Группа Slack topjava8 после 08.12 будет удалена, вступай в группу Java Online Projects (кто еще не +
          • Группа Slack topjava9 после 08.12 будет удалена, вступай в группу Java Online Projects (кто еще не вступил), где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) По каждой теме сделан свой канал. Проверь свои В недалеком будующем планирую сделать адресную рассылку вакансий и статистику по работе, пока это простая форма соискателя. Если у тебя на работе есть вакансии для наших выпускников, публикуй их в #vacancies группы JavaOPs -(после выполнения выпускного проекта группу slack topjava8 удалю, общаемся в этой группе (после сохранения формы должно прийти приглашение). -К этим выходным github репозиторий topjava08 заархивирую, положу в google drive и удалю (доступ в google drive у тебя остается).
            +(после выполнения выпускного проекта группу slack topjava9 удалю, общаемся в этой группе (после сохранения формы должно прийти приглашение). +К этим выходным github репозиторий topjava09 заархивирую, положу в google drive и удалю (доступ в google drive у тебя остается).

            Если есть желание, можно пройти со мной тестовое интервью (здесь также есть полезные ссылки для подготовки, расценки внизу).
            Напомню, что в феврале 2017 г. планирую второй выпуск курса Многопоточность. XML. Веб сервисы, доступно 1-е занятие.
            From 877a8ee40e993f25b86482a24de159d7c30b6447 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Dec 2016 14:55:29 +0300 Subject: [PATCH 417/936] Update lesson01 --- resources/mails/topjava/lesson/lesson01.html | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson01.html b/resources/mails/topjava/lesson/lesson01.html index 02d0b67..c3530b9 100644 --- a/resources/mails/topjava/lesson/lesson01.html +++ b/resources/mails/topjava/lesson/lesson01.html @@ -3,7 +3,6 @@ Первое занятие проекта Java Enterprise (Topjava) -

            Здравствуй firstName!

            From f59698ab2eb12c487dc422260ce4246c84bd0a2c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Dec 2016 14:56:33 +0300 Subject: [PATCH 418/936] Update lesson01 --- resources/mails/topjava/lesson/lesson01.html | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/mails/topjava/lesson/lesson01.html b/resources/mails/topjava/lesson/lesson01.html index c3530b9..f599c53 100644 --- a/resources/mails/topjava/lesson/lesson01.html +++ b/resources/mails/topjava/lesson/lesson01.html @@ -3,6 +3,7 @@ Первое занятие проекта Java Enterprise (Topjava) +

            Здравствуй firstName!

            From 91031107c279252e1a3ac267fa556f421d41556c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Dec 2016 15:01:17 +0300 Subject: [PATCH 419/936] Update lesson01 --- resources/mails/topjava/lesson/lesson01.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson01.html b/resources/mails/topjava/lesson/lesson01.html index f599c53..172d8eb 100644 --- a/resources/mails/topjava/lesson/lesson01.html +++ b/resources/mails/topjava/lesson/lesson01.html @@ -15,7 +15,8 @@ В случае проблем с накаткой патчей всегда можно взять код, на который патчи будут ложиться без проблем, например UserMealsUtil в формате Raw. Решение проблем с патчами есть в Wiki Git. В правилах работы с патчами на проекте написал, что делать apply patch лучше по одному, непосредственно перед видео на эту тему, а при просмотре видео сразу отслеживать все изменения кода проекта по изменению в патче. - Патчи можно закачивать архивом и распаковывать в корень (или отдельную папку) в проекте, я добавил *.patch в .gitignore, чтобы они не попадали в git. Если патчи удваиваются, попробуйте выйти из акаунта и снова войти. + Патчи можно закачивать архивом и распаковывать в корень (или отдельную папку) в проекте, я добавил *.patch в .gitignore, чтобы они не попадали в git. + Если в Google Drive патчи удваиваются, попробуйте выйти из акаунта и снова войти.

            Занятия буду выкладывать в каталоге doc ветки doc проекта.
            Обсуждение занятия в ветке #lesson01 а домашнего задания (HW1) в From fc457fb6e2874c9dbadae51c4322edc737ace3ea Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Dec 2016 20:20:45 +0300 Subject: [PATCH 420/936] Add sql executor --- resources/view/sqlResult.html | 6 ++- .../java/ru/javaops/config/AppConfig.java | 19 +++++++++ .../ru/javaops/repository/SqlRepository.java | 42 ++++++++++++------- .../java/ru/javaops/service/SqlService.java | 31 -------------- .../java/ru/javaops/web/PageController.java | 27 ++++++++---- topjava2.md | 4 +- 6 files changed, 72 insertions(+), 57 deletions(-) delete mode 100644 src/main/java/ru/javaops/service/SqlService.java diff --git a/resources/view/sqlResult.html b/resources/view/sqlResult.html index 00caa71..e1ac01c 100644 --- a/resources/view/sqlResult.html +++ b/resources/view/sqlResult.html @@ -22,8 +22,10 @@ - - + + diff --git a/src/main/java/ru/javaops/config/AppConfig.java b/src/main/java/ru/javaops/config/AppConfig.java index c21c6ef..765752e 100644 --- a/src/main/java/ru/javaops/config/AppConfig.java +++ b/src/main/java/ru/javaops/config/AppConfig.java @@ -8,8 +8,15 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; +import org.springframework.scheduling.annotation.Scheduled; +import java.io.IOException; +import java.io.Reader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.sql.SQLException; +import java.util.Properties; /** * GKislin @@ -34,4 +41,16 @@ public void configeJackson(ObjectMapper objectMapper) { objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); } + + public static final Properties SQL_PROPS = new Properties(); + + @Scheduled(fixedRate = 5000) // every 5 sec + private void refreshSqlProps() { + Path path = Paths.get("./config/sql.properties"); + try (Reader reader = Files.newBufferedReader(path)) { + SQL_PROPS.load(reader); + } catch (IOException e) { + throw new IllegalStateException(path.toAbsolutePath().toString() + " is not found"); + } + } } diff --git a/src/main/java/ru/javaops/repository/SqlRepository.java b/src/main/java/ru/javaops/repository/SqlRepository.java index 1e87ed9..b5281ed 100644 --- a/src/main/java/ru/javaops/repository/SqlRepository.java +++ b/src/main/java/ru/javaops/repository/SqlRepository.java @@ -1,12 +1,14 @@ package ru.javaops.repository; -import org.parboiled.common.ImmutableList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.JdbcUtils; import org.springframework.stereotype.Repository; import ru.javaops.SqlResult; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import java.sql.ResultSetMetaData; +import java.util.ArrayList; +import java.util.List; import java.util.Map; /** @@ -16,18 +18,26 @@ @Repository public class SqlRepository { - @PersistenceContext - private EntityManager em; + @Autowired + private NamedParameterJdbcTemplate jdbcTemplate; - public SqlResult execute(String sql, Map params) { -/* - Session session = em.unwrap(Session.class); - session.doWork((Connection connection)-> { - PreparedStatement ps = connection.prepareStatement(sql); - params.forEach((idx, value)->ps.setObject(idx, value)); + public SqlResult execute(String sql, Map params) { + return jdbcTemplate.query(sql, params, rs -> { + ResultSetMetaData rsmd = rs.getMetaData(); + int columnCount = rsmd.getColumnCount(); + List headers = new ArrayList<>(columnCount); + for (int i = 1; i <= columnCount; i++) { + headers.add(JdbcUtils.lookupColumnName(rsmd, i)); + } + List rows = new ArrayList<>(); + while (rs.next()) { + Object[] row = new Object[columnCount]; + for (int i = 1; i <= columnCount; i++) { + row[i - 1] = JdbcUtils.getResultSetValue(rs, i); + } + rows.add(row); + } + return new SqlResult(headers, rows); }); -*/ - Query query = em.createNativeQuery(sql); - return new SqlResult(ImmutableList.of("email, date"), query.getResultList()); } -} +} \ No newline at end of file diff --git a/src/main/java/ru/javaops/service/SqlService.java b/src/main/java/ru/javaops/service/SqlService.java deleted file mode 100644 index 8b140d8..0000000 --- a/src/main/java/ru/javaops/service/SqlService.java +++ /dev/null @@ -1,31 +0,0 @@ -package ru.javaops.service; - -import com.google.common.collect.ImmutableMap; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import ru.javaops.SqlResult; -import ru.javaops.repository.SqlRepository; - -import java.util.Map; - -/** - * gkislin - * 30.10.2016 - */ -@Service -public class SqlService { - - @Autowired - private SqlRepository sqlRepository; - - public SqlResult executeSql(String sqlKey, Map params) { - if ("itedu".equals(sqlKey)) { - return sqlRepository.execute( - "SELECT u.EMAIL, FORMATDATETIME(u.REGISTERED_DATE, 'yyyy-MM-dd') date FROM USERS u " + - "JOIN USER_GROUP ug ON u.id=ug.USER_ID AND ug.CHANNEL='itedu' " + - "ORDER BY date DESC", - ImmutableMap.of()); - } - throw new IllegalStateException("Illegal Sql Key"); - } -} diff --git a/src/main/java/ru/javaops/web/PageController.java b/src/main/java/ru/javaops/web/PageController.java index d6b2bed..e13d067 100644 --- a/src/main/java/ru/javaops/web/PageController.java +++ b/src/main/java/ru/javaops/web/PageController.java @@ -1,40 +1,53 @@ package ru.javaops.web; -import com.google.common.collect.ImmutableMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import ru.javaops.SqlResult; -import ru.javaops.service.SqlService; +import ru.javaops.config.AppConfig; +import ru.javaops.repository.SqlRepository; import ru.javaops.service.UserService; import ru.javaops.to.UserStat; import java.util.List; +import java.util.Map; import static org.springframework.web.bind.annotation.RequestMethod.GET; @Controller public class PageController { + private static final Logger LOG = LoggerFactory.getLogger(PageController.class); @Autowired private UserService userService; @Autowired - private SqlService sqlService; + private SqlRepository sqlRepository; @RequestMapping(value = "/users", method = GET) public ModelAndView usersInfo(@RequestParam("key") String key, @RequestParam("email") String email) { List users = userService.findAllForStats(); - return (users.stream().filter(u -> u.getEmail().equals(email)).findAny().isPresent()) ? + return (users.stream().anyMatch(u -> u.getEmail().equals(email))) ? new ModelAndView("users", "users", users) : new ModelAndView("statsForbidden"); } @RequestMapping(value = "/sql", method = GET) - public ModelAndView sqlExecute(@RequestParam("sql_key") String sqlKey) { - SqlResult result = sqlService.executeSql(sqlKey, ImmutableMap.of()); - return new ModelAndView("sqlResult", "result", result); + public ModelAndView sqlExecute(@RequestParam("sql_key") String sqlKey, @RequestParam Map params) { + String sql = AppConfig.SQL_PROPS.getProperty(sqlKey); + if (sql == null) { + throw new IllegalArgumentException("Key '" + sqlKey + "' is not found"); + } + try { + SqlResult result = sqlRepository.execute(sql, params); + return new ModelAndView("sqlResult", "result", result); + } catch (Exception e) { + LOG.error("Sql '" + sql + "' execution exception", e); + throw new IllegalStateException("Sql execution exception"); + } } } diff --git a/topjava2.md b/topjava2.md index a58f0a8..950739f 100644 --- a/topjava2.md +++ b/topjava2.md @@ -275,4 +275,6 @@ http://www.springbyexample.org/static/1.1/html/simple-gwt-spring-webapp.html https://api.slack.com/web https://api.slack.com/docs/oauth-test-tokens http://stackoverflow.com/questions/30955818/slack-api-team-invitation -https://spring.io/blog/2009/03/27/rest-in-spring-3-resttemplate \ No newline at end of file +https://spring.io/blog/2009/03/27/rest-in-spring-3-resttemplate + +Spring-jdbc: https://www.javacodegeeks.com/2016/03/springboot-working-jdbctemplate.html From 8b89b952567c52353f364ac83e31626b674ccfa8 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Dec 2016 20:38:51 +0300 Subject: [PATCH 421/936] Update sql view --- resources/view/sqlResult.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/view/sqlResult.html b/resources/view/sqlResult.html index e1ac01c..861bfa8 100644 --- a/resources/view/sqlResult.html +++ b/resources/view/sqlResult.html @@ -23,13 +23,15 @@ + - + + From fd3ef385cc7f01a9b175b9bf839d85d9167c1069 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 8 Dec 2016 21:44:55 +0300 Subject: [PATCH 422/936] Add limit to sql --- src/main/java/ru/javaops/web/PageController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/javaops/web/PageController.java b/src/main/java/ru/javaops/web/PageController.java index e13d067..8f65803 100644 --- a/src/main/java/ru/javaops/web/PageController.java +++ b/src/main/java/ru/javaops/web/PageController.java @@ -37,12 +37,17 @@ public ModelAndView usersInfo(@RequestParam("key") String key, @RequestParam("em } @RequestMapping(value = "/sql", method = GET) - public ModelAndView sqlExecute(@RequestParam("sql_key") String sqlKey, @RequestParam Map params) { + public ModelAndView sqlExecute(@RequestParam("sql_key") String sqlKey, + @RequestParam(value = "limit", required = false) Integer limit, + @RequestParam Map params) { String sql = AppConfig.SQL_PROPS.getProperty(sqlKey); if (sql == null) { throw new IllegalArgumentException("Key '" + sqlKey + "' is not found"); } try { + if (limit != null) { + sql = sql.replace(":limit", String.valueOf(limit)); + } SqlResult result = sqlRepository.execute(sql, params); return new ModelAndView("sqlResult", "result", result); } catch (Exception e) { From aef652c023b48c2fac4ab1acebf8203baa1fc309 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 11 Dec 2016 15:10:31 +0300 Subject: [PATCH 423/936] Update payment --- resources/payment.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/payment.html b/resources/payment.html index fa8f92a..cd3ff12 100644 --- a/resources/payment.html +++ b/resources/payment.html @@ -42,9 +42,11 @@

            Реквизиты оплаты

            сервиса, номер кошелька Yandex: 41001964807638

          • - Денежные переводы ВКонтакте (на карточку, Mastercard без комиссии, Visa 1%)

            + Денежные переводы ВКонтакте (внутри Росии, Mastercard без комиссии, Visa 1%)

          • -
          • Webmoney WMR: R335541240099, WMZ: Z354468526072

            +
          • Webmoney: WMR R335541240099, WMZ Z354468526072

            +
          • +
          • Qiwi: +7 921 855 0482

          • From 508cf0020d56d4030e6bf5ac0cbd9c124c6978ed Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sun, 11 Dec 2016 16:50:37 +0300 Subject: [PATCH 424/936] Update payment --- resources/mails/basejava_register_info.html | 2 +- resources/mails/basejava_reminder.html | 2 +- resources/mails/masterjava/masterjava_prepare.html | 2 +- resources/mails/topjava/topjava_10day.html | 2 +- resources/mails/topjava/topjava_early_price.html | 2 +- resources/mails/topjava/topjava_early_price2.html | 2 +- resources/mails/topjava/topjava_first_lesson.html | 2 +- resources/mails/topjava/topjava_last_chance.html | 2 +- resources/mails/topjava/topjava_tomorrow.html | 2 +- resources/mails/topjava/topjava_tomorrow2.html | 2 +- resources/mails/topjava_ad.html | 2 +- resources/mails/topjava_ad_repeat.html | 2 +- resources/mails/topjava_info.html | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/resources/mails/basejava_register_info.html b/resources/mails/basejava_register_info.html index 1ea645f..c9c967f 100644 --- a/resources/mails/basejava_register_info.html +++ b/resources/mails/basejava_register_info.html @@ -21,7 +21,7 @@

            Стоимость участия: 6900 руб. без проверки домашних заданий и 15900 руб. с проверкой.
            Как обычно участникам моих курсов - скидка.
            - Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать + Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать курс.

            diff --git a/resources/mails/basejava_reminder.html b/resources/mails/basejava_reminder.html index d5e74f4..d7ef63c 100644 --- a/resources/mails/basejava_reminder.html +++ b/resources/mails/basejava_reminder.html @@ -27,7 +27,7 @@

            Напомню, что нужно сделать до вебинара во

            Стоимость участия: 6900 руб. без проверки домашних заданий и 15900 руб. с проверкой.
            - Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать курс.
            + Добавляйтесь в skype: grigory.kislin, после этого можно оплачивать курс.
            В USD можно оплачивать по текущему курсу.

            diff --git a/resources/mails/masterjava/masterjava_prepare.html b/resources/mails/masterjava/masterjava_prepare.html index bfaad26..f3ee3dc 100644 --- a/resources/mails/masterjava/masterjava_prepare.html +++ b/resources/mails/masterjava/masterjava_prepare.html @@ -20,7 +20,7 @@ Предлагаю решения пока не публиковать (или меняйтесь в личке), а разберем их уже на втором уроке.

            - Можно (пока не обязательно, нужно будет перед 2м занятием) оплачивать участие: 7900 руб. без проверки ДЗ и 15000 руб. с проверкой + Можно (пока не обязательно, нужно будет перед 2м занятием) оплачивать участие: 7900 руб. без проверки ДЗ и 15000 руб. с проверкой (после оплаты отписывайтесь в skype grigory.kislin с вашим email). У кого будет проверка, сразу буду давать свои замечания по присылаемому коду.

            Буду держать в курсе обновлений, diff --git a/resources/mails/topjava/topjava_10day.html b/resources/mails/topjava/topjava_10day.html index 87c7007..8c3ea7e 100644 --- a/resources/mails/topjava/topjava_10day.html +++ b/resources/mails/topjava/topjava_10day.html @@ -34,7 +34,7 @@

            После оплаты объязательны вышли мне в skype:

          • Для всех: бесплатное участие в следующий выпусках проекта.
          • -

            Способы оплаты

            +

            Способы оплаты

            Вопросы по проекту
            Ресурсы для подготовки
            Отзывы реальных участиников предыдущих выпусков
            diff --git a/resources/mails/topjava/topjava_early_price.html b/resources/mails/topjava/topjava_early_price.html index 9d0adfe..8f874e7 100644 --- a/resources/mails/topjava/topjava_early_price.html +++ b/resources/mails/topjava/topjava_early_price.html @@ -17,7 +17,7 @@
          • 7600 руб. - участие в проекте и группе slack, помощь по проекту
          • 15500 руб. - добавляется проверка домашних заданий и ревью выпускного проекта
          • для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.
          • -
          • способы оплаты
          • +
          • способы оплаты
          • курс рубля
          • отзывы по проекту реальных участников
          • diff --git a/resources/mails/topjava/topjava_early_price2.html b/resources/mails/topjava/topjava_early_price2.html index 9e1439e..2c31dfc 100644 --- a/resources/mails/topjava/topjava_early_price2.html +++ b/resources/mails/topjava/topjava_early_price2.html @@ -14,7 +14,7 @@
          • 7600 руб. - участие в проекте и группе slack, помощь по проекту
          • 15500 руб. - добавляется проверка домашних заданий и ревью выпускного проекта
          • для всех: бесплатное (или с доплатой за проверку ДЗ) участие в следующий выпусках проекта.
          • -
          • способы оплаты
          • +
          • способы оплаты
          • курс рубля
          • отзывы по проекту реальных участников
          • diff --git a/resources/mails/topjava/topjava_first_lesson.html b/resources/mails/topjava/topjava_first_lesson.html index 3309f79..6e0cfaf 100644 --- a/resources/mails/topjava/topjava_first_lesson.html +++ b/resources/mails/topjava/topjava_first_lesson.html @@ -22,7 +22,7 @@
          • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
          • Скидка для участников других проектов: 700 руб. (без проверки ДЗ) и 1500 руб (с проверкой). -
          • Способы оплаты
          • +
          • Способы оплаты
          • Курс рубля

          • Вопросы по проекту
          • Ресурсы для подготовки
          • diff --git a/resources/mails/topjava/topjava_last_chance.html b/resources/mails/topjava/topjava_last_chance.html index 4ff2c98..a1d791b 100644 --- a/resources/mails/topjava/topjava_last_chance.html +++ b/resources/mails/topjava/topjava_last_chance.html @@ -47,7 +47,7 @@

            Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin или по почте.

            -

            Если подписки нет можно оплачивать и ответить на это письмо куда была оплата (или в skype grigory.kislin): я вышлю +

            Если подписки нет можно оплачивать и ответить на это письмо куда была оплата (или в skype grigory.kislin): я вышлю письмо участника проекта и дам доступ ко всем ресурсам.


            diff --git a/resources/mails/topjava/topjava_tomorrow.html b/resources/mails/topjava/topjava_tomorrow.html index a409205..25e0c39 100644 --- a/resources/mails/topjava/topjava_tomorrow.html +++ b/resources/mails/topjava/topjava_tomorrow.html @@ -38,7 +38,7 @@

            Напомню, что ЗАВТРА, 01.12 старт проекта Java

            Если у тебя есть подписка JavaRush "реальный проект/стажировка", свяжись со мной отдельно в скайпе: grigory.kislin или по почте.

            -

            Если подписки нет можно оплачивать и ответить на это письмо куда была оплата (или в skype grigory.kislin): я вышлю +

            Если подписки нет можно оплачивать и ответить на это письмо куда была оплата (или в skype grigory.kislin): я вышлю письмо участника для включения в группу слак.


            Поторопись, если хочешь получить реальную возможность устроится на позицию middle разработчика!

            diff --git a/resources/mails/topjava/topjava_tomorrow2.html b/resources/mails/topjava/topjava_tomorrow2.html index 11eb71e..0ec8992 100644 --- a/resources/mails/topjava/topjava_tomorrow2.html +++ b/resources/mails/topjava/topjava_tomorrow2.html @@ -28,7 +28,7 @@

            Завтра, 08.09, рассылка первого занятия прое устройстве на работу).
          • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
          • -
          • Способы оплаты
          • +
          • Способы оплаты
          • Курс рубля
          • Вопросы по проекту
          • Ресурсы для подготовки
          • diff --git a/resources/mails/topjava_ad.html b/resources/mails/topjava_ad.html index bf559c9..3323910 100644 --- a/resources/mails/topjava_ad.html +++ b/resources/mails/topjava_ad.html @@ -38,7 +38,7 @@

            Требования к участникам:

          • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
          • Если Вы уже участвовали на моих курсах, то есть скидка: 700 руб. (без проверки ДЗ) и 1500 руб (с проверкой). -
          • Способы оплаты
          • +
          • Способы оплаты
          • Вопросы по проекту
          • Ресурсы для подготовки
          • Курс рубля
          • diff --git a/resources/mails/topjava_ad_repeat.html b/resources/mails/topjava_ad_repeat.html index de82a62..0f2f8d8 100644 --- a/resources/mails/topjava_ad_repeat.html +++ b/resources/mails/topjava_ad_repeat.html @@ -36,7 +36,7 @@

            Требования к участникам:

          • Для всех: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта.
          • Если Вы уже участвовали на моих курсах, то есть скидка: 700 руб. (без проверки ДЗ) и 1500 руб (с проверкой). -
          • Способы оплаты
          • +
          • Способы оплаты
          • Вопросы по проекту
          • Ресурсы для подготовки
          • Курс рубля
          • diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index ab05160..8a6a7b0 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -124,7 +124,7 @@

            На проекте

          • Для всех: бесплатное участие в следующий выпусках проекта.

          • Скидка на другие проекты: 700 руб. (без ДЗ) и 1500 руб (с ДЗ).

          • Добавляйся в skype: grigory.kislin с пометкой topjava.

          • -
          • Способы оплаты (объязательно перед оплатой свяжитесь со мной)
          • +
          • Способы оплаты (объязательно перед оплатой свяжитесь со мной)
          • Вопросы по проекту
          • Ресурсы для подготовки
          • From 0ff3e9fabc7284c96e239dcbbdb0eaac4e0907e1 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 12 Dec 2016 13:17:39 +0300 Subject: [PATCH 425/936] Small fix --- src/main/java/ru/javaops/config/AppConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/javaops/config/AppConfig.java b/src/main/java/ru/javaops/config/AppConfig.java index 765752e..ecb81a0 100644 --- a/src/main/java/ru/javaops/config/AppConfig.java +++ b/src/main/java/ru/javaops/config/AppConfig.java @@ -50,7 +50,7 @@ private void refreshSqlProps() { try (Reader reader = Files.newBufferedReader(path)) { SQL_PROPS.load(reader); } catch (IOException e) { - throw new IllegalStateException(path.toAbsolutePath().toString() + " is not found"); + throw new IllegalStateException(path.toAbsolutePath().toString() + " load exception", e); } } } From b2b370f321b288c6045f689128f68e4b28843cf3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 12 Dec 2016 21:17:30 +0300 Subject: [PATCH 426/936] Add masterjava late --- .../mails/masterjava/late_participate.html | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 resources/mails/masterjava/late_participate.html diff --git a/resources/mails/masterjava/late_participate.html b/resources/mails/masterjava/late_participate.html new file mode 100644 index 0000000..ed2f7af --- /dev/null +++ b/resources/mails/masterjava/late_participate.html @@ -0,0 +1,29 @@ + + + + + + Участие в проекте 'Многопоточность. XML. Веб сервисы.' + +

            + Здравствуй! +

            +Поздравляю с участием в проекте 'Многопоточность. XML. Веб сервисы.'! +

            +Проект идет живыми вебинарами в Adobe Connect (диагностика + подключения) с одновременной записью. Удобно, что участники вебинара могут общаться голосом и в чате и + запись доступна сразу после вебинара (записи редактирую и выкладываю в Google Doc, но не сразу).
            + Занятия начинаются в 20.00 GMT+3, заренее я делаю пост в группе slack и рассылку по почте. + Периодичность получаются ~ раз в две недели. +

            +Вступительное занятие
            +Остальные уроки +

            Настрой свой проект, чтобы забирать мои + изменения и пушить в свой репозиторий (по ходу вебинара можно будет забирать по Ctrl+T мои изменения). +

            + +До встречи на проекте, +

            +

            + \ No newline at end of file From c9db37b96ab13efbf52e1c813b4ff4383350e174 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 12 Dec 2016 21:19:32 +0300 Subject: [PATCH 427/936] Update masterjava late --- resources/mails/masterjava/late_participate.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava/late_participate.html b/resources/mails/masterjava/late_participate.html index ed2f7af..76acc74 100644 --- a/resources/mails/masterjava/late_participate.html +++ b/resources/mails/masterjava/late_participate.html @@ -8,7 +8,7 @@

            Здравствуй!

            -Поздравляю с участием в проекте 'Многопоточность. XML. Веб сервисы.'! +Поздравляю с участием в проекте Многопоточность. XML. Веб сервисы.!

            Проект идет живыми вебинарами в Adobe Connect (диагностика From 5f191c60661ec37f70a0264b76caac262b87157d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 12 Dec 2016 21:34:33 +0300 Subject: [PATCH 428/936] Update sql conf --- src/main/java/ru/javaops/config/AppConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ru/javaops/config/AppConfig.java b/src/main/java/ru/javaops/config/AppConfig.java index ecb81a0..3f547a3 100644 --- a/src/main/java/ru/javaops/config/AppConfig.java +++ b/src/main/java/ru/javaops/config/AppConfig.java @@ -48,6 +48,7 @@ public void configeJackson(ObjectMapper objectMapper) { private void refreshSqlProps() { Path path = Paths.get("./config/sql.properties"); try (Reader reader = Files.newBufferedReader(path)) { + SQL_PROPS.clear(); SQL_PROPS.load(reader); } catch (IOException e) { throw new IllegalStateException(path.toAbsolutePath().toString() + " load exception", e); From edc31121d6f1c5c4e5606bef264f93e35321af1d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 12 Dec 2016 23:52:32 +0300 Subject: [PATCH 429/936] Add lesson8_move --- resources/mails/masterjava/lesson8_move.html | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 resources/mails/masterjava/lesson8_move.html diff --git a/resources/mails/masterjava/lesson8_move.html b/resources/mails/masterjava/lesson8_move.html new file mode 100644 index 0000000..9f2525f --- /dev/null +++ b/resources/mails/masterjava/lesson8_move.html @@ -0,0 +1,22 @@ + + + + + + 8й урок Masterjava в понедельник, 19.12, 20.00 (GMT+3) + +

            + Здравствуй!
            +

            +Выложил видео HW6 7го урока
            +Завтра буду обрабатывать видео самого урока, занятия не получится:( +

            8-е занятие Masterjava будет в понедельник, 19.12 в 20.00 (GMT+3).

            +Ссылка на комнату вебинара пришлю в понедельник. +
            +Принимаю ваши ДЗ (у кого есть проверка).
            +В качестве компенсации по ссылке можно получить купон на бесплатную личную лицензию IntelliJ IDEA на полгода (в письме придет инструкция). +
            +До встречи в понедельник, 19.12 +

            +

            + \ No newline at end of file From 79a4e46e78d5799de16ff779ed814a1aa9f5a9c4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 12 Dec 2016 23:55:08 +0300 Subject: [PATCH 430/936] Add lesson8_move --- resources/mails/masterjava/{ => doc}/lesson8_move.html | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename resources/mails/masterjava/{ => doc}/lesson8_move.html (100%) diff --git a/resources/mails/masterjava/lesson8_move.html b/resources/mails/masterjava/doc/lesson8_move.html similarity index 100% rename from resources/mails/masterjava/lesson8_move.html rename to resources/mails/masterjava/doc/lesson8_move.html From c07ae0e7a8b7549a28ce25cc06b2335fd0ee3173 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 12 Dec 2016 23:55:55 +0300 Subject: [PATCH 431/936] Add lesson8_move --- resources/mails/masterjava/doc/lesson8_move.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/mails/masterjava/doc/lesson8_move.html b/resources/mails/masterjava/doc/lesson8_move.html index 9f2525f..6c49b91 100644 --- a/resources/mails/masterjava/doc/lesson8_move.html +++ b/resources/mails/masterjava/doc/lesson8_move.html @@ -12,8 +12,8 @@ Завтра буду обрабатывать видео самого урока, занятия не получится:(

            8-е занятие Masterjava будет в понедельник, 19.12 в 20.00 (GMT+3).

            Ссылка на комнату вебинара пришлю в понедельник. -
            -Принимаю ваши ДЗ (у кого есть проверка).
            +
            +Принимаю ваши ДЗ (у кого есть проверка).
            В качестве компенсации по ссылке можно получить купон на бесплатную личную лицензию IntelliJ IDEA на полгода (в письме придет инструкция).
            До встречи в понедельник, 19.12 From f31c5408214eda6c08ee0560ba8d1e5c45d4eec4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 12 Dec 2016 23:56:55 +0300 Subject: [PATCH 432/936] Add lesson8_move --- resources/mails/masterjava/doc/lesson8_move.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava/doc/lesson8_move.html b/resources/mails/masterjava/doc/lesson8_move.html index 6c49b91..ae8f347 100644 --- a/resources/mails/masterjava/doc/lesson8_move.html +++ b/resources/mails/masterjava/doc/lesson8_move.html @@ -14,7 +14,7 @@

            8-е занятие Masterjava будет в понедельник, 19.12 Ссылка на комнату вебинара пришлю в понедельник.
            Принимаю ваши ДЗ (у кого есть проверка).
            -В качестве компенсации по ссылке можно получить купон на бесплатную личную лицензию IntelliJ IDEA на полгода (в письме придет инструкция). +По ссылке можно получить купон на бесплатную личную лицензию IntelliJ IDEA на полгода (в письме придет инструкция).
            До встречи в понедельник, 19.12

            From be46994937af3c318533c9ab7acd2a52b6670c70 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 12 Dec 2016 23:59:10 +0300 Subject: [PATCH 433/936] Update lesson8_move --- resources/mails/masterjava/doc/lesson8_move.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/mails/masterjava/doc/lesson8_move.html b/resources/mails/masterjava/doc/lesson8_move.html index ae8f347..11011cf 100644 --- a/resources/mails/masterjava/doc/lesson8_move.html +++ b/resources/mails/masterjava/doc/lesson8_move.html @@ -13,9 +13,10 @@

            8-е занятие Masterjava будет в понедельник, 19.12 в 20.00 (GMT+3).

            Ссылка на комнату вебинара пришлю в понедельник.
            -Принимаю ваши ДЗ (у кого есть проверка).
            -По ссылке можно получить купон на бесплатную личную лицензию IntelliJ IDEA на полгода (в письме придет инструкция). -
            +Принимаю ваши ДЗ (у кого есть проверка). +

            +И еще хорошая новость: JetBrains дала мне купоны на бесплатную личную лицензию IntelliJ IDEA на полгода, можно получить по ссылке (в письме придет инструкция). +

            До встречи в понедельник, 19.12

            From e621779f0c75b4c1eba51e3a5bb9d37fd65c51c0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 15 Dec 2016 15:24:52 +0300 Subject: [PATCH 434/936] Update lesson2 --- resources/mails/topjava/lesson/lesson02.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson02.html b/resources/mails/topjava/lesson/lesson02.html index a85a6ba..d44d9ba 100644 --- a/resources/mails/topjava/lesson/lesson02.html +++ b/resources/mails/topjava/lesson/lesson02.html @@ -8,6 +8,7 @@ Здравствуй firstName!

            Готово второе достаточно сложное занятие нашего проекта "Каркас приложения, добавление Spring".
            +Перед сборкой проекта (или запуском Tomcat) сделайте в окошке Maven clean, в браузере на страничках, где работает неверно, очистить кэш (Ctrl+F5 в хроме).
            После выполнения ДЗ объязательно сверься с подсказками.

            Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и Patch не накатывается (предлагает merge)".

            - Домашнее задание (у кого есть проверка) желательно присылать до вечера 20.09
            + Обсуждение домашнего задания (HW2) в ветке #hw2
            + + У кого есть проверка ДЗ желательно присылать до вечера 20.12
            Удачи в освоении материалов и выполнении этого важного задания!

            From 9a3ffeef6e1a1f3527d68d70b6c4e6290a13a67c Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 15 Dec 2016 15:31:11 +0300 Subject: [PATCH 435/936] Update lesson2 --- resources/mails/topjava/lesson/lesson02.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson02.html b/resources/mails/topjava/lesson/lesson02.html index d44d9ba..81f8402 100644 --- a/resources/mails/topjava/lesson/lesson02.html +++ b/resources/mails/topjava/lesson/lesson02.html @@ -8,7 +8,7 @@ Здравствуй firstName!

            Готово второе достаточно сложное занятие нашего проекта "Каркас приложения, добавление Spring".
            -Перед сборкой проекта (или запуском Tomcat) сделайте в окошке Maven clean, в браузере на страничках, где работает неверно, очистить кэш (Ctrl+F5 в хроме).
            +Перед сборкой проекта (или запуском Tomcat) сделай в окошке Maven clean, если страничка в браузере работает неверно, очисти кэш (Ctrl+F5 в хроме).
            После выполнения ДЗ объязательно сверься с подсказками.

            Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и Date: Thu, 22 Dec 2016 19:55:44 +0300 Subject: [PATCH 436/936] Update lesson3 --- resources/mails/topjava/lesson/lesson03.html | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson03.html b/resources/mails/topjava/lesson/lesson03.html index c07a17d..d99dad4 100644 --- a/resources/mails/topjava/lesson/lesson03.html +++ b/resources/mails/topjava/lesson/lesson03.html @@ -13,21 +13,11 @@

            Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
            - Обсуждение урока в slack #lesson03, HW3 в #hw3. -

            -

            Приглашаю тебя в общую группу Slack Java Online Projects, где мы все общаемся на любые темы IT (помощь с Java, отзывы о работах, обсуждение тестовых заданий, - вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) - По каждой теме сделан свой канал. Проверь свои контактные - данные. - Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут - увидеть твой город и skype в списке, а ты сможешь найти там разработчиков из своего города. - После сохранения формы на почту должно прийти приглашение в группу Slack и откроется ссылка на список - участников, отсортированный по городам. + Обсуждение урока и HW3 в канале slack #hw3.

            - Домашнее задание (у кого есть проверка) желательно присылать до вечера 27.09.
            + После выполения ДЗ обязательно проверься по пунктам. + Домашнее задание (у кого есть проверка) желательно присылать до вечера 27.12.

            From adf1cb749abe866ebe76e224b6802ad8bd9e3290 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Dec 2016 19:59:28 +0300 Subject: [PATCH 437/936] Update lesson3 --- resources/mails/topjava/lesson/lesson03.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson03.html b/resources/mails/topjava/lesson/lesson03.html index d99dad4..713123c 100644 --- a/resources/mails/topjava/lesson/lesson03.html +++ b/resources/mails/topjava/lesson/lesson03.html @@ -9,7 +9,7 @@

            Третье занятие нашего проекта: JUnit тестирование и начало работы с DB.
            -Если с SQL и RDBMS не работали- прочтите основы по ссылкам. +Если с SQL и RDBMS опыта нет, прочти основы по ссылкам урока.

            Перед началом урока код в ветке master твоего проекта должна быть в том же состоянии, что и в моей ветка master.
            From 566bb5c4e5289535c8a0187d5324ecf688090014 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Dec 2016 20:00:54 +0300 Subject: [PATCH 438/936] Update lesson3 --- resources/mails/topjava/lesson/lesson03.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson03.html b/resources/mails/topjava/lesson/lesson03.html index 713123c..9f37b87 100644 --- a/resources/mails/topjava/lesson/lesson03.html +++ b/resources/mails/topjava/lesson/lesson03.html @@ -16,7 +16,7 @@ Обсуждение урока и HW3 в канале slack #hw3.

            - После выполения ДЗ обязательно проверься по пунктам. + После выполения ДЗ обязательно проверься по пунктам.
            Домашнее задание (у кого есть проверка) желательно присылать до вечера 27.12.

            From f4c3a90daa13a6aa975da7b69a3cf2b131f4e261 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Dec 2016 22:25:24 +0300 Subject: [PATCH 439/936] Update index --- resources/view/index.html | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/resources/view/index.html b/resources/view/index.html index ccb9d44..5655cfa 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -114,7 +114,7 @@

            Участие в разработке Spring/JPA Enterprise приложе

            Наши истории (делимся опытом и успехом)


            Стажировка на Java Enterprise:

            -

            Первое занятие 08.12

            +

            Первое занятие было 08.12. Следующий набор будет в марте 2017г.

            Maven, Spring, Security, JPA(Hibernate), REST(Jackson), Bootstrap, jQuery + plugins. Разработка полнофункционального Spring / JPA приложения c авторизацией и правами доступа на основе @@ -138,7 +138,19 @@

            Техническое собеседование Java разработчи

            Тестовое интервью

            Core Java 8, OOP, JMM/Concurrency, Servlet/JSP, JPA, Spring MVC, REST, SQL, Maven

            - +

            + +
            + + + + +
            + + +
            + +
        From 66d8301a8cd88a933782e48a91e1e7d7f37ff835 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 22 Dec 2016 22:30:20 +0300 Subject: [PATCH 440/936] Update index --- resources/view/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/view/index.html b/resources/view/index.html index 5655cfa..ffaada6 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -141,7 +141,7 @@

        Тестовое интервью

        - - +
        +
        From 2db9208901f76c19d143f0b5b19c41eff38c89e6 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 29 Dec 2016 19:51:24 +0300 Subject: [PATCH 441/936] Update lesson04 --- resources/mails/topjava/lesson/lesson04.html | 43 +++++++++++++------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index 9d2b65a..8daeee7 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -7,28 +7,43 @@

        Здравствуй firstName!

        - Четвертое занятие нашего проекта: популирование - данных через Spring, JPA/ Hibernate, HSQLDB.
        - В патче 4_0_2_refactoring я сделал правку:
        -
        46: items="${mealList}" -> items="${meals}"
        - Если ты уже накатил патч, просто поправьте у себя и вчекинь в master. -

        -Материалов по JPA огромное количество. Чтобы не утонуть - не надо пытаться освоить все сразу. Пока достаточно того, что -нужно для выполнения HW4.

        - Обсуждение урока в slack #lesson04, домашнего задания в slack #hw4 -

        -

        - Домашнее задание (у кого есть проверка) желательно присылать до вечера 04.10.
        + Четвертое занятие нашего проекта: + популирование данных через Spring, JPA/ + Hibernate, HSQLDB.
        + Материалов по JPA огромное количество. Чтобы не утонуть - не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW4.
        + Обсуждение урока и домашнего задания в slack #hw4

        После выполнения этого достаточно несложного HW4 можно приступать к выполнению выпускного - проекта + проекта.

        -Удачи в освоении материалов и выполнении задания! +

        + В следующий четверг занятия не будет, проведем вместо него вебинар (примерно на час, запись будет) по вашим вопросам (задавайте их в канал #general): +

        05.12 в 16.00 (GMT+3) нужно будет зайти по ссылке "Собеседование. Разработка ПО. Вопросы"

        +Я скорректировал расписание, выпускной проект сдавать на ревью (у кого есть проверка) после окончания проекта 23.02 + 1 месяц. +

        +

        Нашу группу Slack topjava9 я удалю после проверки выпускных проектов, поэтому приглашаю тебя уже сейчас в общую группу Slack Java Online Projects, где мы все общаемся на любые темы IT (помощь с Java, + отзывы о работах, обсуждение тестовых заданий, + вакансии, цены на рынке труда, IT события, интересные видео по теме и пр.) + По каждой теме сделан свой канал. Проверь свои контактные + данные. + Галочка 'размещение своих данных в закрытой статистике группы' говорит о том, что участники проектов смогут + увидеть твой город и skype в списке, а ты сможешь найти там разработчиков из своего города. + После сохранения формы на почту должно прийти приглашение в группу Slack и откроется ссылка на список + участников, отсортированный по городам. +

        +

        + Домашнее задание HW4 (у кого есть проверка) присылать до вечера 10.01 (вторник перед 5-м занятием).
        +

        +Удачи в освоении материалов и выполнении задания, жду на вебинаре и конечно же +

        поздравляю с наступающим Новым Годом!

        +Желаю, если ты еще в поиске работы, найти работу своей мечты и стать полноценным Java разработчиком, уже с комерческим опытом:)
        +Если уже работаешь - то стать сиьором и выше:)

        From a965bf488e6fb2b3c0ad2b113dcce8e046a51589 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 29 Dec 2016 19:57:14 +0300 Subject: [PATCH 442/936] Update lesson04 --- resources/mails/topjava/lesson/lesson02.html | 3 +-- resources/mails/topjava/lesson/lesson04.html | 7 +++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson02.html b/resources/mails/topjava/lesson/lesson02.html index 81f8402..71f270d 100644 --- a/resources/mails/topjava/lesson/lesson02.html +++ b/resources/mails/topjava/lesson/lesson02.html @@ -22,7 +22,6 @@ У кого есть проверка ДЗ желательно присылать до вечера 20.12
        Удачи в освоении материалов и выполнении этого важного задания!

        -

        -

        +

        \ No newline at end of file diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index 8daeee7..409f3ca 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -11,7 +11,7 @@ Четвертое занятие нашего проекта: популирование данных через Spring, JPA/ Hibernate, HSQLDB.
        - Материалов по JPA огромное количество. Чтобы не утонуть - не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW4.
        + Материалов по JPA огромное количество. Чтобы не утонуть - не надо пытаться освоить все сразу. Пока достаточно того, что нужно для выполнения HW4. Обсуждение урока и домашнего задания в slack #hw4

        @@ -42,9 +42,8 @@

        05.12 в 16.00 (GMT+3) нужно будет зайти по ссылке "<

        Удачи в освоении материалов и выполнении задания, жду на вебинаре и конечно же

        поздравляю с наступающим Новым Годом!

        -Желаю, если ты еще в поиске работы, найти работу своей мечты и стать полноценным Java разработчиком, уже с комерческим опытом:)
        +Желаю, если ты еще в поиске работы, найти работу своей мечты и стать полноценным Java разработчиком, уже с комерческим опытом:) Если уже работаешь - то стать сиьором и выше:) -

        -

        +

        \ No newline at end of file From 2197771e8137e3a3be63407239b81fba1d6df933 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 29 Dec 2016 19:59:30 +0300 Subject: [PATCH 443/936] Update lesson04 --- resources/mails/topjava/lesson/lesson04.html | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/mails/topjava/lesson/lesson04.html b/resources/mails/topjava/lesson/lesson04.html index 409f3ca..cb7b2c9 100644 --- a/resources/mails/topjava/lesson/lesson04.html +++ b/resources/mails/topjava/lesson/lesson04.html @@ -45,5 +45,6 @@

        поздравляю с наступающим Новым Годом!

        Желаю, если ты еще в поиске работы, найти работу своей мечты и стать полноценным Java разработчиком, уже с комерческим опытом:) Если уже работаешь - то стать сиьором и выше:)

        +

        \ No newline at end of file From 89a797e5a69c8c70c3ee5c85426a9639ecb7cec6 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 31 Dec 2016 18:25:46 +0300 Subject: [PATCH 444/936] Update masterjava --- resources/mails/masterjava_register.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava_register.html b/resources/mails/masterjava_register.html index 836c8b4..73966a7 100644 --- a/resources/mails/masterjava_register.html +++ b/resources/mails/masterjava_register.html @@ -9,7 +9,7 @@ Здравствуй firstName!

        - Спасибо за регистрацию на проекте Многопоточность. Веб сервисы.
        + Спасибо за регистрацию на проекте Многомодульный maven. Многопоточность. XML. Веб сервисы. Удаленное взаимодействие.

        Проект идет. Следующий выпуск планируется в феврале 2017г., дата старта и программа проекта будут уточняться и рассылаться всем From 8c9e3b84382afab875042696672398aee6064f54 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 31 Dec 2016 18:28:48 +0300 Subject: [PATCH 445/936] Update masterjava --- resources/mails/masterjava_register.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/masterjava_register.html b/resources/mails/masterjava_register.html index 73966a7..057a495 100644 --- a/resources/mails/masterjava_register.html +++ b/resources/mails/masterjava_register.html @@ -20,7 +20,7 @@ href="https://github.com/JavaOPs/masterjava#-Вступительное-задание">вступительное задание.

        - Следите за рассылкой и до встречи на проекте!
        + Следи за рассылкой и до встречи на проекте!

        From 9888354c9d64ae40e02d4ebe741ed9895e8efd25 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 9 Jan 2017 00:54:42 +0300 Subject: [PATCH 446/936] Add story8 --- resources/story.html | 3 + resources/story/story8.html | 197 ++++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 resources/story/story8.html diff --git a/resources/story.html b/resources/story.html index 6d5bb33..3b94931 100644 --- a/resources/story.html +++ b/resources/story.html @@ -21,6 +21,9 @@

        Наши истории


        +

        История трудоустройства.

        + +

        ИТ-область – это эскалатор, движущийся вниз. Если вы хотите развиваться, то нужно постоянно двигаться вверх.

        diff --git a/resources/story/story8.html b/resources/story/story8.html new file mode 100644 index 0000000..0e49a77 --- /dev/null +++ b/resources/story/story8.html @@ -0,0 +1,197 @@ + + + + + + + + + Истории + + + + + + + + +
        + Мне сейчас 30 лет и я работаю программистом уже четвертый месяц.
        + Моя история о трудоустройстве: +

        Как я не стал программистом

        +

        + Учась в школе, я хотел пойти учиться на программиста, но к концу 11-го класса у меня в аттeстате было + половина троек. Я хорошо разбирался и любил только математику и физику, остальные предметы меня раздражали. + Завуч мне тогда намекнула, что не надо мне лезть в программисты, а выбрать что-то попроще. Я плохо тогда + разбирался во всем, подал документы только на одну специальность (хотя можно было на несколько сразу), только + потом я узнал, что с моими 14 баллами из 15 максимальных (физика - 5, математика - 5, русский - 4), я мог бы + поступить на факультет, который готовил программистов. Но я поступил на специальность - ракетные двигатели. + Отучился 4 года и бросил учебу, хотя учился хорошо (на 4 и 5). +

        +

        Решение стать программистом

        +

        + После этого где только я ни работал. Последнее место работы было в фотосалоне, я был что-то типа техподдержки + (ставил проги, обслуживал принтеры и много чего другого) и помимо этого обычным продавцом-фотографом, там же я + сделал 1-ый сайт для компании, тогда он был на joomla, потом был переведен на wordpress. Я понимал что это очень + далеко от программирования, но это напомнило о моей старой мечте. В 28 лет в феврале я твердо решил выучится и + стать программистом. Тогда я решил поступить заочно на факультет ИВТ(информатики и вычислительной техники), я + сходил в универ и узнал, что с моим дипломом о неполном высшем образовании, мне нужно будет сдать только + русский, и порог прохождения низкий, все таки для платников. Я стал копить деньги на учебу. Тут же я решил + выбрать язык программирования, который хотел бы выучить. Я выбрал Java, и ни капельки не пожалел. +

        +

        Самостоятельное обучение

        +

        + Джаву я начал учить по сайту интуит, но это было настолько скучно, что бросил. Стал читать книгу "Философия + Джавы" Брюса Эккеля, книга отличная всем советую. Смотрел видео уроки на ютубе(советую кстати лекции у Головоча, + мне понравились), и не только по джава, но и по операционным системам, базам данным, линуксу и др. Когда было + лень что-то учить я слушал подкасты (Радио-Т, Разбор Полетов, DevZen), особенно люблю Разбор полетов, там одни + джависты. Притом я 80% того, что говорили в подкастах, вообще не понимал. Мне мир программистов казался чем-то + прекрасным и непонятным. Я хотел попасть в этот мир, и слушая такие подкасты я получал огромное удовольствие, + так как словно окунался в этот мир. Я пытался понять о чем они говорят, иногда заглядывая в википедию, а в + основном просто слушая (помню те незнакомые слова - Spring, JUnit, Casandra, интеграционные тесты и много + других). Сейчас я почти все понимаю, о чем беседуют в этих подкастах.
        + Как-то с начальством поделился, что собираюсь выучиться на программиста. На что начальница мне сказала, + тебе 28 лет, сейчас школьники в компах лучше разбираются, зачем туда лезть. В этот раз я проигнорировал совет + "знающего" человека.
        + Пришла середина лета, настало время для того, чтоб поступать в вуз. И тут оказалось поступить с одним экзаменом + можно только если у тебя нормальный диплом, а с моим о неполном высшем, мне нужно сдавать все 3 экзамена и я + это время уже упустил в этом году. Я плюнул на них и решил купить какой-нибудь курс, как раз тогда был конец + августа 2015, и на джавараш были скидки. Я взял курс с Реальным проектом (это была как раз стажировка от + Григория Кислина). Вообщем мне нужно было пройти минумум 30 уровней из 40 и потом стажировку на проекте. Кстати + за полгода в которые я самостоятельно изучал джаву, я продвинулся совсем немного. Я не знал что мне нужно + конкретно учить, да и надеялся поступить в вуз и идти по их программе. +

        +

        Обучение на онлайн курсах

        +

        + До 30 уровня я дошел примерно за 4 месяца, при этом еще и ленился. Кроме джавараш я еще смотрел онлайн курс Головоча + (единственный видеокурс на ютубе, который я досмотрел до конца). Был январь 2016 года, как раз шел набор на + стажировку. Но нужно было сдать тестовый проект. У меня не хватало времени, и я решил - не буду торопиться, пойду на + стажировку в мае. Так же в январе я ушел с должности техподдержки в своей компании, и остался просто + продавцом-фотографом. Мне нужно было больше времени на учебу.
        + К маю я сделал тестовый проект, и был зачислен на стажировку. Я был безумно рад этому и с нетерпением ждал начала + учебы. Кстати замечу, в декабре-январе я еще покупал небольшой курс, где мы делали небольшое веб приложение. + Благодаря этому курсу, я и написал свое тестовое задание. Переход от простых задачек джавараш к реальным проектам, + это как с арифметики перейти к высшей математике. +

        +

        Стажировка Григория Кислина

        +

        + Было тяжело. Саму джаву я знал хорошо, спасибо джавараш. Но работа с фреймворками, логирование, тестирование, мавен, + томкат. Это было нечто запредельным. Я старался изучать все что давали в уроках. Но быстро начал отставать. Я уже + перестал делать домашку, до того как Григорий выложит решение. Мне было важно хотя бы понять, что тут вообще + происходит. Я делал задания параллельно смотря видео с решением. И потихоньку начинал понимать. Кроме этого у меня + тогда уже стоял линукс, и мне еще приходилось мучиться настраивая базу данных и другие вещи. Но на это я шел + сознательно.
        + В итоге когда закончилась стажировка (12 уроков), я закончил только 9 уроков. И то я понимал, что самостоятельно + не смогу сделать такой же проект, не подсматривая в учебные материалы. Я начал готовиться к собеседованию, заучиваю + основы джавы. У меня был план 10 сентября начать искать работу (выложить резюме в открытый доступ). Подготовил + резюме, дал Григорию на проверку. Он мне посоветовал стажировку указать как опыт работы, что я и сделал. В итоге в + моем резюме теперь было написано, что я программист с мая 2016 года. Как я знал тогда из различных источников, что в + начале нужно главное устроиться, куда угодно, а потом время будет работать на тебя, чем больше стаж тем ты более + востребован на рынке труда.
        + В конце лета 2016 как раз была анонсирована стажировка Григория по многопоточности. Я записался на нее тоже, не + жалея денег на это. Я хотел стать профессионалом в джава и я уже тогда начал понимать насколько много дают такие + стажировки от хорошего специалиста. И, помимо этого, эта стажировка давет мне дополнительный стаж в резюме. +

        +

        Трудоустройство

        +

        + Итак, наступило 10 сентября (это была суббота) и я выложил свое резюме на hh.ru, решил начать с этого. В моем резюме + не было ничего особенного, указал учебу в универе 4 года, это было правдой, хотя я и не закончил ее. Указал + последние 2 места работы, 1-е - сисадмин в сети фотосалонов, где я до сих пор работал, а 2-е - программист в + Online Java Project. Указал свои скилы, и свой домашний проект (параллельно стажировке начал делать еще летом). И + какое было мое удивление, что 12 сентября (в понедельник) я получил отклик на вакансию. Я созвонился с кадровиком, + она меня спросила, почему я решил поменять место работы, я честно ответил, что это стажировка, и что я решил сменить + свою область деятельности. Вообщем отвечал честно, волновался (все таки первый раз на программиста устраиваюсь). На + следующий день мне пришло письмо с приглашением на собеседование. Мой непосредственный начальник, который меня + должен был собеседовать, немного задержался, я общался сначала с другим. Когда пришел тот, кто меня должен был + собеседовать, он даже вроде ничего не спрашивал, просто сидел (компания куда я устраивался было достаточно крутая), + тогда я сам начал рассказывать о том что знаю и умею, и весь разговор был о стажировке. Потом я стал спрашивать о + том что делают у них, какую систему сборки используют, какие БД, есть ли команда тестировщиков или разработчики сами + тесты пишут и т.п. Мне показалось, что я произвел достаточно хорошее впечатление, так как достаточно суровый вначале + начальник стал более дружелюбным. Он сказал что вышлет тестовое задание и мы попрощались.
        + Когда я приехал домой тестовое задание уже было в моей почте. Надо было скачать их тестовый проект с гитхаба, + доработать сущности и один метод, плюс добавить тестовые данные. Когда я скачал и открыл проект я был в шоке. Такого + я еще не видел вообще. Это был многомодульный мавен проект, в котором классы сущностей и интерфейсы генерировались + из специальных файлов. Я был в шоке. Я даже не мог запустить его на томкате. Где то 12 часов я пытался разобраться + в нем и запустить его, настраивая окружение и др. Была уже ночь, пока я пытался запустить проект, я немного + разобрался в нем. Но голова уже не работала и я лег спать. На следующий день, я плюнул на попытки запустить проект, + сделал задание, как считал правильным, даже не сумев проверить. Написал ответ, в котором описал то что не смог + запустить проект, описал почему не смог, сделал некоторые предположения, описал эксепшены которые вываливались при + попытке собрать проект и в конце кинул ссылку на коммит с моим решением тестового задания. Я ни на что не надеялся, + так как думал что провалил тест. Но через пару часов, мне пришел ответ, где написали что я успешно прошел испытания + и если Служба безопасности даст добро, то они меня возьмут. Я был безумно счастлив, тем более что оклад, который они + мне предложили, даже на испытательном сроке был больше, чем я вообще ожидал. Итого не прошло и недели как я выложил + резюме, а меня уже приняли.
        + Пока я ждал ответа от СБ, я еще успел сходить на собеседование в епам, там меня проверили по всему основному джава + стеку. Там я еще раз убедился, что мои слабые стороны это SQL, JavaScript и фреймворки. До второго уровня проверки в + епам (проверка английского) я так и не дошел, окончательно приняли в 1-ю компанию. +

        +

        Работа

        +

        + Я старался работать много, приходил рано, задерживался. Я с трудом понимал что такое мы делаем, и замучил наверно + своего начальника бесконечными вопросами. Но я старался все понять, и постепенно понимал. Домой я приходил выжатый + как лимон. Я не мог ничего больше учить дополнительно по вечерам, мой мозг отказывался что-то воспринимать. Но я + ходил на работу с радостью. Я был уже официально инженером-программистом, и это меня безумно вдохновляло. + Через 2 месяца закончился мой испытательный срок, и с декабря я уже нахожусь в полных правах.
        + Из личных успехов: в декабре мы уже запустили небольшой проект (вернее сказать серию дополнений), бэкенд который был + написан полностью мной (под руководством моего начальника конечно), один микросервис я написал сам от бекэнда до + фронтенда(пришлось учить React.js), но он пока еще не выложен. Специфика моей работы - суровый энтерпрайз. Я как раз + и мечтал о такой работе. Мои строчки кода уже крутятся на боевой и я счастлив от этого. Конечно были и проблемы, я + косячил, писал код с багами, находил эти баги у себя и не только у себя. Есть нехватка знаний, которая быстро + закрывается во время практики, но не вся. Чтение логов стало для меня привычным делом, я просмотрел уже наверно + сотню страниц логов. И свой код я пытаюсь подробно логировать, чтоб можно было быстро выявить ошибку по логам. +

        +

        Заключение

        +

        + Во-первых я хочу сказать огромное спасибо Григорию Кислину, за его прекрасную стажировку. Это + высококонцентрированный источник знаний, которые самостоятельно получить очень трудно, тем более за такой короткий + срок (12 недель). И именно участие в стажировке сыграло главную роль в моем быстром трудоустройстве. Это и опыт + участия в настоящем проекте, о котором можно рассказать на собеседовании, это и стаж программиста, который можно + указать в резюме.
        + С того момента как я решил стать программистом, до моего 1-го рабочего дня в качестве программиста, прошло примерно + 1,5 года. Из них действительно продуктивно прошли только 4 месяца онлайн курса джавараш и 3 месяца стажировки у + Григория. Да я изучал еще самостоятельно много чего, но это было хаотичное изучение и я много ленился. В общем этот + срок в 1,5 года можно было бы сократить в 2 раза, хотя возможно иногда лучше если изменения происходят плавно, а за + эти 1,5 года я очень изменился.
        + И хочу сказать свое мнение о платных курсах: я всегда с радостью покупал курсы, если видел, что они мне помогут + достигнуть моей цели. Если посчитать сколько я потратил всего на обучение джавы, то выйдет примерно так: в конце + августа 2015г, купил расширенный пакет от джавараш вроде за 10 тыс. руб., зимой 2015 дополнительно покупал миникурс + создания вебприложения - 5 тыс.руб, после стажировки в конце лета 2016 купил курс многопоточность у Григория - + 8 тыс.руб, итого 23 тыс руб. Так вот, за 1-й месяц работы, будучи еще на испытательном сроке, я заработал больше чем + потратил за 1,5 года на свое обучение.
        + Сейчас мои планы снова пройтись по 1ой стажировке, досконально изучая все, а потом 2-ю стажировку (многопоточность), + тоже досконально все изучая. И очень хорошо, что стажировки даются в бессрочное пользование, можно проходить их + сколько захочешь раз. И мое мнение, они дают уровень знаний хорошего мидла. +

        +

        + Желаю всем удачи в обучении джава и других языков программирования. Никогда не слушайте никого, кто говорит вам, что + вы что-то не сможете или что-то не для вас. Не бойтесь вкладывать в себя, в свое обучение средства, они вернутся + сторицей. Учитесь у профессионалов, если хотите стать профессионалом. Любите то дело которым хотите заниматься, и + оно быстрее примет вас. Общайтесь с программистами или слушайте подкасты, чтоб лучше и быстрее понять этот + удивительный мир программирования. +

        +
        + Тимур Муратов, 07/01/2017 +
        + К списку историй +
        +
        + + + + + + + + + \ No newline at end of file From 2dfc469de8afc70380a2a7049fe2dec65c081b7a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 9 Jan 2017 00:59:46 +0300 Subject: [PATCH 447/936] Add story8 --- resources/story/story2.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/story/story2.html b/resources/story/story2.html index 431af36..435fc8e 100644 --- a/resources/story/story2.html +++ b/resources/story/story2.html @@ -22,7 +22,7 @@

        Всем привет!

        - Меня зовут Григорий1, и я джавист.

        From 7eb281ab10881fbc73357db19473f96d48bd70bf Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 12 Jan 2017 17:22:42 +0300 Subject: [PATCH 448/936] Update topjava lesson5 --- resources/mails/topjava/lesson/lesson05.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson05.html b/resources/mails/topjava/lesson/lesson05.html index a8dd496..1ee60a1 100644 --- a/resources/mails/topjava/lesson/lesson05.html +++ b/resources/mails/topjava/lesson/lesson05.html @@ -12,11 +12,10 @@ Заканчиваем с базой данных, на следующем уроке перейдем к слою web. Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        - Обсуждение урока в slack #lesson05, домашнего задания в - slack #hw5 + Обсуждение урока и домашнего задания в slack #hw5

        - Домашнее задание (у кого есть проверка) желательно присылать до вечера 11.10
        + Домашнее задание (у кого есть проверка) желательно присылать до вечера 17.01

        From bc543deef611c39e8e0c3cd269d1f56867e17a39 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 19 Jan 2017 22:24:03 +0300 Subject: [PATCH 449/936] Update topjava lesson6 --- resources/mails/topjava/lesson/lesson06.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson06.html b/resources/mails/topjava/lesson/lesson06.html index 944d8d0..c02bdd8 100644 --- a/resources/mails/topjava/lesson/lesson06.html +++ b/resources/mails/topjava/lesson/lesson06.html @@ -15,11 +15,10 @@

        Перед накаткой первого патча код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        - Обсуждение урока в slack #lesson06, домашнего задания в - slack #hw6 + Обсуждение урока в и домашнего задания в канале slack #hw6

        - Домашнее задание (у кого есть проверка) желательно присылать до вечера 18.10
        + Домашнее задание (у кого есть проверка) желательно присылать до вечера 24.10

        From efee18c48c76334e1f2600937916e107845eb5e0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 19 Jan 2017 22:35:50 +0300 Subject: [PATCH 450/936] update story 8 --- resources/static/img/portrait/timur.jpg | Bin 0 -> 15955 bytes resources/story/story8.html | 1 + 2 files changed, 1 insertion(+) create mode 100644 resources/static/img/portrait/timur.jpg diff --git a/resources/static/img/portrait/timur.jpg b/resources/static/img/portrait/timur.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56b718d74b0b6db334f100f8026be15fb2b7e79f GIT binary patch literal 15955 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 Djwig? literal 0 HcmV?d00001 diff --git a/resources/story/story8.html b/resources/story/story8.html index 0e49a77..7a7b04c 100644 --- a/resources/story/story8.html +++ b/resources/story/story8.html @@ -27,6 +27,7 @@
        Мне сейчас 30 лет и я работаю программистом уже четвертый месяц.
        Моя история о трудоустройстве: +

        Как я не стал программистом

        Учась в школе, я хотел пойти учиться на программиста, но к концу 11-го класса у меня в аттeстате было From c2a27a3bdfbb00aeefb88b14ba7680ac790af1ed Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 19 Jan 2017 22:37:46 +0300 Subject: [PATCH 451/936] update story 8 --- resources/story/story8.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/story/story8.html b/resources/story/story8.html index 7a7b04c..f05287a 100644 --- a/resources/story/story8.html +++ b/resources/story/story8.html @@ -26,7 +26,7 @@

        Мне сейчас 30 лет и я работаю программистом уже четвертый месяц.
        - Моя история о трудоустройстве: + Моя история о трудоустройстве:

        Как я не стал программистом

        From 6eea27a3bccdbc94595b683ec8ad51ac5f7b255b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 19 Jan 2017 22:38:45 +0300 Subject: [PATCH 452/936] update story 8 --- resources/story/story8.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/story/story8.html b/resources/story/story8.html index f05287a..c6484cf 100644 --- a/resources/story/story8.html +++ b/resources/story/story8.html @@ -25,8 +25,7 @@

        - Мне сейчас 30 лет и я работаю программистом уже четвертый месяц.
        - Моя история о трудоустройстве:
        + Мне сейчас 30 лет и я работаю программистом уже четвертый месяц.Моя история о трудоустройстве:

        Как я не стал программистом

        From 9d5cf62927872bcd4baaa42ebee2d173df7a95a3 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 27 Jan 2017 13:35:26 +0300 Subject: [PATCH 453/936] update lesson 07 --- resources/mails/topjava/lesson/lesson07.html | 5 ++--- topjava2.md | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson07.html b/resources/mails/topjava/lesson/lesson07.html index 2866b16..9209a4e 100644 --- a/resources/mails/topjava/lesson/lesson07.html +++ b/resources/mails/topjava/lesson/lesson07.html @@ -13,11 +13,10 @@

        Перед накаткой патчей в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        - Обсуждение урока в slack #lesson07, домашнего задания в - slack #hw7 + Обсуждение урока и HW7 в slack #hw7

        - Домашнее задание (у кого есть проверка) желательно присылать до вечера 25.10
        + Домашнее задание не очень большое, у кого есть проверка желательно присылать до вечера 31.01

        diff --git a/topjava2.md b/topjava2.md index 950739f..64d63f8 100644 --- a/topjava2.md +++ b/topjava2.md @@ -57,6 +57,8 @@ http://mtdevuk.com/2015/02/10/how-to-deploy-a-spring-boot-application-to-amazon- - Deploy spring boot application to amazon elastic beanstalk - Spring Cloud AWS +http://eax.me/amazon-one-year/ + ## Static resources http://www.baeldung.com/spring-mvc-static-resources From b86e78ebb76a1506ee4f9262f94489c307304a65 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 2 Feb 2017 17:57:17 +0300 Subject: [PATCH 454/936] update lesson 08 --- resources/mails/topjava/lesson/lesson09.html | 5 ++--- resources/payment.html | 3 --- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index 49a8614..ea1af93 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -13,11 +13,10 @@

        Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        - Обсуждение урока в slack #lesson09, домашнего задания в - slack #hw9 + Обсуждение урока и домашнего задания в slack #hw9

        - Домашнее задание (у кого есть проверка) желательно присылать до вечера 08.11
        + Домашнее задание (у кого есть проверка) желательно присылать до вечера 07.02

        diff --git a/resources/payment.html b/resources/payment.html index cd3ff12..b927e4b 100644 --- a/resources/payment.html +++ b/resources/payment.html @@ -41,9 +41,6 @@

        Реквизиты оплаты

        Наличными или с другого сервиса, номер кошелька Yandex: 41001964807638

        -
      • - Денежные переводы ВКонтакте (внутри Росии, Mastercard без комиссии, Visa 1%)

        -
      • Webmoney: WMR R335541240099, WMZ Z354468526072

      • Qiwi: +7 921 855 0482

        From f6de8e55e40a9be675c4137d810440d6ab5bc9eb Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 2 Feb 2017 18:04:12 +0300 Subject: [PATCH 455/936] update lesson 08 --- resources/mails/topjava/lesson/lesson08.html | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index 75f2259..612b8d2 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -8,16 +8,15 @@ Здравствуй firstName!

        -В четверг выложил восьмое занятие нашего проекта.
        +Выложил восьмое занятие нашего проекта.
        CSS (Bootstrap), JavaScript (jQuery + plugins), AJAX, добавление к REST контроллерам базовой авторизации.

        Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
        - Обсуждение урока в slack #lesson08, домашнего задания в - slack #hw8 + Обсуждение урока и домашнего задания в slack #hw8

        - Домашнее задание (у кого есть проверка) желательно присылать до вечера 01.11
        + Домашнее задание (у кого есть проверка) желательно присылать до вечера 07.02

        From 7063b4e124b474c827bfca8eb62aecf9b5245c07 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 4 Feb 2017 02:35:43 +0300 Subject: [PATCH 456/936] Add masterjava start info --- .../masterjava/masterjava_start_info.html | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 resources/mails/masterjava/masterjava_start_info.html diff --git a/resources/mails/masterjava/masterjava_start_info.html b/resources/mails/masterjava/masterjava_start_info.html new file mode 100644 index 0000000..0dfe0b9 --- /dev/null +++ b/resources/mails/masterjava/masterjava_start_info.html @@ -0,0 +1,37 @@ + + + + + + Новости проекта 'Многомодульный maven. Многопоточность. XML. Веб сервисы. Удаленное взаимодействие.' + +

        + Здравствуй!
        +

        +

        + Первый выпуск проекта MasterJava (на основе вебинаров) + заканчивается в феврале и в конце февраля планирую запустить проект уже в отредактированном варианте в записи. +

        +

        + Программа проекта немного изменилась, + возможны также небольшие изменения последних 2х уроков. + Ну и конечно уже во время проекта также что-то будет менятся и рефакторится. +

        +

        Первое занятие проекта: Многопоточность, + после которого можно выполнять + домашнее задание (HW1). +

        +
          +
        • Стоимость участия 8900 руб., участникам проектов Topjava или JavaSE+Web скидка: 8200 руб. / 139$
        • +
        • C проверкой домашних заданий стоимость без скидки 17000 руб, моим участникам - 15500 руб
        • +
        • Специальная цена на покупку 2х проектов (Topjava + Masterjava)
        • +
        • Оплата участия любым удобным способом
        • +
        • После оплаты обязательно свяжитесь со мной в skype grigory.kislin или ответом на это письмо (с указанием куда + и когда был платеж) +
        • +
        +Участникам проекта выдается индивидуальный ключ IDEA сроком на 6 месяцев
        +О старте проекта я сообщу дополнительно. +

        +

        + \ No newline at end of file From b9b8aa3071c2f755da69ed3b1138d00f447f61d7 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 4 Feb 2017 02:48:10 +0300 Subject: [PATCH 457/936] update masterjava mails --- .../masterjava/masterjava_start_info.html | 3 +++ resources/mails/masterjava_register.html | 26 +++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/resources/mails/masterjava/masterjava_start_info.html b/resources/mails/masterjava/masterjava_start_info.html index 0dfe0b9..f3ecdc9 100644 --- a/resources/mails/masterjava/masterjava_start_info.html +++ b/resources/mails/masterjava/masterjava_start_info.html @@ -32,6 +32,9 @@ Участникам проекта выдается индивидуальный ключ IDEA сроком на 6 месяцев
        О старте проекта я сообщу дополнительно. +

        + До встречи на проекте! +

        \ No newline at end of file diff --git a/resources/mails/masterjava_register.html b/resources/mails/masterjava_register.html index 057a495..b8f0bc1 100644 --- a/resources/mails/masterjava_register.html +++ b/resources/mails/masterjava_register.html @@ -12,15 +12,31 @@ Спасибо за регистрацию на проекте Многомодульный maven. Многопоточность. XML. Веб сервисы. Удаленное взаимодействие.

        - Проект идет. Следующий выпуск планируется в феврале 2017г., дата старта и программа проекта будут уточняться и рассылаться всем - зарегистрированным участникам. + Первый выпуск проекта MasterJava (на основе вебинаров) + заканчивается в феврале и в конце февраля планирую запустить проект уже в отредактированном варианте в записи.

        - Смотри первое занятие и выполняй вступительное задание. + Программа проекта немного изменилась, + возможны также небольшие изменения последних 2х уроков. + Ну и конечно уже во время проекта также что-то будет менятся и рефакторится.

        +

        Первое занятие проекта: Многопоточность, + после которого можно выполнять + домашнее задание (HW1). +

        +
          +
        • Стоимость участия 8900 руб., участникам проектов Topjava или JavaSE+Web скидка: 8200 руб. / 139$
        • +
        • C проверкой домашних заданий стоимость без скидки 17000 руб, моим участникам - 15500 руб
        • +
        • Специальная цена на покупку 2х проектов (Topjava + Masterjava)
        • +
        • Оплата участия любым удобным способом
        • +
        • После оплаты обязательно свяжитесь со мной в skype grigory.kislin или ответом на это письмо (с указанием куда + и когда был платеж) +
        • +
        +Участникам проекта выдается индивидуальный ключ IDEA сроком на 6 месяцев
        +О старте проекта я сообщу дополнительно.

        - Следи за рассылкой и до встречи на проекте!
        + До встречи на проекте!

        From b73b5ba1bef73b5d8d355d430f92d20ab2080340 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 4 Feb 2017 02:52:05 +0300 Subject: [PATCH 458/936] update masterjava mails --- resources/mails/masterjava_register.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/masterjava_register.html b/resources/mails/masterjava_register.html index b8f0bc1..789ceb6 100644 --- a/resources/mails/masterjava_register.html +++ b/resources/mails/masterjava_register.html @@ -3,7 +3,7 @@ - Регистрация на проект 'Многопоточность. Веб сервисы.' + Регистрация на проект 'Многомодульный maven. Многопоточность. XML. Веб сервисы. Удаленное взаимодействие.'

        Здравствуй firstName!
        @@ -12,7 +12,7 @@ Спасибо за регистрацию на проекте Многомодульный maven. Многопоточность. XML. Веб сервисы. Удаленное взаимодействие.

        - Первый выпуск проекта MasterJava (на основе вебинаров) + Первый выпуск проекта (на основе вебинаров) заканчивается в феврале и в конце февраля планирую запустить проект уже в отредактированном варианте в записи.

        @@ -20,7 +20,7 @@ возможны также небольшие изменения последних 2х уроков. Ну и конечно уже во время проекта также что-то будет менятся и рефакторится.

        -

        Первое занятие проекта: Многопоточность, +

        Первое бесплатное занятие проекта: Многопоточность, после которого можно выполнять домашнее задание (HW1).

        From f4690dce45760f7e6d4a7fcb2f7fa6b7c3f656e2 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Sat, 4 Feb 2017 03:05:01 +0300 Subject: [PATCH 459/936] update masterjava mails --- .../mails/masterjava/masterjava_start_info.html | 12 +++++++++--- resources/mails/masterjava_register.html | 6 +++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/resources/mails/masterjava/masterjava_start_info.html b/resources/mails/masterjava/masterjava_start_info.html index f3ecdc9..84af2e4 100644 --- a/resources/mails/masterjava/masterjava_start_info.html +++ b/resources/mails/masterjava/masterjava_start_info.html @@ -22,15 +22,21 @@ домашнее задание (HW1).

          -
        • Стоимость участия 8900 руб., участникам проектов Topjava или JavaSE+Web скидка: 8200 руб. / 139$
        • +
        • Участникам проекта выдается индивидуальный ключ IDEA сроком на 6 месяцев
        • +
        • Общение по проекту будет в группе Slaсk (разные каналы для уроков и общения)
        • +
        • Проект будет вестись в записи, обновление проекта патчами
        • +
        +
          +
        • Стоимость участия 8900 руб., участникам проектов Topjava или JavaSE+Web + скидка: 8200 руб. / 139$
        • C проверкой домашних заданий стоимость без скидки 17000 руб, моим участникам - 15500 руб
        • Специальная цена на покупку 2х проектов (Topjava + Masterjava)
        • Оплата участия любым удобным способом
        • -
        • После оплаты обязательно свяжитесь со мной в skype grigory.kislin или ответом на это письмо (с указанием куда +
        • После оплаты обязательно свяжитесь со мной в skype grigory.kislin или ответом на это письмо (с указанием + куда и когда был платеж)
        -Участникам проекта выдается индивидуальный ключ IDEA сроком на 6 месяцев
        О старте проекта я сообщу дополнительно.

        До встречи на проекте! diff --git a/resources/mails/masterjava_register.html b/resources/mails/masterjava_register.html index 789ceb6..90007e0 100644 --- a/resources/mails/masterjava_register.html +++ b/resources/mails/masterjava_register.html @@ -24,6 +24,11 @@ после которого можно выполнять домашнее задание (HW1).

        +
          +
        • Участникам проекта выдается индивидуальный ключ IDEA сроком на 6 месяцев
        • +
        • Общение по проекту будет в группе Slaсk (разные каналы для уроков и общения)
        • +
        • Проект будет вестись в записи, обновление проекта патчами
        • +
        • Стоимость участия 8900 руб., участникам проектов Topjava или JavaSE+Web скидка: 8200 руб. / 139$
        • C проверкой домашних заданий стоимость без скидки 17000 руб, моим участникам - 15500 руб
        • @@ -33,7 +38,6 @@ и когда был платеж)
        -Участникам проекта выдается индивидуальный ключ IDEA сроком на 6 месяцев
        О старте проекта я сообщу дополнительно.

        До встречи на проекте! From 9daaf59ee2f08d32f46f0e9852cf9c3729360793 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 6 Feb 2017 11:21:18 +0300 Subject: [PATCH 460/936] update story --- resources/story.html | 3 + resources/story/story9.html | 117 ++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 resources/story/story9.html diff --git a/resources/story.html b/resources/story.html index 3b94931..fc06f58 100644 --- a/resources/story.html +++ b/resources/story.html @@ -21,6 +21,9 @@

        Наши истории


        +

        Путь к Java Developer.

        + +

        История трудоустройства.

        diff --git a/resources/story/story9.html b/resources/story/story9.html new file mode 100644 index 0000000..27fe7e5 --- /dev/null +++ b/resources/story/story9.html @@ -0,0 +1,117 @@ + + + + + + + + + Истории + + + + + + + + +
        +

        Путь к Java Developer:

        + + +

        Предыстория

        +

        + Начну с того, что мне повезло быть студентом технического ВУЗа и учился я именно на факультете информационных + технологий. Повезло не потому что я получил какие-то очень полезные навыки, а из-за того, что многие компании + «отсеивают» кандидатов по этому критерию. Но речь не об этом. Я был довольно ленивым студентом и не особо + понимал, чем я хочу заниматься в будущем. Даже не был уверен, что буду работать в IT. +

        +

        + После университета работал установщиком ПО – выезжал к клиентам компании, устанавливал программное обеспечение и + рассказывал, как им пользоваться. Проработав около 2-х лет, я понял, что, особых перспектив не намечается и + нужно двигаться дальше. +

        +

        + Решив продолжить работу в IT, я всё ещё смутно понимал, в каком именно направлении мне нужно развиваться. И + увидев где-то фразу «Не знаешь какой язык программирования учить – учи английский» я проверил требования в паре + десятков вакансий и убедился, что с этого и стоит начать! +

        +

        + Около полугода я самостоятельно изучал английский с помощью интернет-ресурсов, но была нужна языковая практика. + Сначала я хотел поехать в одну из англоязычных стран, но из-за девальвации рубля я начал искать другие варианты + и нашёл! Я решил отправиться в Азию, а именно на Филиппины – во первых, английский имеет статус официального, а + во вторых очень хорошее предложение по обучению – 5 дней в неделю по 6 – 8 уроков в день было именно то, что мне + было нужно. Со мной учились несколько программистов, которые также как и я хотели поднять свой уровень + английского, и с некоторыми общаюсь и сегодня. От них я узнал много нового, и мне было о чём подумать. А в + последнюю неделю обучения в школе проходили уроки по HTML для начинающих. В тот момент для меня это было очень + интересно, а на английском - вдвойне. Так я решил стать программистом! +

        +

        Изучение Java.

        +

        + Вернувшись домой, я хотел как можно скорее приступить к изучению одного из языков программирования. Но мне + предстояло выбрать – какой же язык всё таки учить. После нескольких дней размышлений и изучения информации, + пришёл к выводу, что лучший выбор – это Java! +

        +

        + Начать я решил с JavaRush – отличный ресурс для новичков, который поможет постигнуть начальные азы + программирования на Java. Спустя полгода я получил работу и приступил к обязанностям в должности + инженера-программиста! Первый мой проект был достаточно интересным, особенно для такого новичка, как я – было + необходимо написать простое веб-приложения и организовать доступ к базе данных. На это у меня ушло около месяца. + Хотя сейчас я сделал бы это гораздо быстрее и на совершенно другом уровне, но тогда для меня это был успех! +

        +

        TopJava

        +

        + Проработав чуть меньше года, я набрался опыта и решил, что на этом нельзя останавливаться. Со временем я понял, + что не получил того, что хотел. Я хоть и работал программистом, но я занимался не только Java, а и кучей других + малоизвестный и бесперспективных технологий. Изучив рынок труда, я осознал, что для того, чтобы получить работу, + которую я всегда хотел – необходимо существенно повысить свой уровень и изучить востребованные технологии. + Именно поэтому я решил пройти TopJava – этот курс даёт возможность изучить самые востребованные технологии на + сегодняшний день, а именно Spring, PostgreSQL, JPA/Hibernate, а также Java 8 – Stream API и Date and Time API. +

        +

        + Буду честным и скажу, что не всё давалось легко, но при должном упорстве во всём можно разобраться, а + возможность задать вопрос автору курса или сокурсникам в slack’е несомненно помогает понять то, что на первый + взгляд может показаться довольно сложным. +

        +

        + Вскоре после завершения курса, я разместил своё резюме на нескольких сайтах и мне сразу начали писать и звонить. + Но, как ни странно, предложение о работе, которое я в итоге принял, я получил после того, как написал + девушке-HR, которая написала в slack’е, что ищет специалистов моего уровня . +

        +

        + Недавно закончился испытательный срок, и теперь я являюсь полноценным Java-разработчиком и каждый день + развиваюсь в этом направлении и не собираюсь останавливаться на достигнутом. +

        +

        + Благодарю Григория Кислина, за замечательный курс TopJava и оказанную поддержку. Благодаря всему этому я овладел + необходимыми навыками, которые позволили мне найти работу, которую я всегда хотел. +

        +

        + Было ли легко – нет. Стоит ли оно того – несомненно. +

        +
        + Иван, 05/02/2017 +
        + К списку историй +
        +
        + + + + + + + + + \ No newline at end of file From a0aa15a5eb7704fa7199a1cc7615bbbc74b6e1a9 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Mon, 6 Feb 2017 11:22:35 +0300 Subject: [PATCH 461/936] update story --- resources/story.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/story.html b/resources/story.html index fc06f58..2645f54 100644 --- a/resources/story.html +++ b/resources/story.html @@ -21,7 +21,7 @@

        Наши истории


        -

        Путь к Java Developer.

        +

        Путь к Java Developer.

        История трудоустройства.

        From b7faf21c9f4251d3ace41a94357bd3bac742fead Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 9 Feb 2017 23:27:43 +0300 Subject: [PATCH 462/936] Ad test_access masterjava --- resources/mails/masterjava/test_access.html | 23 +++++++++++++++++++ resources/view/fragments.html | 1 + .../javaops/config/IntegrationProperties.java | 20 +++++++++------- 3 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 resources/mails/masterjava/test_access.html diff --git a/resources/mails/masterjava/test_access.html b/resources/mails/masterjava/test_access.html new file mode 100644 index 0000000..8e46c1b --- /dev/null +++ b/resources/mails/masterjava/test_access.html @@ -0,0 +1,23 @@ + + + + + + Тестирование доступа к материалам MasterJava + +

        + Здравствуй!
        +

        +Поздравляю с участием в проекте MasterJava, который начнем в конце февраля. +

        +Проверь плз. доступ к материалам: картинка MasterJava
        +Доступ дал по gmail, если его нет (после выхода-входа в google аккаунт), обязательно свяжись со мной в skype: grigory.kislin либо письмом. +

        +На днях сделаю группу слак и буду раздавать именные ключи к IDEA (на полгода). +

        + Пока смотрите первое занятие: Многопоточность и делайте ДЗ. +

        +До встречи на проекте, +

        +

        + \ No newline at end of file diff --git a/resources/view/fragments.html b/resources/view/fragments.html index 42bd16e..986f0ef 100644 --- a/resources/view/fragments.html +++ b/resources/view/fragments.html @@ -7,6 +7,7 @@ +
      • diff --git a/src/main/java/ru/javaops/service/SubscriptionService.java b/src/main/java/ru/javaops/service/SubscriptionService.java index 914b5bd..6fdf618 100644 --- a/src/main/java/ru/javaops/service/SubscriptionService.java +++ b/src/main/java/ru/javaops/service/SubscriptionService.java @@ -1,5 +1,6 @@ package ru.javaops.service; +import com.google.api.client.repackaged.com.google.common.base.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.javaops.config.AppProperties; @@ -71,7 +72,7 @@ public String encrypt(String value) { } public String decrypt(String value) { - return value.charAt(0) == '-' ? + return !Strings.isNullOrEmpty(value) && value.charAt(0) == '-' ? decrypt0(value.substring(1), secretKey) : null; } From 9bc17e46213f7dadd4ddbf415b485d8f355d491d Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 16 May 2017 21:40:15 +0300 Subject: [PATCH 675/936] Fix topjava --- resources/view/topjava.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/view/topjava.html b/resources/view/topjava.html index 17f69d7..5bdf092 100644 --- a/resources/view/topjava.html +++ b/resources/view/topjava.html @@ -45,7 +45,7 @@

        Оп для просмотра 8 видео)

        Отзывы по проекту

        + src="../static/img/icon-meal.png" align="middle"/> Демо разрабатываемого приложения From 42a673cc4df86664c93a8b5902281b85eb54eff9 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 16 May 2017 21:40:57 +0300 Subject: [PATCH 676/936] Fix topjava --- resources/view/topjava.html | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/resources/view/topjava.html b/resources/view/topjava.html index 5bdf092..2f05867 100644 --- a/resources/view/topjava.html +++ b/resources/view/topjava.html @@ -126,17 +126,16 @@

        Требования к у Spring/JPA, а также структурному (красивому и надежному) java кодированию и архитектуре приложения. - -

        +

      • Каждая итерация проекта закрепляется домашним заданием по реализации схожей функциональности. Следующее занятие начинается с разбора домашних заданий. -

        +

      • Большое внимание уделяется тестированию кода: в проекте более 100 JUnit тестов. -

        +

      • Несмотря на относительно небольшой размер, приложение разрабатывается с нуля как большой проект (например, мы используем кэш 2-го уровня Hibernate, настраиваем Jenkins для работы с ленивой From 246a909fb881cc9fa112796ea6cb4fb802a0c43f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 16 May 2017 21:41:23 +0300 Subject: [PATCH 677/936] Fix topjava --- resources/view/topjava.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/view/topjava.html b/resources/view/topjava.html index 2f05867..b4d273b 100644 --- a/resources/view/topjava.html +++ b/resources/view/topjava.html @@ -169,7 +169,7 @@

        Требования к у месяцев.
        IntelliJ + alt="IntelliJ"/>

      From 017d423e9611186fbd04d074cfc3398d7aa8253b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 16 May 2017 21:42:24 +0300 Subject: [PATCH 678/936] Fix topjava --- resources/view/topjava.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/view/topjava.html b/resources/view/topjava.html index b4d273b..816358a 100644 --- a/resources/view/topjava.html +++ b/resources/view/topjava.html @@ -176,10 +176,10 @@

      Требования к у
      -

      Расписание:

      From a021a4dd3a5f63b39bdb7e2be9064bc2fd36b0f4 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 16 May 2017 21:44:28 +0300 Subject: [PATCH 680/936] Fix topjava --- resources/view/topjava.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/view/topjava.html b/resources/view/topjava.html index e88367e..d490cd8 100644 --- a/resources/view/topjava.html +++ b/resources/view/topjava.html @@ -369,7 +369,7 @@

      Оптимальное подобранно

      Занятия проходят раз в неделю, оптимальное время необходимое для проработки - пройденных тем и выполнения домашнего задания + пройденных тем и выполнения домашнего задания

    • Ревью Вашего кода.

      @@ -384,14 +384,14 @@

      Помощь в составлении ре (делимся опытом и успехом). В группе skype выпускников происходит активное общение на все темы IT, обсуждение вступительных заданий, вакансии, цены на рынке труда, события, помощь, интересные видео и пр. Ваши формы соискателя я рассылаю всем знакомым - HR.

    • + HR.

    • После проекта в твоем резюме появится раздел в опыте работы:

      Участие в разработке Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей - на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API:

      + на стеке Maven/ Spring MVC/ Security/ REST(Jackson)/ Java 8 Stream API:

      • реализация сохранения в базы Postgres и HSQLDB на основе Spring JBDC, JPA(Hibernate) и Spring-Data-JPA From 2dcae98e42b58fcfd9f2d564fe231e7d2962f994 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Tue, 16 May 2017 21:45:04 +0300 Subject: [PATCH 681/936] Fix topjava --- resources/view/topjava.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/view/topjava.html b/resources/view/topjava.html index d490cd8..53d9a7c 100644 --- a/resources/view/topjava.html +++ b/resources/view/topjava.html @@ -424,7 +424,7 @@
      • - Spring. + Spring. IoC, DI, IoC-контейнер
      • -
      • ORM, - Hibernate, JPA
      • +
      • Hibernate
      • Многопоточность, JMM
      • diff --git a/resources/mails/basejava_register.html b/resources/mails/basejava_register.html index 3a7eff2..2c00a87 100644 --- a/resources/mails/basejava_register.html +++ b/resources/mails/basejava_register.html @@ -13,7 +13,7 @@

        Я адаптировал и обновил этот курс (стало 17 занятий!) и теперь он идет на платформе обучения в личном кабинете с контролем результатов. Мне помогает еще один преподаватель Станислав, который лично курирует процесс обучения. Чтобы оценить свой уровень, нужно установить ПО и выполнить вступительное задание. -После этого свяжитесь пожалуйста со мной в skype: grigory.kislin или telegram gkislin.
        +После этого свяжитесь пожалуйста со мной в skype: grigory.kislin.
        По участию и всем организационным вопросам я свяжу вас с Артемом, организатором.

        Если у вас достаточно знаний, то есть возможность пройти весь курс c проверкой куратором за месяц за 95$!. diff --git a/resources/story/story4.html b/resources/story/story4.html index 232d4fa..0d35e77 100644 --- a/resources/story/story4.html +++ b/resources/story/story4.html @@ -18,7 +18,7 @@

        Java Online Projects diff --git a/resources/view/topjava.html b/resources/view/topjava.html index 0c8378f..de17a7e 100644 --- a/resources/view/topjava.html +++ b/resources/view/topjava.html @@ -12,7 +12,7 @@
        Java Online Projects @@ -41,12 +41,10 @@

        Стажировка Java Enterprise (Topjava)

        Старт следующего набора: 06.07

        Описание и план проекта - (открыто - для просмотра 8 видео)

        -

        Отзывы по проекту

        - - Демо разрабатываемого приложения + (открыто для просмотра 8 видео)
    • +

        Отзывы по проекту

      +

        Демо разрабатываемого приложения

      @@ -58,35 +56,31 @@

      Отзывы
      -
      Почему Java Online Projects?   - Получить вступительное занятие + Получить ссылку + на бесплатное вступительное занятие

      Вебинар ОСВАИВАЕМ JAVA ENTERPRISE

      Слайды вебинара

      -

      Код начального проекта был переработан: появились настройки пользователя, сохранения собственных типов в Hibernate, работа с java 8 (time API, Lambda, Streaming), модальные окна bootstrap, переключение локали, сильно уменьшено количество и упрощена работа с java script. Появилась логика фильтрации таблицы. В каждом уроке добавлены ответы на ваши вопросы по занятию, - дополнительные домашние задания и подсказки по выполнению домашних заданий. + дополнительные домашние задания и подсказки по выполнению домашних заданий. Начиная с 4го занятия участники пишут собственный выпускной проект.

      Требования к участникам, ответы на вопросы

      -
      -

      - Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. - Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и - домашние задания. Домашние задания подобранны по темам занятия и требуют реализации - функциональности, схожей с пройденной на занятии. Разбор домашних заданий происходит в начале - каждого урока. - Вопросы и обсуждение занятий и домашних заданий, общение на разные темы происходит в различных - каналах группы проекта - (используем мессанджер Slack). -

      + Стажировка ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым + записям. + Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и + домашние задания. Домашние задания подобранны по темам занятия и требуют реализации + функциональности, схожей с пройденной на занятии. Разбор домашних заданий происходит в начале + каждого урока. + Вопросы и обсуждение занятий и домашних заданий, общение на разные темы происходит в различных + каналах группы проекта + (используем мессанджер Slack).
      @@ -310,104 +304,6 @@

      Расписание:

      data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir">

      -

    -

    Расписание занятий проекта:

    - Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Домашние задания подобранны по темам занятия и требуют реализации функциональности, схожей с пройденной на занятии. +

    Расписание занятий проекта

      06.07: Старт проекта

    • Сбор группы в Slack
    • Заполнение формы регистрации участника (в том числе gmail для доступа к материалам на Google Drive)
    • From 14651291e2a9037b4e6837552476b075740115f6 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 17 May 2017 17:51:25 +0300 Subject: [PATCH 687/936] Update topjava info --- resources/mails/masterjava/participate2.html | 66 ++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 resources/mails/masterjava/participate2.html diff --git a/resources/mails/masterjava/participate2.html b/resources/mails/masterjava/participate2.html new file mode 100644 index 0000000..9df21fc --- /dev/null +++ b/resources/mails/masterjava/participate2.html @@ -0,0 +1,66 @@ + + + + Участие в проекте 'Masterjava' + +

      + Здравствуй firstName!
      +

      +

      Поздравляю тебя с участием в проекте
      + Многомодульный maven. + Многопоточность. XML. Веб сервисы. Удаленное взаимодействие!

      +

      20.07 планируется окончание Masterjava02. Следующий поток планирую запустить в конце лета/оcенью (будет рассылка). Пока можно изучать материалы самостоятельно.

      +Первое занятия открыто, +здесь остальные занятия проекта. +Выполнение домашнего задания и чекин в свой репозиторий нужно делать согласно wiki по ведению + проекта в Git (анологично проекту Topjava, в вводном занятии проекта + TopJava есть видео с правилами работы с Git и c проектом). +

      Приглашение в Slack и доступ к материалам

      +Общение на проекте будет вестись в группе Slack. Заполни пожалуйста все +поля регистрационной формы. После ее сохранения +
        +
      • на почту придет приглашение в группу Slack (обычно в течении 5 мин, проверь папку спам)
      • +
      • по gmail аккаунту предоставится доступ к материалам. Если + картинка по ссылке закрыта, по порядку: +
          +
        • выйти-войти в gmail аккаунт
        • +
        • попробовать войти в анонимной вкладке
        • +
        • Внимание!! НЕ НАДО запрашивать доступ через Google Drive (он дается автоматически по заполнению формы)
        • +
        • если доступа нет, напиши мне в skype grigory.kislin или в личку в группы Slak
        • +
        +
      • +
      + +Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал.
      +Обсуждение первого занятия происходит в канале Slack #hw01.
      +
        +
      • #flooding: оффтопик
      • +
      • #general: общие вопросы
      • +
      • #help: помощь
      • +
      • #git: вопросы по git
      • +
      • #idea: вопросы по idea
      • +
      • #links: интересные ресурсы
      • +
      +Форматирование сообщений в + slack
      +Desktop/ Mobile приложение Slack +

      +Разработка проекта ведется в JetBrains IDEA, брать версию Ultimate
      +Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую + учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода можно получить согласно политике JetBrains только +один раз. Если ты еще не брал ключ, напиши мне плз в личку. +

      +

      + Удачи в освоении материалов проекта и выполнении ДЗ,
      + Григорий Кислин
      + skype: grigory.kislin +

      +

      + Java Online Projects +

      + + \ No newline at end of file From b4d4e781a5a8c67ac2584d83d350341226c9868a Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 19 May 2017 12:23:08 +0300 Subject: [PATCH 688/936] Update test interview --- resources/interview/test.html | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/resources/interview/test.html b/resources/interview/test.html index c84a546..f2b32ca 100644 --- a/resources/interview/test.html +++ b/resources/interview/test.html @@ -33,6 +33,14 @@

      Возможно собеседование по конкретной вак


    Темы тестового собеседования (можно выбрать):

    + +

    - -

    Время собеседования: 1 час/ 1450 руб./25$

    Детали в скайпе: grigory.kislin

    Date: Fri, 19 May 2017 14:16:56 +0300 Subject: [PATCH 689/936] Refactor profile handling --- .../java/ru/javaops/service/GroupService.java | 2 +- .../java/ru/javaops/web/PageController.java | 9 -- .../ru/javaops/web/ProfileController.java | 98 +++++++++++++++++++ .../javaops/web/SubscriptionController.java | 45 --------- ...ontroller.java => UserRestController.java} | 2 +- 5 files changed, 100 insertions(+), 56 deletions(-) create mode 100644 src/main/java/ru/javaops/web/ProfileController.java rename src/main/java/ru/javaops/web/{UserController.java => UserRestController.java} (98%) diff --git a/src/main/java/ru/javaops/service/GroupService.java b/src/main/java/ru/javaops/service/GroupService.java index b458f5f..4dfc4ee 100644 --- a/src/main/java/ru/javaops/service/GroupService.java +++ b/src/main/java/ru/javaops/service/GroupService.java @@ -156,7 +156,7 @@ public Set filterUserByGroupNames(String includes, String excludes, Lo return includeUsers; } - public User getCurrentUserInProject(String email, String projectName) { + public User getExistedUserInProject(String email, String projectName) { User u; if (projectName.equals("javaops")) { u = userService.findExistedByEmail(email); diff --git a/src/main/java/ru/javaops/web/PageController.java b/src/main/java/ru/javaops/web/PageController.java index 9549a79..37e617f 100644 --- a/src/main/java/ru/javaops/web/PageController.java +++ b/src/main/java/ru/javaops/web/PageController.java @@ -18,7 +18,6 @@ import ru.javaops.service.SqlService; import ru.javaops.service.SubscriptionService; import ru.javaops.to.UserAdminsInfo; -import ru.javaops.to.UserStat; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; @@ -42,14 +41,6 @@ public class PageController { @Autowired private SubscriptionService subscriptionService; - @GetMapping(value = "/users") - public ModelAndView usersInfo(@RequestParam("key") String key, @RequestParam("email") String email) { - List users = userRepository.findAllForStats(); - return (users.stream().anyMatch(u -> u.getEmail().equals(email))) ? - new ModelAndView("users", "users", users) : - new ModelAndView("statsForbidden"); - } - @GetMapping(value = "/user") public ModelAndView userInfo(@RequestParam("email") String email, @RequestParam("partnerKey") String partnerKey) { diff --git a/src/main/java/ru/javaops/web/ProfileController.java b/src/main/java/ru/javaops/web/ProfileController.java new file mode 100644 index 0000000..3d07fff --- /dev/null +++ b/src/main/java/ru/javaops/web/ProfileController.java @@ -0,0 +1,98 @@ +package ru.javaops.web; + +import com.google.api.client.repackaged.com.google.common.base.Strings; +import com.google.common.collect.ImmutableMap; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; +import ru.javaops.model.User; +import ru.javaops.repository.UserRepository; +import ru.javaops.service.GoogleAdminSDKDirectoryService; +import ru.javaops.service.GroupService; +import ru.javaops.service.IntegrationService; +import ru.javaops.service.UserService; +import ru.javaops.to.UserStat; +import ru.javaops.to.UserToExt; +import ru.javaops.util.Util; + +import javax.validation.Valid; +import javax.validation.ValidationException; +import java.util.List; + +/** + * gkislin + * 19.05.2017 + */ + +@Controller +@Slf4j +public class ProfileController { + @Autowired + private UserService userService; + + @Autowired + private UserRepository userRepository; + + @Autowired + private GroupService groupService; + + @Autowired + private IntegrationService integrationService; + + @Autowired + private GoogleAdminSDKDirectoryService googleAdminSDKDirectoryService; + + @RequestMapping(value = "/participate", method = RequestMethod.GET) + public ModelAndView participate(@RequestParam("email") String email, @RequestParam("key") String key, @RequestParam("project") String projectName) { + User u = groupService.getExistedUserInProject(email, projectName); + return new ModelAndView("profile", ImmutableMap.of("user", u, "projectName", projectName, "key", key)); + } + + @RequestMapping(value = "/profile", method = RequestMethod.GET) + public ModelAndView profile(@RequestParam("email") String email, @RequestParam("key") String key) { + User u = userService.findExistedByEmail(email); + return new ModelAndView("profile", ImmutableMap.of("user", u, "key", key)); + } + + @RequestMapping(value = "/save", method = RequestMethod.POST) + public ModelAndView save(@RequestParam("key") String key, @RequestParam(value = "project", required = false) String project, @Valid UserToExt userToExt, BindingResult result) { + if (result.hasErrors()) { + throw new ValidationException(Util.getErrorMessage(result)); + } + userService.update(userToExt); + if (!Strings.isNullOrEmpty(project)) { + String email = userToExt.getEmail(); + groupService.getExistedUserInProject(email, project); + return grantAllAccess(email, userToExt.getGmail(), project, key); + } else { + return new ModelAndView("saveProfile", ImmutableMap.of("userToExt", userToExt, "key", key)); + } + } + + @GetMapping(value = "/users") + public ModelAndView usersInfo(@RequestParam("key") String key, @RequestParam("email") String email) { + List users = userRepository.findAllForStats(); + return (users.stream().anyMatch(u -> u.getEmail().equals(email))) ? + new ModelAndView("users", "users", users) : + new ModelAndView("statsForbidden"); + } + + private ModelAndView grantAllAccess(String email, String gmail, String project, String key) { + log.info("grantAllAccess to {}/{}", email, gmail); + IntegrationService.SlackResponse response = integrationService.sendSlackInvitation(email, project); + String accessResponse = ""; + if (!project.equals("javaops")) { + accessResponse = googleAdminSDKDirectoryService.insertMember(project + "@javaops.ru", gmail); + } + return new ModelAndView("registration", + ImmutableMap.of("response", response, "email", email, + "activationKey", key, + "accessResponse", accessResponse)); + } +} \ No newline at end of file diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index 1f4e9c4..1ff0d3b 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -16,7 +16,6 @@ import ru.javaops.service.*; import ru.javaops.to.UserMail; import ru.javaops.to.UserTo; -import ru.javaops.to.UserToExt; import ru.javaops.util.ProjectUtil; import ru.javaops.util.Util; @@ -53,10 +52,6 @@ public class SubscriptionController { @Autowired private IdeaCouponService ideaCouponService; - @Autowired - private GoogleAdminSDKDirectoryService googleAdminSDKDirectoryService; - - @RequestMapping(value = "/activate", method = RequestMethod.GET) public ModelAndView activate(@RequestParam("email") String email, @RequestParam("activate") boolean activate, @RequestParam("key") String key) { User u = userService.findExistedByEmail(email); @@ -180,44 +175,4 @@ public ModelAndView ideaRegister(@RequestParam("email") String email, @RequestPa throw new IllegalStateException("Ошибка отправки почты" + response); } } - - @RequestMapping(value = "/profile", method = RequestMethod.GET) - public ModelAndView participate(@RequestParam("email") String email, @RequestParam("key") String key) { - User u = userService.findExistedByEmail(email); - return new ModelAndView("profile", ImmutableMap.of("user", u, "key", key)); - } - - @RequestMapping(value = "/participate", method = RequestMethod.GET) - public ModelAndView participate(@RequestParam("email") String email, @RequestParam("key") String key, @RequestParam("project") String projectName) { - User u = groupService.getCurrentUserInProject(email, projectName); - return new ModelAndView("profile", ImmutableMap.of("user", u, "projectName", projectName, "key", key)); - } - - @RequestMapping(value = "/save", method = RequestMethod.POST) - public ModelAndView save(@RequestParam("key") String key, @RequestParam(value = "project", required = false) String project, @Valid UserToExt userToExt, BindingResult result) { - if (result.hasErrors()) { - throw new ValidationException(Util.getErrorMessage(result)); - } - userService.update(userToExt); - if (!Strings.isNullOrEmpty(project)) { - String email = userToExt.getEmail(); - groupService.getCurrentUserInProject(email, project); - return grantAllAccess(email, userToExt.getGmail(), project, key); - } else { - return new ModelAndView("saveProfile", ImmutableMap.of("userToExt", userToExt, "key", key)); - } - } - - private ModelAndView grantAllAccess(String email, String gmail, String project, String key) { - log.info("grantAllAccess to {}/{}", email, gmail); - IntegrationService.SlackResponse response = integrationService.sendSlackInvitation(email, project); - String accessResponse = ""; - if (!project.equals("javaops")) { - accessResponse = googleAdminSDKDirectoryService.insertMember(project + "@javaops.ru", gmail); - } - return new ModelAndView("registration", - ImmutableMap.of("response", response, "email", email, - "activationKey", key, - "accessResponse", accessResponse)); - } } \ No newline at end of file diff --git a/src/main/java/ru/javaops/web/UserController.java b/src/main/java/ru/javaops/web/UserRestController.java similarity index 98% rename from src/main/java/ru/javaops/web/UserController.java rename to src/main/java/ru/javaops/web/UserRestController.java index 72f5330..9a16925 100644 --- a/src/main/java/ru/javaops/web/UserController.java +++ b/src/main/java/ru/javaops/web/UserRestController.java @@ -23,7 +23,7 @@ @RestController @RequestMapping(value = "/api/users", produces = MediaType.APPLICATION_JSON_VALUE) -public class UserController { +public class UserRestController { @Autowired private UserService userService; From e0a88060e1d6551e3504cedae8d3acb770f180e5 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 19 May 2017 16:35:20 +0300 Subject: [PATCH 690/936] Update lesson08 --- resources/mails/topjava/lesson/lesson08.html | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson08.html b/resources/mails/topjava/lesson/lesson08.html index b855650..82994cd 100644 --- a/resources/mails/topjava/lesson/lesson08.html +++ b/resources/mails/topjava/lesson/lesson08.html @@ -8,16 +8,14 @@ Здравствуй firstName!

    -Выложил восьмое занятие нашего проекта.
    - CSS (Bootstrap), JavaScript (jQuery + plugins), AJAX, добавление к REST контроллерам базовой авторизации. +Вчера выложил восьмое занятие нашего проекта.
    + CSS (Bootstrap), JavaScript (jQuery + plugins), AJAX, добавление к REST контроллерам базовой авторизации (в UI и тесты добавим на следующем уроке).

    +Внимание: в конце урока добавил fix 10_fix.patch

    Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
    Обсуждение урока и домашнего задания в slack #hw8

    -

    - Домашнее задание (у кого есть проверка) желательно присылать до вечера 07.02
    -

    From 49535753ed50aaa162427cb5b8aa1f560bf5abfd Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 26 May 2017 17:42:51 +0300 Subject: [PATCH 691/936] Update profile --- resources/view/profile.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/view/profile.html b/resources/view/profile.html index ee25d90..8e9a2bf 100644 --- a/resources/view/profile.html +++ b/resources/view/profile.html @@ -145,7 +145,7 @@

    - +
    From ff99b2ae9f6201361071e0c3b196baafe4c55bf2 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 26 May 2017 17:52:27 +0300 Subject: [PATCH 692/936] Update lesson09 --- resources/mails/topjava/lesson/lesson09.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index 8e4a5a0..e6470f6 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -8,15 +8,15 @@ Здравствуй firstName!

    -Выложил девятое занятие нашего проекта.
    -Наконец делаем настоящую авторизацию, ее тестирование и отрисовку таблицы по AJAX. +В четверг выложил девятое занятие нашего проекта.
    +Наконец делаем настоящую авторизацию, ее тестирование и отрисовку таблиц по AJAX.

    Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
    Обсуждение урока и домашнего задания в slack #hw9

    - Домашнее задание (у кого есть проверка) желательно присылать до вечера 14.02
    + Не тяните с выполнением домашнего задания!

    From e7c2e32bb401cd48be781daa63e7989529e8098b Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 26 May 2017 17:54:30 +0300 Subject: [PATCH 693/936] Update lesson09 --- resources/mails/topjava/lesson/lesson09.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/topjava/lesson/lesson09.html b/resources/mails/topjava/lesson/lesson09.html index e6470f6..64c1b07 100644 --- a/resources/mails/topjava/lesson/lesson09.html +++ b/resources/mails/topjava/lesson/lesson09.html @@ -12,7 +12,7 @@ Наконец делаем настоящую авторизацию, ее тестирование и отрисовку таблиц по AJAX.

    - Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта.
    + Перед накаткой патчей код в ветке master твоего проекта должен быть в том же состоянии, что и ветка master нашего проекта. Обсуждение урока и домашнего задания в slack #hw9

    From 4042f0e8e08e1b947c83e62ca4b1c91983d73917 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Wed, 31 May 2017 11:38:14 +0300 Subject: [PATCH 694/936] Update test --- resources/interview/test.html | 91 +++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 36 deletions(-) diff --git a/resources/interview/test.html b/resources/interview/test.html index f2b32ca..be0c9b7 100644 --- a/resources/interview/test.html +++ b/resources/interview/test.html @@ -36,7 +36,8 @@

    Темы тестового собеседования (можно выбр @@ -71,11 +72,12 @@

    Темы тестового собеседования (можно выбр Транзакции/ACID
  • Maven
  • -
  • Что такое DRY, DIE, KISS, SOLID, YAGNI в программировании
  • +
  • Что такое DRY, DIE, KISS, SOLID, YAGNI в + программировании
  • Задачки
    -

    Время собеседования: 1 час/ 1450 руб./25$

    +

    Время собеседования: 1 час/ 1450 руб./25$

    Детали в скайпе: grigory.kislin

    Skype @@ -85,38 +87,55 @@

    Детали в скайпе: grigory.kisl -
    -
    -

    Отзывы по стажировке Topjava

    -

    Из кнала #interview группы выпускников Slack

    -
    -

    - Всем привет! сходил на первое собеседование на вакансию Junior Java Developer, на следующий день получил офер) - Теперь дорабатываю 2 недели на старом месте и выхожу на работу. Зарплата полностью белая, 60 тыс. рублей к - начислению. Если интересно, напишу подробнее, как проходило собеседование, что спрашивали и т.д. Пока даже с - трудом верится что такое возможно, теперь думаю где может быть подвох:) -

    -

    Компания работает с гос. заказчиками, в штате примерно 120 человек. У них сейчас несколько крупных проектов, на - каждый отдельная команда. В какой конкретно проект я попаду, пока не известно, сказали определят ближе к дате - выхода. Собеседовала меня как обычно сначала HR, задавала общие вопросы, спрашивала что за организация Java - Online Projects, и официально ли я там работаю. Я честно сказал что это стажировка, и описал вкратце как у нас - происходит разработка:) Спрашивала почему решил сменить сферу деятельности и т.д. Потом пришёл руководитель - одного из проектов, в команду к которому я скорее всего попаду, Он спрашивал в основном в общем, на понимание - предметной области: с какими технологиями я знаком, какие для чего применял и т.д. Поспрашивал немного про - микросервисную архитектуру. Сказал что ему в целом всё понятно, и сейчас позовёт тимлида, чтобы проверить мои - технические навыки. Пришёл тимлид, и тоже сначала поспрашивал по технологиям в целом, потом начал задавать более - детальные вопросы по некоторым технологиям. -

    -

    Из тех что запомнил: по мавену - как добавлять зависимости, для чего нужны плагины. По спрингу - как - конфигурируется спринг, какие бывают бины, как сделать бин не синглетоном. Довольно много спрашивал про - Hibernate - какие бывают аннотации, связи, так же дал небольшую задачу на N+1 select. Потом задал буквально пару - вопросов по Java Core - какие бывают коллекции, какие бывают сортированные мапы, что такое Hash. Вот с хэшем я - немного затупил, не смог ответить почему в HashMap в качестве ключа можно добавить объекты с одинаковым хэшем. - Тут тимлида позвали на какое-то важное совещание, и он закончил собеседование, сказав что по результатам мне - сообщат. Я был уверен что меня не возьмут из-за неправильного ответа про хэш, и не очень чётких ответов по - спринг бинам. Но на следующий день HR связалась со мной и прислала офер:) -

    -
    -
    +
    +
    +

    Из кнала #interview группы выпускников Slack

    +
    +

    + Всем привет! сходил на первое собеседование на вакансию Junior Java Developer, на следующий день получил + офер) + Теперь дорабатываю 2 недели на старом месте и выхожу на работу. Зарплата полностью белая, 60 тыс. рублей + к + начислению. Если интересно, напишу подробнее, как проходило собеседование, что спрашивали и т.д. Пока + даже с + трудом верится что такое возможно, теперь думаю где может быть подвох:) +

    +

    Компания работает с гос. заказчиками, в штате примерно 120 человек. У них сейчас несколько крупных + проектов, на + каждый отдельная команда. В какой конкретно проект я попаду, пока не известно, сказали определят ближе к + дате + выхода. Собеседовала меня как обычно сначала HR, задавала общие вопросы, спрашивала что за организация + Java + Online Projects, и официально ли я там работаю. Я честно сказал что это стажировка, и описал вкратце как + у нас + происходит разработка:) Спрашивала почему решил сменить сферу деятельности и т.д. Потом пришёл + руководитель + одного из проектов, в команду к которому я скорее всего попаду, Он спрашивал в основном в общем, на + понимание + предметной области: с какими технологиями я знаком, какие для чего применял и т.д. Поспрашивал немного + про + микросервисную архитектуру. Сказал что ему в целом всё понятно, и сейчас позовёт тимлида, чтобы + проверить мои + технические навыки. Пришёл тимлид, и тоже сначала поспрашивал по технологиям в целом, потом начал + задавать более + детальные вопросы по некоторым технологиям. +

    +

    Из тех что запомнил: по мавену - как добавлять зависимости, для чего нужны плагины. По спрингу - как + конфигурируется спринг, какие бывают бины, как сделать бин не синглетоном. Довольно много спрашивал про + Hibernate - какие бывают аннотации, связи, так же дал небольшую задачу на N+1 select. Потом задал + буквально пару + вопросов по Java Core - какие бывают коллекции, какие бывают сортированные мапы, что такое Hash. Вот с + хэшем я + немного затупил, не смог ответить почему в HashMap в качестве ключа можно добавить объекты с одинаковым + хэшем. + Тут тимлида позвали на какое-то важное совещание, и он закончил собеседование, сказав что по результатам + мне + сообщат. Я был уверен что меня не возьмут из-за неправильного ответа про хэш, и не очень чётких ответов + по + спринг бинам. Но на следующий день HR связалась со мной и прислала офер:) +

    +
    +

    Отзывы по стажировке Topjava

    +
    \ No newline at end of file From 11be77c9fbc760d8eca84ca7efe127720b47e7d7 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Jun 2017 18:14:59 +0300 Subject: [PATCH 695/936] Update topjava --- resources/mails/jr_confirm.html | 93 +++++++++++++++--------- resources/mails/topjava/participate.html | 85 ++++++++++++++-------- 2 files changed, 116 insertions(+), 62 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index b273314..6662c81 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -7,30 +7,37 @@ Здравствуй!

    Ваше решение тестового задания проверено. Поздравляю, результат положительный!
    - Вы зачислены на стажировку JavaRush 06.07.2017 + Вы зачислены на стажировку JavaRush 06.07.2017

    Информация по проекту от преподавателя Григория Кислина:

    -Общение на проекте предлагаю на "ты".
    -

    Поздравляю с участием в стажировке на проекте Java Enterprise:
    Maven/ Spring MVC, Security/ JPA(Hibernate)/ REST(Jackson)/ Bootstrap(CSS)/ jQuery + plugins.

    -Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. -Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние +

    Поздравляю с участием в стажировке на проекте Java Enterprise + (Topjava):
    Maven/ Spring MVC, Security/ JPA(Hibernate)/ REST(Jackson)/ Bootstrap(CSS)/ jQuery + + plugins.

    +Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и +отредактированым записям. +Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все +домашние задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с пройденной на занятии.

    Описание и план проекта
    Демо разрабатываемого приложения

    Заполнение регистрационной формы

    -Общение на проекте будет вестись в группе Slack. Заполни пожалуйста все поля регистрационной формы. После ее сохранения +Общение на проекте будет вестись в группе Slack. Заполни пожалуйста все поля + регистрационной формы. После ее сохранения
    • на почту придет приглашение в группу (обычно в течении 5 мин, проверь папку спам)
    • -
    • по gmail аккаунту предоставится доступ к материалам. Если - картинка по ссылке закрыта, по порядку: +
    • по gmail аккаунту предоставится доступ к материалам. Если + картинка по ссылке закрыта, по порядку:
      • выйти-войти в gmail аккаунт, который ты указал в форме регистрации
      • попробовать войти в анонимной вкладке
      • -
      • Внимание!! НЕ НАДО запрашивать доступ через Google Drive (он дается автоматически по заполнению формы)
      • -
      • если доступа нет, напиши мне в skype grigory.kislin или в личку в группы Slak
      • +
      • Внимание!! НЕ НАДО запрашивать доступ через Google Drive (он дается автоматически по заполнению + формы)
      • +
      • если доступа нет, напиши мне в skype grigory.kislin или в личку в группы Slak
    @@ -42,9 +49,13 @@

    Заполнение регистрационной формы

  • #general: общие вопросы
  • #git: вопросы по git
  • #idea: вопросы по idea
  • -
  • #interview_job: прохождение интервью, работа, вакансии
  • +
  • #interview_job: прохождение интервью, работа, + вакансии +
  • #links: интересные ресурсы
  • -
  • #rss: подписка на публикации от JUG.ru, Хабрабабр, Типичный программист.
  • +
  • #rss: подписка на публикации от JUG.ru, Хабрабабр, + Типичный программист. +
  • Форматирование сообщений в slack
    @@ -53,42 +64,58 @@

    IDE: JetBrains IDEA

    IDEA считается лучшей Java IDE, и по последней статистике IntelliJ is the number one IDE.
    -Поэтому разработка проекта ведется в JetBrains IDEA, брать версию Ultimate
    +Поэтому разработка проекта ведется в JetBrains IDEA, брать версию + Ultimate
    Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую - учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода можно получить согласно политике JetBrains только + учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода +можно получить согласно политике JetBrains только один раз по этой ссылке и далее по инструкции в письме (лучше активировать ее после месячного trial периода, купон будет действителен). -

    Вступительное занятие

    -До старта проекта 16.03 можно приступать к освоению вводного - занятия. Здесь есть видео с подробными инструкциями по установке проекта и работе с системой управления версиями git и GitHub. +

    Вводное занятие

    +До старта проекта 06.07 приступай к освоению вводного + занятия. Здесь есть видео с подробными инструкциями по установке проекта и работе с системой управления +версиями git и GitHub. Перед выполнением домашнего задания объязательно посмотри все видео занятия и следуй инструкциям. Особое внимание обращаю на wiki по ведению проекта в Git, необходимо строго следовать этим правилам.

    Проверка домашних заданий

    Разбор домашний заданий происходит в начале каждого занятия.
    -Если у тебя подписка ментор, то свое решение вступительного задания нужно присылать на проверку начиная c +Если у тебя подписка ментор или Premium Pro, то свое решение вступительного задания нужно присылать на проверку начиная c 06.07 до вечера 11.07 и остальных домашних заданий - до вечера вторника.

    - Проверка заданий подразумевает ревью твоего кода. Ты увидишь именно свои ошибки в стиле, структурах данных, - алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания - это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. - Обычно участники выкладывают свой код и шлют мне ссылку на свой проект в GitHub. - Я проверяю и пишу замечания в slack личным сообщением. Получается эффективно и + Проверка заданий подразумевает ревью твоего кода (лучше ДЗ присылать пораньше, чтобы успеть поправить ошибки и + сделать еще одно ревью). Ты увидишь именно свои ошибки в стиле, структурах данных, алгоритмах и кодировании. Это + самый эффективный способ научиться программировать. Все домашние задания это часть проекта. Часть из них достаточно + простая, часть Optional - сложнее. Обычно участники чекинят код в гитхаб и шлют ссылку на репозиторий. Проверка + заданий делается ассистентом Татьяной при моей поддержке, фидбэк пишется в slack. Получается эффективно и оперативно. Можно что-то переделать и снова поревьюится.

    -Также, начиная с 4-го занятие вы начинаете писать выпускной проект на нашем стеке (Maven/ Spring MVC, Security/ Hibernate/ REST). - Если у тебя есть желание участвовать в стажировке с проверкой заданий и нет подписки ментор, свяжись со мной - отдельно по skype: grigory.kislin или в личку в группы Slak. - Стоимость проверки всех домашних заданий + ревью выпускного проекта: 7900 руб./135$ + Также, начиная с 4-го занятие вы начинаете писать выпускной проект на нашем стеке (Maven/ Spring MVC, Security/ + Hibernate/ REST), ревью которого входит в участие с проверкой. Если у тебя есть желание участвовать в стажировке с проверкой заданий и нет подписки ментор, свяжись со мной + отдельно по skype: grigory.kislin или в личку + в группы Slak. + Стоимость проверки всех домашних заданий + ревью выпускного проекта: 7900 руб./140$

    -Также для всех участников: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта Topjava (ближе к концу проекта я вышлю ссылку). -Проект постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками проект существенно обновился. +Также для всех участников: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта Topjava +(ближе к концу проекта я вышлю ссылку). +Проект постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками проект существенно обновился. + +

    Пожелания к участникам.

    +Обычно участники подбираются с разным уровнем. Поэтому главное- не стеснятся задавать вопросы! Всегда есть поддержка +группы, меня и ассистента Татьяны. Проходят занятия раз в неделю, поэтому времени для усвоения пройденного и выполнения домашних +заданий достаточно, при условии что вы НЕ ОТКЛАДЫВАЕТЕ обучение на потом. В зависимости от уровня подготовки на обучение +необходимо уделять от 5 до 15 часов в неделю. Для усвоения материала ВЫПОЛНЯТЬ ДОМАШНИЕ ЗАДАНИЯ НЕОБХОДИМО: после +лекции, через месяц у студента в голове остаётся 3% знаний. А если он выполнил упражнение на практике то в памяти +сохраняется 95% знаний + бонус. Студент, практикуя упражнение, открывает ещё 50% нюансов знаний, которые не были +озвучены преподавателем.

    Ресурсы

    -Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Для подготовки к проекту рекомендую изучить Полезные ресурсы. - Еще полезные ссылки: +Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Для подготовки к проекту рекомендую изучить +Полезные ресурсы. +Еще полезные ссылки:
    • Wiki по проекту
    • Wiki по GIT
    • diff --git a/resources/mails/topjava/participate.html b/resources/mails/topjava/participate.html index f15eb81..e272174 100644 --- a/resources/mails/topjava/participate.html +++ b/resources/mails/topjava/participate.html @@ -6,40 +6,50 @@

      Здравствуй firstName!

      -

      Поздравляю тебя с участием в проекте Java Enterprise (Topjava)!

      -Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю +

      Поздравляю тебя с участием в проекте Java Enterprise (Topjava)! +

      +Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и +отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с пройденной на занятии.

      Описание и план проекта
      Демо разрабатываемого приложения

      Заполнение регистрационной формы

      -Общение на проекте будет вестись в группе Slack. Заполни пожалуйста все поля регистрационной формы. После ее сохранения +Общение на проекте будет вестись в группе Slack. Заполни пожалуйста все поля + регистрационной формы. После ее сохранения
      • на почту придет приглашение в группу (обычно в течении 5 мин, проверь папку спам)
      • -
      • по gmail аккаунту предоставится доступ к материалам. Если +
      • по gmail аккаунту предоставится доступ к материалам. Если картинка по ссылке закрыта, по порядку:
        • выйти-войти в gmail аккаунт, который ты указал в форме регистрации
        • попробовать войти в анонимной вкладке
        • -
        • Внимание!! НЕ НАДО запрашивать доступ через Google Drive (он дается автоматически по заполнению формы)
        • -
        • если доступа нет, напиши мне в skype grigory.kislin или в личку в группы Slak
        • +
        • Внимание!! НЕ НАДО запрашивать доступ через Google Drive (он дается автоматически по заполнению + формы)
        • +
        • если доступа нет, напиши мне в skype grigory.kislin или в личку в группы Slak
      Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал.
      Обсуждение вступительного занятия происходит в канале Slack #hw0.
      + href="https://topjava11.slack.com/messages/hw0/">#hw0.
        Другие каналы Slack: -
      • #flooding: оффтопик
      • -
      • #general: общие вопросы
      • -
      • #git: вопросы по git
      • -
      • #idea: вопросы по idea
      • -
      • #interview_job: прохождение интервью, работа, вакансии
      • -
      • #links: интересные ресурсы
      • -
      • #rss: подписка на публикации от JUG.ru, Хабрабабр, Типичный программист.
      • +
      • #flooding: оффтопик
      • +
      • #general: общие вопросы
      • +
      • #git: вопросы по git
      • +
      • #idea: вопросы по IDEA
      • +
      • #interview_job: прохождение интервью, работа, + вакансии +
      • +
      • #links: интересные ресурсы
      • +
      • #rss: подписка на публикации от JUG.ru, Хабрабабр, + Типичный программист. +
      Форматирование сообщений в slack
      @@ -48,33 +58,49 @@

      IDE: JetBrains IDEA

      IDEA считается лучшей Java IDE, и по последней статистике IntelliJ is the number one IDE.
      -Поэтому разработка проекта ведется в JetBrains IDEA, брать версию Ultimate
      +Поэтому разработка проекта ведется в JetBrains IDEA, брать версию + Ultimate
      Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую - учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода можно получить согласно политике JetBrains только + учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода +можно получить согласно политике JetBrains только один раз по этой ссылке и далее по инструкции в письме (лучше активировать ее после месячного trial периода, купон будет действителен). -

      Вступительное занятие

      -До старта проекта 16.03 можно приступать к освоению вводного - занятия. Здесь есть видео с подробными инструкциями по установке проекта и работе с системой управления версиями git и GitHub. +

      Вводное занятие

      +До старта проекта 06.07 приступай к освоению вводного + занятия. Здесь есть видео с подробными инструкциями по установке проекта и работе с системой управления +версиями git и GitHub. Перед выполнением домашнего задания объязательно посмотри все видео занятия и следуй -инструкциям. Особое внимание обращаю на wiki по ведению - проекта в Git, необходимо строго следовать этим правилам. +инструкциям. Особое внимание обращаю на WIKI по ведению + проекта в Git, необходимо строго следовать этим правилам!.

      Проверка домашних заданий

      Разбор домашний заданий происходит в начале каждого занятия.
      Если у тебя участие с проверкой ДЗ, то свое решение вступительного задания желательно присылать на проверку начиная c -16.03 до вечера 21.03, остальных домашних заданий - до вечера вторника. +06.07 до вечера 11.07, остальных домашних заданий - до вечера вторника.

      - Проверка заданий подразумевает ревью твоего кода. Ты увидишь именно свои ошибки в стиле, структурах данных, + Проверка заданий подразумевает ревью твоего кода (лучше ДЗ присылать пораньше, чтобы успеть поправить ошибки и + сделать еще одно ревью). Ты увидишь именно свои ошибки в стиле, структурах данных, алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в - гитхаб и шлют мне ссылку на репозиторий. Я проверяю и фидбэк пишу в slack. Получается эффективно и + гитхаб и шлют ссылку на репозиторий. Проверка заданий делается ассистентом Татьяной при моей поддержке, фидбэк + пишется в slack. Получается эффективно и оперативно. Можно что-то переделать и снова поревьюится.

      -Также для всех участников: бесплатное (или с доплатой за проверку) участие в следующий выпусках проекта Topjava (ближе к концу проекта я вышлю ссылку). -Проект постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками проект существенно обновился. +Для всех участников: БЕСПЛАТНОЕ участие в следующий выпусках проекта Topjava (по желанию, ближе к концу проекта я вышлю +ссылку). +Проект постоянно развивается, в том числе благодаря вашему активному участию. По сравнению с первыми выпусками проект существенно обновился. -

      Ресурсы

      +

      Пожелания к участникам.

      +Обычно участники подбираются с разным уровнем. Поэтому главное- не стеснятся задавать вопросы! Всегда есть поддержка +группы, меня и ассистента Татьяны. Проходят занятия раз в неделю, поэтому времени для усвоения пройденного и выполнения домашних +заданий достаточно, при условии что вы НЕ ОТКЛАДЫВАЕТЕ обучение на потом. В зависимости от уровня подготовки на обучение +необходимо уделять от 5 до 15 часов в неделю. Для усвоения материала ВЫПОЛНЯТЬ ДОМАШНИЕ ЗАДАНИЯ НЕОБХОДИМО: после +лекции, через месяц у студента в голове остаётся 3% знаний. А если он выполнил упражнение на практике то в памяти +сохраняется 95% знаний + бонус. Студент, практикуя упражнение, открывает ещё 50% нюансов знаний, которые не были +озвучены преподавателем. + +

      Ресурсы

      Основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия. Рекомендую также изучить полезные ресурсы. +

      Удачи в освоении материалов и выполнении задания,
      Григорий Кислин
      From 2fa40986987431c16ef913e094620e957f195c72 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Jun 2017 18:25:46 +0300 Subject: [PATCH 696/936] Update topjava --- resources/mails/jr_confirm.html | 23 ++++++++++++++--------- resources/mails/topjava/participate.html | 11 +++++------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 6662c81..b5f25e0 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -41,10 +41,11 @@

      Заполнение регистрационной формы

  • -Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал.
    -Обсуждение вступительного занятия происходит в канале Slack #hw0.
    -
      Другие каналы Slack: +Другие каналы Slack: +
      • #flooding: оффтопик
      • #general: общие вопросы
      • #git: вопросы по git
      • @@ -63,8 +64,8 @@

        Заполнение регистрационной формы

        IDE: JetBrains IDEA

        IDEA считается лучшей Java IDE, и по последней - статистике IntelliJ is the number one IDE.
        -Поэтому разработка проекта ведется в JetBrains IDEA, брать версию + статистике IntelliJ is the number one IDE. Поэтому разработка проекта ведется в JetBrains IDEA, брать версию Ultimate
        Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую @@ -81,19 +82,22 @@

        Вводное занятие

        проекта в Git
        , необходимо строго следовать этим правилам
        .

        Проверка домашних заданий

        Разбор домашний заданий происходит в начале каждого занятия.
        -Если у тебя подписка ментор или Premium Pro, то свое решение вступительного задания нужно присылать на проверку начиная c +Если у тебя подписка ментор или Premium Pro, то свое решение вступительного задания нужно присылать на +проверку начиная c 06.07 до вечера 11.07 и остальных домашних заданий - до вечера вторника.

        Проверка заданий подразумевает ревью твоего кода (лучше ДЗ присылать пораньше, чтобы успеть поправить ошибки и сделать еще одно ревью). Ты увидишь именно свои ошибки в стиле, структурах данных, алгоритмах и кодировании. Это - самый эффективный способ научиться программировать. Все домашние задания это часть проекта. Часть из них достаточно + самый эффективный способ научиться программировать. Все домашние задания это часть проекта. Часть из них + достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в гитхаб и шлют ссылку на репозиторий. Проверка заданий делается ассистентом Татьяной при моей поддержке, фидбэк пишется в slack. Получается эффективно и оперативно. Можно что-то переделать и снова поревьюится.

        Также, начиная с 4-го занятие вы начинаете писать выпускной проект на нашем стеке (Maven/ Spring MVC, Security/ - Hibernate/ REST), ревью которого входит в участие с проверкой. Если у тебя есть желание участвовать в стажировке с проверкой заданий и нет подписки ментор, свяжись со мной + Hibernate/ REST), ревью которого входит в участие с проверкой. Если у тебя есть желание участвовать в стажировке с + проверкой заданий и нет подписки ментор, свяжись со мной отдельно по skype: grigory.kislin или в личку в группы Slak. Стоимость проверки всех домашних заданий + ревью выпускного проекта: 7900 руб./140$ @@ -105,7 +109,8 @@

        Проверка домашних заданий

        Пожелания к участникам.

        Обычно участники подбираются с разным уровнем. Поэтому главное- не стеснятся задавать вопросы! Всегда есть поддержка -группы, меня и ассистента Татьяны. Проходят занятия раз в неделю, поэтому времени для усвоения пройденного и выполнения домашних +группы, меня и ассистента Татьяны. Проходят занятия раз в неделю, поэтому времени для усвоения пройденного и выполнения +домашних заданий достаточно, при условии что вы НЕ ОТКЛАДЫВАЕТЕ обучение на потом. В зависимости от уровня подготовки на обучение необходимо уделять от 5 до 15 часов в неделю. Для усвоения материала ВЫПОЛНЯТЬ ДОМАШНИЕ ЗАДАНИЯ НЕОБХОДИМО: после лекции, через месяц у студента в голове остаётся 3% знаний. А если он выполнил упражнение на практике то в памяти diff --git a/resources/mails/topjava/participate.html b/resources/mails/topjava/participate.html index e272174..27512f6 100644 --- a/resources/mails/topjava/participate.html +++ b/resources/mails/topjava/participate.html @@ -35,10 +35,10 @@

        Заполнение регистрационной формы

    -Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал.
    -Обсуждение вступительного занятия происходит в канале Slack #hw0.
    -
      Другие каналы Slack: +Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. Обсуждение вступительного занятия происходит в канале Slack #hw0.
      +Другие каналы Slack: + Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. Обсуждение вступительного занятия происходит в канале Slack #hw0.
      + href="https://topjava11.slack.com/messages/hw0/">#hw0.
      Другие каналы Slack:
      • #flooding: оффтопик
      • From d2014431066eb4bad61cfb73277857d28fb13013 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Jun 2017 19:38:02 +0300 Subject: [PATCH 698/936] Update jr --- resources/mails/jr_confirm.html | 5 ++++- .../java/ru/javaops/service/MailService.java | 2 +- .../javaops/web/SubscriptionController.java | 2 +- .../ru/javaops/service/MailServiceTest.java | 22 +++++++++++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index b5f25e0..2664257 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -1,7 +1,7 @@ - Зачисление на стажировку JavaRush 16.03 + Зачисление на стажировку JavaRush 06.07.2017

        Здравствуй!
        @@ -9,6 +9,9 @@

        Ваше решение тестового задания проверено. Поздравляю, результат положительный!
        Вы зачислены на стажировку JavaRush 06.07.2017

        +

        + Тип участия: (про проверку домашних заданий смотрите ниже). +

        Информация по проекту от преподавателя Григория Кислина:

        Поздравляю с участием в стажировке на проекте Java Enterprise (Topjava):
        Maven/ Spring MVC, Security/ JPA(Hibernate)/ REST(Jackson)/ Bootstrap(CSS)/ jQuery + diff --git a/src/main/java/ru/javaops/service/MailService.java b/src/main/java/ru/javaops/service/MailService.java index 47e242b..275cc5f 100644 --- a/src/main/java/ru/javaops/service/MailService.java +++ b/src/main/java/ru/javaops/service/MailService.java @@ -101,7 +101,7 @@ public GroupResult sendToUserList(String template, Set users) { return groupResultBuilder.buildOK(); } - private User getAppUser() { + User getAppUser() { return userService.findExistedByEmail(appProperties.getEmail()); } diff --git a/src/main/java/ru/javaops/web/SubscriptionController.java b/src/main/java/ru/javaops/web/SubscriptionController.java index 1ff0d3b..d93cb2e 100644 --- a/src/main/java/ru/javaops/web/SubscriptionController.java +++ b/src/main/java/ru/javaops/web/SubscriptionController.java @@ -80,7 +80,7 @@ public ModelAndView registerInGroup(@RequestParam("group") String group, UserGroup userGroup = groupService.registerAtGroup(userTo, group, channel, participationType); String mailResult = "без отправки"; if (StringUtils.isNotEmpty(template)) { - mailResult = mailService.sendToUser(template, userGroup.getUser()); + mailResult = mailService.sendWithTemplate(template, new UserMail(userGroup.getUser()), ImmutableMap.of("participationType", participationType)); } ImmutableMap params = ImmutableMap.of("userGroup", userGroup, "result", mailResult); diff --git a/src/test/java/ru/javaops/service/MailServiceTest.java b/src/test/java/ru/javaops/service/MailServiceTest.java index c16289f..92257af 100644 --- a/src/test/java/ru/javaops/service/MailServiceTest.java +++ b/src/test/java/ru/javaops/service/MailServiceTest.java @@ -1,8 +1,12 @@ package ru.javaops.service; +import com.google.common.collect.ImmutableMap; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import ru.javaops.ApplicationAbstractTest; +import ru.javaops.model.ParticipationType; +import ru.javaops.model.User; +import ru.javaops.to.UserMail; /** * GKislin @@ -13,8 +17,26 @@ public class MailServiceTest extends ApplicationAbstractTest { @Autowired private MailService mailService; + @Autowired + private SubscriptionService subscriptionService; + @Test public void testSendMail() throws Exception { System.out.println(mailService.sendTest("jr_confirm")); } + + @Test + public void testTemplate() throws Exception { + User userMail = mailService.getAppUser(); + String activationKey = subscriptionService.generateActivationKey(userMail.getEmail()); + String subscriptionUrl = subscriptionService.getSubscriptionUrl(userMail.getEmail(), activationKey, false); + + String content = mailService.getContent("jr_confirm", + ImmutableMap.of("participationType", ParticipationType.HW_REVIEW, + "user", new UserMail(userMail), + "subscriptionUrl", subscriptionUrl, + "activationKey", activationKey)); + + System.out.println(content); + } } \ No newline at end of file From ae9df20cbc59132e1e08625f98f9df5241ad46b7 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Jun 2017 20:41:55 +0300 Subject: [PATCH 699/936] Update jr --- resources/mails/jr_confirm.html | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 2664257..1142795 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -7,21 +7,23 @@ Здравствуй!

        Ваше решение тестового задания проверено. Поздравляю, результат положительный!
        - Вы зачислены на стажировку JavaRush 06.07.2017 + Вы зачислены на стажировку JavaRush 06.07.2017

        Тип участия: (про проверку домашних заданий смотрите ниже).

        Информация по проекту от преподавателя Григория Кислина:

        -

        Поздравляю с участием в стажировке на проекте Java Enterprise - (Topjava):
        Maven/ Spring MVC, Security/ JPA(Hibernate)/ REST(Jackson)/ Bootstrap(CSS)/ jQuery + - plugins.

        +

        Поздравляю с участием в стажировке на проекте Java Enterprise + (Topjava)

        + Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и HSQLDB +

        Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с пройденной на занятии. +

        Описание и план проекта
        Демо разрабатываемого приложения

        Заполнение регистрационной формы

        @@ -69,8 +71,7 @@

        IDE: JetBrains IDEA

        href="http://zeroturnaround.com/rebellabs/java-tools-and-technologies-landscape-2016/">последней статистике IntelliJ is the number one IDE. Поэтому разработка проекта ведется в JetBrains IDEA, брать версию - Ultimate
        -Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять . Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода можно получить согласно политике JetBrains только @@ -98,9 +99,9 @@

        Проверка домашних заданий

        оперативно. Можно что-то переделать и снова поревьюится.

        - Также, начиная с 4-го занятие вы начинаете писать выпускной проект на нашем стеке (Maven/ Spring MVC, Security/ - Hibernate/ REST), ревью которого входит в участие с проверкой. Если у тебя есть желание участвовать в стажировке с - проверкой заданий и нет подписки ментор, свяжись со мной + Также, начиная с 4-го занятие участники разраатывают выпускной проект на нашем стеке (Maven/ Spring MVC, Security/ + Hibernate/ REST), ревью которого входит в участие с проверкой. Если у тебя тип участие "без проверки" ДЗ и есть желание участвовать с + проверкой, свяжись со мной отдельно по skype: grigory.kislin или в личку в группы Slak. Стоимость проверки всех домашних заданий + ревью выпускного проекта: 7900 руб./140$ @@ -111,7 +112,7 @@

        Проверка домашних заданий

        href="https://github.com/JavaOPs/topjava/blob/master/ReleaseNotes.md">проект существенно обновился.

        Пожелания к участникам.

        -Обычно участники подбираются с разным уровнем. Поэтому главное- не стеснятся задавать вопросы! Всегда есть поддержка +Обычно участники подбираются с разным уровнем. Поэтому главное - не стеснятся задавать вопросы! Всегда есть поддержка группы, меня и ассистента Татьяны. Проходят занятия раз в неделю, поэтому времени для усвоения пройденного и выполнения домашних заданий достаточно, при условии что вы НЕ ОТКЛАДЫВАЕТЕ обучение на потом. В зависимости от уровня подготовки на обучение From efbe12fa0296d668ae8f379132c9f926b69fc5cd Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Jun 2017 20:46:01 +0300 Subject: [PATCH 700/936] Update topjava --- resources/mails/jr_confirm.html | 2 +- resources/mails/topjava/participate.html | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 1142795..ed68521 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -15,7 +15,7 @@

        Информация по проекту от преподавателя Григория Кислина:

        Поздравляю с участием в стажировке на проекте Java Enterprise (Topjava)

        - Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и HSQLDB +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и HSQLDB.

        Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. diff --git a/resources/mails/topjava/participate.html b/resources/mails/topjava/participate.html index c7f57a0..a2d0886 100644 --- a/resources/mails/topjava/participate.html +++ b/resources/mails/topjava/participate.html @@ -6,13 +6,15 @@

        Здравствуй firstName!

        -

        Поздравляю тебя с участием в проекте Java Enterprise (Topjava)! -

        +

        Поздравляю тебя с участием в проекте Java Enterprise (Topjava)!

        +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и HSQLDB. +

        Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю (четверг) производится рассылка новых материалов, обновления к проекту (патчи) и домашние задания. Все домашние задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с пройденной на занятии. +

        Описание и план проекта
        Демо разрабатываемого приложения

        Заполнение регистрационной формы

        From 20da2b0844f191af1582ec5571b800fb3f187a01 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Thu, 1 Jun 2017 20:48:51 +0300 Subject: [PATCH 701/936] Update topjava --- resources/mails/jr_confirm.html | 2 +- resources/mails/topjava/participate.html | 2 +- resources/view/topjava.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index ed68521..10fc713 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -15,7 +15,7 @@

        Информация по проекту от преподавателя Григория Кислина:

        Поздравляю с участием в стажировке на проекте Java Enterprise (Topjava)

        -Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и HSQLDB. +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и сохранением в базах данных Postgresql и HSQLDB.

        Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. diff --git a/resources/mails/topjava/participate.html b/resources/mails/topjava/participate.html index a2d0886..dd31125 100644 --- a/resources/mails/topjava/participate.html +++ b/resources/mails/topjava/participate.html @@ -7,7 +7,7 @@ Здравствуй firstName!

        Поздравляю тебя с участием в проекте Java Enterprise (Topjava)!

        -Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и HSQLDB. +Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и сохранением в базах данных Postgresql и HSQLDB.

        Общение на проекте предлагаю на "ты". Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям. Раз в неделю diff --git a/resources/view/topjava.html b/resources/view/topjava.html index de17a7e..bdc8017 100644 --- a/resources/view/topjava.html +++ b/resources/view/topjava.html @@ -26,7 +26,7 @@

        Стажировка Java Enterprise (Topjava)

        Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), - datatables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и + datatables, jQuery + plugins, Java 8 Stream and Time API и сохранением в базах данных Postgresql и HSQLDB.

        From 9d5638f4fae26c5612efca2f2ee8ff2e08ac6eb0 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 2 Jun 2017 13:10:22 +0300 Subject: [PATCH 702/936] Create basejava participate --- resources/mails/basejava/participate.html | 93 ++++++++++++++++++++ resources/mails/jr_confirm.html | 2 +- resources/mails/masterjava/participate2.html | 2 +- resources/mails/topjava/participate.html | 4 +- src/main/resources/application.yaml | 8 +- 5 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 resources/mails/basejava/participate.html diff --git a/resources/mails/basejava/participate.html b/resources/mails/basejava/participate.html new file mode 100644 index 0000000..dc55124 --- /dev/null +++ b/resources/mails/basejava/participate.html @@ -0,0 +1,93 @@ + + + + Участие в проекте 'Разработка Web приложения "База данных резюме"'. + +

        + Здравствуй firstName!
        +

        +

        + Поздравляю тебя с участием в проекте "Разработка Web приложения "База данных резюме""!
        + На проекте общаемся на ты, так удобнее и процесс становится более неформальным. Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям в индивидуальном режиме. Все домашние + задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с + пройденной на занятии. +

        +

        Заполнение регистрационной формы

        +Общение на проекте будет вестись в группе Slack. Заполни пожалуйста все поля + регистрационной формы. После ее сохранения +
          +
        • на почту придет приглашение в группу (обычно в течении 5 мин, проверь папку спам)
        • +
        • по gmail аккаунту предоставится доступ к материалам. Если + картинка по ссылке закрыта, по порядку: +
            +
          • выйти-войти в gmail аккаунт, который ты указал в форме регистрации
          • +
          • попробовать войти в анонимной вкладке
          • +
          • Внимание!! НЕ НАДО запрашивать доступ через Google Drive (он дается автоматически по заполнению + формы)
          • +
          • если доступа нет, напиши мне в skype grigory.kislin или в личку в группы Slak
          • +
          +
        • +
        +Общение в Slack происходит в каналах по темам, для каждого нового занятие будет делаться отдельный канал. Обсуждение первого занятия происходит в канале Slack #lesson01.
        +Другие каналы Slack: +
          +
        • #flooding: оффтопик
        • +
        • #general: общие вопросы
        • +
        • #idea: вопросы по IDEA
        • +
        • #links: интересные ресурсы
        • +
        • #rss: подписка на публикации от JUG.ru, Хабрабабр, + Типичный программист. +
        • +
        +Форматирование сообщений в + slack
        +Desktop/ Mobile приложение Slack +

        IDE: JetBrains IDEA

        +IDEA считается лучшей Java IDE, и по последней + статистике IntelliJ is the number one IDE. Поэтому разработка проекта ведется в JetBrains IDEA, брать версию + Ultimate
        +Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую + учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода +можно получить согласно политике JetBrains только +один раз по этой ссылке и далее по +инструкции в письме (лучше активировать ее после месячного trial периода, купон будет действителен). +

        Проверка домашних заданий

        +Разбор домашний заданий происходит в начале каждого занятия.
        +Если у тебя участие с проверкой ДЗ, то свое решение нужно присылать на проверку +Татьяне (@tanya) личным сообщением группы Slak в течении недели. +Если есть объективные причины, по которым не получается выполнить задание в течении недели, необходимо сообщить об этом Татьяне (из за разницы во времени Татьяна появляется онлайн ближе к вечеру). +

        + Проверка заданий подразумевает ревью твоего кода (лучше ДЗ присылать пораньше, чтобы успеть поправить ошибки и + сделать еще одно ревью). Ты увидишь именно свои ошибки в стиле, структурах данных, + алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания + являются частью проекта. Участники чекинят код в + гитхаб и шлют ссылку на репозиторий. Результат проверки пишется в slack. Получается эффективно и + оперативно. Можно что-то переделать и снова поревьюится.
        +

        +

        Пожелания к участникам.

        +Для усвоения материала ВЫПОЛНЯТЬ ДОМАШНИЕ ЗАДАНИЯ НЕОБХОДИМО: после +лекции, через месяц у студента в голове остаётся 3% знаний. А если он выполнил упражнение на практике то в памяти +сохраняется 95% знаний + бонус. Студент, практикуя упражнение, открывает ещё 50% нюансов знаний, которые не были +озвучены преподавателем. + +

        Ресурсы

        + +

        + Удачи в освоении материалов и выполнении задания,
        + Григорий Кислин
        + skype: grigory.kislin +

        +

        + Java Online Projects +

        + \ No newline at end of file diff --git a/resources/mails/jr_confirm.html b/resources/mails/jr_confirm.html index 10fc713..8ae16ff 100644 --- a/resources/mails/jr_confirm.html +++ b/resources/mails/jr_confirm.html @@ -95,7 +95,7 @@

        Проверка домашних заданий

        самый эффективный способ научиться программировать
        . Все домашние задания это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в гитхаб и шлют ссылку на репозиторий. Проверка - заданий делается ассистентом Татьяной при моей поддержке, фидбэк пишется в slack. Получается эффективно и + заданий делается ассистентом Татьяной при моей поддержке, результат проверки пишется в slack. Получается эффективно и оперативно. Можно что-то переделать и снова поревьюится.

        diff --git a/resources/mails/masterjava/participate2.html b/resources/mails/masterjava/participate2.html index 9df21fc..f5a1e80 100644 --- a/resources/mails/masterjava/participate2.html +++ b/resources/mails/masterjava/participate2.html @@ -34,7 +34,7 @@

        Приглашение в Slack и доступ к материалам

      -Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал.
      +Общение в Slack происходит в каналах по темам, для каждого нового занятия будет делаться отдельный канал.
      Обсуждение первого занятия происходит в канале Slack #hw01.
        diff --git a/resources/mails/topjava/participate.html b/resources/mails/topjava/participate.html index dd31125..54c3916 100644 --- a/resources/mails/topjava/participate.html +++ b/resources/mails/topjava/participate.html @@ -37,7 +37,7 @@

        Заполнение регистрационной формы

    -Общение в Slack происходит в каналах по темам, для каждого нового урока будет делаться отдельный канал. Обсуждение вступительного занятия происходит в канале Slack #hw0.
    Другие каналы Slack:
      @@ -83,7 +83,7 @@

      Проверка домашних заданий

      сделать еще одно ревью). Ты увидишь именно свои ошибки в стиле, структурах данных, алгоритмах и кодировании. Это самый эффективный способ научиться программировать. Все домашние задания это часть проекта. Часть из них достаточно простая, часть Optional - сложнее. Обычно участники чекинят код в - гитхаб и шлют ссылку на репозиторий. Проверка заданий делается ассистентом Татьяной при моей поддержке, фидбэк + гитхаб и шлют ссылку на репозиторий. Проверка заданий делается ассистентом Татьяной при моей поддержке, результат проверки пишется в slack. Получается эффективно и оперативно. Можно что-то переделать и снова поревьюится.

      diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index bfa78bc..8e05265 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -19,7 +19,7 @@ spring: #http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-caching.html#boot-features-caching-provider-caffeine spring.cache: cache-names: group, groups, member_groups - guava.spec: maximumSize=100, expireAfterAccess=300s + guava.spec: maximumSize=100, expireAfterAccess=15s logging: file: javaops.log @@ -28,6 +28,6 @@ logging: org.hibernate.engine.jdbc.spi.SqlStatementLogger: DEBUG spring.http.encoding: - charset: UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly. - enabled: true # Enable http encoding support. - force: true \ No newline at end of file + charset: UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly. + enabled: true # Enable http encoding support. + force: true \ No newline at end of file From 20e0d6901be3c7258cf0cfd5514e41677c3e77c2 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 2 Jun 2017 13:27:04 +0300 Subject: [PATCH 703/936] Update participate --- resources/mails/basejava/participate.html | 5 ++--- resources/mails/masterjava/participate.html | 4 ++-- resources/mails/masterjava/participate2.html | 3 +-- resources/mails/topjava/participate.html | 3 +-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/resources/mails/basejava/participate.html b/resources/mails/basejava/participate.html index dc55124..94f3cd3 100644 --- a/resources/mails/basejava/participate.html +++ b/resources/mails/basejava/participate.html @@ -7,7 +7,7 @@ Здравствуй firstName!

      - Поздравляю тебя с участием в проекте "Разработка Web приложения "База данных резюме""!
      + Поздравляю тебя с участием в проекте "Разработка Web приложения "База данных резюме""!
      На проекте общаемся на ты, так удобнее и процесс становится более неформальным. Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям в индивидуальном режиме. Все домашние задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с пройденной на занятии. @@ -51,8 +51,7 @@

      IDE: JetBrains IDEA

      IDEA считается лучшей Java IDE, и по последней статистике IntelliJ is the number one IDE. Поэтому разработка проекта ведется в JetBrains IDEA, брать версию - Ultimate
      -Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять
      . Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода можно получить согласно политике JetBrains только diff --git a/resources/mails/masterjava/participate.html b/resources/mails/masterjava/participate.html index 8307756..e5de4da 100644 --- a/resources/mails/masterjava/participate.html +++ b/resources/mails/masterjava/participate.html @@ -56,8 +56,8 @@

      Приглашение в Slack и доступ к материалам

      slack
      Desktop/ Mobile приложение Slack

      IDE: JetBrains IDEA

      -Разработка проекта ведется в JetBrains IDEA, брать версию Ultimate
      -Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую +Разработка проекта ведется в JetBrains IDEA, брать версию Ultimate. + Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода можно получить согласно политике JetBrains только один раз по этой ссылке и далее по инструкции в письме. diff --git a/resources/mails/masterjava/participate2.html b/resources/mails/masterjava/participate2.html index f5a1e80..7cfa5e1 100644 --- a/resources/mails/masterjava/participate2.html +++ b/resources/mails/masterjava/participate2.html @@ -49,8 +49,7 @@

      Приглашение в Slack и доступ к материалам

      slack
      Desktop/ Mobile приложение Slack

      -Разработка проекта ведется в JetBrains IDEA, брать версию Ultimate
      -Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую +Разработка проекта ведется в JetBrains IDEA, брать версию Ultimate. Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода можно получить согласно политике JetBrains только один раз. Если ты еще не брал ключ, напиши мне плз в личку.

      diff --git a/resources/mails/topjava/participate.html b/resources/mails/topjava/participate.html index 54c3916..6c52f76 100644 --- a/resources/mails/topjava/participate.html +++ b/resources/mails/topjava/participate.html @@ -60,8 +60,7 @@

      IDE: JetBrains IDEA

      IDEA считается лучшей Java IDE, и по последней статистике IntelliJ is the number one IDE. Поэтому разработка проекта ведется в JetBrains IDEA, брать версию - Ultimate
      -Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять
      . Если ты студент (или есть знакомые студенты/ аспиранты), то лучше взять студенческую учебную лицензию JetBrains IDEA на год. Купон на бесплатную личную лизензию IntelliJ IDEA на полгода можно получить согласно политике JetBrains только From 22651987649d798276c4bd7cf32e21f46cef9824 Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 2 Jun 2017 13:53:23 +0300 Subject: [PATCH 704/936] Update participate --- resources/mails/basejava/participate.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/mails/basejava/participate.html b/resources/mails/basejava/participate.html index 94f3cd3..327e64c 100644 --- a/resources/mails/basejava/participate.html +++ b/resources/mails/basejava/participate.html @@ -10,7 +10,7 @@ Поздравляю тебя с участием в проекте "Разработка Web приложения "База данных резюме""!
      На проекте общаемся на ты, так удобнее и процесс становится более неформальным. Проект ведется по подготовленным на основе вебинара, разбитым по темам и отредактированым записям в индивидуальном режиме. Все домашние задания являются чаcтью проекта, подобранны по темам занятий и требуют реализации функциональности, схожей с - пройденной на занятии. + пройденной на занятии. Куратор проекта Татьяна.

      Заполнение регистрационной формы

      Общение на проекте будет вестись в группе Slack. Заполни пожалуйста все поля From e49f9df581b8f35cf8872df139e5b3b4c614ae6f Mon Sep 17 00:00:00 2001 From: Grigory Kislin Date: Fri, 2 Jun 2017 16:02:39 +0300 Subject: [PATCH 705/936] Update info --- resources/mails/topjava/lesson/lesson10.html | 9 +++-- resources/mails/topjava_info.html | 40 ++++++++++---------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/resources/mails/topjava/lesson/lesson10.html b/resources/mails/topjava/lesson/lesson10.html index 5dcf4df..434f611 100644 --- a/resources/mails/topjava/lesson/lesson10.html +++ b/resources/mails/topjava/lesson/lesson10.html @@ -14,8 +14,8 @@ Домашнее задание (у кого есть проверка) желательно присылать до вечера 21.02

      -23.02 проведем заключительное занятие с деплоем в Heroku.
      -Для участников с проверкой ДЗ принимаю выпускной проект на ревью в течении 3 недель после окончания Topjava, до 14.03.
      +08.06 проведем заключительное занятие с деплоем в Heroku.
      +Для участников с проверкой ДЗ принимаю выпускной проект на ревью в течении 3 недель после окончания Topjava, до 06.07.

      Напоминаю про группу Slack Java Online Projects, где мы все общаемся на IT темы (помощь с Java, отзывы о работах, @@ -29,9 +29,10 @@ После сохранения формы на почту должно прийти приглашение в группу Slack (обычно в течении 5 минут) и откроется ссылка на список участников, отсортированный по городам. Группу topjava10 после окончания проекта удалю.

      -Следующий выпуск TopJava10 начнется 16.03 (первое занятие 23.03, тут есть расписание). Повторное участие без проверки домашних заданий бесплатное. Единственное условие: пожалуйста сделай репост объявления о наборе в VK или в Facebook. +Следующий выпуск TopJava10 начнется 06.07 (первое занятие 13.07, тут есть расписание). +Повторное участие без проверки домашних заданий бесплатное. Единственное условие: пожалуйста сделай репост объявления о наборе в VK или в Facebook. Для повторного участия зарегистрируйся тут и тебе - придет ссылка на группу Slack topjava10. + придет ссылка на группу Slack topjava11.

      diff --git a/resources/mails/topjava_info.html b/resources/mails/topjava_info.html index dbe46da..2adc364 100644 --- a/resources/mails/topjava_info.html +++ b/resources/mails/topjava_info.html @@ -78,6 +78,27 @@

      После проекта в твоем резюме появится раз
    • реализация клиента на Bootstrap (css/js), datatables, jQuery + plugins.
    • твоя доработка проекта
    +
    +
      +
    • Стоимость участия без проверки домашних заданий: 8300 руб./ 150$
      + сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом.

      +
    • +
    • Стоимость полного пакета: 16200 руб./ 294$
      + добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания + при устройстве на работу).

    • +
    • Для всех: бесплатное участие в следующий выпусках проекта.

    • +
    • Скидка на другие проекты: 700 руб. (без ДЗ) и 1500 руб (с ДЗ).

    • +
    • Добавляйся в skype: grigory.kislin с пометкой topjava.

    • +
    • Способы оплаты (если у тебя есть подписка "стажировка/PremiumPro" от JavaRush, объязательно перед оплатой свяжись со мной)
      + После оплаты объязательно напиши в skype grigory.ksilin, куда была оплата и свой email (или можно написать информацию по оплате в ответ на это письмо)

    • +
    • Вопросы по проекту
    • +
    • Ресурсы для подготовки +
    • +
    • Курс рубля
    • +
    +
    +

    До 15.06 ранняя цена: 7900 руб./ 143$ , с проверкой и ревью выпускного: 15500 руб./ 272$

    +

    На проекте

    • Основное внимание будет уделяться способам решения многочисленных проблем разработки в Spring/JPA, а @@ -113,25 +134,6 @@

      На проекте

      логирования logback, реализующая SLF4J, повсеместно используемый Bootstrap и jQuery.
    -
    -
      -
    • Стоимость участия без проверки домашних заданий: 8300 руб.
      - сюда входят все материалы, участие в группе skype и slack, ответы на вопросы и помощь с проектом.

      -
    • -
    • Стоимость полного пакета: 16500 руб.
      - добавляется проверка домашних заданий + ревью выпускного проекта (либо вашего, например тестового задания - при устройстве на работу).

    • -
    • Для всех: бесплатное участие в следующий выпусках проекта.

    • -
    • Скидка на другие проекты: 700 руб. (без ДЗ) и 1500 руб (с ДЗ).

    • -
    • Добавляйся в skype: grigory.kislin с пометкой topjava.

    • -
    • Способы оплаты (если у тебя есть подписка "реальный проект/стажировка" от JavaRush, объязательно перед оплатой свяжись со мной)
      - После оплаты объязательно напиши в skype grigory.ksilin, куда была оплата и свой email (или можно написать информацию по оплате в ответ на это письмо)

    • -
    • Вопросы по проекту
    • -
    • Ресурсы для подготовки -
    • -
    • Курс рубля
    • -
    -

    Расписание занятий проекта

    + \ No newline at end of file diff --git a/resources/view/payment.html b/resources/view/payment.html new file mode 100644 index 0000000..8e85f7d --- /dev/null +++ b/resources/view/payment.html @@ -0,0 +1,68 @@ + + + + + + + + + +
    +
    +

    Реквизиты оплаты

    + +
    +

    Курс рубля

    +
    +

    + Обязательно подтвердите оплату в skype grigory.kislin или почту admin@javaops.ru (проект, куда платеж и email)
    + После оплаты сразу выдаю доступ ко всем материалам проекта, включаю в группу Slack (разные каналы для уроков и общения) и выдаю ключ Ultimate IntelliJ IDEA на 6 месяцев. +

    +
    +
    + + + \ No newline at end of file diff --git a/resources/view/profile.html b/resources/view/profile.html index e051a95..eca6577 100644 --- a/resources/view/profile.html +++ b/resources/view/profile.html @@ -1,96 +1,80 @@ - - - - Профиль - - + + + - - - -
    - - -
    -
    +
    +

    Редактирование профиля


    -
    -
    - -
    + +
    + +
    -
    - -
    +
    + +
    -
    - -
    +
    + +
    - -
    + +
    - -
    + +
    @@ -131,20 +115,20 @@

    - -
    + +
    -
    -