Java Mentor – Telegram
Java Mentor
293 subscribers
173 photos
48 videos
1 file
79 links
Download Telegram
Мир вашему Либидо!

В апреле прошлого года я завел себе ТГ канал.

Стал постить вещи про джаву, себя и трудоустройство.

Стал искать себе учеников.

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

Даже не заработанных, созданных, сгенерированных вот этими вот руками.

Я нашел 5ых учеников. Предложил им сочные условия, и мы погнали.

С кем-то наша работа уже закончилась, с кем-то скоро закончится.

Я сгенерил себе больше 100к самостоятельно. И это очень большое достижение лично для меня.

Никому из учеников я не обещал трудоустройство по итогу наставничества.

Я обещал лишь подготовить их к выходу на рынок.

Но блин!

За 3-6 месяцев работы со мной 4 человека из 5 уже получили офферы.

1 устроился работать за три месяца.

1 получил оффер с первого собеса

1 еще не закончил заниматься со мной но уже получил оффер x2 стоимости моего наставничества

1 еще получит свой оффер я уверен.

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

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

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

PS Я обязательно расскажу историю каждого с кем мне повезло поработать в наставничестве.
🔥11👍42❤‍🔥2
Вопросы и ответы на собес

Всем привет!

Ловите клевый ресурс для подготовки к техническому интервью: https://github.com/enhorse/java-interview

Здесь вы найдете вопросы и ответы как по самой джаве, так и по смежным темам вроде SQL и работе с web
🔥8👍31🙏1
Media is too big
VIEW IN TELEGRAM
Где-то я прочитал, что блогеры эксперты продают не свои знания и экспертизу, а образ жизни, который можно получить используя те знания и экспертизу.

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

Мой подход к генерации контента основан на двух мышках внутри меня. В какой-то момент у них возникает такой диалог:
- Привет, Пинки!
- Привет, Брейн!
- Мы давно ничего не постили, Пинки.
- Да Брейн.
- Так мы не захватим мир, Пинки
- Да, Брейн
- Ну так может быть ты расскажешь и покажешь как клево работать из дома, Пинки?
- Да, Брейн.

Ну так вот, из дома работать клево. Я работаю из дома еще с тех времен, когда не было ковида. У меня в офисе два новогодних подарка, ждут, когда я заеду за ними. Один с этого НГ, другой с прошлого. Настолько мне стало лень в офис ездить.

Не все это любят. Кому-то прям очень важна социальность, общение. В моем окружении как правило это важно девушкам.

Не видел ни одного парня, который сказал бы: «Блин, как мне не хватает работы в офисе, и живого общения с этими прекрасными людьми»

А вы как относитесь к работе на удаленке? Чего бы хотели больше (удаленку/офис) и почему?
🔥10🦄1
Итак, пока я рожаю полезный контент, (головка уже появилась), продолжу знакомить вас с образом жизни блогера программиста.

Мне 32. Я заметил, что 3-ий десяток - это период переосмысления своей жизни.

Многие мои знакомые начинают задумываться: «а че я собственно хочу?». Будто до 30 мы все двигаемся по шаблону, найти работу, обзавестись семьей, купить робот-пылесос.

А после все задумываемся, а что мне нужно? Нужно не по сценарию, а действительно.

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

Человек я вежливый. Мне всегда было неловко бить людей. Но на боевых единоборствах если ты не бьешь, то бьют тебя. И даже если бьешь ты, то тебя все равно тоже бьют.

🏊‍♂️🏊‍♂️🏊‍♂️
Поэтому я выбрал бассейн. Ходил около полугода, но потом надоело быть в этом процессе одному.

🥊🥊🥊
Затем я выбрал бокс. Индивидуальные занятия с тренером. Раньше я не занимался боксом, и для меня было открытием, что на боксе люто забиваются ноги, а не руки.


🥊🥊🥊
Спустя какое-то время я совершил фатальную ошибку. Подумав, что я немного прокачался в индивидуальных занятиях, я пошел на групповые.

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

И после, собрав всю свою мужественность и храбрость, я сжал очко и пошел на танцы.

💃🕺
Удивительно, но пойти на танцы было гораздо страшнее, чем получать по щщам на боксе.

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

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

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

А в четвертых, пожалуй разверну. Лично я сталкиваюсь на танцах со своими слабостями. Со своей скованностью, со своей застенчивостью, со своей зажатостью.

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

Как сказал один чувак на танцах: «все мы боремся со своей социальной отчужденностью». Эти слова запали мне в душу. Мне кажется, что социально отчужденным людям сложнее стать успешными.

И я очень рад, что нашел в себе силы бороться со своей социальной отчужденностью.

А где вы боретесь со своими слабостями? Комфортно ли вам бить людей или предпочитаете иные способы контактного взаимодействия?
Ставь 🦄 если интроверт
Please open Telegram to view this post
VIEW IN TELEGRAM
9🦄5🤝2
Media is too big
VIEW IN TELEGRAM
Видос к прошлому посту.
Танцы - спросите вы? Танцы - отвечу я.
👍52
Предлагаю сыграть в игру.

