Java guru
932 subscribers
1 photo
1 video
234 links
Новости из мира Java, обзоры интересных библиотек и фреймворков, обучающие статьи. Онлайн обсуждения актуальных тем и обмен опытом. Для связи @RodmanDV
Download Telegram
Сравнение производительности ввода/вывода: C, C++, Rust, Golang, Java и Python

Сейчас существует большое количество языков программирования для создания бэкенд-сервисов. Это вызывает интерес в сравнении их производительности по различным критериям. К примеру, сервис Benchmarks Game сравнивает языки программирования на основе того, как они решают различные задачи. А TechEmpower измеряет производительность веб-фреймворков.

Это сподвигло автора выяснить настоящую стоимость затрат ресурсов, необходимых для “голого” ввода/вывода на различных платформах. Измерение прокси TCP, кажется, дается проще всего. Он включает только обработку входящих и исходящих соединений, а также передачу необработанных байтовых данных.

https://nuancesprog.ru/p/14464/
AssertJ как способ значительно улучшить код ваших тестов

Недавно я открыл для себя прекрасный инструмент AssertJ. Его API гораздо лаконичнее чем стандартные assert-ы JUnit + Hamcrest. Код тестов читается проще. Он позволяет также тестировать базу.

AssertJ предоставляет абстрактный базовый класс AbstractAssert<>, расширяя который, вы можете добавить поддержку своих собственных типов и методов для проверки. В некоторых случаях это позволяет заметно сократить количество тестового кода и повысить его выразительность. Пример:

assertThat(check)
.hasType(Column.class)
.hasDiagnostic(Diagnostic.COLUMNS_WITHOUT_DESCRIPTION)
.hasHost(PgHostImpl.ofPrimary())
.executing()
.isEmpty();

https://habr.com/ru/post/675778/
https://assertj.github.io/doc/
Robocode

Достаточно давно я играл в такую старую, но замечательную игру Robocode. Это прям классика. Недавно я опять на нее набрел и хочу с вами ей поделиться.

Суть в том, что вы пишите алгоритм на Java и потом ваша стратегия сражается с другими стратегиями. Прелесть в том, что этот батл визуализируется.

Есть современный аналог от mail_ru и я там даже участвовал. Было прикольно. https://cups.online/ru/contests/?category=ai&utm_campaign=to-allcups&utm_medium=referral&utm_source=raic

https://robocode.sourceforge.io
Как правильно писать сообщения коммитов в GIT, чтобы всем было хорошо

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

https://proglib.io/p/kak-pravilno-pisat-soobshcheniya-kommitov-v-git-chtoby-vsem-bylo-horosho-2022-08-11
Атака на String.hashCode: прообразы и коллизии

Требовалось ли вам получать наборы строк с коллизией по хеш-коду? Лично мне нет. Я в основном старался избегать коллизий, но чисто из "спортивного" интереса стоит прочитать эту статью.

https://habr.com/ru/post/674816/
Свой Spliterator

Многие из вас активно пользуются Stream API из Java 8, но не всем приходилось создавать свои Spliterator-ы. В статье очень хорошо разбирается процесс написания своего Spliterator-а. Мне особенно понравился пример создания для любой нестандартной коллекции (ещё пример — org.json.JSONArray), которая умеет быстро вернуть длину и элемент по порядковому номеру.

public class XmlStream {
static Stream<Node> of(NodeList list) {
return IntStream.range(0, list.getLength()).mapToObj(list::item);
}
}


https://habr.com/ru/post/256905/
Выпуск стандартной Си-библиотеки Cosmopolitan 2.0, развиваемой для переносимых исполняемых файлов

Этот пост не про Java. Извините, но я просто не удержался. Для меня она настоящее открытие.

Если вы думали, что только в Java возможна переносимость между разными операционными системами, то вы ошибались. Your build-once run-anywhere c library!!!
https://justine.lol/cosmopolitan/

Опубликован выпуск проекта Cosmopolitan 2.0, развивающего стандартную Си-библиотеку и универсальный формат исполняемых файлов, который можно использовать для распространения программ для разных операционных систем без использования интерпретаторов и виртуальных машин. Получаемый при помощи компиляции в GCC и Clang результат компонуется в статически связываемый универсальный исполняемый файл, который пригоден для запуска в любом дистрибутиве Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD и даже вызова из BIOS. Код проекта распространяется под лицензией ISC (упрощённый вариант MIT/BSD).

Контейнер для формирования универсальных исполняемых файлов основан на совмещении специфичных для разных операционных систем сегментов и заголовков (PE, ELF, MACHO, OPENBSD) в одном файле, комбинируя в нем несколько разных форматов, используемых в Unix, Windows и macOS. Для обеспечения запуска одного исполняемого файла в Windows и Unix-системах применяется трюк, связанный с кодированием файлов Windows PE в виде shell-скрипта, пользуясь тем, что Thompson Shell не использует маркер скриптов "#!". Для создания программ, включающих несколько файлов (компоновки всех ресурсов в один файл), поддерживается формирование исполняемого файла в виде специально оформленного ZIP-архива.

https://github.com/jart/cosmopolitan/releases/tag/2.0
Статический анализ кода в современной Java-разработке

Многостраничные гайды по оформлению кода, правильных инструментах и библиотеках по факту не работают. Люди в принципе не любят читать документацию. Автор статьи выражается более радикально по поводу таких гайдов ))

