Обновить
128K+

Java *

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

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

Иван Пономарёв про Kafka Streams API на встрече jug.msk.ru

Время на прочтение2 мин
Охват и читатели3.6K
25 июля 2019 года прошла встреча московского сообщества Java-разработчиков jug.msk.ru, на которой Иван Пономарёв представил доклад про Kafka Streams API.


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

Web MVC приложение без фреймворков и сервлетов

Время на прочтение8 мин
Охват и читатели7.3K
Напишем небольшое веб приложение, без использование Web-фреймворков, внешних библиотек, и сервера приложений.

Цель данной статьи показать общую суть происходящего под капотом веб-сервиса, на примере Java. Итак, поехали. Мы не должны использовать сторонние библиотеки, а также сервлет. Поэтому проект соберем Maven-ом, но без зависимостей.

Что происходит когда пользователь вводит некий ip-адрес(ну или dns который превращается в ip-адрес) в адресной строке браузера? Происходит запрос к ServerSocket указанного host-a, на указанный порт.

Организуем на нашем localhost, socket на случайном свободном порту(например 9001).
Читать дальше →

Java vs Kotlin для Android: мнения разработчиков

Время на прочтение7 мин
Охват и читатели68K
В опросах Stack Overflow в 2018 году 45,3% респондентов называли Java самым популярным языком программирования, а Kotlin отдали предпочтение всего 4,5% разработчиков. Тем не менее, в мае 2019 в Google объявили приоритетным языком программирования именно Kotlin. Корпорация не призывала отказываться от С++ и Java, но споры между программистами разгорелись еще жарче.

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

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

Синхронизация клиентских запросов в Spring

Время на прочтение5 мин
Охват и читатели12K
Сегодня предлагаю Вам разобрать одну практическую задачу о гонке клиентских запросов, с которой я столкнулся в МаксимаТелеком при разработке back-end для нашего мобильного приложения MT_FREE.

При старте клиентское приложение асинхронно отправляет «пачку» запросов к API. Приложение имеет идентификатор clientId, на основании которого можно различить запросы одного клиента от другого. На каждый запрос на сервере выполняется код вида:

  // получаем из репозитория данные клиента
  Client client = clientRepository.findByClientId(clientId);
  // если клиент не создан ранее
  if(client == null){
      client = clientRepository.save(new Client(clientId));
  }
  // далее обрабатываем запрос  

где сущность Client имеет поле clientId, которое должно являться уникальным и имеет для этого в базе unique constraint. Так как в Spring каждый запрос будет выполнять данный код в отдельном потоке, даже если это запросы от одного и того же клиентского приложения, будет возникать ошибка вида:
integrity constraint violation: unique constraint or index violation; UK_BFJDOY2DPUSSYLQ7G1S3S1TN8 table: CLIENT

Ошибка возникает по очевидной причине: 2 или более потоков с одним clientId получают сущность client == null и начинают ее создавать, после чего при коммите получают ошибку.

Задача:


Необходимо синхронизировать запросы от одного clientId так, чтобы только первый запрос выполнил создание сущности Client, а остальные блокировались бы на момент создания и получали бы уже созданный им объект.
Читать дальше →

Опенсорс-решение для автоматизации отчетности

Время на прочтение9 мин
Охват и читатели54K
Разработчикам сайтов и мобильных приложений часто нужно управлять подготовкой PDF-страниц к выводу на печать или их отправкой клиентам на почту.

У PDF-файлов есть полный контроль над отображением текста и графическими изображениями на странице. К сожалению, библиотеки для генерации динамически заполняющихся PDF-файлов не входят в стандартный инструментарий PHP, JS (Web), Java или Swift (Android и iOS соответственно). В этой статье хочу вам рассказать об опенсорс-решении для генерации PDF-файлов.



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

Опыт автоматизации регрессионного визуального тестирования на Java + Selenium Webdriver + aShot

Время на прочтение3 мин
Охват и читатели9.9K
Здравствуйте.

В этой статье я бы хотел рассказать о своем опыте автоматизации визуального регрессионного тестирования.
Читать дальше →

Как я отказывался от db4o в промышленной системе

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

image


Мы — отдел большой компании, развивающий важную систему на Java SE / MS SQL / db4o. За несколько лет проект перешел от опытного образца к промышленной эксплуатации и db4o превратилась в тормоз расчета, захотелось перейти с db4o на современную noSQL-технологию. Пробы и ошибки завели далеко от первоначального замысла — от db4o отказаться удалось, но ценой компромисса. Под катом размышления и подробности реализации.

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

