Обновить
512K+

Java *

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

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

Искусство ETL. Пишем собственный движок SQL на Spark [часть 7]

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели4.1K
В предыдущих сериях (FAQ 1 2 3 4 5 6 ) мы весьма подробно рассмотрели, как написать на Java собственный интерпретатор объектно-ориентированного диалекта SQL поверх Spark RDD API, заточенный на задачи подготовки и трансформации наборов данных.

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


-- library.tdl

CREATE PROCEDURE dwellTimeByMode(@signals, @target, @outPrefix,
  @modes = ['pedestrian', 'non_pedestrian', 'car', 'bike'],
  @groupid='cell10') AS BEGIN
    LOOP $mode IN $modes BEGIN
        SELECT * FROM $signals INTO "{$signals}/{$mode}" WHERE mode=$mode;

        CALL dwellTime(@signals_userid_attr=userid,
            @target_userid_attr=userid,
            @target_grouping_attr=$groupid
        ) INPUT signals FROM "{$signals}/{$mode}", target FROM $target
        OUTPUT INTO "{$outPrefix}/{$mode}";

        ANALYZE "{$signals}/{$mode}";
        ANALYZE "{$outPrefix}/{$mode}";
    END;
END;

--- ... --- ... --- ... ---

-- script.tdl

CALL dwellTimeByMode(@signals=$this_month, @target=$population, @outPrefix=$this_month);

Нафига это надо?


Ну, допустим, у нас уже есть некоторое количество SQL ETL кода, наработанного за время эксплуатации инструмента в продакшене, и становится заметно, что значительная часть скриптов на разных проектах совпадает, и из раза в раз повторяется. Логично было бы вынести все эти совпадающие куски в библиотеку, чтобы держать в одном месте, да и вызывать с какими надо параметрами, когда надо. Вот прям как на примере выше.

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

Профилирование Java-приложений: от HeapDump до Grafana

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели22K

Добрый день дорогой читатель. Сегодня я дам тебе несколько советов для поиска и анализа проблем в твоем Java приложении. Мы разберем такие вещи как: HeapDump, ThreadDump, VisualVM, Grafana, HikariPool, Prometheus и Garbage Collector.

Читать далее

Простые коммуникации в Java-приложении

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели8.7K

Привет, 

Как вы уже, наверное, знаете, Jmix — это такая платформа для разработки корпоративных приложений, построенная на основе фреймворков Spring, Vaadin и других классных технологий с открытым исходным кодом. 

Ее использование позволяет абстрагироваться от многих сложностей фронтенд-разработки. Разработчикам не обязательно учить JavaScript/TS, погружаться в особенности популярных фронтенд-фреймворков, тренироваться в верстке, чтобы иметь возможность создавать полнофункциональные веб-приложения. Достаточно просто писать код на Java и немного компоновать экраны в XML. При разработке интерфейса для Jmix под капот уходят также некоторые механики, связанные с «перекладыванием джейсонов», что открывает дополнительные возможности для написания интерактивных веб-приложений с использованием готовых компонентов и дополнений. 

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

Читать далее

Глубокое погружение в Sealed классы и интерфейсы

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели15K

С появлением sealed классов и интерфейсов Java открыла перед разработчиками новые горизонты в области проектирования устойчивого и предсказуемого кода. 

В новом переводе от команды Spring АйО было рассмотрено, как эти элементы языка позволяют строго контролировать иерархию классов, обеспечивая тем самым безопасность и простоту поддержки кода. Мы рассмотрим ключевые особенности sealed классов и интерфейсов, их влияние на архитектуру приложений и практические примеры их применения.

Читать далее

Мечтают ли Андроиды о нейропроцессорных модулях? Перенос модели TensorFlow Lite в мобильное приложение

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели2.8K

Несмотря на то, что искусственный интеллект – наиболее хайповая тема в современных ИТ, и учитывая тот факт, что предыдущая мега-история с Internet of Things и Edge Computing до сих пор не забылась, я удивился, что отсутствуют внятные обучалки типа «Hello world» по добавлению machine learning в мобильные приложения на Android. Ну они конечно есть, только совсем не начального уровня. Кроме того, в них предлагается использовать чужие модели для распознавания кошек от собак и рукописных букв в текст итд. Но вот чтобы взять регрессию и с ней поработать – нет (или я не нашел). И в книгах не нашел. Если есть – поделитесь. Ну а пока я буду добавлять свою модель в приложение и параллельно писать этот текст.

