Как стать автором
Поиск
Написать публикацию
Обновить
185.87

Java *

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

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

Как я перестал бояться и написал игрового бота

Время на прочтение12 мин
Количество просмотров8.3K
Или старое доброе динамическое программирование без этих ваших нейросетей.

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

image
Экран игры с сервера проекта Codenjoy
Читать дальше →

Quarkus: модернизация приложений на примере helloworld из JBoss EAP Quickstart (продолжение)

Время на прочтение4 мин
Количество просмотров1K
Всем привет – с вами пятый пост из нашей серии про Quarkus! (Кстати, смотрите наш вебинар «Это Quarkus – Kubernetes native Java фреймворк». Покажем, как начать «с нуля» или перенести готовые решения)



В предыдущем посте мы рассмотрели модернизацию Java-приложений с помощью поддерживаемых Quarkus технологий (CDI и Servlet 3) на примере программы helloworld из репозитория Red Hat JBoss Enterprise Application Platform (JBoss EAP) Quickstart. Сегодня мы продолжим тему модернизации и обсудим вопрос потребления памяти.
Читать дальше: Модернизация приложений на примере helloworld из JBoss EAP Quickstart

Java-дайджест за 13 мая

Время на прочтение5 мин
Количество просмотров5.8K


Иллюстрация получена вот из этого видео.


  • Джеймс Гослинг, создатель языка Java, заявил об участии в летней конференции JPoint и уже появился в списке спикеров на сайте. Говорят, кризис — время возможностей. Иногда это действительно так! Пару лет назад трудно было представить, что Гослинг будет отвечать у нас на вопросы из чата.


  • В рассылочке появилось интересное письмо о том, что в спеке языка ведется работа над более аккуратным использованием слов вроде «class», «interface» и «type». Например, вместо «sealed types» правильнее говорить «sealed classes and interfaces». Примечание: а вместо Linux нужно говорить GNU/Linux!


  • Стивен Стюарт-Галлус сделал на Java и выложил на GitHub игрушечную реализацию System F JIT, в наличии MethodHandles и Higher Order Abstract Syntax. Соответствующий тред есть на Reddit, где автору можно задавать вопросы. System F — система, которую придумал в 1972 году Жан-Ив Жирар для доказательств в логике, которая представляет собой систему типизированного лямбда-исчисления, отличающаяся от просто типизированной системы наличием механизма универсальной квантификации над типами.

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

Пакетная обработка в JDBC и HIBERNATE

Время на прочтение9 мин
Количество просмотров24K

Здравствуйте!


В этой статье, я кратко расскажу о пакетной обработке SQL (DML) операторов: INSERT, UPDATE, DELETE, как одной из возможностей достижения увеличения производительности.




Преимущества


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


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

Подводные камни тестирования Kafka Streams

Время на прочтение8 мин
Количество просмотров8.6K

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

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

Две альтернативы JDBC

Время на прочтение12 мин
Количество просмотров13K

Примеры для двух неблокирующих библиотек доступа к SQL базам данных — Vert.X SQL и R2DBC. Примеры будут основаны на PostgreSQL и реактивных обертках Java.



Начнем с главного: JDBC — это отличный стандарт. Служил и служит верой и правдой.


Но новые веяния просят новых решений. И даже есть смысл иногда потеснить JDBC.


Я предлагаю взглянуть на две альтернативных реализации доступа к SQL базам из JVM приложений и их (реализаций) применимости.


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

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

Шесть советов об использовании PostgreSQL в функциональных тестах

Время на прочтение5 мин
Количество просмотров19K

В 2018-м году, работая в Akvelon Inc., я собеседовал одного человека. Перед интервью мне дали на проверку его тестовое задание: небольшое web-приложение по типу записной книжки или todo-списка – React\TypeScript, C# на бэке и MS SQL Server в качестве персистентного хранилища. Приложение было модное: с обилием unit-тестов на mock’ах, упакованное в docker-образ – видно, что человек старался. И у этого решения был всего один недостаток – оно не работало. Совсем. Падало при попытке сохранить новую строку в базу данных.



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


Первая из них – ложная уверенность от модульных тестов. Даже 100% покрытие кода тестами не гарантирует, что в нём нет ошибок.


И вторая – отсутствие функциональных тестов. Если ваше приложение работает с СУБД, то вы обязательно должны покрыть эту часть кода реальными тестами с реальной базой данных. И здесь есть очень важное условие: проверять нужно именно на той версии СУБД, которая работает у вас в production’е. Думаю, очень многие разработчики под Oracle, прогоняющие свои тесты на H2\HSQLDB, сталкивались с ситуацией, когда тесты проходят, а production не работает (boolean, group by и другие чудеса).


