Обновить
151.04

Java *

Объектно-ориентированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Выполнение запланированных заданий в Spring Boot

Время на прочтение12 мин
Охват и читатели151K

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

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

Читать далее

Flutter: о разработке плагинов с интерфейсом ActivityAware

Время на прочтение6 мин
Охват и читатели5.7K


В былые времена клиенты присылали цветные изображения документов со сканера по емейлу. Кто ленился или не мог — отправлял свой загранник по почте. С этим неплохо справлялось решение от ABBYY. Потом появились телефоны и люди стали присылать фотографии паспортов. ABBYY сломался. Перешли на решение от Smart Engines и даже с фотографиями, посланными через WhatsApp особых проблем не было. Но потом пошли умные мобилки с включенными по умолчанию водяными знаками типа «Xiaomi 9T» часто перекрывающими важнейшую часть паспорта. Вдобавок к этому наличие в кадре на фотографии пальцев и бликов тормозило общение с клиентом.

Примеры паспортов, непригодных к распознаванию

Когда паспорт распознается в видеопотоке на телефоне клиента, то этой проблемы так остро не стоит. Почему?

  1. Мобильное ядро отображает рамку документа в процессе распознавания, не просто маску поверх видео, а именно рамку документа, находящегося в руках. По моим ощущениям, это дает человеку понимание, где не должно быть его пальцев. Вообще, это интересная тема для отдельного исследования.
  2. Система использует механизм сатурации данными и готова выдать результат только после определенной уверенности в них.
Читать дальше →

Как справиться с Debezium + MySql + Spring Could Streams, Part 1

Время на прочтение5 мин
Охват и читатели8K

Добрый день, Хаброжители!

Это моя первая статья на Хабре, любые замечания, предложения, пожелания приветствуются!

В этой статье (часть 1), я попытаюсь рассказать и показать как поднять и настрить stand along Debezium CDC + MySql server.

Читать далее

Миграция YAML конфигов или история одного парсера

Время на прочтение8 мин
Охват и читатели4.8K

Есть счастливые люди, которые могут себе позволить просто перезаписывать YAML конфиги в продакшене. Мне же повезло меньше - инсталляции у меня специфичные и конфиги часто настраиваются "под себя". К каждому релизу приходилось готовить отдельную доку для ручного апдейта конфигурации.

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

Как вы уже могли догадаться, тулзу я в итоге написал свою (java). Но рассказать я хочу не о том что она умеет, а о том что было после "да что я сам не сделаю что ли...".

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

Читать далее

Разбираемся со сборкой мусора в Java — Java2Blog

Время на прочтение3 мин
Охват и читатели2.1K

В этой статье мы рассмотрим механизм сборки мусора на платформе Java.

Вместо теоретических объяснений я буду использовать схемы и примеры.

Читать далее

Разработка мультиагентной системы для рынка электроэнергии

Время на прочтение4 мин
Охват и читатели2.9K

Пока я пишу статью, я еду в поезде и рядом со мной 79 ребят со всей России, которые 18 предыдущих дней занимались проектами в области энергетики, и среди них едут 9 победителей этой смены, среди которых и я. Ну a здесь я хочу рассказать про то, какую лепту я внес в наш проект.

Читать далее

Мягкое удаление в Hibernate: неочевидные факты

Время на прочтение7 мин
Охват и читатели23K

Мягкое удаление (soft deletion) — это популярная в энтерпрайз разработке стратегия удаления, когда вместо физического стирания та или иная запись помечается как удаленная, а потом фильтруется во всех запросах на чтение. Применение мягкого удаления может быть оправдано целым набором требований: аудит, возможность восстановления удаленных записей, а иногда необходимо уметь удалять данные, при этом сохраняя на них ссылки из других записей… 

Вообщем, нам, как авторам JPA Buddy (плагина для IntelliJ), пришлось с этим плотно разбираться. В этой статье мы рассмотрим детали, которые зачастую не упоминаются в большинстве публикаций по этой теме, хотя крайне важны для принятия решения о способе реализации мягкого удаления в вашем приложении. Давайте посмотрим, с чем вы, вероятно, намучаетесь. 

Читать далее

Создание реалистичных тестовых данных для Java приложений

Время на прочтение9 мин
Охват и читатели8.5K

Чем ближе ваши тестовые или демонстрационные данные к реальному миру, тем лучше вы сможете протестировать приложение на UX, улучшить и отловить крайние случаи в процессе разработки. 

В этой статье я покажу вам, как использовать пример генератора данных Vaadin для создания демонстрационных данных для простой базы данных SQL. В статье показано, как создать полное приложение, используя Spring BootJPAProject LombokVaadin и MariaDB.

Читать далее

Java 17: Pattern Matching for switch

Время на прочтение3 мин
Охват и читатели59K

14-го сентября состоялась презентация Apple, в этот же день произошло не менее важное событие - релиз Java 17.

Среди новых фич подъехал паттерн матчинг для switch в preview моде.

История началась с того, что в jdk 16 расширили instanceof оператор, который теперь может принимать type pattern и выполнять матчинг по паттерну. Это маленькое изменение позволило упростить типичную конструкцию с проверкой на тип и последующее приведение.

Читать далее

Наиболее частые исключения Java

Время на прочтение4 мин
Охват и читатели5.6K

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

Читать далее

30 сентября — MeetUp Backend Stories

Время на прочтение1 мин
Охват и читатели1.6K

Привет!

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

Начало в 19:00 МСК, участие бесплатное, главное заранее зарегистрироваться, чтобы получить ссылку на трансляцию за час до её начала. Вести митап будет руководитель центра компетенций Java в Альфа-Банке — Павел Дерендяев.

