Бесплатные курсы по java

Содержание:

Введение в Swing

Swing — это набор классов для создания графического интерфейса пользователя (GUI) в Java-программах. В сравнении с ранее использовавшейся библиотекой AWT, у библиотеки Swing есть ряд преимуществ:

  • богатый набор интерфейсных примитивов;
  • настраивающийся внешний вид на различных платформах (look and feel);
  • раздельная архитектура «модель-вид» (model-view);
  • встроенная поддержка HTML.

Изучение Swing начинается с написания пустого окна на основании класса JFrame. Затем изучается назначение JPanel, JLabel, JButton и других элементов библиотеки java.awt, размещение элементов с помощью BorderLayout и других компоновщиков, обработка кликов по кнопке и кликов мыши по элементу, а также рисование на JPanel.

Материал по разделу можно найти в книгах:

  • «Java. Библиотека профессионала. Том 1. Основы» — главы 10, 11, 12;
  • «Java 8. Полное руководство» — главы 31, 32, 33.

Применение метасимвольных аргументов

Представьте, что мы хотим добавить метод для сравнения средних значений массивов в класс из примера 3. Причем типы массивов могут быть разные:

Так как параметризованный тип, какой тип параметра вы укажете для , когда создадите параметр метода типа ? Напрашивается следующий вариант:

Но это не сработает, так как в этом случае метод будет принимать аргументы только того же типа, что и существующий объект:

Чтобы создать обобщенную версию метода , следует воспользоваться другим средством обобщений Jаvа – метасимвольным аргументом. Метасимвольный аргумент обозначается знаком ? и представляет неизвестный тип.

Мета символ не оказывает никакого влияния на тип создаваемых объектов класса . Это определяется оператором в объявлении класса Average. Мета символ просто совпадает с любым достоверным объектом класса .

Метасимвольные аргументы могут быть ограничены почти таким же образом, как и параметры типов

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

План курса

Программа обучения включает видео уроки по обучение Java на практике для начинающих. Благодаря практическим заданиям, Вы сможете закрепить полученные знания по каждой теме курса. Включен подробный разбор самых популярных вопросов на собеседовании на должность Junior-разработчика по части Java SE.

развернуть все

свернуть все

Введение — О курсе Программирование на Java с нуля — Уровень 2

1. JUnit — тестирование

  • 1.1 JUnit — тестирование. Часть 113:02
  • 1.2 JUnit — тестирование. Часть 209:06

2. Collection Fraimework

  • 2.1 ArrayList24:35
  • 2.2 ArrayList. Часть 216:47

  • 2.3 LinkedList28:26

  • 2.4 Собеседование по коллекциям List05:12

  • 2.5 Устройство памяти в Java07:52

  • 2.6 Equals и hashcode11:04

  • 2.7 HashSet33:50

  • 2.8 Collection14:43

  • 2.9 Iterable16:58

  • 2.10 Собеседование по пройденным коллекциям06:01

  • 2.11 TreeSet14:59

  • 2.12 HashMap33:52

  • 2.13 Собеседование по HashMap12:07

  • 2.14 Map и Set остальные коллекции08:07

  • 2.15 Queue08:55

  • 2.16 Собеседование по Collections Framework08:46

3. Generics

  • 3.1 Generics. Введение17:05

  • 3.2 Параметризируем коллекции13:55

  • 3.3 Super, extends и WildCard14:45

  • 3.4 Параметризированные методы11:47

  • 3.5 Собеседование и разбор дз08:29

4. Многопоточность

  • 4.1 Многопоточность. Введение10:49

  • 4.2 Остановка потоков. Метод join26:42

  • 4.3 Потоки-демоны и состояние гонки10:54

  • 4.4 Синхронизация методов и мониторы20:53

  • 4.5 Атомарные типы данных и volatile07:34

  • 4.6 Многопоточность. Собеседование 105:38

  • 4.7 CountDownLatch и ExecutorService17:05

  • 4.8 ThreadFactory, интерфейс Callable и класс Future14:35

  • 4.9 Блокирующая очередь. Wait, notify и notifyAll19:07

  • 4.10 DeadLock или взаимная блокировка11:49

  • 4.11 Потокобезопасные коллекции08:16

  • 4.12 Semaphore, CyclicBarrier. Задача про гонку30:10

  • 4.13 Многопоточность. Собеседование 208:23

