Всем привет!
Тренировка вопросов по java с чат-ботом мне очень понравилась, многие вопросы меня подлавливают, изредка попадаются вопросы про многопоточность. Ее я еще не изучала - в Практикуме тема многопоточности начнется, возможно, через спринт-другой.
В общем, в субботу открываю браузер, а там вкладка открыта на курс на степике "Java c нуля до Junior + Подготовка к собеседованию". Смотрю содержание, а там обсуждение тонкостей разных коллекций, многопоточность и другие темы. Отзывы все положительные, решила начать и залипла! Сегодня дошла уже до 8й темы из 11, как раз подробнее о многопоточности. До этого написали небольшую программку, которая одновременно угадывала число и считала секунды.
Интересный курс, не сказала бы, что подходит для людей с нуля, потому что сходу писать свои реализации двусвязных списков и хеш-сет дело не простое. Но кастомный двусвязный список мы в Практикуме писали еще на 5 ТЗ, тогда я достаточно много на эту тему читала и очень долго разбиралась, мне бы не хватило той информации, что была в этом курсе. Но сейчас повторить теорию пока каникулы, углубиться в тонкости, потренировать вопросы с собеседований (там регулярно есть такие видео-занятия) - просто супер. Но думаю, что я его быстро закончу, потому что бОльшую часть я знаю и знаю больше способов реализовать какие-то задачи, предлагаемые в курсе. Это хорошо поднимает настроение и самооценку)
А потом есть еще много планов, в первую очередь написать SQL Parser из того тестового задания с гитхаба, а потом думала попробовать написать теоретическую заметку об Optional, что это такое, для чего используется. Как рассказывала до этого, такой челлендж мне дали в книжке Coding Career. Планов, конечно, у меня еще миллион, но всё за 2 недели не успеешь :)
Тренировка вопросов по java с чат-ботом мне очень понравилась, многие вопросы меня подлавливают, изредка попадаются вопросы про многопоточность. Ее я еще не изучала - в Практикуме тема многопоточности начнется, возможно, через спринт-другой.
В общем, в субботу открываю браузер, а там вкладка открыта на курс на степике "Java c нуля до Junior + Подготовка к собеседованию". Смотрю содержание, а там обсуждение тонкостей разных коллекций, многопоточность и другие темы. Отзывы все положительные, решила начать и залипла! Сегодня дошла уже до 8й темы из 11, как раз подробнее о многопоточности. До этого написали небольшую программку, которая одновременно угадывала число и считала секунды.
Интересный курс, не сказала бы, что подходит для людей с нуля, потому что сходу писать свои реализации двусвязных списков и хеш-сет дело не простое. Но кастомный двусвязный список мы в Практикуме писали еще на 5 ТЗ, тогда я достаточно много на эту тему читала и очень долго разбиралась, мне бы не хватило той информации, что была в этом курсе. Но сейчас повторить теорию пока каникулы, углубиться в тонкости, потренировать вопросы с собеседований (там регулярно есть такие видео-занятия) - просто супер. Но думаю, что я его быстро закончу, потому что бОльшую часть я знаю и знаю больше способов реализовать какие-то задачи, предлагаемые в курсе. Это хорошо поднимает настроение и самооценку)
А потом есть еще много планов, в первую очередь написать SQL Parser из того тестового задания с гитхаба, а потом думала попробовать написать теоретическую заметку об Optional, что это такое, для чего используется. Как рассказывала до этого, такой челлендж мне дали в книжке Coding Career. Планов, конечно, у меня еще миллион, но всё за 2 недели не успеешь :)
👏3👍2🔥2
Всем привет!
Пост хвастовства) Закончила курс, начатый в выходные. Повторила тему коллекций, стримов, чтения и записи в файл, узнала про многопоточность. До этого знания были о ней очень поверхностные.
Классные вопросы с собеседований обсуждались, я практически на все уже знала ответ, некоторые вещи пометила себе, чтобы запомнить. Курс в целом классный, но не для людей с нуля.
В бот-игре я уже 10 уровня программист, которого недавно повысили до Middle. Эх, если бы в жизни всё также было легко)))
Пост хвастовства) Закончила курс, начатый в выходные. Повторила тему коллекций, стримов, чтения и записи в файл, узнала про многопоточность. До этого знания были о ней очень поверхностные.
Классные вопросы с собеседований обсуждались, я практически на все уже знала ответ, некоторые вещи пометила себе, чтобы запомнить. Курс в целом классный, но не для людей с нуля.
В бот-игре я уже 10 уровня программист, которого недавно повысили до Middle. Эх, если бы в жизни всё также было легко)))
🔥3👍2👏2
Сегодняшний пост будет началом цикла кратких теоретических заметок. Это больше моя тренировка говорить на эти темы, чем попытка кого-то чему-то научить. Статей и книжек на разные теоретические темы написано очень много и, конечно, лучше учиться по ним, а мои короткие заметки ни на что не претендуют.
Что такое Optional?
Это своего рода контейнер, в котором может лежать значение, а может и не лежать. Если в нем лежит значение — это означает, что оно присутствует в контейнере. По-английски это переводится present. Если значения в контейнере нет — контейнер пуст, или empty. Поэтому проверяя, есть ли значение в optional, мы пишем ifPresent (если присутствует) или isPresent (присутствует) и делаем какие-то действия. Если значение есть, мы можем его из Optional получить через метод get().
Казалось бы, какая выгода с этого класса? Если у нас есть какой-либо объект, который может иметь значение null, мы также добавляем проверки в коде (if sth != null). Зачем вводить такой специальный контейнер? Одно из многих преимуществ — мы можем устанавливать значения по умолчанию с помощью метода orElse(). Например, получить значение по умолчанию какого-нибудь среднестатического только родившегося хомяка — optionalHamster.orElse(new Hamster(“Хома”, 0));
Когда мы видим Optional в коде, мы понимаем, что здесь значения может и не быть, и чтобы избежать ошибок, мы уже будем знать, что нам нужно обработать ситуации, когда значения в контейнере нет — выбросить ошибку (orElseThrow()) или получить значение по умолчанию (есть два метода orElse() и orElseGet(), первый создает объект, при отсутствии значения, который нам может быть и не нужен, а второй принимает функциональный интерфейс и возвращает результат его метода).
Хорошая статья об Optional — https://www.baeldung.com/java-optional. В следующей «серии» буду писать о валидации в Spring c помощью аннотаций.
Что такое Optional?
Это своего рода контейнер, в котором может лежать значение, а может и не лежать. Если в нем лежит значение — это означает, что оно присутствует в контейнере. По-английски это переводится present. Если значения в контейнере нет — контейнер пуст, или empty. Поэтому проверяя, есть ли значение в optional, мы пишем ifPresent (если присутствует) или isPresent (присутствует) и делаем какие-то действия. Если значение есть, мы можем его из Optional получить через метод get().
Казалось бы, какая выгода с этого класса? Если у нас есть какой-либо объект, который может иметь значение null, мы также добавляем проверки в коде (if sth != null). Зачем вводить такой специальный контейнер? Одно из многих преимуществ — мы можем устанавливать значения по умолчанию с помощью метода orElse(). Например, получить значение по умолчанию какого-нибудь среднестатического только родившегося хомяка — optionalHamster.orElse(new Hamster(“Хома”, 0));
Когда мы видим Optional в коде, мы понимаем, что здесь значения может и не быть, и чтобы избежать ошибок, мы уже будем знать, что нам нужно обработать ситуации, когда значения в контейнере нет — выбросить ошибку (orElseThrow()) или получить значение по умолчанию (есть два метода orElse() и orElseGet(), первый создает объект, при отсутствии значения, который нам может быть и не нужен, а второй принимает функциональный интерфейс и возвращает результат его метода).
Хорошая статья об Optional — https://www.baeldung.com/java-optional. В следующей «серии» буду писать о валидации в Spring c помощью аннотаций.
Baeldung on Kotlin
Guide To Java Optional | Baeldung
Quick and practical guide to the Java Optional class
👍2🔥2
Всем привет!
Пишу сегодня рассказать о своем прогрессе по курсу по mySQL. Осталось 30 баллов до сертификата (40 для сертификата с отличием). Казалось бы сделать 10 задач в день и можно до конца недели закончить этот курс, но вот пару запросов примеров какие задачки пошли под конец курса. Мозг взрывается, особенно большой запрос со скрина, долго я его составляла)))
Вот к такому селект запросу написать SQL Parser на Java выглядит как непосильная для меня задачка) Но я попробую сделать это на этой неделе.
Пишу сегодня рассказать о своем прогрессе по курсу по mySQL. Осталось 30 баллов до сертификата (40 для сертификата с отличием). Казалось бы сделать 10 задач в день и можно до конца недели закончить этот курс, но вот пару запросов примеров какие задачки пошли под конец курса. Мозг взрывается, особенно большой запрос со скрина, долго я его составляла)))
Вот к такому селект запросу написать SQL Parser на Java выглядит как непосильная для меня задачка) Но я попробую сделать это на этой неделе.
👍2👏2🔥1
Всем привет!
Курс по mySQL дожала) Так что результат за каникулы - два сертификата Stepik: по курсу Java и mySQL.
Но никаких других проектов не поделала, кроме короткого решателя Судоку.
В понедельник начинается групповой проект, мы с командой пока не определили тимлида. Расскажу потом впечатления и т.п.
Курс по mySQL дожала) Так что результат за каникулы - два сертификата Stepik: по курсу Java и mySQL.
Но никаких других проектов не поделала, кроме короткого решателя Судоку.
В понедельник начинается групповой проект, мы с командой пока не определили тимлида. Расскажу потом впечатления и т.п.
🔥6
Всем привет!
Давно не делилась новостями здесь, потому что в понедельник стала тимлидом на групповом проекте. Было много разных дел. Каждый день делаем созвоны, я отвечаю за главную ветку, которую отправим на ревью, мержу все изменения со всех веток, у каждого по фичи было. Мне досталось три фичи, потому что они были очень мелкие, а у остальных ребят потруднее.
Ждем еще двоих, как они закончат работу над своими ветками, надеюсь отправим скоро на первое ревью.
Вчера был интересный опыт разрешения (28?) конфликтов при мерже ветки одного человека, который не добавлял в свою ветку изменения из общей ветки.
А еще от-rollback-нула случайно свои изменения в своей ветке, ладно хоть мне нужно было всего два метода изменить, немного потеряла и быстро восстановила. Коммитов и stash изменений в ней не сделала и на будущее теперь буду осторожнее:) Такие дела)
Давно не делилась новостями здесь, потому что в понедельник стала тимлидом на групповом проекте. Было много разных дел. Каждый день делаем созвоны, я отвечаю за главную ветку, которую отправим на ревью, мержу все изменения со всех веток, у каждого по фичи было. Мне досталось три фичи, потому что они были очень мелкие, а у остальных ребят потруднее.
Ждем еще двоих, как они закончат работу над своими ветками, надеюсь отправим скоро на первое ревью.
Вчера был интересный опыт разрешения (28?) конфликтов при мерже ветки одного человека, который не добавлял в свою ветку изменения из общей ветки.
А еще от-rollback-нула случайно свои изменения в своей ветке, ладно хоть мне нужно было всего два метода изменить, немного потеряла и быстро восстановила. Коммитов и stash изменений в ней не сделала и на будущее теперь буду осторожнее:) Такие дела)
🔥2👏2👍1
Всем привет!
Сегодня торжественное открытие новой рубрики - Совместное решение задач!
Пишу условие задачи в посте, а чуть позже в комментариях к нему оставлю решение с объяснением.
Итак, первая задача, взята с LeetCode:
Называется с английского - "Взбираемся по лестнице"
Есть лестница с n-ступенями. Каждый раз мы можем пройти либо 1 либо 2 ступени.
Сколько есть различных способов забраться наверх?
Пример 1:
Ступеней 2. Ответ: 2. Объяснение - есть два способа забраться наверх:
1. 1 шаг + 1 шаг
2. 2 шага
Пример 2:
Дано: n = 3
Вывод: 3.
Объяснение: есть три способа забраться наверх:
1. 1 + 1 +1
2. 1 шаг + 2 шага
3. 2 шага + 1 шаг.
1 <= n <= 45 (n не может быть меньше 1 и больше 45)
Чуть позже скину решение с объяснением в комментарии 🤓
Сегодня торжественное открытие новой рубрики - Совместное решение задач!
Пишу условие задачи в посте, а чуть позже в комментариях к нему оставлю решение с объяснением.
Итак, первая задача, взята с LeetCode:
Называется с английского - "Взбираемся по лестнице"
Есть лестница с n-ступенями. Каждый раз мы можем пройти либо 1 либо 2 ступени.
Сколько есть различных способов забраться наверх?
Пример 1:
Ступеней 2. Ответ: 2. Объяснение - есть два способа забраться наверх:
1. 1 шаг + 1 шаг
2. 2 шага
Пример 2:
Дано: n = 3
Вывод: 3.
Объяснение: есть три способа забраться наверх:
1. 1 + 1 +1
2. 1 шаг + 2 шага
3. 2 шага + 1 шаг.
1 <= n <= 45 (n не может быть меньше 1 и больше 45)
Чуть позже скину решение с объяснением в комментарии 🤓
👍2🔥1
Всем привет!
Наша команда получила зачет, поэтому буду спамить тут новыми постами, пока свободное время до нового спринта)
Вчера был день задач. Верхнюю задачу сначала решила, потом занялась задачами на числа Фибоначчи, решила еще легкую задачку с leetcode. Потом думаю, дай отдохну от задач - пошла читать/смотреть про Docker. Пока не скажу, что разобралась, но появилось первое впечатление.
Стала перебирать открытые вкладки в браузере - нашла открытую на какой-то контест от яндекс на 2 часа. Начала, а там хоп, а джавы-то и нет в выбираемых языках. Сначала думала на питоне решить, но писать на нем я не умею, как оказалось) Думаю это надо будет исправить, среди моих больших планов на будущее есть план получше узнать питон. Пока я его только "читаю" и могу перевести некоторые вещи на джаву.
В итоге, вспомнила, что идея переводит джаву на Котлин и решила задачки на джаве и перевела с помощью идеи на Котлин. Так я вчера увидела первый раз как выглядит котлин. В целом, любопытная возможность.
Сегодняшний день начала с чистки папки с разными мелкими проектами/задачами, перенесла большую часть в облако, открыла свой трекер и думаю, что сегодня займусь им. Добавила юзеров, надо будет добавить таблицу юзеров, познакомиться со Spring MVC, получше организовать JPA Hibernate, чтобы четко работало, возможно поменяю Н2 базу на PostgreSQL или mySQL.
Еще двое из команды проявили желание сделать задачу со звездочкой, которую можно было начать выполнять только после сдачи проекта - задача перевести лайки в оценки фильма от 1 до 10.
Наша команда получила зачет, поэтому буду спамить тут новыми постами, пока свободное время до нового спринта)
Вчера был день задач. Верхнюю задачу сначала решила, потом занялась задачами на числа Фибоначчи, решила еще легкую задачку с leetcode. Потом думаю, дай отдохну от задач - пошла читать/смотреть про Docker. Пока не скажу, что разобралась, но появилось первое впечатление.
Стала перебирать открытые вкладки в браузере - нашла открытую на какой-то контест от яндекс на 2 часа. Начала, а там хоп, а джавы-то и нет в выбираемых языках. Сначала думала на питоне решить, но писать на нем я не умею, как оказалось) Думаю это надо будет исправить, среди моих больших планов на будущее есть план получше узнать питон. Пока я его только "читаю" и могу перевести некоторые вещи на джаву.
В итоге, вспомнила, что идея переводит джаву на Котлин и решила задачки на джаве и перевела с помощью идеи на Котлин. Так я вчера увидела первый раз как выглядит котлин. В целом, любопытная возможность.
Сегодняшний день начала с чистки папки с разными мелкими проектами/задачами, перенесла большую часть в облако, открыла свой трекер и думаю, что сегодня займусь им. Добавила юзеров, надо будет добавить таблицу юзеров, познакомиться со Spring MVC, получше организовать JPA Hibernate, чтобы четко работало, возможно поменяю Н2 базу на PostgreSQL или mySQL.
Еще двое из команды проявили желание сделать задачу со звездочкой, которую можно было начать выполнять только после сдачи проекта - задача перевести лайки в оценки фильма от 1 до 10.
🔥3👏3👍1
Всем привет!
На этой неделе интересовалась Spring MVC, что это такое и чем отличается от Spring Boot. Во-первых, потому что часто встречала требование в вакансиях знать Spring MVC, а во-вторых, потому что узнала, что мы не будем подробно этим заниматься в Практикуме. Начала смотреть курс по нему на youtube, прочитала короткую статью об основных принципах на хабре. Почитала другие статьи на английском. Итак, что могу сказать пока после короткого знакомства со Spring MVC:
MVC – описывает паттерн Model (сущности), View (отображение/ фронт-энд) и Controller (контроллеры). То есть, на первый взгляд, всё как мы и делаем в наших приложениях на Spring Boot, за исключением того, что мы не делаем фронт-энд.
Когда стала смотреть курс на ютюбе, увидела, что view оказывается здесь играет ключевую роль. Например, когда мы пишем REST API в Spring Boot, мы можем вернуть созданный объект в теле ответа, либо просто статус ОК. Здесь же, каждый метод контроллера возвращает String – название html страницы, которую нужно отобразить пользователю. Для каждого эндпоинта, по которому мы будем создавать какой-либо объект, в mvc существует и GetMapping и PostMapping. То есть мы сначала получаем страницу, на которой будем что-то создавать, а потом только можем это создать.
Стала смотреть еще на разницу между Spring Boot и Spring MVC, оказалось что есть отличия и в настройках — в mvc нужно прописывать настройки (configuration) вручную, в boot этого не требуется. Есть еще отличия, связанные с тем, что я пока еще не делала (например, deployment – развертывание и запуск веб-приложения на сервере), поэтому пока не буду о них писать.
Также, в этом курсе подтвердили слова нашего наставника с вебинара, что действительно не делают 1 класс для одной сущности и перегружают ее всякими аннотациями. Например, один класс User для обозначения полей, какие у него будут, и связывания с базой данных. А другой класс, UserDto (dto - data transfer object, или объект передачи данных), где можно добавить аннотации по валидации или дополнительные поля, которые в связи с безопасностью не нужно раздавать при любом запросе. И иметь два маппера, один из которых будет собирать более общий объект userDto, а другой обычного юзера. Наставник также говорил, что может быть и третий класс, который будет дополнительно иметь какую-нибудь логику.
На этой неделе интересовалась Spring MVC, что это такое и чем отличается от Spring Boot. Во-первых, потому что часто встречала требование в вакансиях знать Spring MVC, а во-вторых, потому что узнала, что мы не будем подробно этим заниматься в Практикуме. Начала смотреть курс по нему на youtube, прочитала короткую статью об основных принципах на хабре. Почитала другие статьи на английском. Итак, что могу сказать пока после короткого знакомства со Spring MVC:
MVC – описывает паттерн Model (сущности), View (отображение/ фронт-энд) и Controller (контроллеры). То есть, на первый взгляд, всё как мы и делаем в наших приложениях на Spring Boot, за исключением того, что мы не делаем фронт-энд.
Когда стала смотреть курс на ютюбе, увидела, что view оказывается здесь играет ключевую роль. Например, когда мы пишем REST API в Spring Boot, мы можем вернуть созданный объект в теле ответа, либо просто статус ОК. Здесь же, каждый метод контроллера возвращает String – название html страницы, которую нужно отобразить пользователю. Для каждого эндпоинта, по которому мы будем создавать какой-либо объект, в mvc существует и GetMapping и PostMapping. То есть мы сначала получаем страницу, на которой будем что-то создавать, а потом только можем это создать.
Стала смотреть еще на разницу между Spring Boot и Spring MVC, оказалось что есть отличия и в настройках — в mvc нужно прописывать настройки (configuration) вручную, в boot этого не требуется. Есть еще отличия, связанные с тем, что я пока еще не делала (например, deployment – развертывание и запуск веб-приложения на сервере), поэтому пока не буду о них писать.
Также, в этом курсе подтвердили слова нашего наставника с вебинара, что действительно не делают 1 класс для одной сущности и перегружают ее всякими аннотациями. Например, один класс User для обозначения полей, какие у него будут, и связывания с базой данных. А другой класс, UserDto (dto - data transfer object, или объект передачи данных), где можно добавить аннотации по валидации или дополнительные поля, которые в связи с безопасностью не нужно раздавать при любом запросе. И иметь два маппера, один из которых будет собирать более общий объект userDto, а другой обычного юзера. Наставник также говорил, что может быть и третий класс, который будет дополнительно иметь какую-нибудь логику.
Хабр
Spring MVC — основные принципы
Фреймворк Spring MVC обеспечивает архитектуру паттерна Model — View — Controller (Модель — Отображение (далее — Вид) — Контроллер) при помощи слабо связанных готовых компонентов. Паттерн MVC разделяет...
👍6🔥1
Всем привет!
Вчера проходила мок-собеседование. Впечатления очень хорошие, увидела темы, в которых нужно укрепить знания, приятно было отвечать правильно. Это приободрило.
Обсуждали ООП, HTTP, SOLID, алгоритмы и сложности, циклы разработки, монолит против микросервисной архитектуры, тесты, а также, рассказывала о проектах, которые писала (учебные и свой пет-проект).
Из забавного — забыла, что такое логарифм)) Когда «раскладывала» сложности по О-большое в порядке возрастания.
Вспомнила только два принципа SOLID, поэтому сейчас их здесь пропишу, чтобы лучше запомнить:
S – Single Responsibility – Принцип единственной ответственности. Каждый класс должен иметь только одну зону ответственности. Из жизни — курьер только доставляет, а не чинит нам технику.
O – Open / Closed — Принцип открытости-закрытости. Классы должны быть открыты для расширения, но закрыты для изменения. Например, хотим мы класс, отправляющий оповещения по электронной почте, научить отправлять оповещения по смс. Если мы изменим его метод sendNotification – это будет противоречить принципу закрытости для изменения. Как тогда лучше это сделать? Например, создать интерфейс с методом sendNotification, в этом случае класс, который будет оповещать по смс, просто переопределит этот метод, реализуя этот интерфейс. А класс, оповещающий по электронной почте, не потерял свой функционал.
L – Liskov Substitution — Принцип подстановки Барбары Лисков. Можно пояснить так, если класс A является подтипом класса B (наследуется от него), мы должны иметь возможность заменить B на A, не нарушая поведения нашей программы. Другими словами наследники должны уметь делать все то же, что и родители. Пример на машинах — есть класс Car, в котором прописаны методы завестись (turnOnEngine()) и ускориться (accelerate()). Подтип машин, электромашины. Он сможет также заводиться и ускоряться.
I – Interface Segregation — Принцип разделения интерфейсов. Большие интерфейсы должны быть разделены на более мелкие. Таким образом, классы будут реализовывать только те интерфейсы, которые имеют к ним отношение. Другими словами, нельзя заставлять класс переопределять все методы интерфейсов, которые они не используют.
D – Dependecy Inversion — Принцип инверсии зависимостей. Он относится к разделению программных модулей. Модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те, и другие должны зависеть от абстракции. Звучит сложно, но по сути это классический полиморфизм, когда мы одинаково можем работать с классами, реализующими один интерфейс. То есть, вместо того, чтобы прописать конкретную реализацию (условный userServiceImpl), мы прописываем интерфейс, который этот класс реализует (userService).
Вчера проходила мок-собеседование. Впечатления очень хорошие, увидела темы, в которых нужно укрепить знания, приятно было отвечать правильно. Это приободрило.
Обсуждали ООП, HTTP, SOLID, алгоритмы и сложности, циклы разработки, монолит против микросервисной архитектуры, тесты, а также, рассказывала о проектах, которые писала (учебные и свой пет-проект).
Из забавного — забыла, что такое логарифм)) Когда «раскладывала» сложности по О-большое в порядке возрастания.
Вспомнила только два принципа SOLID, поэтому сейчас их здесь пропишу, чтобы лучше запомнить:
S – Single Responsibility – Принцип единственной ответственности. Каждый класс должен иметь только одну зону ответственности. Из жизни — курьер только доставляет, а не чинит нам технику.
O – Open / Closed — Принцип открытости-закрытости. Классы должны быть открыты для расширения, но закрыты для изменения. Например, хотим мы класс, отправляющий оповещения по электронной почте, научить отправлять оповещения по смс. Если мы изменим его метод sendNotification – это будет противоречить принципу закрытости для изменения. Как тогда лучше это сделать? Например, создать интерфейс с методом sendNotification, в этом случае класс, который будет оповещать по смс, просто переопределит этот метод, реализуя этот интерфейс. А класс, оповещающий по электронной почте, не потерял свой функционал.
L – Liskov Substitution — Принцип подстановки Барбары Лисков. Можно пояснить так, если класс A является подтипом класса B (наследуется от него), мы должны иметь возможность заменить B на A, не нарушая поведения нашей программы. Другими словами наследники должны уметь делать все то же, что и родители. Пример на машинах — есть класс Car, в котором прописаны методы завестись (turnOnEngine()) и ускориться (accelerate()). Подтип машин, электромашины. Он сможет также заводиться и ускоряться.
I – Interface Segregation — Принцип разделения интерфейсов. Большие интерфейсы должны быть разделены на более мелкие. Таким образом, классы будут реализовывать только те интерфейсы, которые имеют к ним отношение. Другими словами, нельзя заставлять класс переопределять все методы интерфейсов, которые они не используют.
D – Dependecy Inversion — Принцип инверсии зависимостей. Он относится к разделению программных модулей. Модули верхнего уровня не должны зависеть от модулей нижнего уровня. И те, и другие должны зависеть от абстракции. Звучит сложно, но по сути это классический полиморфизм, когда мы одинаково можем работать с классами, реализующими один интерфейс. То есть, вместо того, чтобы прописать конкретную реализацию (условный userServiceImpl), мы прописываем интерфейс, который этот класс реализует (userService).
🔥6👍1
Всем привет!
Небольшой пятничный апдейт. С понедельника у нас начался новый модуль, начали углубляться в то, как работает Spring Boot под капотом. Начали новый проект, в этом спринте в основном задание было сделать каркас-подготовку, в следующем спринте будем подключать базу данных с помощью JPA. Мне задание уже зачли, поэтому я пока буду отдыхать до открытия следующей теории, до среды.
Вчера порекомендовали одного преподавателя/ментора по Java, у него есть свой YouTube канал — dmdev. Заинтересовали его видео по сервлетам. После теории этого спринта, захотелось углубиться в эту тему, потому что представление о том, как они работают пока очень поверхностное. Возможно после этих видео, сделаю короткий пост о том, что это такое. Присмотрела, что у него есть и по docker и по spring видео, думаю начать смотреть его канал.
Также, думаю доделать подключение пользователей через Spring Security у себя в пет-проекте. Я пока security подробно не касалась, но зато пригодятся знания, полученные в результате работы над ТЗ. Теперь есть лучше представление, как организовать работу с DTO объектами и где хранить пароль юзера, хотя на счет пароля еще есть сомнения с точки зрения безопасности. Скорее всего изучение Spring Security подскажет точно как это нужно правильно сделать.
Небольшой пятничный апдейт. С понедельника у нас начался новый модуль, начали углубляться в то, как работает Spring Boot под капотом. Начали новый проект, в этом спринте в основном задание было сделать каркас-подготовку, в следующем спринте будем подключать базу данных с помощью JPA. Мне задание уже зачли, поэтому я пока буду отдыхать до открытия следующей теории, до среды.
Вчера порекомендовали одного преподавателя/ментора по Java, у него есть свой YouTube канал — dmdev. Заинтересовали его видео по сервлетам. После теории этого спринта, захотелось углубиться в эту тему, потому что представление о том, как они работают пока очень поверхностное. Возможно после этих видео, сделаю короткий пост о том, что это такое. Присмотрела, что у него есть и по docker и по spring видео, думаю начать смотреть его канал.
Также, думаю доделать подключение пользователей через Spring Security у себя в пет-проекте. Я пока security подробно не касалась, но зато пригодятся знания, полученные в результате работы над ТЗ. Теперь есть лучше представление, как организовать работу с DTO объектами и где хранить пароль юзера, хотя на счет пароля еще есть сомнения с точки зрения безопасности. Скорее всего изучение Spring Security подскажет точно как это нужно правильно сделать.
👍4❤1🔥1
Всем привет!
В прошлый раз хотела написать про Сервлеты. Пока смотрела разные видео, читала разные статьи, больше всех понравилось объяснение профессора из Университета Вандербильта. Решила здесь выложить перевод некоторых основных моментов и показать схему из его видео (она будет в комментариях).
Когда браузер отправляет HTTP запрос, этот запрос направляется в контейнер, который обычно называется web container (web application container полностью). Внутри этого контейнера есть один или несколько сервлетов, которые обрабатывают отправляемые ему HTTP-запросы. Запрос приходит в веб-контейнер, а затем перенаправляется одному из многих отдельных сервлетов.
Что такое сервлет? Это просто класс Java, который имеет специальные методы для обработки входящих HTTP-запросов, а ключевые методы сервлета — это doGet(), doPost(), и так далее, на каждый HTTP-метод.
Один из ключевых вопросов: если у нас есть несколько сервлетов, как нам решить, какой сервлет должен обрабатывать конкретный HTTP-запрос?
Внутри большинства веб-контейнеров есть то, что называется функцией маршрутизации или неким маршрутизатором, с помощью которого решается на основе поступающего запроса, какой сервлет должен его обработать. В Java способ обработки и маршрутизации сервлета определяется через файл web.xml. Это специальный файл, сообщающий веб-контейнеру о поступлении определенного запроса.
Допустим, у нас есть новый запрос для /bar, и это POST. С помощью файла web.xml, находится сервлет, к которому этот запрос должен перейти, а затем он направляется к соответствующему сервлету.
Так что этот файл — это по сути маршрутизация запросов. Веб-контейнер обеспечивает жизненный цикл и использует эту таблицу маршрутизации для определения какой сервлет должен получать запросы, а затем эти запросы обрабатываются отдельными сервлетами.
В прошлый раз хотела написать про Сервлеты. Пока смотрела разные видео, читала разные статьи, больше всех понравилось объяснение профессора из Университета Вандербильта. Решила здесь выложить перевод некоторых основных моментов и показать схему из его видео (она будет в комментариях).
Когда браузер отправляет HTTP запрос, этот запрос направляется в контейнер, который обычно называется web container (web application container полностью). Внутри этого контейнера есть один или несколько сервлетов, которые обрабатывают отправляемые ему HTTP-запросы. Запрос приходит в веб-контейнер, а затем перенаправляется одному из многих отдельных сервлетов.
Что такое сервлет? Это просто класс Java, который имеет специальные методы для обработки входящих HTTP-запросов, а ключевые методы сервлета — это doGet(), doPost(), и так далее, на каждый HTTP-метод.
Один из ключевых вопросов: если у нас есть несколько сервлетов, как нам решить, какой сервлет должен обрабатывать конкретный HTTP-запрос?
Внутри большинства веб-контейнеров есть то, что называется функцией маршрутизации или неким маршрутизатором, с помощью которого решается на основе поступающего запроса, какой сервлет должен его обработать. В Java способ обработки и маршрутизации сервлета определяется через файл web.xml. Это специальный файл, сообщающий веб-контейнеру о поступлении определенного запроса.
Допустим, у нас есть новый запрос для /bar, и это POST. С помощью файла web.xml, находится сервлет, к которому этот запрос должен перейти, а затем он направляется к соответствующему сервлету.
Так что этот файл — это по сути маршрутизация запросов. Веб-контейнер обеспечивает жизненный цикл и использует эту таблицу маршрутизации для определения какой сервлет должен получать запросы, а затем эти запросы обрабатываются отдельными сервлетами.
👍6
Всем привет!
Сегодня хочу рассказать о паре забавных случаев, связанных со Spring Security (один напрямую связан, второй не очень). В начале недели делала свой проект, разобралась, как хранить пароли пользователей в зашифрованном виде, начала настраивать SecurityConfig, чтобы это все дело протестировать. Даже сделала пару простеньких html страниц для отображения страниц регистрации и логина, для зарегистрированных пользователей.
Делала я по курсу Spring MVC Security, который был выложен 6 месяцев назад. Оказалось, что методы, которые там применялись для настройки SecurityConfig уже устарели. Попробовала сделать сама по неглубокому погружению в документацию — дошла до того, что мне стал запрещен доступ на localhost 😅
На этой веселой ноте, проверила остальную часть работы программы — ничего не сломалось, добавила себе там новую задачу — настроить по-нормальному SecurityConfig и отложила пока.
А второй забавный случай произошел вчера. Делала я учебный проект, немного зайдя вперед теории настроила связь таблиц по аннотации OneToMany. Запускаю проект — ошибка выходит “Unable to acquire JDBC Connection”, стала гуглить — никакие варианты не работали. Отложила теорию, пошла смотреть более новое видео по Spring Security, оно начинается с настройки связей ManyToMany по аннотации и тут я замечаю свою ошибку в учебном проекте. Надо указывать сначала в JoinColumn ссылку на класс, в котором есть поле, ссылающееся на другую сущность/таблицу, а потом уже указывать ссылку на второй класс. Поменяла в учебном проекте — запустила, вышла ошибка с наименованием колонки, поправила и все заработало. Так неожиданно, но интересно и забавно вышло.
Сегодня хочу рассказать о паре забавных случаев, связанных со Spring Security (один напрямую связан, второй не очень). В начале недели делала свой проект, разобралась, как хранить пароли пользователей в зашифрованном виде, начала настраивать SecurityConfig, чтобы это все дело протестировать. Даже сделала пару простеньких html страниц для отображения страниц регистрации и логина, для зарегистрированных пользователей.
Делала я по курсу Spring MVC Security, который был выложен 6 месяцев назад. Оказалось, что методы, которые там применялись для настройки SecurityConfig уже устарели. Попробовала сделать сама по неглубокому погружению в документацию — дошла до того, что мне стал запрещен доступ на localhost 😅
На этой веселой ноте, проверила остальную часть работы программы — ничего не сломалось, добавила себе там новую задачу — настроить по-нормальному SecurityConfig и отложила пока.
А второй забавный случай произошел вчера. Делала я учебный проект, немного зайдя вперед теории настроила связь таблиц по аннотации OneToMany. Запускаю проект — ошибка выходит “Unable to acquire JDBC Connection”, стала гуглить — никакие варианты не работали. Отложила теорию, пошла смотреть более новое видео по Spring Security, оно начинается с настройки связей ManyToMany по аннотации и тут я замечаю свою ошибку в учебном проекте. Надо указывать сначала в JoinColumn ссылку на класс, в котором есть поле, ссылающееся на другую сущность/таблицу, а потом уже указывать ссылку на второй класс. Поменяла в учебном проекте — запустила, вышла ошибка с наименованием колонки, поправила и все заработало. Так неожиданно, но интересно и забавно вышло.
🔥3😁2👍1
Всем привет!
Может кому-то скучно и будет интересно решить алгоритмическую задачку?)) Эта задачка со степика из курса "Алгоритмы", которую я решала на прошлой неделе.
"Официальное" задание:
По данным n отрезкам необходимо найти множество точек минимального размера, для которого каждый из отрезков содержит хотя бы одну из точек.
В первой строке дано число 1 ≤ n ≤ 100 отрезков. Каждая из последующих n строк содержит по два числа 0 ≤ l ≤ r ≤10 , задающих начало и конец отрезка. Выведите оптимальное число m точек и сами m точек. Если таких множеств точек несколько, выведите любое из них.
Пример ввода №1:
3
1 3
2 5
3 6
Вывод:
1
3
Пример ввода №2:
4
4 7
1 3
2 5
5 6
Вывод:
2
3 6
Перевод с учебного на русский: "есть несколько дощечек разной длины (это наши отрезки n). Нужно прибить их к полу так, чтобы если комната перевернулась они не попадали. Вот минимальное количество гвоздей в этой задаче и точки куда они прибиты и будет решением"
(позже в комментариях скину свое решение)
Может кому-то скучно и будет интересно решить алгоритмическую задачку?)) Эта задачка со степика из курса "Алгоритмы", которую я решала на прошлой неделе.
"Официальное" задание:
По данным n отрезкам необходимо найти множество точек минимального размера, для которого каждый из отрезков содержит хотя бы одну из точек.
В первой строке дано число 1 ≤ n ≤ 100 отрезков. Каждая из последующих n строк содержит по два числа 0 ≤ l ≤ r ≤10 , задающих начало и конец отрезка. Выведите оптимальное число m точек и сами m точек. Если таких множеств точек несколько, выведите любое из них.
Пример ввода №1:
3
1 3
2 5
3 6
Вывод:
1
3
Пример ввода №2:
4
4 7
1 3
2 5
5 6
Вывод:
2
3 6
Перевод с учебного на русский: "есть несколько дощечек разной длины (это наши отрезки n). Нужно прибить их к полу так, чтобы если комната перевернулась они не попадали. Вот минимальное количество гвоздей в этой задаче и точки куда они прибиты и будет решением"
(позже в комментариях скину свое решение)
👍3👏2❤1
Всем привет!
Захотелось рассказать про интересный инструмент, о котором узнала вчера. Мне пришло тестовое задание на отклик на вакансию. Задание было — «Добавить кнопку и текстовое поле на страницу. По нажатию на кнопку - значение в поле увеличивается на 1. Значение поля можно изменить руками, вписав нужное значение. Изменения должны сохранятся в БД автоматически при каждом изменении.» Одним из требований было сделать это используя Vaadin 24. Я с ним не была до этого знакома, пошла изучать и мне очень понравились его возможности.
Это такой фреймворк, на котором можно удобно создавать фронт на Java. Я стала с ним знакомиться по этой статье с spring.io, есть очень похожая статья на русском языке с хабра. Идеальная вещь для создания симпатичного внешнего вида для своих пет-проектов. Этим я с удовольствием скоро займусь, как закончу делать ТЗ этого спринта (вчера только начала).
С Vaadin можно быстро настроить разные текстовые поля, колонки, таблички, кнопки, если цвета по умолчанию не нравятся, нужно будет настраивать CSS, как сказано в еще одной статье с хабра, в ней еще говорится, что и в компаниях используют Vaadin и люди из комментариев это также подтвердили.
Так что кому хочется симпатичного фронта для своего веб-приложения, но не хочется сильно углубляться в JavaScript, HTML, CSS и так далее, советую посмотреть в сторону Vaadin (прочитав про его минусы из последней ссылки).
Захотелось рассказать про интересный инструмент, о котором узнала вчера. Мне пришло тестовое задание на отклик на вакансию. Задание было — «Добавить кнопку и текстовое поле на страницу. По нажатию на кнопку - значение в поле увеличивается на 1. Значение поля можно изменить руками, вписав нужное значение. Изменения должны сохранятся в БД автоматически при каждом изменении.» Одним из требований было сделать это используя Vaadin 24. Я с ним не была до этого знакома, пошла изучать и мне очень понравились его возможности.
Это такой фреймворк, на котором можно удобно создавать фронт на Java. Я стала с ним знакомиться по этой статье с spring.io, есть очень похожая статья на русском языке с хабра. Идеальная вещь для создания симпатичного внешнего вида для своих пет-проектов. Этим я с удовольствием скоро займусь, как закончу делать ТЗ этого спринта (вчера только начала).
С Vaadin можно быстро настроить разные текстовые поля, колонки, таблички, кнопки, если цвета по умолчанию не нравятся, нужно будет настраивать CSS, как сказано в еще одной статье с хабра, в ней еще говорится, что и в компаниях используют Vaadin и люди из комментариев это также подтвердили.
Так что кому хочется симпатичного фронта для своего веб-приложения, но не хочется сильно углубляться в JavaScript, HTML, CSS и так далее, советую посмотреть в сторону Vaadin (прочитав про его минусы из последней ссылки).
🔥3👍2👏2❤1
Всем привет!
На этой неделе плотно занималась учебным проектом. В этот раз к нашему проекту шеринга нужно было подключить базу данных через JPA и внести новые фичи. Нам дали ~700 тестов, на которых наш проект должен был успешно отработать. Из новых фич: добавили возможность бронировать вещи и оставлять комментарии после аренды.
Тесты были хорошие, в плане обработки разнообразных крайних случаев: то пользователь оставляет комментарии на вещь, которую не арендовал, то владелец хочет арендовать свою собственную вещь.
Самым сложным для понимания был момент с выводом последнего и следующего бронирования. Сначала поняла топорно, отсортировала бронирования по времени и выдавала их по индексам списка, по порядку. Это естественно не было правильным решением.
Потом стала смотреть почему тест ожидает именно эти бронирования, сделала свой запрос в базу данных, стала смотреть на результаты и разбираться в логике почему ожидаемый результат правильный.
Когда поняла, что последняя бронь является последней по отношению к текущему времени запроса, уже пошла придумывать алгоритм отбора таких бронирований и он успешно отработал.
Вообще, было очень интересно над ним работать, задание было большим, пугающим и местами очень непростым. Но постепенно, решая вопросы по мере поступления я его дописала, а вчера вечером мне его зачли,после небольших исправлений.
Вчера пока ждала проверки, стала потихоньку возвращаться к своим вопросам по другим темам, начала смотреть курс по докеру, потом по кафке. Ещё вчера "разговорилась" с chat gpt часа на полтора, просила его сравнивать разные инструменты, применять их на примерах с кодом. Очень понравилось)
На этой неделе плотно занималась учебным проектом. В этот раз к нашему проекту шеринга нужно было подключить базу данных через JPA и внести новые фичи. Нам дали ~700 тестов, на которых наш проект должен был успешно отработать. Из новых фич: добавили возможность бронировать вещи и оставлять комментарии после аренды.
Тесты были хорошие, в плане обработки разнообразных крайних случаев: то пользователь оставляет комментарии на вещь, которую не арендовал, то владелец хочет арендовать свою собственную вещь.
Самым сложным для понимания был момент с выводом последнего и следующего бронирования. Сначала поняла топорно, отсортировала бронирования по времени и выдавала их по индексам списка, по порядку. Это естественно не было правильным решением.
Потом стала смотреть почему тест ожидает именно эти бронирования, сделала свой запрос в базу данных, стала смотреть на результаты и разбираться в логике почему ожидаемый результат правильный.
Когда поняла, что последняя бронь является последней по отношению к текущему времени запроса, уже пошла придумывать алгоритм отбора таких бронирований и он успешно отработал.
Вообще, было очень интересно над ним работать, задание было большим, пугающим и местами очень непростым. Но постепенно, решая вопросы по мере поступления я его дописала, а вчера вечером мне его зачли,после небольших исправлений.
Вчера пока ждала проверки, стала потихоньку возвращаться к своим вопросам по другим темам, начала смотреть курс по докеру, потом по кафке. Ещё вчера "разговорилась" с chat gpt часа на полтора, просила его сравнивать разные инструменты, применять их на примерах с кодом. Очень понравилось)
👏6🔥1
Всем привет!
Вчера целый день изучала Docker. Хочу сегодня здесь немного коротко структурировать основные понятия:
Что такое докер?
Docker – это программная платформа для быстрой разработки, тестирования и развертывания приложений. Docker упаковывает ПО в стандартизованные блоки, которые называются контейнерами.
Что такое Docker контейнер?
Это такой блок, который включает все необходимое для работы приложения: библиотеки, системные инструменты, код и среду исполнения.
Что такое Docker-образ? (на английском Docker Image)
Docker-образ — шаблон для создания Docker-контейнеров. Представляет собой исполняемый пакет, содержащий все необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации.
Казалось бы, определения для контейнера и образа очень похожи. Чем же отличается докер контейнер от докер образа? Docker контейнер – это рабочая среда для образа. А докер-образ — это неизменяемый образ, из которого разворачивается контейнер.
Зачем нам может понадобиться Docker?
Когда разработка ведется разными людьми, на разных компьютерах, для того, чтобы запустить приложение, использующее, например, Java и PostgreSQL, нужно установить на каждый компьютер и java и postgresql. Когда мы хотим продемонстрировать работу нашего приложения, нам нужно установить java и postgresql на ту машину, на которой будет демо, либо привезти свой ноутбук. Если добавить удаленных тестировщиков, которые будут тестировать наше приложение, им также нужно будет установить и java и postgresql на их компьютерах. В зависимости от операционной системы на разных компьютерах, установка может отличаться, что может привести к сложностям.
Захотим мы протестировать наше приложение с работой с другой базой данных, MongoDb или MySQL, нам нужно будет установить все три базы данных на каждый компьютер.
Так вот докер позволяет запустить наше приложение не устанавливая никаких дополнительных инструментов на наш компьютер напрямую. Потому что контейнер — это своя собственная изолированная среда, включающая все необходимые настройки и инструменты для запуска и работы нашего приложения. И загрузить и запустить такой контейнер можно одной командой — docker run my-app:1.0, где my-app будет именем нашего образа, а 1.0 версией (тегом) нашего образа.
Вчера целый день изучала Docker. Хочу сегодня здесь немного коротко структурировать основные понятия:
Что такое докер?
Docker – это программная платформа для быстрой разработки, тестирования и развертывания приложений. Docker упаковывает ПО в стандартизованные блоки, которые называются контейнерами.
Что такое Docker контейнер?
Это такой блок, который включает все необходимое для работы приложения: библиотеки, системные инструменты, код и среду исполнения.
Что такое Docker-образ? (на английском Docker Image)
Docker-образ — шаблон для создания Docker-контейнеров. Представляет собой исполняемый пакет, содержащий все необходимое для запуска приложения: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации.
Казалось бы, определения для контейнера и образа очень похожи. Чем же отличается докер контейнер от докер образа? Docker контейнер – это рабочая среда для образа. А докер-образ — это неизменяемый образ, из которого разворачивается контейнер.
Зачем нам может понадобиться Docker?
Когда разработка ведется разными людьми, на разных компьютерах, для того, чтобы запустить приложение, использующее, например, Java и PostgreSQL, нужно установить на каждый компьютер и java и postgresql. Когда мы хотим продемонстрировать работу нашего приложения, нам нужно установить java и postgresql на ту машину, на которой будет демо, либо привезти свой ноутбук. Если добавить удаленных тестировщиков, которые будут тестировать наше приложение, им также нужно будет установить и java и postgresql на их компьютерах. В зависимости от операционной системы на разных компьютерах, установка может отличаться, что может привести к сложностям.
Захотим мы протестировать наше приложение с работой с другой базой данных, MongoDb или MySQL, нам нужно будет установить все три базы данных на каждый компьютер.
Так вот докер позволяет запустить наше приложение не устанавливая никаких дополнительных инструментов на наш компьютер напрямую. Потому что контейнер — это своя собственная изолированная среда, включающая все необходимые настройки и инструменты для запуска и работы нашего приложения. И загрузить и запустить такой контейнер можно одной командой — docker run my-app:1.0, где my-app будет именем нашего образа, а 1.0 версией (тегом) нашего образа.
👍6
Всем привет!
Небольшой пятничный апдейт 👨💻
После того, как познакомилась с Docker, захотелось применить его на своем пет-проекте. Но для этого захотелось его сначала доделать.
Поэтому начала с настройки Spring Security. Наконец, это у меня получилось, пароли стали сохраняться в зашифрованном виде. После этого, подключила Json Web Token, который теперь может выдаваться юзеру на короткое время действия, и с которым юзер может заходить в защищенные эндпоинты.
Теперь хочу подключить простой фронт. Сомневаюсь, стоит ли делать через модель Spring MVC или через Vaadin... 🤔 C одной стороны, мне интереснее Vaadin, потому что он на Java, а MVC предполагает знание, как минимум, HTML. Но оба варианта предполагают изменение существующей логики — у меня сейчас реализованы REST контроллеры.
Буду рада, если кто-нибудь из читающих посоветует, что лучше выбрать (или свой вариант) ☺️
Небольшой пятничный апдейт 👨💻
После того, как познакомилась с Docker, захотелось применить его на своем пет-проекте. Но для этого захотелось его сначала доделать.
Поэтому начала с настройки Spring Security. Наконец, это у меня получилось, пароли стали сохраняться в зашифрованном виде. После этого, подключила Json Web Token, который теперь может выдаваться юзеру на короткое время действия, и с которым юзер может заходить в защищенные эндпоинты.
Теперь хочу подключить простой фронт. Сомневаюсь, стоит ли делать через модель Spring MVC или через Vaadin... 🤔 C одной стороны, мне интереснее Vaadin, потому что он на Java, а MVC предполагает знание, как минимум, HTML. Но оба варианта предполагают изменение существующей логики — у меня сейчас реализованы REST контроллеры.
Буду рада, если кто-нибудь из читающих посоветует, что лучше выбрать (или свой вариант) ☺️
👏2👍1