Java Mentor – Telegram
Java Mentor
294 subscribers
173 photos
48 videos
1 file
79 links
Download Telegram
public class Main {
/**
* Менеджер наблюдателей с возможностью подписки,
* отписки и оповещения
*/
public static class EventManager {
// Список наблюдателей
List<EventListener> listeners = new ArrayList<>();

/**
* Подписка наблюдателя
* @param listener наблюдатель
*/
public void subscribe(EventListener listener) {
listeners.add(listener);
}

/**
* Отписка наблюдателя
* @param listener наблюдатель
*/
public void unsubscribe(EventListener listener) {
listeners.remove(listener);
}

/**
* Оповещение наблюдателей
* @param data данные для передачи наблюдателям
*/
public void notify(String data) {
for (EventListener listener : listeners) {
listener.update(data);
}
}
}


/**
* Сервис, отвечающий за изменения состояний техники
*/
public static class TransportService {
public EventManager eventManager;

public TransportService(EventManager eventManager) {
this.eventManager = eventManager;
}

/**
* Метод для изменения координат
* @param coordinates новые координаты
*/
public void changeCoordinates(String coordinates) {
// Оповещение всех подписчиков о смене координат
eventManager.notify(coordinates);
}

}

/**
* Наш наблюдатель
*/
public interface EventListener {
/**
* Метод, который будет выполнен, когда наблюдателя оповестят об изменении
* @param data данные изменения
*/
void update(String data);
}

/**
* Класс, отвечающий за отправку WebSocket сообщений
*/
public static class WsNotificationListener implements EventListener {

/**
* Демо метод отправки сообщений. Будет вызван при изменении
* Состояний техники
* @param data данные изменения
*/
@Override
public void update(String data) {
System.out.println("Sending message to ws session: " + data);
}
}


public static void main(String[] args) {
// Отправитель ws сообщений
WsNotificationListener wsNotificationListener = new WsNotificationListener();

// Манагер наблюдателей
EventManager eventManager = new EventManager();
// Отправитель ws сообщений подписывается на изменения
eventManager.subscribe(wsNotificationListener);

// Сервис транспорта. Передаем ему манагера наблюдателей
TransportService service = new TransportService(eventManager);

Random random = new Random();
for (int i = 0; i < 100; i++) {
// В сервисе транспорта меняем координаты, по выводу в консоль убеждаемся что происходит отправка ws сообщений
service.changeCoordinates(String.format("New Coordinates [%s, %s]", random.nextInt(), random.nextInt()));
}
}
}
Задачка

Есть класс Car с двумя полями: brand и model.

Также есть List<Car> - список машин различных брендов и моделей.

Задача 1
Привести список к мапе со вложенностью:
Map<String, Map<String, Car>>


Здесь ключ внешней мапы - brand. Значение - мапа со всеми моделями данной марки, в которой ключ - это модель авто, а значение - сам объект.

Задача 2
Отфильтровать List<Car>

Для фильтра используется объект класса Filter с двумя полями: Set<String> brands и Set<String> models;

Правила фильтрации:

Если brands == null, тогда не фильтруем по этому полю. Иначе только те марки машин, которые перечислены в поле brands

Если models == null, тогда не фильтруем по этому полю. Иначе только те модели авто, которые перечислены в поле models

Задача 3
Собрать из Map<String, Map<String, Car>> список List<Car>

Код всего что нужно для решения - в коментах к этому посту.

Постарайтесь использовать Stream API для решения этой задачи.
🔥5👍2
Media is too big
VIEW IN TELEGRAM
Ну а теперь немного интересных новостей.

Закончил работу над последним проектом со своим учеником.

Посмотрите какой клевый бот для записи к барберу получился 😍

И вместе с работой над этим проектом подошло к концу мое наставничество со всеми ребятами.

Я обязательно поделюсь с вами этим опытом, кажется я узнал не меньше, чем мои ученики 😅

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

Stay tuned, как говорится )
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥54
Проблема с Spring Security заключается в том, что не существует единого то гайда на все случаи жизни.

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