5. Stream API

  • 5.1 Лямбда-выражения и функциональные интерфейсы19:20

  • 5.2 Введение в стримы. Методы filter, map и collect18:48

  • 5.3 Терминальные и промежуточные операторы14:56

  • 5.4 Тип Optional, метод parallelStream, способы создания стримов15:15

  • 5.5 Stream API. Собеседование05:04

6. Потоки ввода/вывода

  • 6.1 Введение в потоки ввода/вывода. Класс File13:45

  • 6.2 Чтение из файла, класс FileInputStream и try с ресурсами11:24

  • 6.3 StringBuilder, StringBuffer, чтение в массив и InputStreamReade18:45

  • 6.4 Чтение и запись с использованием буфера. Класс Scanner17:40

  • 6.5 Классы Reader, Writer и RandomAccessFile11:44

  • 6.6 Сериализация и десериализация24:07

  • 6.7 Собеседование04:53

7. Java Core

  • 7.1 Как работает Java05:12

  • 7.2 Отличие интерфейсов и абстрактных классов07:12

  • 7.3 Исключения и метод finalize10:59

  • 7.4 Основные парадигмы ООП06:14

  • 7.5 Финальное собеседование16:58

Завершение курса — Получение Сертификата

Легко ли новичку учить Java?

Java легче некоторых других языков, например таких как С и С++. Большую роль в этом играет то, что в Java вам не придётся разбираться с управлением памятью. С другой стороны, как мы уже говорили, синтаксис в том же Python проще, а типизация свободнее.

Если вы совсем новичок, то учить Java может быть сложновато и стоит подумать о языках с более простым синтаксисом. Но если у вас уже есть минимальный опыт программирования, то Java — хороший выбор. Вы научитесь программированию, не распыляясь на работу с памятью, а ещё освоите объектно-ориентированное программирование. ООП не стоит бояться: оно скорее упрощает работу, чем наоборот.

Программа обучения

1

Сетевой чат и мобильная игра

Видеокурс «Как учиться эффективно»

Java Core. Уровень 1

Основы баз данных. Видеокурс

Java Core. Уровень 2

Java Core. Уровень 3

Проект

7 видео-уроков, 1 час обучающего контента

Видеокурс «Как учиться эффективно»
  • Особенности обучения в Geek University
  • Почему тяжело учиться
  • Инструменты для самообразования
  • Учимся от компетенций
  • Особенности обучения взрослых
  • Постановка целей по SMART
  • Как сформулировать образовательный запрос

1 месяц, 8 уроков

12 часов обучающего контента24 часа практики

Java Core. Уровень 1
  • Java. Введение
  • Основные конструкции
  • Практика
  • Крестики-нолики в процедурном стиле
  • Введение в ООП
  • Продвинутое ООП
  • Практика ООП и работа со строками
  • Создаем приложение с графическим интерфейсом

20 видео-уроков,4 часа обучающего контента

Основы баз данных. Видеокурс
  • Реляционные базы данных
  • Установка СУБД
  • Проектирование базы данных, нормальные формы
  • SQL-команды CREATE, INSERT, SELECT, WHERE, DISTINCT, ORDER BY, LIMIT, DELETE и UPDATE
  • Согласованность данных
  • Внешний ключ
  • Создание таблиц с отношением «многие ко многим»
  • Составной первичный ключ
  • Объединение данных из нескольких таблиц
  • Операторы INNER JOIN, LEFT JOIN, RIGHT JOIN и UNION
  • Агрегирующие функции
  • Оператор GROUP BY
  • Индексы
  • Транзакции

1 месяц, 8 уроков

12 часов обучающего контента24 часа практики

Java Core. Уровень 2
  • Объектно-ориентированное программирование Java
  • Исключения
  • Коллекции
  • Продвинутые вопросы создания графического интерфейса
  • Многопоточность
  • Работа с сетью
  • Написание сетевого чата

