Search
Write a publication
Pull to refresh
0
Богданов Ярослав @Wonderkotread⁠-⁠only

User

Send message

Поиск кропнутых дубликатов изображений с помощью перцептуальных хешей

Reading time6 min
Views72K
В этой статье пойдет речь о том, как решалась небольшая задачка поиска дубликатов по фрагменту или кропу картинки.



Читать дальше →

Тестирование асинхронного контракта Spring Boot приложения (Kafka Consumer+Producer)

Level of difficultyEasy
Reading time12 min
Views6.2K

Приветствую тебя, Хабр! Сегодня мы попробуем разобраться, как написать интеграционный\сервисный\авто тест для Spring Boot приложения, которое взаимодействует с внешним миром исключительно с помощью Kafka.

Начнем!

Быстрее, выше, сильнее: оптимизируем Spring-контекст для тестов

Level of difficultyMedium
Reading time22 min
Views9.8K

Всем привет! Я Юнес, SDET в Тинькофф. Помогаю автоматизаторам создавать более эффективные и надежные тесты, готовить тестовые данные и настраивать CI/CD-пайплайны. 

Расскажу о доступных способах оптимизации Spring-контекста для тестов. Будет здорово, если у вас есть знания о Spring Framework и опыт написания тестов: тогда мы будем на одной волне. Давайте разберемся в хитросплетениях аннотаций и конфигураций вместе под катом!

Читать далее

MapStruct — смаппь меня, если сможешь

Level of difficultyEasy
Reading time15 min
Views41K

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

Читать далее

Генерация OpenAPI из Spring Boot MVC

Level of difficultyMedium
Reading time7 min
Views16K

В этой статье посмотрим, насколько хороша генерация в OpenAPI из Spring MVC (спойлер — довольно хороша), какие есть подводные камни и костыли, чтобы с ними справится.

Наше API будет включать:
— валидацию тела и параметров с помощью JSR-303 
— различные коды ответа с помощью ControllerAdvice и без него
— работа с Page и Pageable
— авторизация запросов

Читать далее

Хостеры с оплатой российскими картами и серверами за границей

Reading time3 min
Views141K

Всем привет! Меня зовут Леонид, я владелец сервиса Поиск VPS. Весной я уже опубликовал две статьи по оплате услуг иностранных хостеров при помощи SWIFT и криптовалют. К сожалению, карты, выпущенные российскими банками, все еще не работают в большинстве стран мира, да и не у всех есть желание и возможность оплачивать услуги указанными выше способами, поэтому сегодня я хочу предложить выборку хостеров, принимающих оплату российскими картами и предоставляющих виртуальные серверы не в России.

При составлении списка я ориентировался на количество стран, в которых возможно заказать наиболее универсальную услугу, а именно виртуальные серверы, а также минимальную цену не выше 300 рублей, 5 долларов или 5 евро в месяц. У большинства хостеров возможен заказ услуг в России, а там, где это возможно, приведена ссылка на точки Looking Glass.

Читать далее

Опять транзакции…

Level of difficultyEasy
Reading time8 min
Views16K

Всем привет. На своем последнем месте работы я выполнял обязанности Java разработчика в одной из команд сервиса, чье приложение установлено в смартфоне большинства жителей РФ. Использовался стандартный стек технологий: Java, Spring(web, jdbc, core), PostgreSQL, Kafka. Обычное синхронное API по работе с данными, без всякой реактивщины, с нагрузкой более миллиона пользователей в день. Я столкнулся с тем что сервисы по работе с БД были обильно «усыпаны» Spring аннотациями @Transactional. Даже одиночные запросы на чтение данных использовали аннотацию с параметром readOnly=true. Я пытался писать комментарии к мердж‑реквестам с вопросом: «зачем вы это делаете?». Но получал ответы из разряда: «для перфоманса», «у нас так принято, чтобы случайно не упустить случай когда транзакция будет действительна нужна», «раньше у нас была какая‑то проблема с коннектами (какая именно никто так и не вспомнил сколько я не пытал), мы везде добавили аннотации и все заработало». Если интересно чем в итоге закончилась эта дискуссия, то подробности далее.

Читать далее

Как мы Schema Registry для Kafka настраивали, и что могло пойти не так…

Reading time11 min
Views46K

Всем привет.

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

Спойлер: на данный момент реестр схем данных настроен и используется в боевой системе, каких-то проблем, связанных с SR, замечено не было.

Читать далее

Интерактивная карта субъектов России для новичка. Ошибки, которые допустил я и которые не должны допустить вы

Reading time5 min
Views55K

В этой статье я расскажу, как мы столкнулись с типовыми ошибками при создании интерактивной карты, а главное — дам вам ссылки на нормальные, актуальные карты субъектов РФ.



Наша задача. Создать интерактивную карту, чтобы при наведении на регион срабатывал обработчик событий и выводил некоторые данные по регионам (например, его название).
На первый взгляд это кажется очень простым, но далее в статье я расскажу, как мы потратили больше 3 дней на исправление, а самое главное — на определение багов.

Читать дальше →

Использование resilience4j со Spring Boot

Level of difficultyEasy
Reading time10 min
Views21K

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

Рассмотрим какие в ней есть инструменты, как их использовать в Spring Boot приложении с помощью аннотаций, как настраивать и есть ли в них подводные камни

Читать далее