Написание программного обеспечения с функционалом клиент-серверных утилит Windows, part 02

Время на прочтение6 мин
Охват и читатели2.2K
Продолжая начатый цикл статей, посвященный кастомным реализациям консольных утилит Windows нельзя не затронуть TFTP (Trivial File Transfer Protocol) — простой протокол передачи файлов.

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

Митап ITX5: живая JAVA, магия Kotlin и томатный тиндер

Время на прочтение2 мин
Охват и читатели3.5K
Внутри #ITX5, в котором сейчас почти 1500 человек, часто проводятся интересные мероприятия, а в июле мы впервые решились открыться миру и организовать митап для всех поклонников JAVA. Поговорили о красоте кода, новых парадигмах вычислений и магии Kotlin. Спойлер: в течение пяти лет он всех победит, но это не точно. Реальными JAVA-кейсами поделились Александр Краснощеков из #ITX5, Виталий Куценко из Otus, Дмитрий Латышев из Leroy Merlin, Павел Финкельштейн из Lamoda.


Java REPL вам не ScriptEngine

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


Привет, Хабр! Меня зовут Дима, я разработчик в команде “Архитектура” в hh.ru. Среди прочего, я занимаюсь тем, что делаю разработку проще для коллег. Выполнение кода в продакшене является типовой задачей. Поэтому когда я услышал, что с этим есть проблемы, я решил заняться их устранением.

Не всегда изменения данных можно сделать простым UPDATE/INSERT — иногда нужно задействовать валидацию, шины событий и прочее. В таких случаях самым оптимальным решением является выполнение произвольного кода прямо в приложении. У нас Java, поэтому когда появился JEP-222, я сразу подумал, что JShell, возможно, сможет снова сделать написание скриптов удобным. Чуда не произошло, а потому под катом вы найдете не очень глубокое сравнение самых известных интерпретаторов Java (и «около-Java») для jvm с примерами. Всех интересующихся приглашаю под кат.
Читать дальше →

WASM Meet Up 1/08

Время на прочтение1 мин
Охват и читатели2K
Приглашаем на митап, посвященный технологии WebAssembly, который пройдет на площадке Райффайзенбанка в Нагатино 1 августа. Послушаем доклады Raiffeisen Digital, Parity Technologies и Mozilla напрямую из Сан-Франциско.


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

Использование Liquibase для управления структурой БД в Spring Boot приложении. Часть 2

Время на прочтение7 мин
Охват и читатели46K
В предыдущей части мы разобрались с основными возможностями Liquibase и написали базовый пример Spring boot приложения, который использует Liquibase для инициализации БД. Полный код базового приложения можно увидеть тут на GitHub. В этой статье мы поговорим про liquibase-maven-plugin и те дополнительные возможности, которые он нам дает для версионирования структуры БД. Начнем с того, как автоматически создавать скрипты при помощи функции сравнения.

Предположим, что нам понадобилось внести какие-либо изменения в структуру нашей БД. Например, мы хотим, чтобы email не мог быть null. Безусловно, для такого маленького изменения можно было бы подкорректировать код и скрипты вручную, но как быть если изменений будет больше? В этом случае к нам на помощь придет встроенная в Liquibase возможность сравнения БД. Интересной её особенностью является то, что сравнивать можно не только две базы данных, но и базу данных с набором JPA сущностей в нашем приложении. Именно так мы сейчас и поступим!
Читать дальше →

Использование Liquibase для управления структурой БД в Spring Boot приложении. Часть 1

Время на прочтение5 мин
Охват и читатели113K
В этой статье я разберу использование утилиты Liquibase в Spring Boot приложениях для версионирования структуры реляционной БД и миграции этой структуры с одной версии на другую. В первой части разберем базовый пример, а во второй поговорим об использовании liquibase-mave-plugin для отката изменений и автоматической генерации скриптов через сравнение структур БД.

Начнем с того, что создадим простейшее приложение на Spring Boot + JPA (Hibernate). В этом нам поможет Spring Initializr. Из зависимостей выбираем JPA, MySQL и Web. Liquibase тоже можно подключить на этом шаге, но для лучшего понимания мы это сделаем далее вручную.
Читать дальше →

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

Выпускаем Predator — предкомпилированные Data-репозитории

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


Сегодня, команда Micronaut в Object Computing Inc (OCI) представила Predator, новый проект с открытым исходным кодом, цель которого — значительно улучшить время выполнения и производительность (по памяти) доступа к данным для микросервисов и serverless-приложений, при этом не потеряв в продуктивности по сравнению с такими инструментами, как GORM и Spring Data.

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

Реализация сопоставления с образцом в Java

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