1 месяц, 8 уроков

12 часов обучающего контента24 часа практики

Java Core. Уровень 3
  • Обобщения
  • Базы данных
  • Средства ввода-вывода
  • Многопоточность
  • Обзор средств разработки
  • Reflection API и аннотации
  • Подготовка к собеседованию
Проект

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

2

Облачное хранилище

Базы данных. Базовый курс

Разработка сетевого хранилища на Java

Проект

1 месяц, 8 уроков

12 часов обучающего контента24 часа практики

Базы данных. Базовый курс
  • Проектирование реляционной базы данных
  • SQL — команды DDL и DML
  • Объединение запросов, хранимые процедуры, триггеры, функции
  • Транзакции и оптимизация запросов
  • Масштабирование MySQL и NoSQL
  • Обзор движков MySQL, управление и обслуживание. Подготовка к собеседованию
  • Альтернативные СуБД и функциональные надстройки

1 месяц, 8 уроков

12 часов обучающего контента24 часа практики

Проект

Вы создадите облачное хранилище — аналог DropBox и Google Drive. С помощью этого сервиса можно будет отправлять файлы на сервер, просматривать список файлов и скачивать нужные. Хранилище будет синхронизировать клиентский компьютер с сервером.

4

Командная разработка и подготовка к собеседованию

Архитектуры и шаблоны проектирования на Java

Подготовка к собеседованию Java-разработчика

Проект

2 месяца, 8 уроков

12 часов обучающего контента24 часа практики

Архитектуры и шаблоны проектирования на Java
  • Архитектура Java-приложений
  • Принципы и шаблоны проектирования
  • Порождающие шаблоны
  • Структурные паттерны
  • Поведенческие шаблоны
  • Архитектурные системные паттерны
  • Антипаттерны

1 месяц, 8 уроков

12 часов обучающего контента24 часа практики

Подготовка к собеседованию Java-разработчика
  • Пробегаем по ООП
  • Алгоритмы и структуры данных
  • Java Core. Углубленное изучение
  • Базы данных
  • Hibernate
  • Java Web
  • Spring
  • Подготовка к собеседованию
Проект

Вы с нуля создадите бизнес-проект, используя изученные на факультете технологии и инструменты, Spring Framework. Вас ждет работа в команде: применение методологии Agile поможет прокачать soft skills.

Плюсы Java

О широкой поддержке и развитии Java мы уже сказали. Но есть и другие положительные характеристики:
• невысокий порог вхождения. Считается, что язык программирования Java изучать несколько проще, чем многие другие языки с Си-подобным синтаксисом;
• объектная ориентированность. Как известно, Java-программы строятся на основе объектов и взаимодействия объектов — это даёт возможность задействовать все преимущества ООП;
• переносимость и платформенная независимость. При программировании мы используем интерпретатор — виртуальную машину Java. Благодаря этому, программы могут переноситься на разные устройства и платформы. То есть код, написанный на языке программирования Java для одной платформы, может компилироваться в промежуточный байт-код. Таким образом, эта программа в итоге сможет запускаться и на других платформах, а всё благодаря интерпретации посредством JVM под каждую платформу;
• развитая многопоточность. Средства программирования Java дают нам возможность управлять выполнением нескольких потоков — это позволяет создавать многопоточные приложения;
• безопасность. Она достигается за счёт встроенной в JVM верификации байт-кода, отсутствия в Java ручного управления памятью, слежения за переполнением стека, наличия различных API, позволяющих контролировать безопасность, и т. п.;
• отказоустойчивость. Повышается за счёт механизма исключения, который полезен как при компиляции, так при непосредственном выполнении. В итоге имеем снижение количества ошибок;
• интерпретируемость. У нас есть Java-интерпретатор, способный выполнять байт-коды Java на любых машинах, где есть JRE и JVM;
• распределённость. Речь идёт о Java-инструментах для создания распределённых приложений;
• производительность. Just-in-time-компилятор (он же JIT) повышает скорость работы приложений, делая её сопоставимой с языками С и С++.