От такого многообразия новичку сносит башню.

На чем же сосредоточиться в начале пути?

Наиболее распространен способ аутентификации через JWT токен. Такой способ используется в REST приложениях.

JWT не подсходит, если у вас html странички.

Дело в том, что JWT токен передается в заголовке запроса. Без JavaScript в голом html сделать это невозможно.

Для начала, лучше отказаться от реализации аутентификации и авторизации через JWT токен.

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

Что гуглить для этого?

spring form login tutorial

Если все-таки хотите jwt, у вас два 3 варианта:

1. Отказаться от фронта, и делать просто REST приложение. Чисто backend. Тогда тестировать приложение нужно будет через постман.

2. Научиться с помощью JavaScript управлять токенами и передавать их на бэк в заголовке запроса.

3. Изучить реакт и делать полноценное фронтенд приложение (если есть лишний год времени).

Здесь может быть заманчивой перспектива стать фулл-стэк разработчиком. Но на рынке не очень большая потребность в такой связке Java-React. Я бы не рекомендовал этот путь избирать вначале. Мне кажется, что если очень хочется изучить реакт, лучше делать это после трудоустройства джавистом куда-нибудь.

Теперь ссылки. Почитайте Обзор способов и протоколов аутентификации в веб-приложениях

Туториал для JWT

Если прям очень сильно хочется в React, то вот неплохой курс из 100 уроков, бесплатно и на русском.

PS-Disclaimer данный пост сделан в качестве ответа на вопрос заданный в чатике, не является прям полноценным гайдом.
🔥10👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Знание английского больше не нужно!!!

Пост для тех, у кого беда с английским.

Сорян за кликбейтный заголовок, но мало ли, вдруг кто-то еще не в курсе.

Яндекс браузер позволяет переводить видосы налету.

А это значит, что вы можете смотреть любой туториал на английском с мгновенным переводом на русский, бесплатно и без регистрации 😏

Работает как на компе, так и на мобиле.

Пожелал бы вам удачи в обучении, но с этой штукой удачи нужно уже не так много 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥86👍5
Кто сяй не пьет, тот сьмо!
(с) Конфуций
😁9
Тут в чатике задали вопрос на тему:

Что делать после того, как изучил Spring?

Запишу для вас небольшой аудиоподкаст на эту тему и поделюсь своим мнением.

PS Залетайте в чатик, задавайте свои вопросы, так вы получите ответы, а я инфоповод для контента 😎
👍5
🔥11
🛑🅰️🅰️🅰️🅰️🅰️🅰️🅰️🛑

Сидел, никого не трогал, писал свою реализацию игры быки и коровы для следующего видоса на YouTube, как вдруг бабах 🤯

Придумал для вас интересную задачку на кругозор и сообразительность 😈

Необходимо создать случайное четырех значное число содержащие только уникальные цифры

ВНИМАНИЕ! Класс Random использовать запрещается 🚫

Hint
В картинке к посту зарыта совсем неочевидная подсказка

Успеете разгадать до того, как выложу видос? 😳 Но чур не гуглить и не джипитить 😏
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3
В общем, здравствуйте!

Неделька выдалась плодотворной, пришлось впервые конвертировать объекты в GeoJSON. Опыт интересный, но повторять его не хочется 😅

По мотивам этой деятельности родилась идея задать вам еще одну задачку.

Только давайте на этот раз договоримся, что вы потешите немного мое эго, и притворитесь, что задачка сложная и интересная, а не как в прошлый раз за 10 минут скинете правильный ответ 😂

Понеслась 🎮

Представим себе что у нас есть объект - здание (Building).

У него есть характеристики:
🎮 Адрес
🎮 Количество помещений
🎮 Тип

Есть два типа зданий: Коммерческие и частные

Частные здания обладают дополнительной характеристикой:
🎮 Имя владельца

Коммерческие здания обладают дополнительными характеристиками:
🎮 Список компаний (которые размещаются в данном здании, можно просто List<String>)
🎮 Номер телефона администрации

