Обновить
128K+

Java *

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

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

Java Optional не такой уж очевидный

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

NullPointerException - одна из самых раздражающих вещей в Java мире, которую был призван решить Optional. Нельзя сказать, что проблема полностью ушла, но мы сделали большие шаги. Множество популярных библиотек и фреймворков внедрили Optional в свою экосистему. Например, JPA Specification возвращает Optional вместо null.

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

Читать далее

Кейс использования Mapping Diagnostic Context и @Async

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

Речь в этой небольшой заметке пойдёт про то, как с пользой можно использовать MDC в Spring-проекте.

Читать далее

Гибкая авторизация с помощью Casbin и PERM. Практический пример

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

После написания предыдущей статьи по языку PERM и библиотеке Casbin, возникли вопросы. Причем не у одного человека, и я хотел ответить сначала в комментарии, но понял, что объем материала выходит за рамки обычного комментария, поэтому изложу этот ответ в виде отдельной статьи.


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

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

Spring Cloud и Spring Boot. Часть 2: использование Zipkin Server для распределенной трассировки

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

Из прошлой статьи (перевод на хабре, оригинал на англ.) вы узнали, как использовать Eureka Server для обнаружения и регистрации сервисов. В этой статье мы познакомимся с распределенной трассировкой (Distributed Tracing).

Распределенная трассировка используется для поиска и устранения ошибок в работе микросервисов. Она помогает в отслеживании прохождения запроса через ряд микросервисов. И помимо этого, может использоваться для анализа производительности.

Читать далее

Need for speed. Пакетная обработка данных с TiSpark

Время на прочтение7 мин
Охват и читатели1.6K
TiSpark – это подключаемый модуль Apache Spark, который работает с платформой  TiDB  и отвечает на запросы сложной интерактивной аналитической обработки (OLAP). Этот плагин Spark широко используется для пакетной обработки больших объёмов данных и для получения аналитических инсайтов. Я старший архитектор решений в PingCAP и бывший разработчик TiSpark. В этом посте я объясню, как он работает и почему TiSpark лучше традиционных решений для пакетной обработки.

Приятного чтения!

Еще раз про try и Try

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

По вопросу обработки ошибок уже множество статей написано и все равно возникают вопросы и споры. Я не стану рассматривать все способы и языки, но хотел бы остановится на исключениях в JVM и сравнить их с функциональным подходом (`Try`/`Either`) на примере Scala.

Эта статья так же не про сравнение ФП с ООП – совсем не обязательно бросать одно ради другого. Но посмотреть и сравнить всегда полезно.

Читать далее

Вы всё ещё ловите исключения? Тогда мы к вам

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

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

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

Но с другой стороны, обрабатывать ошибки всегда лениво и напряжно. Поэтому существует много инструментов для облегчения этой задачи. Стандартный механизм обработки ошибок в Java - Exceptions. Я не буду сейчас расписывать скучные описания, как бы отвечая на скучные вопросы со многих собеседований. Скажу лишь, что Исключение - это на мой взгляд, неправильный перевод понятия Exception. Я считаю, что исключение, то есть исключительная ситуация - это про другого представителя летающих монстров, java.lang.Error.

А Exception - это не исключение, это часть правила. Это всегда один из возможных исходов. Я бы перевёл этот класс не иначе как Отклонение. В смысле отклонение от прямого курса. Потому как перехватив это отклонение, можно курс выправить и продолжить работу. А Исключение - это для безответственных разработчиков.

Так вот. Давайте теперь перехватывать эти отклонения. Как можно это сделать?

В современной разработке существует тенденция наследовать все Exception от непроверяемых исключений. Это позволяет не заботиться о написании кода обработки ошибок. Я считаю этот подход расхлябанным и безответственным. И сам всегда пропагандирую использование явно заданных и объявленных отклонений с жёсткой обязанностью их обработать, т.е. настаиваю на использовании только проверяемых исключений/отклонений в любом бизнес-коде.

