Тёмный
Eugene Suleimanov
Eugene Suleimanov
Eugene Suleimanov
Подписаться
Разработка программного обеспечения.
Меня зовут Евгений Сулейманов.
Я инженер по разработке ПО. Специализация - высоконагруженные распределённые системы.
Публикую обучающие видеоматериалы по языкам программирования, фреймворкам, базам данных, облачным сервисам и т.д.
Будущее программирования
28:16
6 месяцев назад
Виртуальные потоки в Java
23:00
7 месяцев назад
Оптимизация SQL запроса
17:13
9 месяцев назад
Что такое Kubernetes?
12:49
10 месяцев назад
Ключевые структуры данных
50:39
10 месяцев назад
LeetCode #49 - Group Anagrams
14:00
Год назад
Комментарии
@delalen8012
@delalen8012 День назад
Спасибо за видео
@MadMax-mz5zu
@MadMax-mz5zu 2 дня назад
👍👍
@crazym8nd
@crazym8nd 5 дней назад
классный чел
@dmitriykolesnik9752
@dmitriykolesnik9752 8 дней назад
Спасибо за видео! Кратко, ёмко и суперполезно! Сразу тяжело всё понять - перематываю, пересматриваю, стараюсь разобраться. Столкнулся с таким моментом: в классе SingleThreadPoolDemo компилятор ругается на блок try-with-resources, говорит, что ExecutorService не является AutoCloseable. В итоге выяснилось, что начиная с Java 21, ExecutorService был расширен, чтобы имплементировать интерфейс AutoCloseable, а я использовал старую версию Джавы. Поэтому, чтобы корректно завершить работу ExecutorService в старых версиях, нужно явно вызвать его методы shutdown() и awaitTermination(). Вот такой вариант работает для старых версий Джавы: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class SingleThreadPoolDemo { public static void main(String[] args) { long start = System.currentTimeMillis(); ExecutorService executorService = Executors.newSingleThreadExecutor(); try { for (int i = 0; i < 100; i++) { executorService.submit(new GenerateRandomIntegerTask()); } } finally { executorService.shutdown(); // Корректное завершение работы потока try { // Ждём завершения всех задач, но не более 1 минуты if (!executorService.awaitTermination(1, TimeUnit.MINUTES)) { executorService.shutdownNow(); // Принудительное завершение при таймауте } } catch (InterruptedException e) { executorService.shutdownNow(); // Принудительное завершение при ошибке } long end = System.currentTimeMillis(); long duration = end - start; System.out.println("Processed in: " + duration + " ms"); } } }
@urugwaii6653
@urugwaii6653 8 дней назад
Большое спасибо за материал и за объяснение!
@EugeneSuleimanov
@EugeneSuleimanov 7 дней назад
@@urugwaii6653 спасибо за отзыв!
@oldjohn1503
@oldjohn1503 9 дней назад
Ох, круто! Спасибо тебе, Женя, огромное!
@EugeneSuleimanov
@EugeneSuleimanov 8 дней назад
@@oldjohn1503 спасибо за отзыв!
@polrk
@polrk 9 дней назад
Да и выбор кубернетеса - очень плохое решение. Посмотрите на ваши нагрузки, ни один кластер не выдержит нагузку, да и сеть не выдержит такую нагрузку. Тут как минимум нужны десятки кластеров в каждой зоне доступности, + нужны кеширующие сервера на разных уровнях сети
@EugeneSuleimanov
@EugeneSuleimanov 9 дней назад
@@polrk интересное мнение. Если можете скинуть ссылки на исследования- буду признателен. Спасибо!
@polrk
@polrk 9 дней назад
Ну это же полный бред брать технологии от амазона... там переплача 1000-10000%.
@codingpas
@codingpas 14 дней назад
Как вы успеваете пилить такие классные ролики и работать?
@EugeneSuleimanov
@EugeneSuleimanov 14 дней назад
@@codingpas спасибо за комментарий. Немного меньше сплю :)
@vladimirk201
@vladimirk201 15 дней назад
Если собеседование уже через полчаса, а ты совсем ничего не знаешь))
@toddis4912
@toddis4912 16 дней назад
В explain 1 цифра - это стоимость для начала конкретного этапа, а 2 - это общая стоимость выполнения. Первая цифра включает все операции выполненные до этого, чтобы начать текущий этап. Чтобы получить стоимость конкретного этапа нужно вычесть из цифры 2 цифру 1. Общая стоимость выполнения запроса это 2 цифра на последнем этапе, цифры не нужно суммировать, как это делает автор. По сути после первого преобразования запроса автором, запрос отработал медленнее))) Но это вполне объяснимо маленьким объемом данных и поэтому цифры будут скакать)
@EugeneSuleimanov
@EugeneSuleimanov 16 дней назад
@@toddis4912 спасибо за полезный комментарий и конструктив.
@manartezekov502
@manartezekov502 16 дней назад
Лучшее что можно найти респект))), ждем новых тем :)
@EugeneSuleimanov
@EugeneSuleimanov 16 дней назад
@@manartezekov502 спасибо за поддержку!
@ShintilesBayzakov
@ShintilesBayzakov 20 дней назад
Большое спасибо! Но у меня при update срабатывает как insert новая запись. Не подскажите почему так?
@EugeneSuleimanov
@EugeneSuleimanov 20 дней назад
@@ShintilesBayzakov спасибо аза отзыв! Имеет смысл проверит реализацию метода isNew в классе сущности. Обычно, причина именно в этом.
@ShintilesBayzakov
@ShintilesBayzakov 20 дней назад
@@EugeneSuleimanov спасибо) но я не понял) можно пример, если не трудно, прошу прощения!
@MrRomanvideo
@MrRomanvideo 20 дней назад
Если уж говоришь 'точка остановы', то иди дальше и говори 'противожук'. ;)
@EugeneSuleimanov
@EugeneSuleimanov 20 дней назад
@@MrRomanvideo я остановлюсь на отладчике ))
@MrRomanvideo
@MrRomanvideo 20 дней назад
@@EugeneSuleimanov а, так да 👍)
@mobilafilm
@mobilafilm 25 дней назад
спасибо👍
@non_holy6286
@non_holy6286 26 дней назад
Здравствуйте! Подскажите, пожалуйста, вы еще работаете с менти? Как получить информацию по этой части?
@EugeneSuleimanov
@EugeneSuleimanov 26 дней назад
@@non_holy6286 здравствуйте! Да, работаю. Телеграмм: @proselyte
@redice8928
@redice8928 27 дней назад
Ну так в чем отличие многопоточности от параллелизма, хоть кто-нибудь может дать внятный ответ?
@user-lk8n0fgjk
@user-lk8n0fgjk 29 дней назад
Добрый вечер. Подскажите, пожалуйста, в проекте country как идет наполнение баз данных? У меня вылетает ошибка((
@TheFuckel
@TheFuckel Месяц назад
Раз даже через три года автор не удосужился рассказать, зачем нужен новый уровень абстракции, попробую я - представьте что для создания экземпляров каждого девелопера нужно тащить кучу сервисов, дао, конфигов из контекста (dependency injection) вот и получается, что ваш класс раздулся до огромных размеров. Поэтому хорошобы спрятать логику создания в конкретные фабрики, а потом унифицированно и компактно вызывать их методы
@yaroslavlymar6599
@yaroslavlymar6599 Месяц назад
почему меня корежит от словосочетания "точка остановы"? Можно это просто брейкпойнтом называть
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@yaroslavlymar6599 да, можно назвать брейкпоинтом, а можно точкой останова - стандартный термин :)
@Daniel-mo1iy
@Daniel-mo1iy Месяц назад
Спасибо за видео! Помню работал не на спринговом проекте, написал заявление на увольнение и последние 2 недели не сделал практически ни одной задачи, очень сильно перегорел. На тот момент уже был оффер на проект с новым стеком. Эти две недели отрабатывал дома, позволял себе заниматься не работой, а своими делами (например смотрел про спринг илм другие технологии которые будут на новой работе). Я думал ну все равно уволюсь, и лучше будет если подготовлюсь к новой работе. Все таки двухнедельная отработка это тоже работа, за которую я получаю деньги. И я не имею права забивать на это. Считаю это поступком дилетанта.
@vadmixname978
@vadmixname978 Месяц назад
Как раз изучаю сейчас потоки, спасибо автору!!!
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@vadmixname978 спасибо за поддержку!
@leonidas8404
@leonidas8404 Месяц назад
50:20 Будьте здоровы!
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@leonidas8404 спасибо :)
@Daniel-mo1iy
@Daniel-mo1iy Месяц назад
спасибо! подскажите, а действительно нужно тестировать базовые методы типа save, findAll или saveAll? это было показано для примера, разве в реальном коде не тестируют только какую то кастомную логику, кастомные запросы?
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@Daniel-mo1iy спасибо за комментарий! Обычно, не тестируются, здесь показаны просто примеры работы с тестами.
@Daniel-mo1iy
@Daniel-mo1iy Месяц назад
@@EugeneSuleimanov спасибо за ответ! подскажите еще пжлст, а можно проверять конкретно sql запросы при тестировании repository? например, проверить отсутствие проблемы N+1, или хибернейт может разные алиасы каждый раз делать и такое невозможно протестить?
@user-lk8n0fgjk
@user-lk8n0fgjk Месяц назад
Добрый день, Евгений. Спасибо за Ваш полезный труд! Повторял код за Вами и уперся в докеризацию. Контейнер создал, но при его подъеме ловлю исключение - SQL State : 08001 2024-08-20T10:13:02.695640490Z Error Code : 0 2024-08-20T10:13:02.695641735Z Message : Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. При этом локально БД работает. гугл и chat Gpt пока не дали ответ( Может, есть альтернатива - extra_hosts: - "host.docker.internal:host-gateway"? Спасибо за помощь!
@Daniel-mo1iy
@Daniel-mo1iy Месяц назад
спасибо за видео! Евгений, вы на работе используете docker desktop или используете консольные команды? что предподчительнее? Например у вас в команде может есть особые случаи. Но я точно знаю что на серваке только командами можно использовать )
@peremysh
@peremysh Месяц назад
ща бы систем дизайн у жава мидла спрашивать😀 Леха - молодец! Хорошо держался
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@peremysh спасибо за комментарий!
@selub1058
@selub1058 Месяц назад
Класс. Спасибо. ❤ Только на 14:28 в where должно быть больше ИЛИ РАВНО 1 Января
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@selub1058 большое спасибо за поддержку и за уточнение.
@Usa-wk1bm
@Usa-wk1bm Месяц назад
Евгений, огромное спасибо за урок, буду разбираться с jwt
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@Usa-wk1bm спасибо за поддержку!
@Serg-q6y
@Serg-q6y Месяц назад
На всякий случай: автор вводит в заблуждение по поводу недостатков NoSQL баз данных. В частности NoSQL MongoDb нормально поддерживает транзакции, имеют хорошие возможности отладки и отлично устойчива к любым внешним сбоям. А перечисленные достоинства SQL можно так же отнести и к некоторым NoSQL базам данных. Поэтому нужно аккуратно доверять некоторым оценкам автора.
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@Serg-q6y спасибо за комментарий! Буду признателен за ссылки на документацию. Если под поддержкой транзакций (ACID) в Mongo мы говорим о CAS и ACID на УРОВНЕ ДОКУМЕНТА, то я остаюсь при своем мнении.
@Daniel-mo1iy
@Daniel-mo1iy Месяц назад
спасибо за контент, очень полезно. хорошо что вы у меня такое на собесе в сбер не спрашивали, тогда я бы точно не прошёл)
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@Daniel-mo1iy спасибо за поддержку :)
@limitless6216
@limitless6216 Месяц назад
Евгений, низкий поклон, лайк, подписка, колокольчик
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@limitless6216 спасибо за поддержку!
@Dominic_Herzog
@Dominic_Herzog Месяц назад
Спасибо! Все круто и понятно!)
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@Dominic_Herzog спасибо за отзыв!
@maratslivets1146
@maratslivets1146 Месяц назад
Спасибо! Отличный полнометражный блокбастер. Но при поднятии контейнера country-api падает исключение java.net.UnknownHostException: host.docker.internal на Linux Mint 21.2 может кто-то знает как решить?
@imangalibolatbek8954
@imangalibolatbek8954 Месяц назад
Все круто нравится теперь очень хотелось бы видео ролики про KAFKA, RABBIT, CAMUNDA, WEBSOCKET
@Celestial-y4n
@Celestial-y4n Месяц назад
Дай бог тебе здоровья, добрый человек. Спасибо!
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@Celestial-y4n спасибо за поддержку :)
@romantikh6728
@romantikh6728 Месяц назад
Может невнимательно слушаю, но зачем прописывать создание таблиц вручную, а потом создавать их же с помощью Хибернейт аннотаций?
@street_paws_cafe
@street_paws_cafe Месяц назад
Спасибо за такое информационное и НАГЛЯДНОЕ видео!
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@street_paws_cafe спасибо за поддержку!
@andarworld8985
@andarworld8985 Месяц назад
Евгений, вы Легенда! Спасибо за полезную информацию! Куда вы планируете переезжать, если youtube совсем заблокируют?
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
@@andarworld8985 спасибо за поддержку! По переезду еще нет решения.
@ercefwxdx
@ercefwxdx 2 месяца назад
Супер!
@EugeneSuleimanov
@EugeneSuleimanov 2 месяца назад
@@ercefwxdx спасибо за комментарий!
@ercefwxdx
@ercefwxdx 2 месяца назад
Дякую, супер
@EugeneSuleimanov
@EugeneSuleimanov 2 месяца назад
@@ercefwxdx спасибо за поддержку!
@alfalf1593
@alfalf1593 2 месяца назад
Я правилтно понимаю, что замена join на left join это не оптимизация, а испраление логической ошибки?
@alilaveaau
@alilaveaau 2 месяца назад
Спасибо большое! Было бы интересно послушать от вас про стримы🙌🏻
@delalen8012
@delalen8012 2 месяца назад
Спасибо за видео! Секции с самопроверкой полезные, лучше материал запоминается
@EugeneSuleimanov
@EugeneSuleimanov 2 месяца назад
@@delalen8012 спасибо за отзыв и поддержку!
@yt_consumer
@yt_consumer 2 месяца назад
English comment to boost this video
@EugeneSuleimanov
@EugeneSuleimanov 2 месяца назад
Сенк ю :) Спасибо за поддержку!
@igorklimov9481
@igorklimov9481 2 месяца назад
Евгений, спасибо за курс! Очень основательно и детально, впрочем, как всегда. У меня остался вопрос по докерфайлу -- у вас не возникает проблем с тестами при использовании testcontainers при такой конфигурации, когда сначала билд тул импортируется, а затем он запускает билд? Получается, gradle сам находится в контейнере, и у него нет доступа к контейнеру ryuk:testcontainers, т.к. последний является внешним по отношению к gradle. Я себя на проекте я отказался от докерфайла, и собираю образ при помощи gradle плагина -- при этом я перенастроил процесс сборки, чтобы тесты выполнялись до собирания образа. По мне, это является костылём, и возможно вы знаете более оптимальный подход, при котором можно продолжать использовать dockerfile?
@happysadman8558
@happysadman8558 2 месяца назад
Спасибо большое за видео, Евгений! Много нового узнал, хоть уже с многопоточностью довольно давно знаком. Было очень интересно. Хотелось уточнить, что в примере с "first", "second", "third" можно было бы поочередно запускать, потом дожидаться выполнения каждого из потоков и в таком случае бы было поочередно выведены "first", "second" и "third". Я понимаю что в этом варианте не было бы никакого смысла от создания нескольких потоков, и все можно было бы последовательно выводить в одном, но думаю для полноты картины будет полезно знать, если вдруг кто-то задастся вопросом "а почему не сделать t1.start(); t1.join(); t2.start...?"
@НикитаЗемницкий-ы3ж
@НикитаЗемницкий-ы3ж 2 месяца назад
Пример с Callable и Future не совсем корректный, из-за того, что executor Service создается в try с ресурсами и будет закрыт после выхода из try, мы вынуждены ждать, пока все потоки не закончат работу. На видео это не заметно, так все выполняется большим количеством потоков, но если поставить выполнять это все 2-3 потока, то к брейкпоинту на строчке 22 программа будет идти очень долго
@EugeneSuleimanov
@EugeneSuleimanov 2 месяца назад
@@НикитаЗемницкий-ы3ж большое спасибо за корректное замечание.
@TarasovFrontDev
@TarasovFrontDev 2 месяца назад
Одно из лучших видео, чтобы получить представление о теме! Яростно плюсую)
@EugeneSuleimanov
@EugeneSuleimanov 2 месяца назад
@@TarasovFrontDev большое спасибо за отзыв!
@winter-lb7id
@winter-lb7id 2 месяца назад
ХВАТИТ ЛУПИТЬ ПО КНОПКАМ, боже как же бесит...