Итак, ⛄️🎄🍾 Новый Год уже наступил и мчится на всех порах... и что это значит? Это значит, что пришла пора анонсировать новый проект!
Поэтому представляю вашему вниманию канал Пульс Технологий @pulse_of_tech, на котором регулярно публикуются самые обсуждаемые новости и статьи из мира науки и IT!
Канал только запустился, поэтому прошу поддержать подпиской. Новости на канале публикуются ежедневно!
Поэтому представляю вашему вниманию канал Пульс Технологий @pulse_of_tech, на котором регулярно публикуются самые обсуждаемые новости и статьи из мира науки и IT!
Канал только запустился, поэтому прошу поддержать подпиской. Новости на канале публикуются ежедневно!
👍5🔥1👏1
Обновил 📺 видео про Springdoc, чтобы оно соответствовало статье. Видео доступно и на YouTube, и на RuTube - кому что удобнее.
Springdoc позволяет автоматически генерировать документацию по вашему REST API на основании исходного кода и специальных аннотаций. Таким образом, ваша документация будет всегда актуальной и её не нужно как-то дополнительно актуализировать каждый раз при изменении исходников.
Springdoc позволяет автоматически генерировать документацию по вашему REST API на основании исходного кода и специальных аннотаций. Таким образом, ваша документация будет всегда актуальной и её не нужно как-то дополнительно актуализировать каждый раз при изменении исходников.
👍6🔥6
Записал видеоролик для статьи Валидация бинов в Spring. Видео доступно на YouTube и RuTube.
Spring позволяет проверять входящие запросы в декларативном стиле при помощи специальных аннотаций из пакета jakarta.validation. Валидация активируется с помощью аннотации Valid.
Ещё бывает полезно изменить стандартный формат сообщения об ошибке, чтобы там отображались более информативные сообщения. И в видео я расскажу как это можно сделать.
Пример проекта также доступен на github.
Spring позволяет проверять входящие запросы в декларативном стиле при помощи специальных аннотаций из пакета jakarta.validation. Валидация активируется с помощью аннотации Valid.
Ещё бывает полезно изменить стандартный формат сообщения об ошибке, чтобы там отображались более информативные сообщения. И в видео я расскажу как это можно сделать.
Пример проекта также доступен на github.
🔥9👍2
На собеседованиях и на leetcode можно встретить такую алгоритмическую задачу.
В новом видео (YouTube и RuTube) мы рассмотрим несколько вариантов реализации этого алгоритма, начиная с самого простого, и будем постепенно его оптимизировать. Текстовый вариант в виде статьи доступен на моём сайте.
Дан неупорядоченный массив целых чисел. Нужно найти все пары чисел, сумма которых равна указанной. Числа в массиве могут быть как положительными, так и отрицательными. В качестве результата нужно вернуть порядковые индексы найденных элементов.
В новом видео (YouTube и RuTube) мы рассмотрим несколько вариантов реализации этого алгоритма, начиная с самого простого, и будем постепенно его оптимизировать. Текстовый вариант в виде статьи доступен на моём сайте.
👍10
Сегодня давайте разберёмся, как вычислять контрольные суммы файлов на ☕️ Java с помощью стандартной библиотеки. 📺 Видео доступно на YouTube и RuTube.
Контрольная сумма от набора байт позволяет убедиться в том, что данные на клиенте, полученные от сервера, являются корректными. Для этого вместе с файлом сервер может предоставлять контрольную сумму для проверки на клиентской стороне.
Существует несколько алгоритмов вычисления контрольной суммы, рассмотрим самые популярные: md5, sha-256, sha-512 и crc-32.
Контрольная сумма от набора байт позволяет убедиться в том, что данные на клиенте, полученные от сервера, являются корректными. Для этого вместе с файлом сервер может предоставлять контрольную сумму для проверки на клиентской стороне.
Существует несколько алгоритмов вычисления контрольной суммы, рассмотрим самые популярные: md5, sha-256, sha-512 и crc-32.
👍3🏆3🔥2
С наступлением эпохи микросервисной архитектуры и облачных технологий монолит воспринимается как плохая практика и вообще что-то устаревшее.
К плюсам микросервисов можно отнести лёгкость освоения кодовой базы новичками и готовность к горизонтальному масштабированию by design. Однако за это мы платим дублированием кода и данных в разных микросервисах, большим количеством однотипных правок при обновлении библиотек и сервисных паролей, а также сложными релизами.
В монолите же огромная кодовая база, которую трудно держать в голове, и велика вероятность упереться в потолок по техническим лимитам на сервере. Однако монолиты быстрее разрабатывать, проще релизить и обновлять в нём библиотеки.
Я считаю, что для крупных и "устоявшихся" корпоративных приложений подходят только микросервисы, а для прототипов - монолит. При старте нового продукта логичнее сначала сделать монолит, проверить гипотезы и затем постепенно его распиливать на части.
А какую архитектуру выбрали бы вы при старте нового проекта?
К плюсам микросервисов можно отнести лёгкость освоения кодовой базы новичками и готовность к горизонтальному масштабированию by design. Однако за это мы платим дублированием кода и данных в разных микросервисах, большим количеством однотипных правок при обновлении библиотек и сервисных паролей, а также сложными релизами.
В монолите же огромная кодовая база, которую трудно держать в голове, и велика вероятность упереться в потолок по техническим лимитам на сервере. Однако монолиты быстрее разрабатывать, проще релизить и обновлять в нём библиотеки.
Я считаю, что для крупных и "устоявшихся" корпоративных приложений подходят только микросервисы, а для прототипов - монолит. При старте нового продукта логичнее сначала сделать монолит, проверить гипотезы и затем постепенно его распиливать на части.
А какую архитектуру выбрали бы вы при старте нового проекта?
👍7🔥3❤2💯1
Задавались ли вы вопросом, что именно влияет на популярность языков программирования? Почему одни ЯП популярны десятилетиями, а про другие уже никто не вспоминает? Хочу привести несколько примеров.
C++, привнесший в классический Си ООП модель программирования, появился в 1983. По современным меркам имеет высокий порог входа, тяжёлое наследие в синтаксисе и, как следствие, долгую разработку и сложный дебаг. Однако используется до сих пор для написания высоконагруженных проектов или низкоуровневых утилит и драйверов.
Java в 1995, учтя все минусы C++, привнесла в ООП автоматическую сборку мусора и относительно "стройную" стандартную библиотеку. Сейчас является стандартном де-факто для серверных приложений. Хотя изначально разрабатывалась для управления стиральными машинами и микроволновками.
С#, учтя все "детские болезни" Java, представил очень похожий язык, но под инфраструктуру Microsoft. По сути, до сих пор его ниша так и ограничивается продуктами Microsoft.
Kotlin, детище JetBrains, как будто выбрав золотую середину между ООП Java и функциональным программированием Scala, представил ещё более "стройную" стандартную библиотеку и поддержку от такого гиганта как Google, который сделал его основным языком разработки под Android. И с каждым годом всё больше набирает популярности на server-side.
Python, наиболее популярный сейчас язык программирования, имеющий низкий порог входа. Используется в самых разных сферах: от написания небольших скриптов и до машинного обучения. Его особенностью является необходимость форматировать блоки кода отступами, в отличие от фигурных скобок, как в большинстве других языков. К плюсам можно отнести читабельность кода и интуитивно-понятный синтаксис.
Хочется ещё отдельно вспомнить про HTML, который не совсем язык программирования, а язык разметки. Появившись вместе с интернетом, он разрабатывался для домохозяек. Сейчас домохозяйки сайты не верстают, однако HTML живее всех живых, являясь чем-то вроде ассемблера для Интернета. И скорее всего будет существовать до тех пор, пока существует сам Интернет.
PHP, изначально заточенный под создание сайтов и по сути генерирующий HTML-страницы динамически, в начале нулевых был стандартом де-факто при создании сайтов. В настоящее время его немного потеснили другие языки, но сдавать свои позиции не намерен. Кроме того, PHP уже довольно давно по дизайну старается быть похожим на Java.
Ещё давайте вспомним SQL - язык для баз данных, который, в отличие от обычных ЯП, позволяет указать ЧТО я хочу получить в результате, а не КАК это сделать. Каждая СУБД его расширяет под свою специфику, но стандартные запросы поддерживаются в любом из них. Разработан в 70-е и тоже живее всех живых.
Исходя из всего вышесказанного, напрашивается вывод, что на популярность и время жизни языка влияют либо особенность среды исполнения (HTML, SQL), либо заточенность под конкретного вендора (C#), либо богатый набор библиотек и низкий порог входа (Python), либо высокая производительность (C++).
А какой язык программирования предпочитаете вы и почему?
C++, привнесший в классический Си ООП модель программирования, появился в 1983. По современным меркам имеет высокий порог входа, тяжёлое наследие в синтаксисе и, как следствие, долгую разработку и сложный дебаг. Однако используется до сих пор для написания высоконагруженных проектов или низкоуровневых утилит и драйверов.
Java в 1995, учтя все минусы C++, привнесла в ООП автоматическую сборку мусора и относительно "стройную" стандартную библиотеку. Сейчас является стандартном де-факто для серверных приложений. Хотя изначально разрабатывалась для управления стиральными машинами и микроволновками.
С#, учтя все "детские болезни" Java, представил очень похожий язык, но под инфраструктуру Microsoft. По сути, до сих пор его ниша так и ограничивается продуктами Microsoft.
Kotlin, детище JetBrains, как будто выбрав золотую середину между ООП Java и функциональным программированием Scala, представил ещё более "стройную" стандартную библиотеку и поддержку от такого гиганта как Google, который сделал его основным языком разработки под Android. И с каждым годом всё больше набирает популярности на server-side.
Python, наиболее популярный сейчас язык программирования, имеющий низкий порог входа. Используется в самых разных сферах: от написания небольших скриптов и до машинного обучения. Его особенностью является необходимость форматировать блоки кода отступами, в отличие от фигурных скобок, как в большинстве других языков. К плюсам можно отнести читабельность кода и интуитивно-понятный синтаксис.
Хочется ещё отдельно вспомнить про HTML, который не совсем язык программирования, а язык разметки. Появившись вместе с интернетом, он разрабатывался для домохозяек. Сейчас домохозяйки сайты не верстают, однако HTML живее всех живых, являясь чем-то вроде ассемблера для Интернета. И скорее всего будет существовать до тех пор, пока существует сам Интернет.
PHP, изначально заточенный под создание сайтов и по сути генерирующий HTML-страницы динамически, в начале нулевых был стандартом де-факто при создании сайтов. В настоящее время его немного потеснили другие языки, но сдавать свои позиции не намерен. Кроме того, PHP уже довольно давно по дизайну старается быть похожим на Java.
Ещё давайте вспомним SQL - язык для баз данных, который, в отличие от обычных ЯП, позволяет указать ЧТО я хочу получить в результате, а не КАК это сделать. Каждая СУБД его расширяет под свою специфику, но стандартные запросы поддерживаются в любом из них. Разработан в 70-е и тоже живее всех живых.
Исходя из всего вышесказанного, напрашивается вывод, что на популярность и время жизни языка влияют либо особенность среды исполнения (HTML, SQL), либо заточенность под конкретного вендора (C#), либо богатый набор библиотек и низкий порог входа (Python), либо высокая производительность (C++).
А какой язык программирования предпочитаете вы и почему?
🔥4⚡2👍2
Знаете, что доводит меня до "белого каления"?
Небольшая предыстория.
До 2022 года я хостил все свои pet-проекты, в том числе и devmark.ru, на сервисе heroku.com. Меня он полностью устраивал, т.к. позволял в один клик развернуть Spring-приложение в облачном сервисе, а также при необходимости подключить ему postgres, домен и https. То есть вы получаете готовый сервис без навыков devops буквально за 5 минут. Потом мне пришлось перейти на отечественные виртуалки и я даже сэкономил на этом. Но я готов платить больше, если сервис заметно облегчает мне жизнь и позволяет сосредоточиться на написании кода.
И вот недавно я узнал, что timeweb.cloud предоставляет такой же функционал. У них заявлено немало фичей: облачные БД, kuber, s3 и тот же apps - сборка и деплой из репозитория. Я сначала обрадовался и готов был уже начать переносить все свои проекты туда, однако при первой же попытке деплоя gradle-проекта удача меня покинула(
В процессе двухдневной переписки с поддержкой меня сначала отправили читать их мануал по деплою maven (видимо они считают что раз java, то только maven), затем посоветовали увеличить память c 1 до 2 ГБ и, наконец, завели "внутреннюю задачу" со словами "решение может занять длительное время" 😡. Как будто я - первый человек, которые решил у них задеплоить Spring с gradle 😏 А ведь эта фича у них доступна уже как минимум год!
Другой забавный момент состоит в том, что самая "свежая" JDK, которая у них поддерживается - Java 19 (год выпуска - тот же 2022). Когда же я спросил, не планируется ли поддержка Java 21 как последней актуальной long-term support версии - мне предложили вынести эту фичу на голосование в раздел "Есть идея", и если она будет востребована - то возьмут в работу. То есть переход на актуальную (а порой и более оптимизированную) версию преподносится как фича). Браво! Кстати, на голосование эту фичу уже вынесли до меня ещё полгода назад.
Вот пожалуй и всё что нужно знать про отечественный хостинг) Это меня и доводит до "белого каления". Когда задаёшь конкретные вопросы и выдвигаешь гипотезы, а тебя просто игнорят и отписываются. Хотя gradle - это такой же базовый функционал как maven, который должен поддерживаться по умолчанию.
Но я без претензий к техподдержке timeweb. Их просто этому не научили) Они нащупали реально востребованную нишу и я считаю, что будущее именно за такими сервисами. Осталось только довести до ума технологическую составляющую.
Развитие технологий, как часть ещё более давнего процесса разделения труда, имеет вектор на уменьшение необходимого вам оборудования и знаний при увеличении вашей производительности и удобства. Сервисная модель отлично себя зарекомендовала, к тому же её легко монетизировать. Об этом красноречиво говорят различные конструкторы сайтов, облачные хранилища файлов (Google Drive, Яндекс Диск), потоковое видео (YouTube, Netflix), запуск любых игр без локальной установки (GeForce Now), виртуализация, контейнеры и, наконец, деплой напрямую из репозитория.
Год или полтора назад на одной из конференций я разговаривал на эту тему с представителем всем известной компании на букву Я. Тогда мне сказали, что, несмотря на развитие Cloud-направления, деплой из репозитория не рассматривается даже в отдалённой перспективе.
Между тем среди моих подписчиков периодически возникает вопрос, как развернуть Spring-приложение на сервере. Я же не могу им сказать: "изучите ещё администрирование linux, postgres, docker, kuber - и вот тогда сможете увидеть свой Hello World из любой точки мира"?
P.S. Если знаете другие отечественные аналоги heroku - напишите в комментах, буду очень вам благодарен)
Небольшая предыстория.
До 2022 года я хостил все свои pet-проекты, в том числе и devmark.ru, на сервисе heroku.com. Меня он полностью устраивал, т.к. позволял в один клик развернуть Spring-приложение в облачном сервисе, а также при необходимости подключить ему postgres, домен и https. То есть вы получаете готовый сервис без навыков devops буквально за 5 минут. Потом мне пришлось перейти на отечественные виртуалки и я даже сэкономил на этом. Но я готов платить больше, если сервис заметно облегчает мне жизнь и позволяет сосредоточиться на написании кода.
И вот недавно я узнал, что timeweb.cloud предоставляет такой же функционал. У них заявлено немало фичей: облачные БД, kuber, s3 и тот же apps - сборка и деплой из репозитория. Я сначала обрадовался и готов был уже начать переносить все свои проекты туда, однако при первой же попытке деплоя gradle-проекта удача меня покинула(
В процессе двухдневной переписки с поддержкой меня сначала отправили читать их мануал по деплою maven (видимо они считают что раз java, то только maven), затем посоветовали увеличить память c 1 до 2 ГБ и, наконец, завели "внутреннюю задачу" со словами "решение может занять длительное время" 😡. Как будто я - первый человек, которые решил у них задеплоить Spring с gradle 😏 А ведь эта фича у них доступна уже как минимум год!
Другой забавный момент состоит в том, что самая "свежая" JDK, которая у них поддерживается - Java 19 (год выпуска - тот же 2022). Когда же я спросил, не планируется ли поддержка Java 21 как последней актуальной long-term support версии - мне предложили вынести эту фичу на голосование в раздел "Есть идея", и если она будет востребована - то возьмут в работу. То есть переход на актуальную (а порой и более оптимизированную) версию преподносится как фича). Браво! Кстати, на голосование эту фичу уже вынесли до меня ещё полгода назад.
Вот пожалуй и всё что нужно знать про отечественный хостинг) Это меня и доводит до "белого каления". Когда задаёшь конкретные вопросы и выдвигаешь гипотезы, а тебя просто игнорят и отписываются. Хотя gradle - это такой же базовый функционал как maven, который должен поддерживаться по умолчанию.
Но я без претензий к техподдержке timeweb. Их просто этому не научили) Они нащупали реально востребованную нишу и я считаю, что будущее именно за такими сервисами. Осталось только довести до ума технологическую составляющую.
Развитие технологий, как часть ещё более давнего процесса разделения труда, имеет вектор на уменьшение необходимого вам оборудования и знаний при увеличении вашей производительности и удобства. Сервисная модель отлично себя зарекомендовала, к тому же её легко монетизировать. Об этом красноречиво говорят различные конструкторы сайтов, облачные хранилища файлов (Google Drive, Яндекс Диск), потоковое видео (YouTube, Netflix), запуск любых игр без локальной установки (GeForce Now), виртуализация, контейнеры и, наконец, деплой напрямую из репозитория.
Год или полтора назад на одной из конференций я разговаривал на эту тему с представителем всем известной компании на букву Я. Тогда мне сказали, что, несмотря на развитие Cloud-направления, деплой из репозитория не рассматривается даже в отдалённой перспективе.
Между тем среди моих подписчиков периодически возникает вопрос, как развернуть Spring-приложение на сервере. Я же не могу им сказать: "изучите ещё администрирование linux, postgres, docker, kuber - и вот тогда сможете увидеть свой Hello World из любой точки мира"?
P.S. Если знаете другие отечественные аналоги heroku - напишите в комментах, буду очень вам благодарен)
👍6💯5😁2👎1🔥1
✅ Обновил видео про работу с событиями в Spring.
В нём рассмотрим gradle-проект, написанный на Kotlin. В основе проекта лежит Spring Boot. Фреймворк "из коробки" предоставляет простой механизм работы с событиями, который позволяет уменьшить связность компонентов системы.
Событие, которое возникает в одной точке приложения, может быть перехвачено и обработано в любой другой части приложения благодаря механизму publisher и eventListener. А при помощи пары аннотаций мы можем сделать эту обработку асинхронной.
➡️ Видео доступно на YouTube и RuTube. Текстовый вариант доступен в виде статьи.
В нём рассмотрим gradle-проект, написанный на Kotlin. В основе проекта лежит Spring Boot. Фреймворк "из коробки" предоставляет простой механизм работы с событиями, который позволяет уменьшить связность компонентов системы.
Событие, которое возникает в одной точке приложения, может быть перехвачено и обработано в любой другой части приложения благодаря механизму publisher и eventListener. А при помощи пары аннотаций мы можем сделать эту обработку асинхронной.
➡️ Видео доступно на YouTube и RuTube. Текстовый вариант доступен в виде статьи.
👍6🔥5
Spring Rest Repository: минимум кода для полноценного restful сервиса на Kotlin
В этом видео рассмотрим как Spring Data Rest позволяет избежать написания контроллеров и сервисной логики.
Мы получим все основные операции CRUD (create, read, update и delete), написав при этом значительно меньше кода. Нам нужно только создать интерфейс и разметить сущность. Всё остальное (и запросы к БД, и rest api) Spring сгенерит за нас. Это очень удобный подход для создания прототипов.
Поскольку писать будем на Kotlin, нам придётся учитывать специфику взаимодействия с Java-кодом, на который изначально был рассчитан Spring Data Rest.
В качестве примера напишем приложение, которое позволяет просматривать и редактировать список музыкальных групп.
Видео доступно на YouTube и RuTube.
В этом видео рассмотрим как Spring Data Rest позволяет избежать написания контроллеров и сервисной логики.
Мы получим все основные операции CRUD (create, read, update и delete), написав при этом значительно меньше кода. Нам нужно только создать интерфейс и разметить сущность. Всё остальное (и запросы к БД, и rest api) Spring сгенерит за нас. Это очень удобный подход для создания прототипов.
Поскольку писать будем на Kotlin, нам придётся учитывать специфику взаимодействия с Java-кодом, на который изначально был рассчитан Spring Data Rest.
В качестве примера напишем приложение, которое позволяет просматривать и редактировать список музыкальных групп.
Видео доступно на YouTube и RuTube.
🔥6👍4
Сегодня стартует эксперимент по созданию национальной платформы для оценки компетенций программистов. С помощью этой платформы все желающие смогут проходить тестирование и выполнять практические задания для оценки своих навыков в качестве разработчика. По результатам прохождения такого тестирования на Госуслугах появится сертификат, который будет действителен один год.
Предполагается, что такая сертификация упростит работодателям поиск новых разработчиков и оценку существующих.
Оператор эксперимента будет выбран на конкурсной основе до 31 марта 2025 года. А практическая часть стартует 31 мая, когда все желающие получат доступ к данной платформе.
Пока сложно оценить эту инициативу. В теории, если набор оцениваемых навыков и практических заданий будет как-то стандартизован, то такое тестирование может быть неплохим подспорьем для быстрой оценки потенциального кандидата. Особенно в тех небольших компаниях, у которых нет ресурсов или собственных компетенций для проведения многоэтапных собеседований. Потому что вряд ли такие лидеры индустрии как Яндекс добровольно откажутся от своих фирменных алгоритмический секций.
Вторая область применения, которую я вижу, заключается в том, что различным IT-компаниям, работающим с государственными же проектами, может быть значительно проще обосновать бюджет под ту или иную ставку, если у разработчика будет такой сертификат. Одно время наличие официальных сертификатов было существенным преимуществом у интеграторов.
С другой стороны, до сих пор непонятно, что будет представлять из себя эта платформа. А то нагенерят нейросетью за 5 минут задания в стиле "что будет выведено в консоли после выполнения этой простыни кода?". И даже особо выверять эти задания не будут.
А что вы думаете о подобных инициативах? Следует ли государству пытаться как-то стандартизовывать требования и навыки в области разработки ПО?
Предполагается, что такая сертификация упростит работодателям поиск новых разработчиков и оценку существующих.
Оператор эксперимента будет выбран на конкурсной основе до 31 марта 2025 года. А практическая часть стартует 31 мая, когда все желающие получат доступ к данной платформе.
Пока сложно оценить эту инициативу. В теории, если набор оцениваемых навыков и практических заданий будет как-то стандартизован, то такое тестирование может быть неплохим подспорьем для быстрой оценки потенциального кандидата. Особенно в тех небольших компаниях, у которых нет ресурсов или собственных компетенций для проведения многоэтапных собеседований. Потому что вряд ли такие лидеры индустрии как Яндекс добровольно откажутся от своих фирменных алгоритмический секций.
Вторая область применения, которую я вижу, заключается в том, что различным IT-компаниям, работающим с государственными же проектами, может быть значительно проще обосновать бюджет под ту или иную ставку, если у разработчика будет такой сертификат. Одно время наличие официальных сертификатов было существенным преимуществом у интеграторов.
С другой стороны, до сих пор непонятно, что будет представлять из себя эта платформа. А то нагенерят нейросетью за 5 минут задания в стиле "что будет выведено в консоли после выполнения этой простыни кода?". И даже особо выверять эти задания не будут.
А что вы думаете о подобных инициативах? Следует ли государству пытаться как-то стандартизовывать требования и навыки в области разработки ПО?
🤔7👍3
devmark_ru pinned «Дорогие друзья! Этот канал является частью проекта devmark.ru, где я делюсь своим опытом и публикую статьи о разработке на Java, Kotlin и Spring. Большинство статей доступно также и в видеоформате на YouTube и RuTube. Материалы рассчитаны в основном на начинающих…»
Сегодня на Хабре я опубликовал статью Как сделать Telegram-бота умнее: пошаговый гайд на Spring AI и Kotlin.
Это пошаговый туториал о том, как сделать интеграцию с любой популярной нейросетью с помощью Spring AI и развернуть его в облаке. В качестве примера рассматривается telegram-бот с ChatGPT, но можно использовать и DeepSeek. Сам проект написан на Kotlin и доступен в github.
В процессе написания статьи мне оказывали профессиональные консультации по devops ребята из dockhost.ru.
Думаю, что многим эта тема может быть интересна, поэтому добавляйте в закладки, пишите комменты на Хабре и просто поддержите плюсиком)
Это пошаговый туториал о том, как сделать интеграцию с любой популярной нейросетью с помощью Spring AI и развернуть его в облаке. В качестве примера рассматривается telegram-бот с ChatGPT, но можно использовать и DeepSeek. Сам проект написан на Kotlin и доступен в github.
В процессе написания статьи мне оказывали профессиональные консультации по devops ребята из dockhost.ru.
Думаю, что многим эта тема может быть интересна, поэтому добавляйте в закладки, пишите комменты на Хабре и просто поддержите плюсиком)
🔥10👍4
Несколько недель назад я написал пост о моём негативном опыте взаимодействия с timeweb.cloud. Но отчасти именно благодаря этому посту я познакомился с ребятами из dockhost.
Как оказалось, если в вашем проекте есть Dockerfile, то этот сервис предоставляет точно такой же функционал как heroku по схеме Push-to-Deploy. Вам достаточно указать путь до вашего репозитория, а остальное dockhost сделает за вас: выполнит сборку приложения, подставит переменные окружения, поднимет контейнер, привяжет домен и даже выпустит https-сертификат!
Помимо такой автоматизации вы можете гибко настраивать потребляемые ресурсы, от которых зависит стоимость хостинга.
Ещё меня приятно удивила техподдержка, которая не ограничивается шаблонными фразами, как у других хостеров, а действительно оказывает консультации и предлагает варианты решения той или иной проблемы.
Поэтому, если вы только начинаете осваивать backend-разработку и задаётесь вопросом, как развернуть приложение на сервере, я смело могу рекомендовать dockhost!
А ещё я написал пошаговый гайд:
Как быстро развернуть Spring Boot в облаке.
Как оказалось, если в вашем проекте есть Dockerfile, то этот сервис предоставляет точно такой же функционал как heroku по схеме Push-to-Deploy. Вам достаточно указать путь до вашего репозитория, а остальное dockhost сделает за вас: выполнит сборку приложения, подставит переменные окружения, поднимет контейнер, привяжет домен и даже выпустит https-сертификат!
Помимо такой автоматизации вы можете гибко настраивать потребляемые ресурсы, от которых зависит стоимость хостинга.
Ещё меня приятно удивила техподдержка, которая не ограничивается шаблонными фразами, как у других хостеров, а действительно оказывает консультации и предлагает варианты решения той или иной проблемы.
Поэтому, если вы только начинаете осваивать backend-разработку и задаётесь вопросом, как развернуть приложение на сервере, я смело могу рекомендовать dockhost!
А ещё я написал пошаговый гайд:
Как быстро развернуть Spring Boot в облаке.
👍9
На днях написал заметку про Функциональные интерфейсы в Java.
Многие методы Stream API в качестве параметров принимают именно функциональные интерфейсы.
Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией
В статье мы рассмотрим наиболее употребимые функциональные интерфейсы стандартной библиотеки. Все эти интерфейсы можно найти в пакете java.util.function.
Многие методы Stream API в качестве параметров принимают именно функциональные интерфейсы.
Любой интерфейс можно назвать функциональным, если он содержит один-единственный метод. Такой интерфейс снабжается аннотацией
@FunctionalInterface. Реализацию любого функционального интерфейса можно записать кратко в виде лямбды.В статье мы рассмотрим наиболее употребимые функциональные интерфейсы стандартной библиотеки. Все эти интерфейсы можно найти в пакете java.util.function.
👍13
Обновил 📺 видео к статье про создание Telegram-бота на Spring и Kotlin.
В настоящее время чат-боты в Telegram не делал только ленивый. Они плотно вошли в нашу жизнь и почти у каждой компании есть бот, решающий какие-то задачи бизнеса, тем самым разгружая «живых» сотрудников.
Видео доступно на YouTube и RuTube.
В пример на github я добавил Dockerfile и теперь его легко можно запустить в любом облачном сервисе. Например, на dockhost.ru.
В настоящее время чат-боты в Telegram не делал только ленивый. Они плотно вошли в нашу жизнь и почти у каждой компании есть бот, решающий какие-то задачи бизнеса, тем самым разгружая «живых» сотрудников.
Видео доступно на YouTube и RuTube.
В пример на github я добавил Dockerfile и теперь его легко можно запустить в любом облачном сервисе. Например, на dockhost.ru.
👍8🔥1
Обновил статью Inline-кнопки в telegram-боте и записал видео к ней.
Предположим, вы решили написать онлайн-квиз в виде Telegram-бота. Бот должен выдать вопрос и какие-то варианты ответа к нему.
Если это делать с помощью обычных кнопок, то довольно сложно сопоставить ответ пользователя с конкретным вопросом, т.к. обычные кнопки не хранят контекст.
Но есть встраиваемые (inline) кнопки, которые относятся непосредственно к сообщению. Они добавляют гораздо больше интерактива и именно их можно увидеть при регистрации бота в @BotFather.
📺 Видео доступно на YouTube и RuTube.
Предположим, вы решили написать онлайн-квиз в виде Telegram-бота. Бот должен выдать вопрос и какие-то варианты ответа к нему.
Если это делать с помощью обычных кнопок, то довольно сложно сопоставить ответ пользователя с конкретным вопросом, т.к. обычные кнопки не хранят контекст.
Но есть встраиваемые (inline) кнопки, которые относятся непосредственно к сообщению. Они добавляют гораздо больше интерактива и именно их можно увидеть при регистрации бота в @BotFather.
📺 Видео доступно на YouTube и RuTube.
👍4🔥1
Недавно я опубликовал статью Как быстро развернуть Spring Boot в облаке, а теперь записал видеогайд по ней.
Наличие Dockerfile позволяет выполнять деплой docker-контейнеров на разных хостингах независимо от технологий виртуализации, которые используются у этого хостера. Но мне, как программисту, хотелось бы развернуть проект прямо из репозитория, подобно тому, как это делается в heroku.
Эта технология называется Push-To-Deploy и она поддерживается в облачном сервисе dockhost. Вам достаточно запушить изменения в репозиторий, и всё остальное платформа сделает за вас: выполнит сборку проекта, создаст контейнер и подставит переменные окружения. При необходимости также можно привязать свой домен или сгенерить бесплатный. Https-сертификат при этом будет выпущен автоматически.
📺 Видео доступно на YouTube и RuTube.
Наличие Dockerfile позволяет выполнять деплой docker-контейнеров на разных хостингах независимо от технологий виртуализации, которые используются у этого хостера. Но мне, как программисту, хотелось бы развернуть проект прямо из репозитория, подобно тому, как это делается в heroku.
Эта технология называется Push-To-Deploy и она поддерживается в облачном сервисе dockhost. Вам достаточно запушить изменения в репозиторий, и всё остальное платформа сделает за вас: выполнит сборку проекта, создаст контейнер и подставит переменные окружения. При необходимости также можно привязать свой домен или сгенерить бесплатный. Https-сертификат при этом будет выпущен автоматически.
📺 Видео доступно на YouTube и RuTube.
🔥4👍3
Сегодня, 18 марта 2025 года, вышла новая версия Java 24!
✅ Новые фичи:
Stream Gatherers - это расширение Stream API, которое позволяет создавать собственные промежуточные (intermediate) операции. До этого можно было использовать только стандартные промежуточные операции вроде
Class-File API - это стандартное API для парсинга, генерации и трансформации class-файлов, которое впервые появилось в Java 22, теперь окончательно оформилось в Java 24. Фреймворки и инструменты, использующие стандартный API, будут автоматически поддерживать class-файлы из последней версии JDK, что позволит быстро и легко внедрять новые возможности языка и VM, представленные в class-файлах. До этого обновление сторонних библиотек для работы с class-файлами происходило с заметной задержкой относительно релиза каждой новой JDK.
✅ Фичи в статусе превью (работают только с флагом
Generational Shenandoah GC - режим поколений для сборщика мусора Shenandoah. Изначально Shenandoah был non-generational сборщиком, то есть он не разделял объекты на молодое и старое поколения, как это делают G1, Parallel и, начиная с JDK 23, ZGC. Благодаря новому режиму Shenandoah сможет поддерживать молодое и старое поколения, что позволит чаще собирать молодые объекты.
Project Lilliput привносит компактные заголовки объектов. Цель проекта — уменьшить размер заголовков Java-объектов в HotSpot JVM с 96 или 128 бит до 64 бит на 64-битных архитектурах (x64 и AArch64). Это призвано уменьшить использование CPU и/или памяти Java-приложениями.
✅ Очередные итерации предварительных версий:
Поддержка примитивных типов в конструкциях
Vector API повышает производительность расчётов на массивах однотипных данных. Это особенно актуально для машинного обучения, линейной алгебры, криптографии и финансов.
Simple Source Files, который позволяет писать программы вида "Hello, world!" в упрощённом варианте: без явного определения класса, без импортов и в не-статическом main-методе без параметров. Это приближает Java по синтаксису к скриптовым языкам.
Flexible Constructor Bodies - в конструкторе класса можно выполнять некоторую логику перед вызовом
Импорт модулей как альтернатива импорту пакетов.
Я перечислил только основные изменения. На самом деле их больше.
Будете ли вы переходить на Java 24 или дождётесь Java 25, версии с длительной поддержкой, выход которой запланирован на сентябрь?
✅ Новые фичи:
Stream Gatherers - это расширение Stream API, которое позволяет создавать собственные промежуточные (intermediate) операции. До этого можно было использовать только стандартные промежуточные операции вроде
filter(), map(), distinct() и т.п.Class-File API - это стандартное API для парсинга, генерации и трансформации class-файлов, которое впервые появилось в Java 22, теперь окончательно оформилось в Java 24. Фреймворки и инструменты, использующие стандартный API, будут автоматически поддерживать class-файлы из последней версии JDK, что позволит быстро и легко внедрять новые возможности языка и VM, представленные в class-файлах. До этого обновление сторонних библиотек для работы с class-файлами происходило с заметной задержкой относительно релиза каждой новой JDK.
✅ Фичи в статусе превью (работают только с флагом
--enable-preview):Generational Shenandoah GC - режим поколений для сборщика мусора Shenandoah. Изначально Shenandoah был non-generational сборщиком, то есть он не разделял объекты на молодое и старое поколения, как это делают G1, Parallel и, начиная с JDK 23, ZGC. Благодаря новому режиму Shenandoah сможет поддерживать молодое и старое поколения, что позволит чаще собирать молодые объекты.
Project Lilliput привносит компактные заголовки объектов. Цель проекта — уменьшить размер заголовков Java-объектов в HotSpot JVM с 96 или 128 бит до 64 бит на 64-битных архитектурах (x64 и AArch64). Это призвано уменьшить использование CPU и/или памяти Java-приложениями.
✅ Очередные итерации предварительных версий:
Поддержка примитивных типов в конструкциях
pattern matching, switch и instanceof. То есть когда во время проверки условия компилятор автоматически выводит тип данных. Ранее это было доступно для ссылочных типов и record-классов.Vector API повышает производительность расчётов на массивах однотипных данных. Это особенно актуально для машинного обучения, линейной алгебры, криптографии и финансов.
Simple Source Files, который позволяет писать программы вида "Hello, world!" в упрощённом варианте: без явного определения класса, без импортов и в не-статическом main-методе без параметров. Это приближает Java по синтаксису к скриптовым языкам.
Flexible Constructor Bodies - в конструкторе класса можно выполнять некоторую логику перед вызовом
super(), если она не использует текущее состояние объекта.Импорт модулей как альтернатива импорту пакетов.
Я перечислил только основные изменения. На самом деле их больше.
Будете ли вы переходить на Java 24 или дождётесь Java 25, версии с длительной поддержкой, выход которой запланирован на сентябрь?
👍6🔥3
Представьте, что в один прекрасный день к вам пришёл заказчик и говорит: "в рамках импортозамещения мы должны отказаться от Jira и вместо неё разработать собственный инструмент для управления задачами". Конкретно вам поручено разработать небольшой сервис. Этот сервис оперирует статусами задач и подзадач, которые в неё входят.
Мы должны принять важное архитектурное решение. Можно конечно при смене статусов сабтасок ещё и обрабатывать статусы родительских тасок. И если они меняются, тут же ещё и встраивать логику по отправке email. Но это делает логику не расширяемой и сложной в поддержке. Если завтра появится ещё несколько статусов, мы получим спагетти-код.
Чтобы этого избежать, лучше сразу сделать компоненты системы менее связанными и обеспечить их взаимодействие через события. То есть если меняется статус сабтаски - мы генерим соответствующий эвент. Далее компонент обработки статуса получает это событие, выполняет проверку остальных сабтасок и при необходимости меняет статус родительской задачи.
При построении event-driven системы можно использовать разные брокеры сообщений, но мы рассмотрим наиболее популярный из них - RabbitMQ.
В тестовых целях "кролика" можно развернуть в один клик на платформе dockhost.ru
Подробности читайте на Хабре в моей новой статье RabbitMQ и Kotlin: делаем свою event-driven Jira на Spring.
Мы должны принять важное архитектурное решение. Можно конечно при смене статусов сабтасок ещё и обрабатывать статусы родительских тасок. И если они меняются, тут же ещё и встраивать логику по отправке email. Но это делает логику не расширяемой и сложной в поддержке. Если завтра появится ещё несколько статусов, мы получим спагетти-код.
Чтобы этого избежать, лучше сразу сделать компоненты системы менее связанными и обеспечить их взаимодействие через события. То есть если меняется статус сабтаски - мы генерим соответствующий эвент. Далее компонент обработки статуса получает это событие, выполняет проверку остальных сабтасок и при необходимости меняет статус родительской задачи.
При построении event-driven системы можно использовать разные брокеры сообщений, но мы рассмотрим наиболее популярный из них - RabbitMQ.
В тестовых целях "кролика" можно развернуть в один клик на платформе dockhost.ru
Подробности читайте на Хабре в моей новой статье RabbitMQ и Kotlin: делаем свою event-driven Jira на Spring.
👍5🔥2
В сообществе Spring АйО на Хабре вышла интересная статья Spring Boot 3.3 и Docker: изменение в эффективных docker-образах.
Если вы не знали, Spring уже несколько лет "из коробки" поддерживает разделение одного jar-файла на "слои":
dependencies — внешние зависимости
spring-boot-loader — загрузчик Spring Boot
snapshot-dependencies — зависимости snapshot-версий
application — код приложения
Это позволяет оптимизировать работу с Docker-образами, т.к. чаще всего мы делаем изменения именно в последнем слое, который содержит бизнес-логику.
Так вот, в Spring Boot 3.3 изменилась команда распаковки запуска приложения в "многослойном режиме". Разработчики постарались стандартизовать эти команды. Более подробно читайте в статье.
Если вы не знали, Spring уже несколько лет "из коробки" поддерживает разделение одного jar-файла на "слои":
dependencies — внешние зависимости
spring-boot-loader — загрузчик Spring Boot
snapshot-dependencies — зависимости snapshot-версий
application — код приложения
Это позволяет оптимизировать работу с Docker-образами, т.к. чаще всего мы делаем изменения именно в последнем слое, который содержит бизнес-логику.
Так вот, в Spring Boot 3.3 изменилась команда распаковки запуска приложения в "многослойном режиме". Разработчики постарались стандартизовать эти команды. Более подробно читайте в статье.
Хабр
Spring Boot 3.3 и Docker: изменение в эффективных docker-образах
Переход от Spring Boot 3.2 к 3.3 принес изменения в процесс распаковки JAR и запуск приложения в Docker-контейнере. В новой статье от Рустама Курамшина, эксперта сообщества Spring АйО , вы узнаете: •...
👍7🔥3