Обновить
512K+

Java *

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

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

Варианты использования Java ML библиотек совместно со Spring, Docker, Spark, Rapids, CUDA

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

В данной статье рассматривается способ использования GPU nVidia с технологией CUDA в Docker-контейнерах для распределенной тренировки моделей машинного обучения на нескольких машинах. Цель статьи - показать вариант использования Big Data Tool Apache Spark в Docker-контейнерах, совместно с акселератором GPU вычислений Rapids на устройствах nVidia CUDA, с применением библиотек DJL, Spark ML, XGBoost, в приложении Spring Boot на Java 8 (требование Rapids), на нескольких машинах под управлением ОС Windows 10 Pro для решения задачи тренировки моделей машинного обучения в распределенной системе.

Читать далее

Hibernate Best Practices для начинающих

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

В данной статье я не ставлю цель подробно описать Hibernate, такого материала полно в сети. Это скорее справочник, в который можно заглянуть и увидеть возможные проблемные места и их решение, который позволит вам не допустить грубых ошибок при использовании Hibernate. Статья рассчитана на читателя уже знакомого с Hibernate и Spring.

Читать далее

К микросервисам через reverse engineering и кодогенерацию

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

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

Часто основная сложность заключается в том, что нужно одновременно поддерживать уже существующий код монолита и параллельно внедрять новые принципы и подходы.  В статье я расскажу, как мы в Wrike, используя reverse engineering и немного кодогенерации, реализовали первые шаги по выделению отдельных микросервисов и запустили первый «почти настоящий» BFF-сервис в рамках нашего монолита.

Читать далее

Считаем уникальные IPv4 адреса

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

Как создавать быстрые и эффективные алгоритмы? В статье, на примере задачи по подсчёту уникальных IPv4 адресов, рассматриваются приёмы и методы обработки больших объёмов данных. Вы узнаете, как написать код, работающий в десятки раз быстрее и использующий в несколько десятков раз меньше памяти, чем "наивные" алгоритмы.

Читать далее

Нормализуем логи OpenFeign

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

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

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

Решение ‘Normalized Logger’ нацелено исправить этот изъян - этот логгер собирает в одну запись будущего лога запрос и ответ - теперь они не будут разбросаны.

Читать далее

Компиляторы против компиляторов

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

Давно хотел познакомиться с Rust. Язык с экосистемой сборки из коробки, компилятор в машинный код, но самое главное — автоматическое управление памятью, но без сборщика мусора. С учетом того, что управление памятью обещается как zero-cost в runtime — просто сказка! По ходу изучения и возник вопрос – а насколько код Rust быстрее/медленнее компилятора в машинный код давно известного, например, Delphi?

Посмотреть на финалистов

Нагрузочный клиент по тестированию Кафка в Avro формате на Java

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

 

Современный Фреймворк Spring Boot позволяет писать очень многие вещи писать современным программистам в две-три строчки, просто подключив нужную зависимость, для этого нужно уметь хорошо ориентироваться в возможностях этого Фреймворка, но есть вещи, которые всё же приходится писать руками.

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

Сегодня Spring Boot поддерживает не в полной мере Avro? для корректной работы этой технологи приходится использовать конфигурирование на основе обычного Spring, не Boot. А дело вот в чём:

Читать далее

Как войти в блокчейн-разработку через Java и Kotlin: представляем JVM SDK смарт-контрактов

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

Всем привет! Меня зовут Степан Кашинцев, я руководитель группы разработки в Waves Enterprise, а конкретно — подразделения, отвечающего за создание децентрализованных приложений, реализующих процессы реального бизнеса на базе нашего блокчейна. В этом посте я хочу рассказать о нашем SDK для JVM-языков программирования, с помощью которого каждый Java/Kotlin-разработчик сможет попробовать себя в создании блокчейн-приложений.

Читать далее

Программирование JavaFX: использование SceneBuilder

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


В прошлой статье мы начали разговор о фреймворке JavaFX, который позволяет создавать интерфейсы, оставаясь в рамках знакомой вам среды разработки (не нужно изучать веб-технологии). В этот раз мы поговорим о средстве упрощения и ускорения разработки интерфейсов — SceneBuilder.

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

Gradle и нетривиальная конфигурация

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

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

Читать далее

Лояльность покупателей — гигантская ответственность, а не просто технологии

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

Всем привет. Я Игорь, тимлид в команде, которая занимается системой лояльности в CSI. Расскажу, как работают и устроены системы лояльности в ритейле, о том, как мы создали новую архитектуру системы Set Loyalty, что применяем из фреймворков и инструментов. 

Читать далее

Производительность: нюансы против очевидностей. JDK edition

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

Привет, это продолжение статьи, в которой я разбирал разные неочевидные вещи из мира производительности. В этот раз будем копать ещё глубже, хоть и начнём с относительно простых примеров. И да, в этой статье будет много интересного про строки. Да, несмотря на "Катехизис j.l.String", "The Lord of the Strings: Two Scours" и несколько моих статей (раз, два, три, четыре) там всё ещё есть куда копать :)