История моего приложения есть в публикациях 1, 2, 3. Если коротко, это программа RuLearn для запоминания лексики в иностранных языках или в любой другой области, которая требует механического заучивания. Ее эффективность определяется «кривой забывания» Эббингауза, но как выясняется, интервалы для повторения хорошо было бы адаптировать под сложность изучаемого материала. То есть обучающийся учит новые слова, а приложение учится на его ошибках и подстраивает алгоритмы повторения оптимальным образом. Напрашивается машинное обучение в обучении человека.

Современные ARM-процессоры в мобильных телефонах содержат NPU для работы с нейросетями. Возможно, до сих пор это наименее используемая часть аппаратного обеспечения в вашем мобильнике. Поэтому никакая клиент-серверная архитектура в данном случае не нужна, в финале нашей разработки машинное обучение будет идти на конечном устройстве (бонус - никто с серверной стороны не сможет посмеяться над ошибками пользователя). Но на промежуточном этапе придется использовать модель, созданную на десктопе. Сегодня этим и займемся.

Читать далее

Новое событие в JFR для диагностики использования устаревшего (deprecated) кода

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели1K

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

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

Давайте посмотрим на простом примере как это работает.

Посмотрим...

Запускаем таски по расписанию: когда важна высокая частота, а креши дорого стоят

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели5.8K

Всем привет! Я Илья, бэкенд-разработчик в Яндекс Телемосте — сервисе для организации видеовстреч и онлайн-трансляций.  

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

Читать далее

Создание микросервисов на Java с Dropwizard

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели5.6K

Dropwizard — это комплексный фреймворк, созданный с целью упростить разработку RESTful веб‑сервисов, объединяя в себе множество проверенных временем библиотек и инструментов.

Читать далее

Spring Boot 3.3: повышение производительности, безопасности и  observability

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели6.3K

Команда Spring АйО продолжает следить за выходом новых версий популярных технологий. В новом переводе рассказали про основные улучшения, которые вошли в состав Spring Boot 3.3. Среди них:

Поддержка Class Data Sharing (CDS)

Улучшение производительности виртуальных потоков для web-сокетов

Новые свойства для настройки Spring Data JDBC, GraphQL websocket, WebFlux и Tomcat

Читать далее

Не используйте Lombok с JPA, пока не прочтете эту статью

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели27K

Lombok — действительно отличный инструмент. Одна строчка кода, и все ваши JPA сущности перестают корректно работать ;) Но это только в том случае, если вы не знаете, какие фичи Lombok можно использовать вместе с JPA, а какие лучше не стоит. 

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

Читать далее

Как заставить code coverage работать на вас

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели9K

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

Читать далее

Нагрузочное тестирование в разработке веб-приложений

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели13K

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

Читать далее

Правда ли, что Dubbo — это как gRPC, но из Китая?

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели6.3K

Всем привет! На связи Максим Чудновский и Александр Козлов, мы занимаемся развитием интеграционной платформы Synapse. Это сloud-native децентрализованная платформа для интеграции и оркестрации микросервисов, которая разрабатывается в СберТехе.

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

Мы подготовили два материала на тему интеграционных фреймворков. В этой статье познакомим вас с Dubbo, вспомним про базовое устройство Service Mesh и покажем, как мы на Java обычно решаем вопросы интеграции в наших системах. Во второй статье соберём демоприложение на базе фреймворка Dubbo.

Читать далее

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

Забытая история Java: версия Патрика Ноутона

Уровень сложностиПростой
Время на прочтение44 мин
Охват и читатели9.3K

Патрик Ноутон — первоклассный специалист из Sun Microsystems, являющийся одним из создателей Star7 и Java.

Именно он был инициатором запуска проекта (причём через конфликт с руководством Sun и критику их работы, находясь на грани увольнения), который привел к появлению Java.