А докладов будет три. Два от спикеров нашего банка, третий — от приглашённого эксперта из экосистемы недвижимости «Метр квадратный». Примерная продолжительность митапа — два часа.

Под катом — расписание и названия докладов.

Читать далее

Hibernate Proxy — для чего используются и как получить исходный объект

Время на прочтение7 мин
Охват и читатели18K

Hibernate использует прокси-объекты для реализации ленивой загрузки (lazy load) связей "к-одному". Их также можно использовать для улучшения производительности некоторых операций записи. 

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

Читать далее

Собеседование наоборот: Usetech и Weigandt Consulting отвечают на вопросы о работе

Время на прочтение11 мин
Охват и читатели4.1K

По следам Java-недели на Хабр Карьере было так много вопросов от участников, что они не уместились в полтора часа нашего итогового круглого стола с компаниями. Поэтому мы решили выпустить их в формате статьи здесь на Хабре и попросили компании ответить на те вопросы, которые показались им самыми интересными. Отозвались ребята из Weigandt Consulting и Usetech, и сегодня мы делимся их комментариями о работе джавистов, найме джунов и старте карьеры в Java-разработке, мнением о технологиях и карьерными советами.

Читать далее

Ближайшие события

Java.  The composite pattern on Game Server

Время на прочтение4 мин
Охват и читатели3.6K

Паттерн Компоновщик - так же известен как Дерево, Composite.

Суть паттерна

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

Проблема

Использование шаблона Composite имеет смысл только тогда, когда базовая модель вашего приложения может быть представлена в виде дерева.

Например, представьте, что у вас есть два типа объектов: конфигурация награды и конфигурация сундука. Сундук может содержать несколько Наград, а также несколько Сундуков меньшего размера. Эти маленькие сундуки также могут содержать некоторые награды или даже сундуки меньшего размера и т. Д.

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

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

Читать далее о паттерне Компановщик

Чему я научился делая игры на LibGDX

Время на прочтение12 мин
Охват и читатели27K

Привет, Хабр! 👋 В этом топике хочу поговорить о незаслуженно забытом, бесплатном фреймворке для разработки кросс-платформенных игр - LibGDX. Поделиться секретами своей кухни и решениями, которые я использую при разработке своих игр-головоломок. Ворнинг! Много кода под катом.

Читать далее

Обработка русского языка на Java

Время на прочтение4 мин
Охват и читатели13K

Рассказ пойдет об одной новой, общедоступной Java/Kotlin библиотеке, для работы с русским языком. Она позволяет получить исходные формы + морфологическую информацию для большинства слов русского языка. Статья предназначена для тех, кто создает ботов, обрабатывает сообщения и занимается поиском. Для справки, ключевое отличие лемматизации от стеммизации (урезания до нормализованной формы) состоит в том, что лемма удовлятворяет правилам языка, например для слова "яблоками" леммой будет "яблоко", а не просто урезанный корень. Лемма может быть и более сложной, например для слова люди, начальная форма – человек. В этой статье мы рассмотрим способ быстрого извлечения такой информации из морфологического словаря.

Запустить процесс

AWS Lambda с Java: быстро и недорого

Время на прочтение10 мин
Охват и читатели7.9K

AWS Lambda - популярная платформа для разработки serverless-функций, и как Java-разработчик мне нравится иметь возможность использовать эту платформу. Однако, есть некоторые важные моменты, о которых стоит помнить при работе с ней.

Читать далее

Насколько быстрее Java 17?

Время на прочтение4 мин
Охват и читатели14K

Решение задачи по составлению расписания турнира с разъездами (TTP) — один из вычислительных тестов в нашем наборе

Позавчера вышла Java 17 с кучей новых функций и усовершенствований. Большинство из них требуют изменения кода. Кроме производительности. Просто заменяете JDK — и получаете бесплатную прибавку производительности. Но насколько большую? Стоит ли она того? Для этого мы провели бенчмарки JDK 17, JDK 16 и JDK 11.
Читать дальше →

Kotlin Null-Safety vs ClassLoader

Время на прочтение7 мин
Охват и читатели5.7K

Недавно я проходил собеседование и одним из вопросов, стал такой загадочный экземпляр:
"А какое главное преимущество системы типов Kotlin перед Java"?

Честно говоря, выделить какое преимущество считалось главным, оказалось неразрешимой для меня задачей: Nothing, отсутсвие Wildcard и First-Class Functions вместо Java-костыля с Functional Interface (имеется ввиду 8я версия Java) не заняли первых мест в личном топе интервьюера, который мне предложили угадать.

Оказалось что главное в Kotlin - возможность обьявить Nullable Type и Null Safety подход (Замечу, что по моему опыту собственные или библиотечные Optional или Maybe решают эту проблему, и пишутся за 10 минут на Java 7. А еще есть аннотации Nullable, позволяющие проверять поля в сompile-time. Короче, есть много способов заставить делать Null проверки в plain Java. Ну да ладно).

Но речь пойдет не о странных вопросах, связанных со вкусовыми предпочтениями интервьюеров относительно синтаксического сахара.
Дело в том, что Null Safety в Kotlin можно сломать, притом не выходя из под его безопасного купола в суровый дикий мир Java и Null-Referrences.

Как?

Long story short: ClassLoader ведет себя интересным образом при попытке загрузить статические поля классов рекурсивно ссылающиеся на классы друг-друга.

Под катом примеры кода и подробное объяснение того, как он обманывает проверки на Nullable. Я искренне надеюсь что специфические знания Java/Kotlin для статьи не нужны - я объясню все детали на ходу, и уложу расследование в 10 минут.

Начнем.

Вклад авторов