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

Java *

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

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

Home видео для Selenium aka WebDriver. Или чем записать экран, если у вас есть java, поломанные тесты и немного времени

Время на прочтение4 мин
Количество просмотров5.6K
Решили мы на работе автоматизировать тесты для нескольких своих веб приложений. И кроме информации, когда упали тесты, захотелось еще и увидеть, как выглядела страница на этот печальный момент.

Я уже давно не брал в руки шашки и Selenium, поэтому пришлось немного покопаться в интернете и поискать — что в этой ситуации делают умные люди. Решение, которое меня устроило в итоге, собрало несколько технологий: Java + Selenium + Junit + Allure + ffmpeg + VideoRecorder (by Pirogov). Но поскольку я все таки честно копался, пытаясь найти лучшее решение проблемы, то нашлось еще несколько альтернативных моему и более простых способов — как можно сделать слепок экрана.

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

Давайте посмотрим, что нам предлагают сделать.
Читать дальше →

Скринкаст: простейший плагин для IntelliJ IDEA

Время на прочтение1 мин
Количество просмотров5K
Многие боятся писать плагины для IDE потому, что кто-то их напугал, что это безумно сложно. Это не совсем так: простые плагины для бытовых нужд писать вполне возможно.

Давайте сделаем простейший плагин, который при нажатии на Ctrl+T весь текст, выделенный в редакторе, отправляет прямиком в Twitter. Потом каждый его сможет заточить для собственных нужд.

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

Big Data Tools EAP 10: SSH-туннели, фильтрация приложений, пользовательские модули и многое другое

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

Только что вышла очередная версия плагина Big Data Tools — плагина для IntelliJ IDEA Ultimate, DataGrip и PyCharm, который обеспечивает интеграцию с Hadoop и Spark, позволяет редактировать и запускать интерактивные блокноты в Zeppelin.


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


  • соединяться с Hadoop и Spark теперь можно через SSH-туннели, создающиеся парой щелчков мыши;
  • мониторинг Hadoop может ограничивать объем данных, загружаемых при просмотре списка приложений.

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

Разработка базы данных медиаплеера для организации музыки типа iTunes

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

Описание предметной области


Предметной областью является медиаплеер, аналог iTunes. Основными сущностями в данной базе данных выступает пользователь и сборник композиций.

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

Проверка кода XMage и почему недоступны специальные редкие карточки для коллекции Dragon's Maze

Время на прочтение13 мин
Количество просмотров2.5K
image1.png

XMage — клиент-серверное приложение для игры в Magic: The Gathering (MTG). XMage начал развиваться еще в начале 2010 года. За это время было выпущено 182 релиза, набралась целая армия контрибьюторов, и проект до сих пор активно развивается. Отличный повод поучаствовать и нам в его развитии! Поэтому сегодня единорог из PVS-Studio проверит кодовую базу XMage, и кто знает, может и схлестнется с кем-нибудь в бою.
Читать дальше →

Пишем чат с использованием Spring Boot и WebSockets

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


Всем привет. В преддверии старта курса «Разработчик на Spring Framework» мы подготовили для вас еще один полезный перевод. Но, прежде чем перейти к статье, хотим поделиться с вами бесплатной записью урока от наших преподавателей по теме: «Рефакторинг кода приложений на Spring», а также предлагаем посмотреть запись вебинара из которого вы сможете подробно узнать о программе курса и формате обучения.

А теперь перейдем к статье



В статье Building Scalable Facebook-like Notification using Server-Sent Event and Redis для отправки сообщений от сервера клиенту мы использовали Server-sent Events. Также там было упомянуто о WebSocket — технологии двунаправленной связи между сервером и клиентом.

В этой статье мы посмотрим на один из распространенных примеров использования WebSocket. Мы напишем приложение для обмена приватными сообщениями.

Ниже на видео продемонстрировано то, что мы собираемся сделать.

Spring. Кастомная аутентификация с применением JWT

Время на прочтение18 мин
Количество просмотров11K
В данной статье я хотел бы поделиться, на мой взгляд, удачным опытом написания своего велосипеда для аутентификации пользователя в REST API с использованием JWT.
Это не замена Spring Security, но этот способ хорошо себя показывает в продакшене на протяжении вот уже более двух лет.

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


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