Туториал по нотификациям через RSocket: от концепции до запуска в продакшн

Level of difficultyMedium
Reading time17 min
Views7.1K

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

После анализа различных вариантов, мы остановились на WebSocket в связке с RSocket.

Но есть нюанс — информации по RSocket почти нет. Технология относительно новая и просто так сразу на ней не начнешь делать проекты. Для начала нужно изучить теорию, овладеть терминологией и при необходимости, собрать тестовый прототип, чтобы появилось понимание, как RSocket работает изнутри. Но попробуй найди эту информацию.

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

Поэтому, когда мы закончили проект, то решили восполнить (или попытаться) этот пробел в русскоязычной среде на реальном примере. Надеемся, что эта статья поможет вам разобраться в применении RSocket over WebSocket и сократит время на погружение :) 

Читать далее

Java Digest #8

Level of difficultyEasy
Reading time3 min
Views6.5K

??Приветствуем в новогоднем Java Digest! ??

В этом выпуске с радостью представляем некоторые захватывающие статьи, связанные с миром Java и его новейшими разработками. Приготовьтесь узнать о главных моментах Java в 2023 году, улучшениях в сборщиках мусора в JDK 21, устаревших функциях в Java 18—21, применении CDS с Spring Framework 6.1 и многом другом.

Читать новогодний выпуск

Создание и использование BOM в Gradle

Level of difficultyMedium
Reading time9 min
Views13K

В каждой компании (а если она крупная, то, скорее всего, в каждом подразделении) должна быть выстроена культура использования BOM (bill of materials) для управления версиями зависимостей. В этой статье я хочу поделиться своим видением того, как это может быть организовано, а также рассмотреть более сложные случаи создания и использования BOM в Gradle-проектах.

Читать далее

JWT-аутентификация при помощи Spring Boot 3 и Spring Security 6

Level of difficultyMedium
Reading time15 min
Views96K

Переход от базовых приложений к более сложным требует использования Spring Security для обеспечения безопасности. Новая версия, Spring Security 6, изменяет некоторые базовые реализации, а русскоязычных материалов на эту тему очень мало. В этой статье мы рассмотрим JWT-аутентификацию и авторизацию с помощью Spring Boot 3 и Spring Security 6, чтобы помочь начинающем разработчикам разобраться и начать пользоваться базовым функционалом этой библиотеки. Цель данной статьи - показать, как использовать JWT-аутентификацию с API-интерфейсами.

Читать далее

Сложность алгоритмов. Разбор Big O

Level of difficultyMedium
Reading time14 min
Views150K

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

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

Читать далее

Как новому тимлиду завоевать доверие команды: 9 правил, которые я усвоил за полгода в этой роли

Level of difficultyEasy
Reading time10 min
Views7.1K

Привет! Меня зовут Кирилл Комиссаров, я пришел на позицию лида примерно полгода назад. Срок небольшой, но за это время многое понял о том, почему доверие в команде так важно. 

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

Позиция тимлида вообще предполагает relationship management, который может быть направлен как и на команду, так и наверх, в сторону стейкхолдеров. Но в этой статье я хочу поговорить именно про связку TL + Dev Team. Руководителю важно выстроить и поддерживать доверительные отношения с сотрудниками. Это поможет эффективно управлять командой и добиваться слаженной и продуктивной работы.

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

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

Читать далее

Как распараллелить тесты с базой данных

Level of difficultyMedium
Reading time5 min
Views5.4K

Представьте проект, в котором уже написано несколько сотен тестов. Каждый тест настраивает базу под себя: добавляет данные, вызывает truncate по окончанию. Хочется запускать тесты параллельно, чтобы ускориться, но если два теста запустить одновременно, они почти наверняка друг другу помешают.

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

Читать далее

Генерация контрактов OpenApi или прикладной API first: гайд по генерации в Spring Boot приложении

Level of difficultyMedium
Reading time7 min
Views19K

Стек: OpenAPI, Spring Boot, Gradle

Небольшой гайд по генерации серверной и клиентской части в Spring Boot приложении.

Краткое содержание:

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

В сервисе-сервере сгенерируйте сервер по спецификации. Настройте созданные контроллеры/имплементируйте интерфейсы.

В сервисе-клиенте сгенерируйте клиентскую часть по спецификации. Подключите сгенерированного feign клиента.

Generate it

Архитектура веб-приложений, Gitflow и REST API: доклады с Backend-митапа red_mad_robot

Level of difficultyMedium
Reading time2 min
Views4.5K

В конце октября мы провели в нашем московском Робохранилище Backend-митап, где собрали больше 60 офлайн-зрителей. Ребята из нашей практики выступили с тремя докладами — и не в нашем стиле скрывать такой полезный контент. Поэтому ловите презентации и видео их выступлений. 

Читать далее

Разработка через тестирование. Совместное использование JUnit 5 и Mockito

Level of difficultyMedium
Reading time10 min
Views6K

Привет, Хабр! На связи участница профессионального сообщества NTA Александра Грушина.

Поговорим о важности написания тестов к своему коду, о магии подхода test-driven development. Я расскажу о своём пути: от первого знакомства с концепцией TDD до умелого использования инструментов тестирования на Java (Junit 5 + Mockito).

Читать далее
1
23 ...

Information

Rating
Does not participate
Location
Ижевск, Удмуртия, Россия
Date of birth
Registered
Activity