Эта статья является пересказом моего доклада на Java-конференции SnowOne 2021 года. LJV — проект, созданный в 2004 году как инструмент для преподавания языка Java студентам. Он позволяет визуализировать внутреннее устройство структур данных. В этом докладе я запускаю LJV на разных структурах (от String
до ConcurrentSkipListMap
) в разных версиях Java и разбираю, что там внутри, как оно менялось от версии к версии, и как это всё работает.
Java *
Объектно-ориентированный язык программирования
«Невозможный» параллельный алгоритм неотрицательной суммы
Рецепт параллельных вычислений Fork/Join или Map/Reduce:
- разбить задачу на куски;
- посчитать куски по-отдельности;
- склеить вместе.
Неотрицательная сумма (a, b) -> max(0, a + b)
неассоциативна и результат зависит от порядка склейки. Она сломает Fork/Join и результат будет некорректен. Магией моноида починить на Java, SQL и Haskell за 5 минут, но
Java: делаем Valhalla сами
Сказ о том как сделать свой List<?>, который будет быстрее ArrayList и занимать меньше памяти.
Создание Native Images со Spring Native и GraalVM
В этой статье я хочу исследовать возможности технологии Java Native Image, поделиться опытом взаимодействия с ней и со средствами Spring для генерации нативных образов.
Истории
Разрушаем и подтверждаем мифы о кадровых агентствах в ИТ
Всем привет! На связи Антон Чимин. Не так давно я стал ИТ рекрутером и сегодня решил написать небольшую статью о том, что на самом деле происходит внутри кадровых агентств и стоит ли с ними работать. Называть свое кадровое агентство я не буду, чтобы это не было рекламой :) Просто пройдемся по фактам, что здесь и как.
Сегодня будет необычный пост, в котором я буду разрушать или подтверждать мифы о кадровых агентствах (КА), как это когда-то делали Адам Сэвидж и Джэми Хайнеман в одном известном шоу :) Погнали!
Тестирование GraphQL: подходы, инструменты, автоматизация
Несколько месяцев назад на моем пути возник GraphQL.
Это произошло, когда я присоединилась к одному из наших проектов, где был не только привычный REST, но и GraphQL API. Это было моё первое знакомство с ним. Я понятия не имела, что он собой представляет, в чем его особенности, а самое главное для меня, как QA инженера – не знала, как его тестировать.
Ниже я расскажу, что делала я, с какими проблемами сталкивалась, с чего можно начать и что важного и особенного надо знать про GraphQL для успешного тестирования как руками, так и с помощью автотестов. Вполне вероятно, что это поможет и вам разобраться в данном вопросе.
Разбираем Log4j уязвимость в деталях… с примерами и кодом
Все о той же критической уязвимости в Log4j, но с примерами и кодом.
Spring AOP: как работает проксирование
Четкое разделение бизнес логики с другими сквозными задачами является обязательным условием для создания чистого и читабельного кода. И говоря о сквозных задачах я имею ввиду управление транзакциями, безопасность и прочие важные задачи, которые хоть и не относятся к бизнес логике напрямую - но оказывают существенное влияние на работу приложения в целом. В случае "жесткого связывания" основной логики и подобных задач - мы можем получить кучу проблем в случае ошибки последних. АОП, собственно, и нацелено на решение подобных задач.
Аспектно-ориентированное программирование - это отличный инструмент для решения проблем, которые не относятся к бизнес логике напрямую. Оно позволяет добавить поведение в существующий код, не меняя его функционал. АОП дополняет ООП, предоставляя еще один способ достижения модульности и большей чистоты кода.
Spring имеет свою собственную структуру АОП, которая концептуально проста для понимания и является отличным решением большинства проблем в корпоративных Java-приложениях. В этой статье мы собираемся рассмотреть магию Spring АОП - со всеми его достоинствами и недостатками. Если у вас вообще нет никакого понимания за данную тему - рекомендую почитать данный материал.
Разбираемся с библиотекой лексического анализа ANTLR4
У нас в SberDevices разрабатывается платформа по управлению рекомендациями, которая взаимодействует с разными ML-движками. Со временем их станет много, и, когда пользователь умных устройств Sber будет запрашивать контент – искать фильмы, музыку, спрашивать о чём-то виртуальных ассистентов Салют, – запрос будет проходить через нашу платформу.
Сначала выбор движка мы хотели завязывать на источник сообщений – пользовательское приложение на устройстве. Сейчас мы решили управлять маршрутизацией на основе содержания сообщений – по различным полям. Для этого используется набор правил, похожих на условие WHERE в SQL, т.е. мы выбираем маршруты, у которых совпадают условия со значениями полей сообщений.
В SQL-запросе пользователь шлёт условие, по которому из существующих строк таблицы выбираются подходящие. В нашей задаче получается наоборот: входящему сообщению нужно сопоставить все условия, которые у нас есть, и вернуть те, которые прошли проверку. Правила маршрутизации – это настройки и их должны создавать не только программисты, но и менеджеры контента или дейта-сайентисты. С такими задачами справляются такие фреймворки, как, например Drools, но мы решили написать своё легковесное решение с упрощенным DSL, условия на котором может понять не только разработчик.
Для обработки правил, написанных на кастомном DSL, лучшая библиотека – ANTLR4. Я находил много статей, в которых описываются разные аспекты работы с ANTLR4, но ни в одной из них я не увидел, то, что изучил на пути создания production-ready кода. Поэтому, разобравшись, я решил собрать туториал. Ниже опишу пример парсинга SQL SELECT-запроса в объектную модель Java. Будем двигаться постепенно, в этот раз рассмотрим простейший случай. На нём мы разберём саму идею этого парсера, сделаем минимальную реализацию.
Миграция Spring Boot приложения на Java 17 — сложный путь: День 2
Добро пожаловать в статью о миграции приложения Spring Boot на Java 17.
В первый день мы пытались использовать Java 17 со Spring Boot и завершили день компиляцией нашего кода и зелеными юнит тестами.
В этом посте мы рассмотрим миграции: Spring Cloud, Spring Data, Spring Kafka
Распознаем простые фигуры по массиву точек
В данной статье рассматривается простой алгоритм распознавания нарисованного пользователем многоугольника. Алгоритм преобразует набор точек, предоставленный пользователем, в точки многоугольника, удаляя точки находящиеся на прямых. Так же алгоритм может на базовом уровне распознавать окружности.
Данный алгоритм не претендует на уникальность. Однако, я постарался детально расписать как он работает без сложной математики, за исключением, быть может свертки.
Создание нативных CLI приложений на Java с помощью Graalvm и Picocli
Язык программирования Go стал популярным для написания приложений командной строки. Для этого может быть много причин, но один аспект, в котором выделяется Go, - это возможность скомпилировать программу в один нативный исполняемый файл. Это значительно упрощает распространение программы.
Программы Java традиционно было трудно распространять, потому что они требовали, чтобы на целевой машине была установлена виртуальная машина Java. Можно связать с приложением последнюю JVM, но это увеличивает размер пакета примерно на 200 МБ.
Все движется в правильном направлении: система модулей Java (JPMS), представленная в Java 9, включает утилиту jlink, позволяющую приложению создавать настраиваемую, минимизированную JRE, размер которой может составлять всего 30-40 МБ, и Java. 14 включает jpackage, которая может создать установщик, содержащий этот минимальный JRE с вашим приложением.
Тем не менее, для приложений командной строки установщик не идеален. В идеале мы хотим распространять нашу утилиту CLI как «настоящий» нативный исполняемый файл без упакованной среды выполнения. GraalVM позволяет нам делать это с помощью программ, написанных на Java.
Утечка памяти: цена одной маленькой ошибки
Всем привет, меня зовут Алена Коваленко, я Java-разработчица одной из команд направления Warehouse Management System (WMS) компании Lamoda. Наша команда занимается автоматизацией складской системы и реализацией новых фич для улучшения работы сотрудников склада. В том числе мы занимаемся техническими импрувментами системы, такими как вынесение из монолита функциональности, связанной с идентификацией товара и приемкой возвратов, в отдельный сервис — Inbound Service.
После релиза Inbound Service на проде склад заметил долгий отклик системы. В процессе исследования проблемы мы обнаружили утечку памяти, связанную с конфигурацией приложения, в том числе внутренних очередей в ActiveMQ Artemis.
В этой статье я расскажу, как мы вовремя заметили проблему и смогли ее пофиксить, предотвратив падение сервиса и дальнейшие неблагоприятные для склада последствия.
Ближайшие события
Миграция Spring Boot приложения на Java 17 — сложный путь
Недавно была выпущена Java 17, и я очень рад появлению множества улучшений и новых функций. Вместо того, чтобы начинать с нового или недавнего проекта (где в этом азарт?), Мы собираемся обновить существующее приложение Spring Boot, пока мы не сможем разработать новый код с использованием Java 17.
Современная разработка на Java: update, фичи, API и Copilot
Летом этого года мы в *instinctools организовали и провели серию онлайн-дискуссий с разработчиками и экспертами в области IТ. В рамках проекта «Техпора» нам хотелось услышать разные точки зрения на события и проблемы, которые волнуют разработчиков. Одна из этих серий касалась проблем современной разработки на Java. Дискуссия оказалась настолько информативной, что мы решили собрать самые интересные моменты и опубликовать их здесь, на «Хабре».
В разговоре приняли участие Developer JetBrains Тагир Валеев, организатор конференции RigaDevDays, основатель латвийского JUG Дмитрий Буздин, Developer Advocate проекта GraalVM, OracleLabs Олег Шелаев и Java Developer *instinctools Денис Лешенюк. Сразу хотим сказать, что мы не задавали тон беседе и не ставили экспертов в какие-то рамки. Это был достаточно свободный разговор, который касался наиболее важных тем для разработчиков. Если вы хотите поделиться своим взглядом на обсуждаемые вопросы – пишите в комментариях.
Чай СБЕРгамотом: хакатон глазами участника
Наш рынок растет и развивается. Компании, помимо традиционных кадровых процедур, ищут новые ищут новые пути поиска лучших специалистов. В свою очередь, разработчики, которые креативны по своей природе, готовы презентовать и проявить себя не только в рабочих задачах. Участие в хакатоне - своего рода испытание на прочность, тест собственной скорости ума.
Рад поделиться своим опытом участия в мероприятии в качестве капитана команды "чай СБЕРгамотом".
Как проверить, зависит ли Java проект от уязвимой версии Log4j
Если ваше приложение использует Log4j с версии 2.0-alpha1 до 2.14.1, вам следует как можно скорее выполнить обновление до последней версии (2.16.0 на момент написания этой статьи - 20 декабря).
Log4j уязвимость отслеживаться как CVE-2021-44228 (также известный как Log4Shell) позволяет злоумышленнику выполнить произвольный код в системе.
В заметке описаны инструменты для проверки зависимости Java проекта от уязвимой версии Log4j.
Just Do It! Или интеграция JDI + SauceLabs – это просто
Ответ прост, как и на вопрос «сколько будет дважды два?». Кто ответил «5», «7» или «2» смело продолжайте читать этот пост. А кто ответил «4» тем более может найти здесь для себя что-то полезное. В этой статье вы не увидите ни строчки кода, только мои впечатления от знакомства с JDI фреймворком и облачной платформой для запуска тестов SauceLabs. Вот она интрига, итак, поехали…
Уникальные элементы для автотестов: где они обитают и как их искать
Автотесты — очень полезная штука в разработке, так как они упрощают жизнь ручным тестировщикам. На релизе во время smoke-прогона у коллег и так очень много работы, а тут небольшая, но порой ощутимая помощь в виде автотестов, когда после запуска руками тестировщики проверяют только то, что не автоматизировано или если тесты где-то не прошли.
Но автотесты нужно еще написать и первостепенная задача — поиск элементов. Чтобы кликнуть на кнопочку, ее нужно сначала найти. С какими трудностями при этом можно столкнуться и как эти трудности преодолеть я расскажу ниже, добро пожаловать под кат!
Экономим свое время. Ускоряем создание отложенных постов в Telegram с помощью бота
Представьте, что вы всю жизнь собирали коллекцию фотографий кошачьих носов и в один из дней появляется стойкое желание поделиться ею с миром. Для этой цели вы решаете завести канал в Telegram и регулярно постить туда новые фотографии. Но тут вас встречает она – рутина.
Вклад авторов
olegchir 4056.4tagir_valeev 2369.0phillennium 1481.423derevo 1271.0ARG89 1078.2igor_suhorukov 915.2dbelob 895.0doom369 826.0alizar 756.0dididididi 709.0