Очередь отложенных событий delayedQueue

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

Пару лет назад в одном из проектов мы столкнулись с необходимостью откладывать выполнение некоего действия на определенный промежуток времени. Например, узнать статус платежа через три часа или повторно отправить уведомление через 45 минут. Однако на тот момент мы не нашли подходящих библиотек, способных "откладывать" и не требующих дополнительного времени на настройку и эксплуатацию. Мы проанализировали возможные варианты и написали собственную маленькую библиотеку delayed queue на Java с использованием Redis в роли хранилища. В этой статье я расскажу про возможности библиотеки, ее альтернативы и те "грабли", на которые мы наткнулись в процессе.

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

Что нового в Spring Data (Klara Dan von) Neumann

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

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





Spring Data Neumann — это первый релиз, после перехода на новый шестимесячный релизный цикл. Сокращение сроков между релизами позволит нам чаще выпускать новые фичи, а это, в свою очередь, ускорит и вас. В этом релизе, помимо нового функционала, есть также важные изменения, потенциально ломающие совместимость с предыдущими версиями.

Изменение мажорных версий


Для проектов, указанных ниже, увеличен номер мажорной версии из-за изменений, ломающих совместимость в публичных API или драйверах:

  • Spring Data JDBC 2.0 (предыдущая версия 1.1)
  • Миграция с 1.1 на 2.0 описана в этом посте.
  • Spring Data MongoDB 3.0 (предыдущая версия 2.2)
  • Spring Data для Apache Cassandra 3.0 (предыдущая версия 2.2)
  • Spring Data Couchbase 4.0 (предыдущая версия 3.2)
  • Spring Data Elasticsearch 4.0 (предыдущая версия 3.2)
  • Подробнее об изменениях см. этом посте.

Перед тем как перейти к описанию новой функциональности, давайте посмотрим на изменения в API. Подробнее об этом смотрите в разделах по обновлению (“Upgrading”) в документации соответствующих модулей.

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

«Наша школа — это больше, чем просто источник кадров»: интервью с основателями Java School

Время на прочтение6 мин
Количество просмотров5.5K
Один из вечных вопросов, которыми задаются руководители в IT-компаниях — брать на работу готовых экспертов или «выращивать» своих?

Андрей Булов и Даниил Шульгин растят разработчиков уже 9 лет — в Java School, которую они основали. О том, есть ли правильный ответ на этот философский вопрос, зачем офлайн учить людей джаве в эпоху доступного интернет-образования и как создавалась Java School, читайте под катом. 




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

Почему здравый смысл важнее паттернов, а Active Record не так уж и плох

Время на прочтение6 мин
Количество просмотров27K
Так уж вышло, что разработчики, особенно молодые, любят паттерны, любят спорить о том, какой паттерн нужно применять здесь или там. Спорить до хрипоты: это фасад или прокси, а может даже синглтон. А если у вас не чистая, гексагональная архитектура, то некоторые разработчики готовы сжечь на костре Святой Инквизиции.

При этом они забывают, что паттерны — это лишь возможные решения. У паттернов, также как и у любых принципов, есть границы применимости, и важно их понимать. Дорога в ад вымощена слепым и религиозным следованием пусть даже и авторитетным словам.

А наличие во фреймворке нужных паттернов никак не гарантирует их правильного и осознанного применения.


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

Организовываем взаимодействие между ПК и ЦАП/АЦП при помощи ПЛИС

Время на прочтение22 мин
Количество просмотров15K
В современном цифровом мире необходимость ЦАП/АЦП (цифро-аналоговых преобразователей/аналого-цифровых преобразователей) не подвергается сомнению: они используются для обработки сигналов разнообразных датчиков, в звуковой аппаратуре, ТВ-тюнерах, платах видеовхода, видеокамерах и т.д.

Однако использование или отладка ЦАП/АЦП могут быть затруднены поставленными производителем аппаратуры ограничениями, например, на используемое ПО или на способы управления устройством. Это наводит на мысль о проектировании собственной модели взаимодействия.

В этой статье мы рассмотрим возможность организации взаимодействия между ПК и ЦАП/АЦП при помощи ПЛИС.


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

Билдеры или конструкторы? Рассуждаем вслух

Время на прочтение2 мин
Количество просмотров9K
Всем привет! Хочу порассуждать над целесообразностью использования билдеров для несложных объектов.