Задача - спроектировать данные классы таким образом, чтобы можно было иметь объект Building и через него иметь доступ к дополнительной информации о здании.

Как вы поняли, дополнительная информация разная у объектов разного типа (Коммерческих и частных зданий).

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

Решением будет считаться код класс(а/ов).
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2🗿1
Этим летом я впервые попробовал себя в качестве наставника.

Моим вторым учеником был Нурбакыт. Самый воспитанный и скромный среди прочих, он сталкивался с рядом трудностей.

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

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

Короче говоря я дизморалил человека как мог, но несмотря на все трудности на прошлой неделе Нурик сумел таки пробиться на собесы 😎

Их было два, и по итогу одного из них ему предложили сделать тестовое задание:

Написать бэк на спринге, а фронт на реакте.

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

В начале этой неделе ему сделали Job Offer 👍🤝🎉💰

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

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

PS я пишу это просто чтобы поделиться радостью, у меня нет цели рекламировать себя как наставника (по крайней мере сейчас). И чуть позже я хочу поделиться своими дальнейшими планами
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤‍🔥4👍4👏1
Hello, world!

Проект был завершен почти на половину, но работы были приостановлены. Он не мог понять, что мешает ему двинуться дальше. Задачка пустяковая, нужно просто написать пару ендпоинтов, html страничек, прикрутить авторизацию. При удачном стечении мотивации делов-то на несколько часов работы. Но что-то не давало продвинуться дальше. Словно кость вставшая поперек горла. Всеобъемлющая апатия и алгоритмический паралич не давали сдвинуться с места ни на символ.

Он прокручивал в голове этот сценарий много раз: "Сначала нужно сделать проект, затем спроектировать план курса, затем просто все отснять". Но все колом встало на этапе "сделать проект". При мыслях об html завтрак начинал стучаться обратно в глотку просясь наружу.

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

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

Удалить все. Сначала CTRL+A, а затем размашисто и жирно послать все на три буквы DEL.

Другой проект... решение для бизнеса.... Точно! Вдруг стало совершенно очевидно что нужно делать, и как...


Всем доброго утра!
Да, я разрабатываю свой курс, и да, я все еще вижу галлюцинации.

Отвечу на ряд вопросов, которые поступают в лс:
1. Когда выйдет курс - не знаю. Не ждите меня, сила у вас внутри)
2. Беру ли я новых учеников - Нет
3. Планирую ли я брать новых учеников - возможно когда-нибудь

Пока я делаю свой курс я:
1. Постараюсь радовать вас контентом, полезным, бесполезным. Мне нравится возможность порой упорото себя вести.
2. Буду пить чай с печеньками
🔥73👍3🦄2
И первая вещь, которой хочется с вами поделиться и которая совершенно никакого отношения к программированию не имеет, но произвела на меня большое впечатление. Это интервью с 4-ех кратным доктором наук, который расскажет как правильно выбрать спутника жизни, и почему долголетие напрямую зависит от того, ставите вы перед собой цели или нет.

https://www.youtube.com/watch?v=0H9TfRJz_fY&t=1s
🔥6👍4❤‍🔥1👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Объявляется конкурс «проведи аналогию с программированием»

Моя версия: «Когда джуны увидели на какие костыли способен сеньор» 😂
🤣54🙈2
Есть два стула две переменные:

int x = 3;
int y = 4;


На какой сам сядешь Необходимо поменять их значения местами, без использования третьей переменной.

Т.е. в y после нехитрых махинаций должно быть 3, а в x - 4.

Раскройте нехитрую махинацию
👍7🤔2
Всем привет!

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

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


☕️Представим себе маленькую кофейню-булочную, для которой нужно разработать систему лояльности с бонусной картой.

💳 На бонусную карту возвращаются 5% от суммы покупки в виде бонусов., которые можно впоследствии потратить.

☎️ Представим что бонусная карта привязана к номеру телефона.

👇Итого:
Клиент совершает заказ, называет номер телефона, оплачивает заказ и получает 5% от суммы на БК. Если у него были бонусы, он может за их счет уменьшить стоимость оплаты.