Представим, что у нас есть 2 таблицы:

🔶 Employees:
🔹employee_id (целое число, первичный ключ)
🔹first_name (строка, имя сотрудника)
🔹last_name (строка, фамилия сотрудника)
🔹department_id (целое число, внешний ключ, связан с department_id в таблице Departments)
🔹salary (дробное число, зарплата сотрудника)

🔶 Departments:
🔹department_id (целое число, первичный ключ)
🔹department_name (строка, название отдела)


🎮 Я буду давать задания на написание SQL запросов к этим таблицам. А вы в комментах пишите запрос.

🎮 Задания будут постепенно усложняться. После первого правильного ответа я даю следующее задание.

🎮 Победит тот, кто даст больше всех правильных ответов.

Задание 1
Вывести все данные из таблицы "Employees"
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍2
This media is not supported in your browser
VIEW IN TELEGRAM
6🔥3👍2
Самая простая игра на Java которую ты можешь написать уже сейчас!


В далеком 2007 году, в маленьком городе Нальчик, я ехал в маршрутке к репетитору по программированию. Тогда я еще не знал, что в тот вечер мне будет дано задание написать игру на паскале. И уж тем более не подозревал, что спустя 17 лет, я буду сидеть в Санкт-Петербурге и предлагать уже другим людям написать ту самую, маленькую, но очень гордую игру.

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

Суть ее проста.

Компьютер загадывает число определенной длины (минимум 4-ех значное)

Задача человека - угадать число.

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

Например.
Компьютер загадал число: 4356
Первая попытка: 1234
Вывод компьютера: 2, 0.
Две цифры угаданы верно (3, 4), но 0 цифр угаданы в нужной позиции

Вторая попытка: 4321
Вывод компьютера: 2, 2

Две цифры угаданы верно (3, 4) и обе стоят в нужной позиции.

Задача игрока - вычислить задуманное число за минимальное количество попыток.

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

И еще, кто-нибудь может объяснить почему игра называется Быки и Коровы?
🔥10👍2🦄2👨‍💻1
Всем привет!

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

Получил несколько сообщений о том, что было бы интересно послушать о брокерах сообщений.

Мне кажется (сугубо мое имхо), что для джуна знание и умение работать с брокерами сообщений не обязательно.

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

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

Есть 2 шаблона проектирования:

1. Наблюдатель
2. Издатель - подписчик



Вопросы:
1. Какую задачу решают эти шаблоны?
2. В чем отличие одного от другого?
3. Не могли бы вы придумать кейс, в котором уместно было бы использовать 1 из них (ну или использовать брокер сообщений)

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

А чуть погодя сделаю пост, где сам постараюсь раскрыть эту тему.

PS на собесах про брокеры сообщений спрашивают гораздо реже, чем про паттерны проектирования. Заготовьте себе крутой ответ на такой вопрос, ответив на три моих вопроса выше 😎
🔥5❤‍🔥32🦄2👍1
Шаблон проектирования: Наблюдатель

В прошлом посте я коснулся темы шаблонов проектирования Наблюдатель и Издатель-Подписчик.

Постараюсь разобрать первый из двух, а потом рассмотрим и второй.

Как известно, шаблоны проектирования бывают:
⭐️ Порождающие
⭐️ Структурные
⭐️ Поведенческие

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

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

Но на кой черт мне просить оповещать меня? Ситуация, скажем прямо, не повседневная.
Для ответа на вопрос "Нах Зачем?", рассмотрим пример из врачебной практики.

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

И вдруг, о Боже! Один экскаватор замигал красными огнями. Код красный, код красный, экскаватор в беде. Пукан диспетчера взрывается 😫 , что побуждает его совершить определенные действия 🛠.


Теперь рассмотрим эту же ситуацию изнутри. Диспетчер видит технику. Как эта информация поступает к нему? Он должен видеть изменения координат каждой машинки 🚗.

Вариантов реализовать это 2.
Первый вариант. Фронт шлет запросы на сервер. Много запросов. И спрашивает: "Чувак, че нить поменялось? А теперь? А теперь?" И сервер на каждый такой запрос говорит: "Да, поменялось, вот эти машинки были тут, теперь они здесь. А еще у экскаватора припадок".

Это не очень эффективно, так как ну много запросов, нагрузка большая.

Специально для таких кейсов умные ребята в странных свитерах придумали другой протокол. WebSocket

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

В отличии от HTTP, где у нас всегда есть запрос-ответ, в веб-сокете это совсем не обязательно. Возможно отправлять безграничное множество сообщений от одного сервиса в другой и наоборот. Например 10 в одну сторону 20 в другую. Количество ничем не ограничено, как и очередность 💌✉️💌

Это позволяет отправлять информацию на фронт, не дожидаясь от него запроса на получение этой информации.

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

🎮 Заглянем в бэкенд 🎮

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

Именно тут на сцену выходит

Observer - Наблюдатель

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

Что произойдет?

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

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

Теперь, попробуем обернуть все в код.
В примере сознательно допущены упрощения, для лучшего восприятия. Хороший пример данного шаблона вы можете найти здесь.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥75👍3
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