Сейчас я работаю в основном с PostgreSQL и мигрирую наши микросервисы с 10-й версии на 11-ую. В процессе миграции (и разработки вообще) я столкнулся с несколькими нюансами, о которых хотелось бы рассказать.

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

Rust для Java разработчиков

Время на прочтение15 мин
Количество просмотров16K

Представляю перевод статьи автора Evan Cameron, которая может помочь Java разработчикам лучше понять отличия и схожесть этих двух языков — оригинал на сайте автора. Не считая себя достаточно опытным Rust разработчиком, я вряд ли смогу аргументированно участвовать в возможных дискуссиях.

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

Строим pipeline для доставки Graal Native Image конечным пользователям

Время на прочтение7 мин
Количество просмотров1.2K

В данной статье я хочу описать свой опыт по доставке Graal Native Image конечным пользователям Mac OS и Linux в одну команду при помощи Travis CI.


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


Пожалуй начнем.


У меня есть:


  • Java приложение со всеми конфигурациями для сборки native image.

Что хочу получить:


  • Собрать native image при помощи Travis
  • Собрать rpm и deb дистрибутивы, а также архив для mac версии
  • Залить полученные пакеты на Bintray
  • Дать пользователям возможность загрузить приложение через пакетный менеджер
  • Максимально автоматизировать процесс.
Поехали

Сопоставление с образцом в Java: InstanceOf (JEP 305)

Время на прочтение4 мин
Количество просмотров4.2K
Сопоставление с образцом (Pattern Matching) — новая превью функция в Java 14.


instanceof


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


Короче говоря, он проверяет, принадлежит ли данный объект заданному типу. В результате этой проверки он возвращает либо true, либо false.


    if(animal instanceof Cat) {
      // It is a cat! Do something
    } else {
      // It is not a cat, do something else
    }

Этот оператор возвращает true, если ваш объект имеет данный тип или его подтип. В противном случае возвращается false.

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

Spring MVC: создание веб-сайтов и RESTful сервисов

Время на прочтение34 мин
Количество просмотров158K

Вы можете использовать эту статью, чтобы понять, как использовать Spring MVC для создания веб-сайтов или RESTful сервисов. А также получить обзор часто задаваемых вопросов, охватывающих наиболее распространенные задачи Spring MVC.


Примечание: Статья ~ 7500 слов, вероятно, не стоит читать ее на мобильном устройстве. Добавьте ее в закладки и вернитесь позже.


Содержание


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

Беги, муравей. Беги

Время на прочтение16 мин
Количество просмотров18K
В данной статье рассматривается процесс создания имитационной модели поведения муравьиной колонии (можно почитать в википедии ) в среде имитационного моделирования «AnyLogic». Данная статья носит практический характер. В ней будет рассмотрен вопрос применения муравьиного алгоритма для решения задачи о коммивояжёре (Почитать можно тут).



Кратко о сути


Суть задачи коммивояжере заключается в том, что коммивояжер (продавец) должен посетить N городов побывав в каждом из них только один раз по наикратчайшему маршруту. Так как данная задача является NP-сложной и количество вариантов всех возможных маршрутов между N городами вычисляется как «N!», то время поиска кратчайшего маршрута будет увеличиваться по экспоненциальному закону с увеличением значения N. Соответственно время поиска кратчайшего маршрута(решения) с использованием алгоритма «полного перебора» (который дает точное решение) при количестве городов N>16 резко увеличивается (носит экспоненциальный характер). Поэтому мы будем искать не самый короткий по протяженности маршрут, а близкий к нему (рациональный) за конечное время с помощью «муравьиного алгоритма».
Читать дальше →

Онлайн-встреча JUG.ru «Spring-построитель» с Евгением Борисовым

Время на прочтение1 мин
Количество просмотров3.6K
11 мая в 17:00 состоится онлайн-встреча «Spring-построитель» с экспертом по Spring Евгением Борисовым, который начал писать на Java еще в 2001 году и сейчас проводит тренинги по всему миру. Он расскажет, как перестать потрошить Spring и создать его самому.



Под катом — все детали и ссылка на регистрацию.
Читать дальше →

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

Простая интеграция RabbitMQ и Spring Boot

Время на прочтение6 мин
Количество просмотров23K
Перевод статьи был подготовлен в преддверии старта курса «Разработчик на Spring Framework».




Всем привет!