Для упрощения буду использовать аннотации lombok'a:

@Value
@Builder

Недолго погуглив, получаем, что builder Отделяет конструирование сложного объекта от его представления так, что в результате одного и того же процесса конструирования могут получаться разные представления. Только ли для сложных объектов?

Рассмотрим на простом примере:

@Value
public class Info {
    @Nullable String uuid;
    @Nullable String email;
    @Nullable String phone;
}

Довольно-таки простой класс. На деле получаем иммутабельный объект, который инициализируется через конструктор.

Но, как мы видим, все поля nullable, и создание такие объектов будет выглядеть не очень красиво:

        final Info info1 = new Info(null, "email@email.com", "79998888888");
        final Info info2 = new Info("3d107928-d225-11ea-87d0-0242ac130003", null, null);
        final Info info3 = new Info("3d107928-d225-11ea-87d0-0242ac130003 ", "email@email.com", null);
...

Безусловно, есть варианты:

  1. Объекты, где немного полей разных типов, можно завезти несколько конструкторов. Но это не решает проблему класса выше.
  2. Использовать setter'ы — субьективно, нагромождает код.

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

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

Как получить все возможные комбинации элементов группы массивов

Время на прочтение4 мин
Количество просмотров14K
Знаю что эту задачу многие гуглят, т.к. сам недавно столкнулся с этим. Поскольку рабочего решения я так и не нашел, пришлось придумать свое.

Итак, вводные данные. Имеем группу массивов, например:

models = [ "audi", "bmw", "toyota", "vw" ];
colors = [ "red", "green", "blue", "yellow", "pink" ];
engines = [ "diesel", "gasoline", "hybrid" ];
transmissions = [ "manual", "auto", "robot" ];

Теперь представим, что нам надо собрать набор ассоциативных массивов (map) примерно такого вида:

variant1 = { "model": "audi", "color": "red", "engine": "diesel", "transmission": "manual" }
variant2 = { "model": "audi", "color": "red", "engine": "diesel", "transmission": "auto" }
variant3 = { "model": "audi", "color": "red", "engine": "diesel", "transmission": "robot" }
variant4 = { "model": "audi", "color": "red", "engine": "gasoline", "transmission": "manual" }
…
variantN = { "model": "vw", "color": "pink", "engine": "hybrid", "transmission": "robot" }
Читать дальше →

JNI и Delphi. Использование Java методов при помощи JNI

Время на прочтение3 мин
Количество просмотров3.4K
Всем доброго времени суток!

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

Допустим у нас есть некое Java приложение на котором есть простая кнопка и при нажатии на эту кнопку будет исполняться некий код.
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        File MyFile = new File("D:\\Sample\\text.txt");
        MyFile.delete();
    }                        


Как мы видим в событии клика на кнопку будет исполняться просто код для удаления файла.
На Java все выглядит ясно и просто, но как же это будет выглядеть на Delphi с использованием JNI. На самом деле все проще чем кажется.
Для этого нам нужно разобрать заглянуть и в класс File, который находится по адресу java.io.File. Из этого класса нам нужно:
Читать дальше →

Знакомство с Vuecket

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


English Version
Vuecket — веб-фреймворк, интегрирующий VueJS с клиентской стороны и Apache Wicket с серверной. Он берет все самое лучшее от обоих и позволяет разрабатывать full-stack приложения еще быстрее и проще. Конечно, это всё громкие слова, ведь Vuecket'у на данный момент (Август 2020) меньше месяца, и он не прошел ещё крещение «огнем и кровью» продакшн серверов. Но он уже включил в себя всё самое лучшее из наработанного нами при разработке нашего ключевого Open Source продукта Orienteer(платформа для быстрой разработки бизнес приложений). И именно из-за молодого возраста Vuecket'у нужна ваша помощь: поделитесь, пожалуйста, тем, что вам понравилось, что не очень, где нужна доработка и т.д.

Основные принципы, которыми мы руководствуемся при построении Vuecket'а:

  1. Быть декларативным — не императивным. Vuecket не диктует какие-то специальные требования к коду. Он может быть приложен достаточно быстро и легко к уже существующим Vue.JS или Apache Wicket проектам.
  2. Следовать принципу Парето. Vuecket должен обеспечивать 80% нужного функционала из коробки, но для оставшихся 20% должны быть хорошие и удобные точки расширения.