Вопрос:
Какие основные сущности вы бы выделили для такого приложения?

Какие таблицы в бд создали бы?

Может быть у вас есть какие-то идеи для реализации логики бизнес-процесса?

В общем, буду рад, если поделитесь.

🧠 Такие упражнения как минимум полезны для разминки мозгов, а как максимум замените кофейню на цветочный магазин, автомойку, ритуальные услуги - и получите универсальную идею для пет-проекта практически под любой бизнес 💲


PS если картинка вызывает кринж, значит она подобрана правильно))
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3👌1
Привет, ребят!
Порой мне лень что-то постить, потому что порой я ленивый. В такие моменты радуют ваши вопросы в чатике, которые могу потом сюда продублировать.

Дублирую😌
Выше вопрос, ниже ответ 😎

Ликвидбейз это инструмент миграции бд. Чейнджсет - это набор изменений. У него есть id, и прочие параметры. Дословно чейнджсет - это набор изменений. Эти изменения будут применены к бд. Ликвидбейз создаст служебную таблицу для себя - databasechangelog, в которую он будет записывать какие чейнджсеты были применены, а какие нет. Благодаря этому каждый чейнджсет накатывается всего лишь единожды. Также, благодаря этому, нельзя изменять те чейнджсеты, которые были накатаны на базу. В табличке записывается хэш сумма файла миграции, и при изменении этого файла (чейнджсета) хэш сумма сравнивается с той, что записана в бд, если они не совпадают, при запуске будет ошибка.

Короче ликвидбейз - это инструмент миграции бд.

Хибернейт - это реализация ORM - объектно-реляционного маппинга. Подхода, при котором объекты мира ооп сопоставляются с реляционными таблицами.
Создать таблицы при запуске приложения - это одна из функций, которая конфигурируется наличием проперти:
spring.jpa.hibernate.ddl-auto (тык). Возможные значения: auto, create, update. Каждая из них при запуске включает разное поведение хибернейта. Создать схему, обновить в соотвтетствии с ентити классами, и тд, см доки по ссылке выше.

Короче - это два разных инструмента, которые в определенных случаях могут делать одно и то же.

Если используешь ликвидбейз, просто не ставь пропертю хибернейта, которую выше написал
9🔥3👍1
Скоро что-то будет
🔥141
Что-ж будет то скоро?

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

Но как бы то ни было - понеслась.

Первое, и самое сложное из того, что должно произойти - это камбек пост. Этот самый, по буковкам которого так ловко бегают твои глазки.

Почему это сложно?

Скажем прямо, я выпал на некоторое время. И теперь, мне будто нужно обосновать свое возвращение. Конечно, куда проще было бы сразу написать пост про разрядность чисел. Будто ничего и не было. Будто я не шлялся по бабам все это время. Но я не могу делать вид, что ничего не произошло.

А кое-что все таки произошло.

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

А главное вот что.

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

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

Но я его нашел, точнее придумал.

Самому смешно такое писать, но лучше всего пришедшее решение демонстрирует старая добрая песенка.

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


Конечно это вдруг произошло, потому что все прошедшее было не зря. Не напрасно было.

В общем, не буду тянуть кота за яйца.

Что произошло?

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

Подробности я расскажу позже.

И еще я понял, что снова начну практиковать индивидуальное наставничество. Подробности тоже расскажу позже.

Ну и последнее. Мне нравится этот блог. Мне нравится, что он кому-то приносит пользу. И я понял, что мне нужно вести его более систематически. Т.е. относиться к генерации контента не как к чему-то, что требует вдохновения, а как к чему-то, что требует немного дисциплины. Чуточку. Пол шишечки дисциплины.

Собственно вот что будет. Буду доставать вас своим курсом, иногда буду говорить о том, что провожу наставничество, ну а большую часть времени буду стараться регулярно писать о старой доброй Java, и немного о своей жизни.

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

Работаем
👍116🔥4❤‍🔥3