Читать далее

Современная серверная разработка на языке Java: 2. Архитектура серверного приложения

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

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

Читать далее

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

Функциональные интерфейсы в Java 8 → Consumer, Supplier, Predicate и Function. Что к чему и зачем нужны

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

Java представила поддержку функционального программирования в выпуске Java версии 8. В этой статье мы разбираем несколько функциональных интерфейсов, а именно: Потребитель (Consumer), Поставщик (Supplier), Предикат (Predicat) и Функция (Function), которые являются наиболее важными.

Читать далее

Митап JUG.MSK: Константин Кривопустов о Jmix и Семён Киреков о Spring Data JPA

Время на прочтение2 мин
Охват и читатели1.8K
14 июля 2022 года на встрече московского сообщества Java-разработчиков JUG.MSK Константин Кривопустов рассказал про платформу разработки Jmix, Семён Киреков — про антипаттерны тестирования при использовании Spring Data JPA.


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

Kafka и Chronicle Queue

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

Хотя облачные сервисы удобны и гибки, эксплуатационные затраты на приложения, развёрнутые в облаке, иногда могут быть существенными. В этой статье мы расскажем о способе существенного снижения эксплуатационных затрат в чувствительных к задержке Java-приложений с Event-Driven Architecture (EDA) при помощи миграции с Kafka на Chronicle Queue — опенсорсной, более эффективно использующей ресурсы реализации очереди с пониженной задержкой.
Читать дальше →

CWE Top 25 2022. Обзор изменений

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

Список CWE Top 25 отражает наиболее серьёзные недостатки безопасности ПО. Предлагаю вам ознакомиться с обновлённым топом в обзоре изменений за прошедший год.


CWE_top_25_2022_ru


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

Получение generic-типа в runtime

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


В Java 5 появились generic-типы, а вместе с ним и концепция type erasure, которая буквально означает стирание информации о generic-типе после компиляции. Действительно, во многих случаях это просто синтаксический сахар, помогающий писать типо-безопасный код на уровне компиляции, и в runtime с такими типами работать нельзя. Например, невозможно получить тип T внутри ArrayList<T>, поэтому он в своей реализации создает массив Object[], а не T[] для хранения элементов.

Однако, в ряде случаев это очень даже возможно. Например, можно объявить поле

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
...
@Autowired
private Set<BeanPostProcessor> beanPostProcessors;

и spring в него заинжектит все объекты контекста, которые реализуют интерфейс BeanPostProcessor.

Можно написать и так:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
...
List<String> strings = new ObjectMapper()
     .readValue("[1, 2, 3]", new TypeReference<>() {});
// все элементы strings - строки (не Integer и не Long)
List<Integer> ints = new ObjectMapper()
     .readValue("[1, 2, 3]", new TypeReference<>() {});
// все элементы ints - Integer (не String и не Long)

Можно написать даже так:
Читать дальше →

Double, Float — не вещественные числа

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

Во многих источниках тип double и float, числа с плавающей запятой/точкой зачем-то называют вещественными. Такое чувство что кто-то когда-то совершил ошибку или не внимательно написал эту глупость и все как один начали её повторять, совершенно не задумываясь о чём они говорят.

Ладно это были бы просто троечники студенты и любители, так эту ошибку говорят и те, кто обучают специалистов. И эта проблема терминологии не одного ЯП, их правда много (Java, C++, C#, Python, JS и т.д.) везде, где бы я не искал, всегда находятся статьи, ответы, лекции, где дробные числа называют вещественными!

Читать далее

Подробно о мониторинге и профилировании JVM

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

Управление доступными ресурсами в облачной среде по запросу – тема, которая бывает очень непростой. Но эта работа стоит того, поскольку вы сможете использовать ресурсы гораздо эффективнее. Поэтому многие компании и проекты решаются мигрировать на облачные платформы, в частности, на Azul, AWS, Google Cloud или другие. С точки зрения программиста, есть одна истина, которая сохраняется и в облаке: рекомендуется понимать поведение и ограничения того JVM-приложения, что вы развернули (или не приложений, а подов, минимальных развертываемых единиц в Kubernetes). Платформа Java является многопоточной, и, даже если вы не собираетесь использовать какие-либо доступные для этого API, платформа все равно порождает множество потоков-демонов, работающих в фоновом режиме. Такие потоки нужны не только для очистки и подхватывания неиспользуемой памяти. Они относятся к платформе, а что насчет фреймворков? Фреймворки Java пытаются обслуживать большие эксплуатационные мощности; следовательно, инициируется работа множества вспомогательных потоков. Ниже мы немного заглянем под капот. В этой статье будет подробнее рассмотрено, как устроены популярные фреймворки Quarkus и Spring-Boot, сколько потоков они инициируют, чтобы обслужить все результаты. Давайте вместе пробежимся по примерам и для начала разберемся, какова разница между мониторингом и профилированием.

Читать далее