Насколько легко научиться программированию на Java?

Если вы новичок в разработке на Java, то ваши опасения вполне понятны. Так насколько же легко изучить Java?

Этот вопрос имеет несколько субъективную природу, но лично я бы отнес Java к языкам, не самым простым для изучения. Хотя он проще, чем C++, и часто описывается как более удобный для пользователя, но он, безусловно, не столь прост, как такие его конкуренты, как Python или BASIC, которые больше подходят для изучения начинающим программистам.

C# также немного проще по сравнению с Java, хотя они очень похожи.

Конечно, задавшись конкретной целью – стать разработчиком приложений для Android, – проще всего сразу начать с языка, который уже поддерживается этой платформой.

У языка Java есть свои особенности, но его, безусловно, можно изучить, и как только вы его освоите, вам откроется множество возможностей. А поскольку Java имеет много общего с C и C#, вы сможете перейти на эти языки без особых усилий.

Вы уверены, что вам нужен API?

Перевод

От переводчика: При разработке бэкэнда наличие API для фронт-энда стало практически повсеместным стандартом. Однако можем ли мы называть это «настоящим» API? Предлагаем вашему вниманию интересное пятничное чтение, которое, возможно, повлияет на API, которые мы все разрабатываем.

“Слабая связанность, сильное сцепление”, “сокрытие информации”. Известные принципы дизайна. Тем не менее, к ним очень часто не относятся серьезно при разработке архитектуры ПО, особенно когда это касается взаимодействия между клиентской и серверной частью (фронтом и бэком на жаргоне разработчиков).

Ценность API — в сокрытии информации

Предоставляя API, системы решают, какая информация должна быть доступна из внешнего мира, а какая будет держаться в секрете (“сокрытие информации”).

Почему это важно? Потому что чем объемнее API, тем дороже его поддерживать. Представьте себе крайний случай — открытие каждой детали реализации

Каждое изменение в системе может сломать код, который используют ваши клиенты. Именно по этой причине мы стремимся разрабатывать компактные API. Я писал статью (перевод на хабре) по этой теме в контексте описания шаблона “Регистрация событий”.

Вне зависимости от размера, API не позволяет менять систему так, как нам хочется. Мы всегда вынуждены детально документировать API и всегда думать о том, как бы не сломать клиентский код. Изменения должны быть обратно совместимы, в противном случае придется согласовывать развертывание всех зависимых систем, что быстро превратится в ад поддержки монолитного приложения.

Как стать java-разработчиком

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

Важно все знания тестировать на практике

Например, пробовать, тестировать идеи. Бездумное переписывание кода с курсов, не пойдет на пользу

Важно искать решения возникшей проблемы, а не читать предложение за предложением

Необходимые знания

Критерии, необходимые при отборе на должность Java программиста:

  • Знать семантику и синтаксис языка.
  • Знание Java EE, UML, SQL, PL/SQL.
  • Владение шаблонами проектирования.
  • Разработка программных десктопных модулей и архитектуры.
  • Опыт работы, основанный на создании проектов и реализации приложений Java.
  • Знание Eclipse или IntelliJ Idea, SVN, CVS, JVM (Java Virtual Machine).

Важные качества

Привлекательная заработная плата, привилегии, стабильность, безопасность, интересные перспективы развития. Поэтому профессия java-разработчик связана с многочисленными преимуществами, а IT-сектор занимает уникальное место на рынке труда.

Что требуется от кандидатов? Необходимы такие качества, как:

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

Важно также освоить несколько языков программирования. Без этого невозможно использовать возможности, которые обеспечивают новинки, появляющиеся в отрасли IT.
Самостоятельность в решении проблем

Хотя младший Java программист часто выполняет задания под руководством старшего Java специалиста. Существуют ситуации, в которых необходимо быстро и самостоятельно принимать решения и действия. Благодаря этому можно выполнить последующие ступени развития карьеры.
Творчество. Написание кода — творческое задание. Java разработчик планирует и предусматривает, какие последствия принесут действия.
Умение признать ошибку. Каждому случается ошибиться. Java программист обязан уметь признать ошибки и сделать выводы на будущее.
Навыки межличностного общения, коммуникабельность. Реализация проектов требует сотрудничества с клиентами или с другими разработчиками Java. Программисту необходимо быть коммуникабельным, уметь формулировать четкие сообщения, понимать то, что хочет передать собеседник.