Выход из ситуации использовать различные автоматизированные средства валидация. В статье собрана неплохая подборка, которую однозначно стоит попробовать. Подключать ли все сложный вопрос. С одной стороны больше мнений по качеству кода, а с другой стороны замедление (доп. время на проверки). Нужно искать золотую середину. Я думаю, что если на одной чаше качество кода, а на другой скорость, то я скорее отдам большее предпочтение качеству, но возможно не каждый заказчик со мной согласится. Им нужно как всегда быстро и качественно )))
https://habr.com/ru/post/680018/
JUnit расширение DbChange

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

Если вы пишите тесты с использованием JUnit, то стоит обратить внимание на замечательное расширение DbChange. При помощи него вы можете декларативно описать шаги взаимодействия с базой. Мне очень понравился такой подход. Рекомендую попробовать.

https://habr.com/ru/post/684692
Обобщенное программирование – обзор реализаций

В статье дается довольно занимательное сравнение поддержки обобщенного программирования в C++, Java, C#(.Net). Наилучшего подхода не существует, любой подход – это всегда компромисс, при котором одними преимуществами жертвуют ради других.

https://habr.com/ru/company/piter/blog/656377/
Better Java logging, inspired by Clojure and Rust

Недавно наткнулся на интересную статью про логирование. Там сравниваются подходы к логированию в Clojure, Rust и Java. Самое вкусное в этой статье - это попытка автора реализовать в Java более лучший способ логирования. Он в реализации использует новые фичи из последних версий Java и интересно проследить ход его мысли. Он по шагам добавляет новый функционал.

С практической точки зрения я не во всем согласен с автором. Особого профита от namespace-ов я особо не вижу. В моем представлении реализация получилась достаточно перегруженной и самое главное нет возможности отключить не нужные фичи. Возможно стоит доработать решение. Не нужно забывать еще и про GG. В частности в том же log4j есть режим "garbage free".

Про log4j есть режим "garbage free" - https://logging.apache.org/log4j/2.x/manual/garbagefree.html

https://mccue.dev/pages/9-25-22-better-java-logging
Shift Left Approach for API Standardization

Как я уже писал в одном из прошлых постов разработчики не любят читать "длинных инструкций" и нужны автоматизированные средства проверки. С разработкой API тоже беда. Вы можете разработать стандарты и взять за основу Microsoft REST API Guidelines https://github.com/Microsoft/api-guidelines или Google API design guide https://cloud.google.com/apis/design/ или посмотреть примеры на API Stylebook http://apistylebook.com/ но чем больше мануал тем меньше вероятность что прочтут до конца и самое главное правильно поймут.

Решение: воспользоваться автоматизацией. Если разговор про OpenAPI, то есть целый класс инструментов линтеров https://nordicapis.com/8-openapi-linters/

В статье приводится пример для Zally. У данного инструмента есть также Gradle plugin. https://github.com/thiyagu06/zally-gradle-plugin

https://www.infoq.com/articles/shift-left-api/
Работа с проверяемыми исключениями при использовании Stream-ом

Я думаю, что многих из вас раздражают проверяемые исключения "всплывающие" при попытке выстроить "красивый код" со Stream-ами. Ряд библиотек приходят к нам на помощь и предлагают свои решения. В статье приводится пример проблемы и того как разные библиотеки предлагают ее решать. Решение предлагаемое в библиотеке Vavr мне кажется более полным так как позволяет в функциональном стиле описать в том числе и обработку исключения.
https://blog.frankel.ch/exceptions-lambdas/
Настраиваем память JVM-приложения в Kubernetes

Я думаю, что многие из вас сталкиваются в работе либо с Kubernetes либо OpenShift и как известно там есть особенности в том сколько "видит" памяти ваше JVM приложение. В статье неплохо раскрывается эта тема и самое главное без лишней "воды". Также предлагается скрипт для автоматизации. Думаю, что в работе будет однозначно полезно.
https://habr.com/ru/company/domclick/blog/691240/
Apache Kafka 3.3 заменяет ZooKeeper новым протоколом консенсуса KRaft

Apache Software Foundation выпустила Apache Kafka 3.3.1 со множеством новых улучшений. В частности, это первый выпуск, который помечает протокол консенсуса KRaft (Kafka Raft) как готовый к промышленной эксплуатации.

KRaft — это протокол консенсуса, разработанный для управления метаданными непосредственно в Apache Kafka. Это значительно упрощает архитектуру Kafka, возлагая ответственность за метаданные на саму Kafka без необходимости использования стороннего инструмента, такого как Apache ZooKeeper. KRaft улучшает масштабируемость и отказоустойчивость разделов, а также упрощает развертывание Apache Kafka.

https://developer.confluent.io/learn/kraft/
Archunit инструмент автоматизации проверки качества архитектуры.

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

https://archunit.org/
The Polyglot Developer Reference

Недавно наткнулся на интересный инструмент позволяющий сравнивать возможности разных языков программирования. Как минимум можно сравнивать там разные версии Java, но сравнения возможностей Java с другими языками тоже достаточно интересны. Я думаю, что экосистему определяет не только синтаксис языка, но так же очень важную роль играют и доступные фреймворки и библиотеки. Думаю было бы интересно получить такое же сравнение для наиболее типовых кейсов. Например сравнение реализации типовых REST, gRPC и интеграций через Kafka.

https://codethesaur.us/
VM Options Explorer

Chris Newland, один из авторов книги "Optimizing Java - Practical Techniques for Improving JVM Application Performance", создал ресурс на котором собрал информацию по опциям JVM и полезным ссылкам.

https://chriswhocodes.com/
Может ли Java-приложение использовать больше памяти, чем размер кучи?

В этой статье хорошо раскрыта тема устройства памяти JVM. Также затронута тема инструментов диагностики и параметры JVM.
Лично для меня там была интересна тема про Native Memory Tracking.
https://habr.com/ru/company/otus/blog/705982/