Это вносит неудобства, да. Надо их везде ловить. Как упростить задачу? Обычно советуют тупо оборачивать исключение в java.lang.RuntimeException. Но такой подход чреват тяжёлыми последствиями, когда приложение выходит в релиз и на бой. Я как человек, имеющий ещё и плюсовый бэкграунд, прекрасно знаю, что некоторые ситуации невозможно предугадать даже очень внимательно вглядываясь в код. А потом искать их причины днями, неделями, иногда месяцами. Потому что кто-то в самом начале, в месте возникновения ошибки не объявил о возможности их возникновения.

Отклониться к статье

Конфигурация Java систем — как убрать боль

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

Если вы хотя бы однажды разрабатывали большую систему на Java и сопровождали её, то, наверняка, сталкивались с неудобствами настройки тех или иных процессов в системе. 

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

Каждый раз менять всё это в коде, пересобирать и перенакатывать на реал — не комильфо.

Естественно все эти параметры нужно выносить в файлы конфигов и считывать их оттуда — все так делают.

В Java из коробки для этого есть некий Properties. Но пользоваться им крайне неудобно. Во-первых, UTF-8 там не работают, во-вторых — если вы поменяли какой-нибудь параметр в конфиге, то чтобы новое значение попало в систему — требуется перезапуск приложения. А если вы не хотите его перезапускать, или это невозможно в 11 утра — час пиковой нагрузки. И отложить на потом не вариант — нужно срочно. Что делать? Нужно чтобы конфиги перечитывались на «горячую», т. е. без перезапуска системы.

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

И вот ещё что: представьте у вас крупная система в которой уже накопилось около тридцати конфигурационных файлов, и в каждом по десятку параметров. И вам нужно накатить новую инстанцию. Как вы будете настраивать эти конфиги? Создавать каждый вручную? В каждом прописывать имена параметров и их значения, вспоминая что каждый из них значит? А если забыли? А есть документация? А эта документация актуальная? А если вы ошибётесь в одной буковке параметра — позволит ли вам система при старте сразу объяснить что не так? Или она свалится в час ночи, когда вы крепко спите? Вам придётся просыпаться, включать как-то мозг и разбираться во всей этой истории…

Хотелось бы избежать всей этой нервотрёпки

Как трассировка запросов сломала API

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

TL;DR;

История провала со счастливым концом о том, как команда узнала о трассировке запросов, AOP, а потом сломала API.

ВВедение Благие намерения Невинное начало

Каждый проект содержит логирование. Наш проект использовал Lombok и его @Slf4j аннотацию. Мы логировали выполнение бизнес операций, но нам не хватало контекста.

Логи содержали что-то типа такого:

Читать далее

AspectJ в автоматическом тестировании — несколько практических примеров

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

Мне понравился механизм аспектно-ориентированного программирования (АОП), который используется в Allure Framework для перехвата выполнения тестовых шагов, отмеченных аннотацией @Step. И я попробовал применить его в автотестировании, не подключая к тестам таких монстров, как Spring или Guice.

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

Читать далее

RBAC? ABAC?.. PERM! Новый подход к авторизации в облачных веб-службах и приложениях

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

Принципиальная схема процесса авторизации с помощью Casbin


Данная статья преследует цель рассказать о новом походе к авторизации в облачных решениях, в основе которого лежит использование интерпретируемого языка определения политики управления доступом — который называется языком моделирования PERM (PML). Данный язык можно использовать для выражения различных моделей управления доступом, таких как список управления доступом (ACL), управление доступом на основе ролей (RBAC), управление доступом на основе атрибутов (ABAC) и других. А также рассказать о практическом воплощении этого подхода в виде конкретной реализации кросс-языковой библиотеки авторизации Casbin

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

Разбираемся, как работает Spring Data Repository, и создаем свою библиотеку по аналогии

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

В статье показано, как работают библиотеки Spring (Spring Data, Spring Feign), и показано, как можно создать свою похожую библиотеку.

Читать далее

Android Bluetooth Low Energy (BLE) – готовим правильно, часть #4 (bonding)

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

Содержание

Часть #1 (scanning)

Часть #2 (connecting/disconnecting)

Часть #3 (read/write)

Часть #4 (bonding), вы здесь

В предыдущей статье мы разобрались с операциями чтения/записи, включения/выключения нотификаций и организации очереди команд. В этой статье мы поговорим о сопряжении устройств (Прим. переводчика – далее я буду использовать термин «bonding»).