Где обучиться профессии Java-разработчика

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

Университет Особенности онлайн-курса Java-разработчика
Skillbox Вы научитесь писать код и создавать сайты на самом популярном языке программирования
Geekbrains Освойте один из самых распространенных языков программирования и получите востребованную профессию
SkillFactory Освойте программирование, бэкенд-разработку и DevOps на самом востребованном языке
Нетология Научитесь программировать с нуля и получите возможность пройти собеседование в Альфа-Банке
ProductStar Вы научитесь программировать с нуля на самом популярном языке программирования Java
Otus Курс по Java-разработке для начинающих программистов
Udemy Java (Джава) для начинающих с нуля до сертификата Oracle
Русаков Научись программировать на языке Java с нуля в кратчайшие сроки
Nedu Пройдите онлайн-курс по Java с нуля и найдите высокоплачиваемую работу или фриланс в сфере IT

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

Также освоить профессию Java-разработчик можно в ВУЗах России:

  • «МЭИ» (Национальный исследовательский университет).
  • Прикладная информатика в экономике (Инженерно-экономический институт НИУ «МЭИ»)
  • Московский открытый институт
  • МосГУ Московский гуманитарный университет. Прикладная информатика в экономике (Факультет экономики, управления и международных отношений)
  • Национальный исследовательский технологический университет «МИСиС»
  • Институт информационных технологий и компьютерных наук (Информационные системы и технологии).

Длительность обучения

Срок обучения зависит от нескольких факторов: образование, опыт работы, цели, интенсивности занятий.

Java-программирование базируется на практическом применении знаний. Любой язык программирования будет основой для будущего студента курсов или ВУЗа. Продолжительность обучения Ява-разработчика на курсах составляет от 6 месяцев до двух лет. Занятия проводятся по 1-3 часа в день.

Как запустить Java на Windows (XP, 7, 8 и 10)

Для освоения Java основ программирования и запуска платформы на Windows потребуется JAVA SE Development Kit (JDK) и IDE для разработки проектов. Следуйте пошаговой инструкции, приведенной ниже:

Установка Java

После скачивания запустите установочный файл и следуйте инструкциям, которые будут появляться на экране. Нажмите «Next». Выберите все функции, нажав «This feature will be installed on local hard drive» и скопируйте место установки (оно выделено жёлтым) в «Блокнот», после чего снова нажмите «Next».

  • В процессе установки появится запрос об установке JRE. Нажмите «Next, а затем «Finish для завершения установки.
  • Теперь необходимо отредактировать переменную PATH. Перейдите в Панель управления > Система и безопасность > Система. В левой панели выберите «Дополнительные параметры системы».

Нажмите «Переменные среды». В разделе «Системные переменные» найдите переменную PATH и в следующем окне нажмите «Изменить».

Выберите весь текст в поле «Значение переменной» и скопируйте его в отдельный текстовый файл. Так будет легче его отредактировать и проверить на наличие ошибок. Посмотрите, есть ли в скопированном тексте строка: C:ProgramDataOracleJavajavapath;. Если да, то можно переходить к следующему шагу

Если нет, то вставьте скопированное ранее место установки в начало переменной и добавьте в конце строки bin вот так: C:Program Files (x86)Javajdk1.8.0_112bin; Обратите внимание, что ваша версия JDK (jdk1.8.0_112) может отличаться. Скопируйте значение переменной и вставьте его в окошко PATH

  • Нажмите «ОК», чтобы сохранить внесенные изменения.
  • Чтобы проверить, правильно ли установлена платформа для введения в программирование Java, откройте командную строку, набрав cmd в строке поиска Windows или через команду «Выполнить…» (Windows — R). Введите команду java -version. Если отображается текущая версия Java, значит, установка прошла успешно. Если нет, сверьтесь со страничкой помощи Oracle.