Многие современные языки поддерживают сопоставление с образцом (pattern matching) на уровне языка. Java в данный момент не поддерживает pattern matching, но есть надежды что в будущем все может измениться.


Сопоставление с образцом раскрывают перед разработчиком возможность писать код более гибко и красивее, при этом оставляя его понятным.


Используя возможности Java 8, можно реализовать некоторые возможности pattern matching в виде библиотеки. При этом можно использовать как утверждение так и выражения.

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

Проблемы пакетной обработки запросов и их решения (часть 1)

Время на прочтение9 мин
Охват и читатели6.7K
Практически все современные программные продукты состоят из нескольких сервисов. Часто большое время отклика межсервисных каналов становится источником проблем с производительностью. Стандартное решение такого рода проблем — это упаковка нескольких межсервисных запросов в один пакет, которую называют пакетной обработкой (batching).

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

Написание программного обеспечения с функционалом клиент-серверных утилит Windows, part 01

Время на прочтение4 мин
Охват и читатели3.9K
Приветствую.

Сегодня хотелось бы разобрать процесс написания клиент-серверных приложений, выполняющих функции стандартных утилит Windows, как то Telnet, TFTP, et cetera, et cetera на чистой Javа. Понятно, что ничего нового я не привнесу — все эти утилиты уже успешно работают не один год, но, полагаю, что происходит под капотом у них знают не все.

Именно об этом и пойдет речь под катом.
Читать дальше →

Node.js или Java: производительность, ресурсы, управление потоками, популярность и личный опыт

Время на прочтение8 мин
Охват и читатели44K
Недавно мы с коллегами обсуждали вопрос популярности некоторых технологий — в частности Java и node.js. После недолгого интернет-серфинга выяснилось, что именно эти технологии используют многие информационные гиганты для разработки и поддержания своих площадок в сети. Ниже, я приведу лишь малую часть.

Компании использующие Java:

image

Компании использующие node.js:

image

He менее интересным является и то, что по данным поиска на indeed.com (28.06.2019) по запросам Java Developer (30272 вакансии) и node.js developer (7401 вакансии), специалисты по этим технологиям довольно востребованы.

image

Но все это лишь общая информация, касающаяся популярности. Информация, которая натолкнула меня на мысль углубиться в тему и порассуждать на предмет технических особенностей, что привело к написанию этой статьи.
Читать дальше →

Иследование современного Malware Cerberus под Android

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

На носу 2020 год и сегодня мы имеем уже версию Android 9.0 Pie, где компания Google бьет себе в грудь и говорит что их продукт защищен. Но злодеи не дремлют и создают свои вредоносы для Android.

Случайным образом мне попался на руки обфусцированный apk файл, который является банковской малварью под названием «Cerberus», и появился он в 2019 году.

APK файл данного ботнета попал мне с недействительным адресом соединения с сервером, по этому часть логики работы и функционала осталась неизученной, так как данный ботнет использует «модульную» систему, и подгружает функционал напрямую со своего сервера.
Читать дальше →

Карта Метро Москвы и всего мира для Android

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

ГЛАВА 1. Амбиции


Конец февраля 2018



Мы, как адепты идеологии свободного ПО и свободного рынка считаем, что монополия — это плохо.

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

Команда: в разное время от 2х до 4х человек.

Повествованием охвачено только Android приложение, ввиду того, что оно было запущено первым и все основные механизмы были обкатаны на нём. Конечно, на текущий момент доступна и версия для iOS.

ГЛАВА 2. Маршрут во мраке


Март – июнь 2018.

Нужна карта. Берем SVG, пихаем в SVGView, все отлично. Лагает ужасно, но мы радостные. Как рисовать отдельные маршруты? Никто не знает.

В SVG формате нет никакой информации о наслоении, принадлежности элемента к какой-либо линии и прочей информации, которая критически необходима для построения маршрута. Так мы и пришли к использованию базы данных для хранения всех элементов для отрисовки.

К тому же нам было нужно, чтобы приложение работало как можно быстрее. Использование WebView сразу отпадает, нужна GL-поверхность. Решили попробовать с SurfaceView (opengl поверхность, которую можно использовать как канвас) – всё не то. Она может производить изменения внутри себя, мигая черным цветом, так как она просто плохо реализована и не может выдержать нагрузку больше отрисовки кубика 20х20. Она может увеличиваться, пропадая через раз. Нам нужно было другое решение, но такое, которое было бы не так далеко от SurfaceView, так как по интерфейсу нам она полностью подходила.

image
Вкратце про баги драйверов на Android
Читать дальше →