Я хотел бы поделиться с вами библиотекой с открытым исходным кодом, которая облегчает интеграцию RabbitMQ с приложениями на Spring Boot. Кроме того, эта библиотека предлагает новую, улучшенную концепцию повторов неудачных операций (по сравнению со стандартным подходом Spring AMQP).
Упрощает? Но как?

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

WebRTC на Android: как включить аппаратное кодирование на множестве устройств

Время на прочтение7 мин
Количество просмотров16K
Для видеозвонков в Badoo мы используем стандарт WebRTC и кодек H.264. Если верить документации, этот кодек должен без проблем работать на любых устройствах Android начиная с Android 5.0. Но на практике всё оказалось не совсем так. В этой статье я расскажу про особенности реализации аппаратного кодирования для кодека H.264 в WebRTC и о том, как заставить его работать на большем количестве устройств.


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

Иерархическое логирование приложения в Базу Данных

Время на прочтение10 мин
Количество просмотров7.2K

Всем, привет!


В статье я хотел бы рассказать об одном из подходов к логированию приложения, который сильно помогал мне и коллегам при отладке, поиске ошибок и анализе проблем производительности. Про необходимость логирования было написано множество хороших статей в том числе и на Хабре, поэтому здесь нет большого смысла повторяться. Я начинал карьеру в IT с Oracle и изучал эту БД по книгам главного эксперта — Тома Кайта. Мне запомнилась его фраза по поводу логирования из книги "Effective Oracle by Design":

Instrumentation is not overhead. Overhead is something you can remove without losing much benefit. Removing (or not having) instrumentation takes away considerable functionality. You wouldn’t need to do this if your systems never break, never need diagnostics, and never suffer from performance issues. If that is true, you don’t need to instrument your system (and send me your email address, because I have a job offer for you).


С работой над Oracle проектами всё и началось.

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

Руководство по возможностям Java версий 8-14

Время на прочтение13 мин
Количество просмотров26K

Здесь есть все, что вам нужно знать о различных версиях и функциях Java.



Java 8, Java 11, Java 13, Java 14 — какая разница?


Вы можете использовать это руководство, чтобы получить практическую информацию о том, как найти и установить последнюю версию Java, понять различия между дистрибутивами Java (AdoptOpenJdk, OpenJDK, OracleJDK и т.д.), А также получить обзор возможностей языка Java, включая версии Java 8-14.


Примечание переводчика
17 февраля был опубликован перевод Руководство по версиям и возможностям Java
В комментарии к нему Julegg написал
Там у Марко уже описание java-14 добавилось. Будет ли тут перевод добавлен?

Вашему вниманию предлагается обновленная версия руководства от 09 апреля 2020 г.
Читать дальше →

Пара слов про R2DBC и PostgreSQL

Время на прочтение4 мин
Количество просмотров34K
В последнее время я опять вижу, что усилился хайп вокруг реактивного программирования в общем, и реактивной работе с Базами данных — в частности. У меня есть пара фраз, которые я бы хотел сказать по этому поводу.

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

Генерация предсказуемых случайных последовательностей: другой подход к пермутациям

Время на прочтение5 мин
Количество просмотров2.5K

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


Задача довольно простая и решили её у нас быстро. А решение было следующим: У нас есть n вопросов. Из комбинаторики мы знаем, что если у нас есть n > 1 элементов, мы, переставляя элементы местами, можем получить разные последовательности этих элементов, где максимальное число отличающихся последовательностей равно $n!$. Вот и было решено, пишем значит функцию, посчитаем там факториал, сгенерируем n-ную последовательность, а само число n сгенерируем рандомно и запишем в БД. Хренак-хренак и в продакшен отправляем тестерам. И вроде бы все нормально, но ведь не случись что-то непредвиденное, этой статьи бы не было.

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

Java-дайджест за 4 мая

Время на прочтение4 мин
Количество просмотров5.3K


  • Вышла совершенно новая библиотека Enriched Beans — генератор исходников, совместимый с JSR 330: Dependency Injection for Java. Конкретно, генерит он фабрики, совместимые с фреймворками вроде Spring и Micronaut. Работает примерно как AutoFactory, может использоваться вместе с Lombok. В смысле, если в Guice вам нужно писать конструктор руками, то тут можно подцепить то, что сгенерил Lombok. Получаются простые POJO, каждое генерируемое поведение можно менять/подменять/оборачивать как хочешь, нормально работает автодополнение в IDE, код более-менее ООП-шный. Если перечисленные аббревиатуры ничего не говорят — проходите мимо :) Из минусов — 1 контрибьютор, 18 коммитов, насколько хорошо это работает — никому не ведомо.
Читать дальше →

Вклад авторов