Читать далее

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

Поиск по синонимам в тексте — контролируем процесс или доверяемся нейросетям

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

Первое что нужно сделать при разработке поисковых, диалоговых и прочих систем, основанных на natural language processing — это научиться разбирать тексты пользовательских запросов и находить в них сущности рабочей модели. Задача нахождения стандартных сущностей (geo, date, money и т.д.) в целом уже решена, остается лишь выбрать подходящий NER компонент и воспользоваться его функционалом. Если же вам нужно найти элемент, характерный для вашей конкретной модели или вы нуждаетесь в улучшенном качестве поиска стандартного элемента, придется создать свой собственный NER компонент или обучить какой-то уже существующий под свои цели.

Если вы работаете с системами вроде Alexa или Google Dialogflow — процесс обучения сводится к созданию простейшей конфигурации. Для каждой сущности модели вы должны создать список синонимов. Далее в дело вступают нейронные сети. Это быстро, просто, очень удобно, все заработает сразу. Из минусов — отсутствует контроль за настройками нейронных сетей, а также одна общая для данных систем проблема — вероятностный характер поиска. Все эти минусы могут быть совершенно не важны для вашей модели, особенно если в ней ищется одна-две принципиально отличающиеся друг от друга сущности. Но если элементов модели достаточно много, а особенно если они в чем-то пересекаются, проблема становится более значимой.

Если вы проектируете собственную систему, обучаете и настраиваете поисковые компоненты, например от Apache OpenNlp, Stanford NLP, Google Language API, Spacy или Apache NlpCraft для поиска собственных элементов, забот, разумеется, несколько больше, но и контроль над такой системой заметно выше.

Ниже поговорим о том, как нейронные сети используются при поиске сущностей в проекте Apache NlpCraft. Для начала вкратце опишем все возможности поиска в системе.
Читать дальше →

Тривиальная и неправильная «облачная» компиляция

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


Введение


Данная статья не история успеха, а скорее руководство «как не надо делать». Весной 2020 для поддержания спортивного тонуса участвовал в студенческом хакатоне (спойлер: заняли 2-е место). Удивительно, но задача из полуфинала оказалась более интересной и сложной чем финальная. Как вы поняли, о ней и своём решении расскажу под катом.

Под кат

Пишем Telegram Bot для оповещения о коммите в git репозитарий на базе Gitea и разворачиваем его в Google Cloud Platform

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

Здравствуйте как и обещал в продолжение моей статьи о Автоматической публикации приложения в Google Play , рассмотрю в деталях процесс написания Telegram Bot`a для оповещения команды тестировщиков о выпуске новой версии.

Читать далее

Spring Cloud и Spring Boot. Часть 1: использование Eureka Server

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

В этой статье мы поговорим о том, как установить и настроить службу обнаружения (service discovery) для Java-микросервисов.

Что такое Eureka Server?

Автоматизация публикации приложения в Google Play при помощи Jenkins

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

Для этого нам понадобится

1) Действующий account Google Play Developer

2) Сервер Linux с предустановленным Docker, в моём случае это Ubuntu 16.04

3) Установленный Android SDK

4) Jenkins - в данном случае развернём его при помощи Docker

5) Gitea - Удобная служба для собственного Git-репозитория (это не обязательно можно использовать и GItHub) её мы подымем также на базе Docker контейнера

Читать далее

Как работать с легаси, разгонять Java до скоростей C++ и мигрировать в облака: узнаем в четверг

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

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

– Высокопроизводительном транспорте данных Aeron 

– Работе с тяжёлой наследственностью приложений 

– Multicloud-миграции

– Применении DevOps-инструментов для разработчиков

Каждого спикера после доклада можно будет как следует расспросить, а пройдёт мероприятие на виртуальной площадке, где можно «подойти» к другому участнику пообщаться с помощью видеосвязи.

Под катом есть вся информация о докладах, онлайн-площадке и регистрации.

Читать далее

Scala 3: избавление от implicit. Тайпклассы

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


Моя предыдущая статья была про неявные преобразования и extension-методы. В этой статье обсудим новый способ объявления тайпклассов в Scala 3.


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

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