Легко заметить, что эти принципы также применимы и к Vue.JS, и к Apache Wicket.

Итак, как именно мы будем знакомиться с Vuecket? Предлагаю сделать чат/гостевую доску с поддержкой Markdown. Не буду сильно томить: законченное приложение здесь, а код здесь.
Читать дальше →

Ах, эти строки

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

Это текстовая версия моего доклада "Ах, эти строки" на конференции JPoint-2020.
Дабы не тратить время читателей зря, сразу расставим все точки над "ё".


О чём статья?


Статья об эффективном (или не очень) использовании строк.


Для кого статья?


Статья для разработчиков, занимающихся производительностью, и им сочувствующих.


Откуда всё это?


Что-то выловлено в коде проекта, что-то — во фреймворках и библиотеках.

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

В диких условиях. Итоги проектов Школы программистов в эпоху самоизоляции

Время на прочтение6 мин
Количество просмотров2.1K
За четыре месяца занятий были прочитаны 54 лекции на двух потоках бекэнд и фронтенд, проведены несколько крутых практикумов с live-coding’ом. Проверены сотни заданий, на все вопросы получены две сотни ответов. Тут пришел 2020 год и сразу после того как мы сняли с елок гирлянды, всем нам самим пришлось нарядиться в маски и надеть перчатки. А теперь по порядку:



Десятая Школа Программистов hh.ru стала особенной. Юбилей, огромное количество планов, неиссякаемый поток учеников, неугасающая мотивация наших преподавателей и организаторов. Мы приложили максимум усилий, чтобы этот выпуск стал образцовым.
Читать дальше →

Кому рецепты для электронной коммерции? Для SAP Commerce и не только

Время на прочтение16 мин
Количество просмотров6.1K
Моё хобби ― автоматизация онлайн-ритейла. Уже много лет даже в свои выходные я не вылезаю из этого «болота». Да, наверное, это звучит дико и даже смешно. Как можно увлекаться таким скучным делом? — скажут одни. Что там увлекаться, это просто какая-то частная тема для уважающего себя архитектора ПО! — скажут другие.

Действительно, на первый взгляд, это, как говорится, недиссертабельная тема. Фактически, это сборная солянка из разных тем, тем или иным образом притащенных в e-commerce. И в итоге оказалась ровно тем, что я люблю: интеграция технологий.

И вот с 2016 я веду техноблог, hybrismart.com. Такая «хабра» в миниатюре, только на английском и с фокусом на близкую мне тему — разработку на SAP Commerce. У нас тут сформировалась небольшая компания из нескольких десятков тысяч авторов, но в блог пока что пишет только часть из них. Ну, хорошо, пишут пока немногие. Десяток. Но мы стараемся. В блоге уже накопилось под две сотни статей, преимущественно больших и очень больших на самые разные темы, тем или иным боком относящиеся к ecom. В существенной части это всё-таки персональный блог, поэтому отдуваюсь тут я, а не наша пиар-служба. Но это от души, правда.

Как легко догадаться из названия, hybrismart — про хайбрис (что это такое?). И почти все, кто его находит, знают о хайбрисе не понаслышке. Ну и наоборот: наверное, каждый разработчик на hybris хотя бы раз в блог заходил (конечно, не по доброй воли, нам гугл помогает!). Теперь вот и вы зашли. И чтобы вы там не потерялись, хочу провести небольшую экскурсию. Задавайте, пожалуйста, вопросы в самом конце.

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

Анатомия backpressure в реактивных потоках

Время на прочтение7 мин
Количество просмотров16K
Читая многочисленные статьи по теме реактивных потоков, читатель может прийти к выводу, что:

  • backpressure это круто
  • backpressure доступно только в библиотеках, реализующих спецификацию reactive streams
  • эта спецификация настолько сложна, что не стоит и пытаться ее реализовать самому

В этой статье я попытаюсь показать, что:

  • backpressure — это очень просто
  • для реализации асинхронного backpressure достаточно сделать асинхронный вариант семафора
  • при наличии реализации асинхронного семафора, интерфейс org.reactivestreams.Publisher реализуется в несколько десятков строк кода
Читать дальше →

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