Если бы Патрику позволили уволиться и перейти в NeXT, возглавляемую Стивом Джобсом, как он того хотел, то языка Java, не существовало бы.

Данный текст, опубликованный им 18 марта 1996 г., позволяет взглянуть в прошлое на “лихие” 90-е, когда Sun пыталась оседлать перспективные направления, связанные с компьютерами, сетями и сопутствующими технологиями.

Но Патрика не запомнят, как одного из компьютерных гениев, работавших в Sun над Java. А все потому, что на пике своей карьеры в возрасте 34 лет в конце 1999 г. он потеряет всё: семью, престижную работу, бо́льшую часть состояния и репутацию. Причиной тому будет поимка его ФБР и обвинение в педофилии.

Но до этого переломного события еще около трех лет; успех и востребованность начинают кружить голову и кажется, что вся жизнь впереди…

Узнать темное прошлое Java

JPA Entity. Загрузи меня не полностью

Уровень сложностиПростой
Время на прочтение16 мин
Охват и читатели20K

JPA часто подвергается критике за невозможность загружать сущности частично, что на самом деле является большим заблуждением. Spring Data JPA и Hibernate включают в себя множество инструментов по частичной загрузке сущностей. 

Команда Spring АйО подготовила статью, в которой рассмотрела имеющиеся в Spring Data JPA инструменты для частичной загрузки сущностей, а также разобрала их особенности и corner-кейсы.

Читать далее

Как сделать анализатор кода за два дня

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели17K

Статический анализ — это очень мощный инструмент, позволяющий следить за качеством кода. Предлагаем вместе попробовать написать простой Lua анализатор на Java, чтобы понять, как устроены статические анализаторы кода внутри.

Читать далее

Бинарные деревья — решение алгоритмических задач, часть 1

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели38K

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

Немного теории для общего понимания сути.

Бинарное дерево - это иерархические структура данных, в которой каждый узел имеет не более двух дочерних узлов. Узлы обычно называются правыми и левыми потомками. При этом каждый из потомков, в свою очередь тоже является узлом, который может иметь двух потомков. Если у узла нет потомков, такой узел называют листом.

Кстати, у меня есть телеграм-канал, где пишу подходы к решениям всяких задачек с LeetCode, там больше разборов конкретных задач, чем здесь, потому что не всегда нужна статья. В общем, если интересно - жду здесь - t.me/crushiteasy :)

Читать далее

Полезные фичи в Java для новичков: мой список

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели28K

Привет, Хабр!

В Java никогда не бывает скучно, особенно когда речь заходит о вещах, которые делают нашу жизнь проще и код — чище.

Сегодня я хочу рассказать вам о четырех фичах в Java, которые сам активно использовал в своих проектах и которые, на мой взгляд, заслуживают внимания. Да, это мой личный список, и я не претендую на то, что эти фичи новы или являются последним писком моды. Однако, по моему опыту, они действительно могут упростить жизнь.

И знаете, что самое приятное? Когда коллеги начинают говорить: "А почему я об этом не знал раньше?"

Читать далее

И опыт, сын ошибок трудных: обрабатываем ошибки в Spring Boot

Уровень сложностиСложный
Время на прочтение17 мин
Охват и читатели19K

Долгое время разрабатывая микросервисы в разных командах, я сталкивался с типовой задачей: созданием максимально информативного ответа на запрос, когда произошла какая-то ошибка. Особенно это актуально для систем с пользовательским фронтендом, большим количеством интеграций или систем, которые представляют свой API как продукт. Во многих случаях это решалось выдачей сообщения «Ошибка системы» с HTTP-кодом 500. Из раза в раз меня не покидало ощущение, что решению этой задачи не уделяется должного внимания и времени. В текущем проекте нам пришлось пройти все круги ада, изменить несколько подходов и реализаций. И здесь я постарался описать, как это было, и сформулировать выводы, которые мы сделали на каждом шаге решения проблемы.

Читать далее

Даже математики ошибаются

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели20K

Мы знаем, что математика — наука точная. Значит ли это, что GeoGebra — программное обеспечение для интерактивного изучения математики — столь же точно? Проанализируем же исходный код проекта с помощью PVS-Studio!

Читать далее