Установка IntelliJ IDEA

  • Перейдите на страницу загрузки IntelliJ IDEA.
  • Скачайте бесплатную версию Community Edition, нажав «Загрузить».

После загрузки запустите файл установки и следуйте инструкциям, которые будут появляться на экране. Затем создайте ярлык на рабочем столе для 64-битной версии и добавьте ассоциации с расширением .java. Нажмите «Next» и продолжайте установку.

  • После установки откройте IntelliJ IDEA, нажав на значок на рабочем столе.
  • Выберите «Don’t import settings («Не импортировать настройки») и нажмите «OK». После этого принимаем политику приватности Jetbrains, нажав «Accept».
  • Теперь можно настроить интерфейс под себя. Также можно пропустить этот шаг и оставить всё по умолчанию, нажав кнопку «Skip All and Set Defaults».
  • Программа покажет страницу приветствия. Нажмите «Create New Project» («Создать новый проект»).
  • В следующем окне выберите «Java» в левой панели и нажмите «New в верхней части окна программы для выбора JDK. Здесь надо выбрать местоположение, куда установили JDK во время установки Java, после чего нажать «Next».
  • IntelliJ IDEA найдёт JDK и распознает его. Никакие другие опции отмечать не нужно, просто нажмите «Next.
  • На следующем экране введите имя проекта: HelloWorld и нажмите «Finish». Если программа скажет, что директории не существует, нажмите «ОК». Если вы не видите левой панели, перейдите в меню Views > Tool Windows > Project.
  • Чтобы задать имя класса, выберите в левой панели папку src. Кликните по ней правой кнопкой мыши, зайдите в New > Java и задайте имя класса. В имени класса не должно быть пробелов.
  • Напишите код и сохраните проект Java урока программирования.
  • Для запуска программы, зайдите в меню Run > Run… Нажмите на HelloWorld — программа скомпилирует файл и запустит его.

API, ради которых наконец-то стоит обновиться с Java 8. Часть 3

Какие есть причины переходить на новые версии Java? Кто-то это сделает из-за новых языковых возможностей вроде , блоков текста или записей. Кому-то понадобятся новые интересные возможности вроде модулей или низкопаузных сборщиков мусора. Кто-то это сделает просто из-за того, что обновив версию Java, их программа станет быстрее и будет есть меньше памяти. Но есть ещё одна, не менее важная причина. Это новые API, которые позволят писать меньше кода и избежать траты времени на поиск нужной функциональности во внешних библиотеках. А в некоторых случаях сделают ваш код быстрее.

В предыдущих двух частях мы уже рассмотрели по 10 новых API, которые появились в Java 9 и более поздних версиях (часть 1, часть 2). Сегодня мы рассмотрим ещё 10.

FAQ

Как вы выбираете на какие образовательные платформы онлайн курсов сделать обзор?

Мы выбираем платформы для онлайн обучения по размеру их рынка, популярности и самое главное, запросов наших пользователей или общего интереса найти честные MOOC обзоры про определённые платформы для онлайн обучения.

Как много вы изучаете перед написанием обзора на платформы для онлайн обучения?

Наши эксперты по MOOC проводят исследования неделями — только после этого они могут сказать, что их оценки различных аспектов финальные и завершённые. Даже несмотря на то, что это занимает много времени, это единственный способ гарантировать, что все основные особенности платформы для онлайн обучения протестированы и проверены, а вердикт основан на реальных данных.

Какой аспект самый важный при выборе того, какая платформа для онлайн курсов лучшая?

Было бы не правильно уделять внимание только лишь одному аспекту из выборки: приоритеты зависят от определённого человека, его ценностей, пожеланий и целей

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

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

Как этот сайт для обзоров платформ онлайн обучения отличается от других?

Каждая платформа для обзора MOOC уникальна и имеет свои цели и ценности. Наши обзоры онлайн обучения на 100% честные и написаны после проведения тщательного анализа. Это цель, которой недостаёт многим платформам по обзору сайтов онлайн обучения, поэтому мы считаем это нашей суперсилой!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector