Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam

Пикабу Игры +1000 бесплатных онлайн игр

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

Пинбол Пикабу

Аркады, На ловкость, Казуальные

Играть
Постройте дом своей мечты прямо сейчас! Соединяйте три предмета в один ряд, зарабатывайте звезды и покупайте красивые детали интерьера. Звучит заманчиво? Увлекательная головоломка в жанре «три в ряд» заставит размяться ваш мозг. Присоединяйтесь к онлайн-игре бесплатно прямо сейчас!

Строить дом - три в ряд

Три в ряд, Казуальные, Детские

Играть

Отель Эмили. Пасьянс

Карточные, Казуальные, Головоломки

Играть
“Рецепт Счастья” — увлекательная игра в жанре «соедини предметы»! Помогите Эмили раскрыть тайны пропавшего родственника, найти сокровища и восстановить её любимое кафе.

Рецепт Счастья

Казуальные, Головоломки, Новеллы

Играть
Динамичный карточный батлер с PVE и PVP-боями онлайн! Собери коллекцию карточных героев, построй свою боевую колоду и вступай в бой с другими игроками.

Cards out!

Карточные, Ролевые, Стратегии

Играть

Топ прошлой недели

  • Oskanov Oskanov 8 постов
  • alekseyJHL alekseyJHL 6 постов
  • XpyMy XpyMy 1 пост
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Docker

С этим тегом используют

IT Программирование Linux IT юмор Все
75 постов сначала свежее
14
lexa500
lexa500
1 год назад
Home Assistant

Получаем погоду в Home Assistant c WS2032 с помощью rtl_433⁠⁠

Алоха, красноглазые! в этом посте я расскажу, как затащить данные с погодной станции на WS2032 в Home Assistant. данная статья не для новичков, подразумевается, что вы немного знакомы с linux (делать будем на нем) ну и docker надо, куда ж без него

Получаем погоду в Home Assistant c WS2032 с помощью rtl_433 Home Assistant, Погода, Длиннопост, Linux, Docker, 433mhz

а вот и эта продукция сумрачного китайского гения WS2302

История такова, что мне подарили эту погодную станцию и я ее в загородном доме долго использовал, но у нее только экран с цифрами есть, а как объединить ее и HA - понятных инструкций не было. ну поковыряв интернеты пару вечеров, я придумал как сделать. Вообще данный способ подходит для кучи устройств которые разговаривают по открытому протоколу на частоте 433 мгц, rtl_433 поддерживает дофига всякого

TL;DR

связка работает так - ws2032>usb radio >утилита rtl_433> очередь mqtt> home assistant

Погнали:

  1. покупаем на али погодную станцию на базе WS2032 их там довольно много, и вроде как они самые недорогие, есть варианты с со сбором воды и просто ветер и температура, так же потребуется usb радиоприемник типа soap-sdr (их великое множество, все немного качеством различаются я брал на RTL2838 DVB-T, самые дешманские работают не очень) и usb хаб с питанием.

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

    1. для работы rtl_433 потребуется конфиг файл, в нем очень важный момент - нужно будет указать окно девиаций частоты, поскольку станция дешманская и частота передатчика довольно заметно плавает, у меня заработало стабильно вот с таким конфигом (/etc/rtl_433/rtl_433.conf)

      device 0

      gain 0

      # default is "433.92M", other resonable values are 315M, 345M, 915M and 868M

      frequency 433.69M

      frequency 433.72M

      frequency 433.752M

      # default is "600" seconds, only used when multiple frequencies are given

      hop_interval 10

      ppm_error 0

      sample_rate 250k

      samples_to_read 0

      analyze_pulses false

      report_meta level

      report_meta stats

      report_meta time:usec

      report_meta protocol

      signal_grabber none

      output json

      convert si

      stop_after_successful_events false

      protocol 145 # WS2032 weather station

  3. запустить проверить можно вот таким способом

    /usr/bin/rtl_433 -F mqtt://127.0.0.1 1883 retain 1 events rtl_433/rtlsdr/event/21770 states rtl_433/rtlsdr/state/21770 -c /etc/rtl_433/rtl_433.conf

    в ответ должно получиться что то такое

Получаем погоду в Home Assistant c WS2032 с помощью rtl_433 Home Assistant, Погода, Длиннопост, Linux, Docker, 433mhz

как видно из выхлопа - приемник уcлышал погодную станцию, она передает раз в минуту и вывод в формате json

rlt_433 и контейнер с mqtt в моем случае на 1 хосте живут

4. далее нам нужен сервер очередей mqtt - проще всего использовать docker compose

вот их репозиторий со всей нужной обвязкой

services:

mosquitto:

image: eclipse-mosquitto:latest

restart: unless-stopped

volumes:

- ./config/:/mosquitto/config/:rw

- ./log/:/mosquitto/log/

- ./data:/mosquitto/data/

ports:

- 1883:1883

- 9001:9001

запускаем композ и смотрим что он начал слушать на порту 1883, рядом в соседнем терминале запускаем rtl_433 (потом можно будет написать systemd unit) - проверить что в mqtt что то пишется нам поможет утилита mqtt explorer - цепляемся к нашей очереди и смотрим события в ней

Получаем погоду в Home Assistant c WS2032 с помощью rtl_433 Home Assistant, Погода, Длиннопост, Linux, Docker, 433mhz

тут видно что используется 2 очереди event и state (остальные очереди в моем случае всякое остальное типа zigbee устройств) в очереди event можно понаблюдать как меняются данные,

5. раз данные обновляются стабильно, можно переходить к настройке Home Assistant - нам потребуется плагин для mqtt и немного допилить конфиг для того что бы направление ветра показывало не в градусах а в виде букв (N,S,W,E и тд)

сам плагин настраиваем что бы он слушал нашу очередь

Получаем погоду в Home Assistant c WS2032 с помощью rtl_433 Home Assistant, Погода, Длиннопост, Linux, Docker, 433mhz

тут надо указать ип адрес машины с mqtt

и указываем топик откуда получать данные

Получаем погоду в Home Assistant c WS2032 с помощью rtl_433 Home Assistant, Погода, Длиннопост, Linux, Docker, 433mhz

а тут надо указать топик который будем слушать

далее настраиваем configuration.yaml от HA (не забываем рестатануть HA и внимательно следим за идетнацией ямла - блоки sensor ws2032_extras и mqtt должны вроде как быть без отступов, но в вашем конфиге может быть иначе)

mqtt:

sensor:

- name: "village_outside_temp"

state_topic: "rtl_433/rtlsdr/event/21770"

unit_of_measurement: "°C"

value_template: "{{ value_json.temperature_C }}"

unique_id: village_outside_temp_id

- name: "village_outside_humidity"

state_topic: "rtl_433/rtlsdr/event/21770"

unit_of_measurement: "%"

value_template: "{{ value_json.humidity }}"

unique_id: village_outside_humidity_id

- name: "village_outside_wind_direction"

state_topic: "rtl_433/rtlsdr/event/21770"

unit_of_measurement: "deg"

value_template: "{{ value_json.wind_dir_deg }}"

unique_id: village_outside_wind_dir_deg

- name: "village_outside_wind_avg_spd"

state_topic: "rtl_433/rtlsdr/event/21770"

unit_of_measurement: "km/h"

value_template: "{{ value_json.wind_avg_km_h }}"

unique_id: village_outside_wind_avg_spd

- name: "village_outside_wind_max_spd"

state_topic: "rtl_433/rtlsdr/event/21770"

unit_of_measurement: "km/h"

value_template: "{{ value_json.wind_max_km_h }}"

unique_id: village_outside_wind_max_spd

- name: "village_outside_battery_ok"

state_topic: "rtl_433/rtlsdr/event/21770"

unit_of_measurement: "state"

value_template: "{{ value_json.battery_ok }}"

unique_id: village_outside_battery_ok

sensor ws2032_extras:

- platform: template

sensors:

ws2032_wdc:

unique_id: ws2032_wdc

friendly_name: "Wind: Direction (Cardinal)"

icon_template: mdi:weather-cloudy-arrow-right

value_template: >

{% set direction = ['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','NW','NNW','N'] %}

{% set degree = states('sensor.village_outside_wind_direction')|float %}

{{ direction[((degree+11.25)/22.5)|int] }}

ws2032_ws_kmh:

unique_id: ws2032_ws_kmh

friendly_name: "Wind: Speed (km/h)"

icon_template: mdi:windsock

device_class: wind_speed

unit_of_measurement: "km/h"

value_template: "{{ states('sensor.village_outside_wind_avg_spd')}}"

ws2032_gs_kmh:

unique_id: ws2032_gs_kmh

friendly_name: "Wind: Gust Speed (km/h)"

icon_template: mdi:pinwheel-outline

device_class: wind_speed

unit_of_measurement: "km/h"

value_template: "{{ states('sensor.village_outside_wind_max_spd') }}"

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

Получаем погоду в Home Assistant c WS2032 с помощью rtl_433 Home Assistant, Погода, Длиннопост, Linux, Docker, 433mhz
Получаем погоду в Home Assistant c WS2032 с помощью rtl_433 Home Assistant, Погода, Длиннопост, Linux, Docker, 433mhz
Получаем погоду в Home Assistant c WS2032 с помощью rtl_433 Home Assistant, Погода, Длиннопост, Linux, Docker, 433mhz

Все, осталось только накинуть системд юнит в /etc/systemd/system/rtl_433.service примерно такой

[Unit]

Description=RTL_433 service script

StartLimitIntervalSec=5

Documentation=https://github.com/merbanan/rtl_433/README.md

After=syslog.target network.target

[Service]

Type=exec

ExecStart=/usr/bin/rtl_433 -F 'mqtt://127.0.0.1:1883,retain=1,events=rtl_433/rtlsdr/event/21770,states=rtl_433/rtlsdr/state/21770' -c /etc/rtl_433/rtl_433.conf

# Restart script if stopped

Restart=always

# Wait 30s before restart

RestartSec=30s

# Tag things in the log

# View with: sudo journalctl -f -u rtl_433 -o cat

SyslogIdentifier=rtl_433

StandardOutput=syslog

StandardError=syslog

[Install]

WantedBy=multi-user.target

не забываем сделать релоад системд и сказать нашему юниту enable ну и ребутнуть разок что бы проверить что все это хозяйство переживает рестарт

ВСЕ, ПОБЕДА!

Данный способ ни на что не претендует, но возможно, этот путь кому-либо пригодится, поскольку позволяет дальше домашнюю автоматизацию развивать - например, многие почвенные датчики для садоводов точно так же общаются на 433 и их точно также можно загнать в HA и настроить автоматический полив ну и прочее такое. Этот гайд подойдет далеко не всем, но поскольку у меня очень давно поставлен HA (помните эту проблему про разные регионы для устройств от Xiaomi?) то хотелось использовать именно его. Всем спасибо и удачных данных из радиоэфира!

Показать полностью 8
Home Assistant Погода Длиннопост Linux Docker 433mhz
5
12
Wowovideo
Wowovideo
1 год назад
ITmozg

Шпаргалка по командам Docker⁠⁠

в формате pdf тут https://t.me/itmozg/9689

Шпаргалка по командам Docker IT, Программист, Docker, Программирование, Шпаргалка, Telegram (ссылка)
Показать полностью 1
IT Программист Docker Программирование Шпаргалка Telegram (ссылка)
1
5
f.lattys
f.lattys
1 год назад

Docker на практике⁠⁠

Docker на практике Программирование, IT, Книги, Python, Обучение, Docker, Telegram (ссылка)

Авторы: Иан Милл, Эйдан Хобсон Сейерс

Год: 2020

Количество страниц: 516

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

Следуя формату «проблема/решение» в стиле поваренной книги, вы изучите реальные варианты использования Docker и узнаете, как применить их к собственным проектам.

Скачать книгу

Показать полностью 1
Программирование IT Книги Python Обучение Docker Telegram (ссылка)
1
42
raidshadowlegend
raidshadowlegend
1 год назад
Лига Сисадминов

Проверка скорости вашей локальной сети с помощью OpenSpeedTest⁠⁠

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

Ок. А что насчёт тестов скорости в локальной сети? Ну, в принципе у нас вроде как есть iperf. Но может еще что-то менее кондовое?
Что-то еще есть. Это как раз https://github.com/openspeedtest/Speed-Test.

OpenSpeedTest - open source решение, предоставляющее возможность оценки производительности сети, и не требующее установки каких-либо агентов или плагинов на стороне клиента. После установки доступ к инструменту можно получить из любого современного браузера. Удобней всего развернуть docker-контейнер с OpenSpeedTest из готового образа (nginx+alpine).
Запустить OpenSpeedTest можно как с готовым, и автоматически обновляемым LetsEncrypt SSL сертификатом, так и без него. В статье мы рассмотрим оба варианта.

Проверка скорости вашей локальной сети с помощью OpenSpeedTest Linux, IT, Docker, Контейнер, Сисадмин, Локальная сеть, Длиннопост, Гифка

Для запуска приложения нам понадобится только какая-нибудь машина с Linux, где мы сможем запускать контейнеры. В статье все действия будут проводиться на виртуалке с Ubuntu 22.04. Для других ОС отличие будет в основном только в методе установки Docker.

Установка Docker

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

Итак. Для начала позаботимся о скачивании и установке GPG ключа:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

После выполнения команды добавим официальный репозиторий Docker:

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Установим нужные зависимости:

sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release -y

Перед установкой Docker на всякий случай обновим систему:

sudo apt-get update

Ну и поставим уже сам Docker CE со всем необходимым:

sudo apt-get install docker-ce docker-ce-cli containerd.io -y

Во избежание запуска Docker с sudo и прочими повышениями привелегий, добавляем пользователя в группу docker:

sudo usermod -aG docker $USER

Для проверки работы нужно перелогиниться в систему, после чего выполнить например:

docker ps

Если всё хорошо, должна показаться примерно такая картина:

CONTAINER ID IMAGE  COMMAND CREATED  STATUS  PORTS

Всё готово. Теперь можно приступить к более интересной части.

Развёртывание OpenSpeedTest

Сначала рассмотрим вариант запуска без LetsEncrypt. Всё, что вам нужно сделать для этого - запустить следующую команду:

docker run --restart=unless-stopped --name openspeedtest -d -p 3000:3000 -p 3001:3001 openspeedtest/latest

Запуск контейнера может занять некоторое время (вполне может повисеть пару минут). После того как контейнер запустится, откройте браузер и введите http://SERVER:3000, где SERVER - IP адрес сервера на котором размещён контейнер с OpenSpeedTest. После открытия веб-интерфейса приложения вам достаточно нажать кнопку Start, чтобы запустить проверку:

Проверка скорости вашей локальной сети с помощью OpenSpeedTest Linux, IT, Docker, Контейнер, Сисадмин, Локальная сеть, Длиннопост, Гифка

Никто не мешает так же подключаться к нему и по https, для этого в адресной строке браузера нужно будет ввести https://SERVER:3001.

Запуск с LetsEncrypt

Если вы предпочитаете разворачивать контейнеры с поддержкой LetsEncrypt SSL, вам нужно соблюсти несколько условий:

  • иметь белый IP

  • доменное имя, которое преобразуется в IP-адрес хост-сервера

  • почта

Если всё в наличие, то запуск контейнера с поддержкой LetsEncrypt SSL можно произвести следующей командой:

docker run -e ENABLE_LETSENCRYPT=True -e DOMAIN_NAME=yourdomain -e USER_EMAIL=youremail --restart=unless-stopped --name openspeedtest -d -p 80:3000 -p 443:3001 openspeedtest/latest

После удачного запуска контейнера, сервис будет доступен по адресу https://SERVER:443.

Заключение

В целом это все действия, которые потребуется сделать для запуска собственного сервера SpeedTest в своей локальной сети. Штука достаточно удобная и сильно упрощает поиск проблем в перспективе (при их появлении).

Показать полностью 1
Linux IT Docker Контейнер Сисадмин Локальная сеть Длиннопост Гифка
24
2
praksitel
1 год назад
Серия Веб-разработка

Часть 3. Внезапная. А зачем мы всё это делаем?⁠⁠

Продолжение поста Какую задачу будет решать веб-приложение?

Если кому-то что-то непонятно, спрашивайте. И наоборот, если видите, что я несу бред - поправляйте.

Не успели мы написать и строчки кода, как в комментариях возник главный вопрос жизни, Вселенной, разработки и всего такого. И я нифига не шучу, абсолютно каждая программа для своего написания ставит такой вопрос. Если мы пишем некую программу для себя, то типичным ответом будет - мне так захотелось. В конкретно этой серии постов, которую я и писать изначально не собирался, я решил разобрать веб-разработку по шагам на максимально простом примере, но который бы делал что-то реальное и которым можно было бы пользоваться. Поскольку на днях вышел линух 6.7, можно считать это посвящением ему, поскольку Линус тоже начинал свою разработку с целью обмена сообщениями. При разработке ПО же на коммерческой основе этот вопрос будет основным и он точно так же будет возникать в самом начале. В компаниях на него обычно отвечает Архитектор или Тимлид, или кто там решает, а зачем, собственно?

Если более детально, то я увидел некую проблему (затруднённость обмена частными посланиями на пикабу), придумал, как её решить посредством ПО и решил это сделать. Также был вопрос, а почему я собираюсь это делать именно так? В данном случае - потому что, опять же, я так решил. В случае коммерческой разработки любое такое решение нужно будет обосновывать, потому что оно будет стоить от очень больших до гигантских или даже невероятных сумм. Потому что абсолютно любое решение имеет как плюсы, так и минусы. Всё как в любой другой инженерной и прочей системе, и как вообще всегда в жизни.

А, может, можно сделать как-то иначе, лучше? Конечно, можно. Всё всегда можно сделать иначе, особенно в разработке ПО. Но, каждое решение см. абзац выше. Поэтому я пока собираюсь делать по написанному во втором посте алгоритму, поскольку пока никто не предложил, как можно в нём что-то улучшить, существенно что-то не ухудшив. Зато, как было замечено, этот алгоритм является частным случаем другого алгоритма, на базе которого работает 99% обмена данными в нынешних компьютерных системах. Такой вот ещё один внезапный учебный плюс нарисовался :)

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

Показать полностью
[моё] Сайт Проект Веб-разработка Perl Postgresql Docker DNS Разработка Текст
3
praksitel
1 год назад
Серия Веб-разработка

Какую задачу будет решать веб-приложение?⁠⁠

Продолжение поста Пишем и запускаем веб-приложение

Раз есть интерес, начнём!

Если кому-то что-то непонятно, спрашивайте. И наоборот, если видите, что я несу бред - поправляйте.

На пикабу нельзя, ну или я не знаю, как, послать друг другу сообщение так, чтобы его не увидели все. Как это можно было бы сделать? Например, так: один пользователь сообщает другому, в комментах, обычным образом, код, на который нужно отправить сообщение (этап 1). Второй переходит по адресу с этим кодом и оставляет там сообщение (этап 2). А также запоминает второй код, который потом тоже сообщает в комментах первому. Первый снова идёт на этот сервис и, по полученному от второго коду, читает сообщение (этап 3). Что-то типа установки tcp сессии, если кому интересно :)

Зачем нужны эти коды? Первый код будет гарантировать второму пользователю, что сообщение точно будет адресовано первому. А второй код будет позволять первому пользователю выбрать сообщение именно второго. Почему? Потому что, сообщив на этапе 1 общедоступный код, первый пользователь может получить сообщения от кого угодно, ведь сервис предполагается общедоступным. Сервис будет генерировать уникальный второй код при каждом сохранении каждого сообщения, соответственно, получив через комменты второй код, первый пользователь будет точно знать, какое сообщение направлено конкретным юзером пикабу. Тут, конечно, не обязательно пикабу, главное, что можно обменяться общедоступным способом двумя кодами и, посредством их, получить частное сообщение, никому, кроме адресата, уже недоступное.

А откуда будет браться первый код? Его тоже будет генерировать сервис, при регистрации. Т.е., для получения таких сообщений получателю нужно будет зарегистрироваться на этом сервисе. Регистрация будет позволять получателю видеть отправленные только ему сообщения. Отправителю регистрироваться не нужно. Для защиты от спамов и ддосов желательно будет после получения нужного сообщения делать первый код недействительным и, для возможности получения нового сообщения, нужно будет сгенерировать новый код 1 (временный URL).

Итак, что должен будет делать этот веб-сервис:

  1. Регистрировать пользователей-получателей сообщений.

  2. Генерировать им некий код, лучше всего - уникальный временный URL, по которому будет доступно поле ввода сообщения (код 1).

  3. Сохранять полученные сообщения для последующего показа их получателю.

  4. Для отправителя генерировать код сохранённого сообщения (код 2).

  5. Показывать получателю конкретное сообщение по коду 2.

  6. Удалять все эти коды и сообщения по некоторым правилам.

Показать полностью
[моё] Сайт Проект Веб-разработка Perl Postgresql Docker DNS Текст
8
0
praksitel
1 год назад
Серия Веб-разработка

Пишем и запускаем веб-приложение⁠⁠

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

  1. Что такое веб-приложение.

  2. Его создание. Писать буду на Perl + Dancer2.

  3. Создание БД и взаимодействие с ней. PostgreSQL.

  4. Запуск приложения и БД в docker посредством docker-compose.

  5. Запуск приложения на реальном хостинге и организация доступа к нему посредством настройки DNS-записей.

  6. Для желающих - хранение кода приложения в git.

Собственно, если кому-либо это интересно, черканите в комментариях.

[моё] Сайт Проект Веб-разработка Perl Postgresql Docker DNS Текст
6
13
mimokrokodilchik
mimokrokodilchik
1 год назад

Чистим Java код используя SonarQube и PMD⁠⁠

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

В самом начале пути у многих новичков программистов есть много пробелов, даже в базовых вещах. Для выявления таких проблем существует бесплатное решение - SonarQube, которое позволяет довольно быстро обнаруживать множество ошибок и уязвимостей. Здесь мы разберемся, как воспользоваться этим инструментом.

Какие технологии помогают анализировать код на ошибки и уязвимости?

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

  • SonarQube

  • FindBugs

  • PMD

  • SpotBugs

  • Checkstyle

  • Snyk

  • JArchitect

  • Graudit

В данной статье мы рассмотрим SonarQube и PMD.

SonarQube настройка, установка, запуск.

SonarQube - довольно популярное решение, хотя, по моему мнению, изначальные правила проверок лучше немного перенастроить. SonarQube предоставляет бесплатную версию, которая может быть запущена из-под Docker в одну команду. Все, что вам потребуется, это сервер с 2 ГБ оперативной памяти (но чем больше, тем лучше). Как настраивать и арендовать сервер я писал вот тут.

Запускаем Sonar используя Docker.

Запускаем докер одной командой:

docker run -d --name sonarqube -p 9002:9000 -p 9092:9092 sonarqube

Первый логин проходит под admin/admin

После запуска следует подождать примерно пять минут и затем открыть ваш сервер. Первый вход потребует использования имени и пароля admin/admin, после чего система попросит изменить пароль. На данном этапе мы пропустим этот шаг.

Процесс создания проекта и генерации токена.

Существуют разные способы интеграции с SonarQube. Самый простой — интегрировать зависимость в Maven/Gradle вашего проекта и затем выполнить одну команду в командной консоли. Ниже я постараюсь упростить процесс генерации токена и проекта до шести команд:

1/6

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

После выполнения всех 6 шагов у нас есть:

  • Имя проекта pikabu

  • Имя ключа pikabu

  • имя токена

Чтобы Sonar проводил более подробную аналитику, рекомендуется установить плагины. Для этого перейдите в раздел Administration => Marketplace и выберите плагины по вашему желанию:

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

Плагины имеют много общих правил и настроить профиль без пересечений это головная боль.

Настраиваем Maven и добавляем Sonar плагин.

Для настройки мавен проекта достаточно добавить плагин в pom.xml:

<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.9.1.2184</version>
</plugin>

Теперь мы готовы к анализу нашего кода.

Напишем код с наиболее популярными ошибками в Java.

Я приведу далеко не все классические ошибки, но для оценки базовой функциональности этого будет достаточно:

1/4

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

Все настроено. Погнали.

Если в файле pom.xml добавлен Sonar плагин, и имя проекта, ключ и токен готовы, после сборки проекта можно запустить команду для передачи результатов в SonarQube:

mvn sonar:sonar -Dsonar.projectKey=pikabu -Dsonar.projectName=pikabu -Dsonar.host.url=http://IP_СЕРВЕРА:9002 -Dsonar.login=sqp_4d542b25...

Анализируем результаты

После запуска заходим в проект (в моем случае pikabu) и нажимаем Overall Code

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

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

Результаты

  • Обнаружено 6 багов.

  • Покрытие составляет 0% (для более точного анализа покрытия, рекомендуется интегрировать Jococo плагин).

  • Выявлено 49 вонючих строк кода.

Поскольку я включил более 1000 правил (по умолчанию их всего 400), некоторые проблемы среди 49 являются просто дубликатами. Давайте рассмотрим самые важные, а именно баги:

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

Часть проблем была найдена, но не все.

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

Также можно выбрать файл и посмотреть всю аналитку:

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

Слишком много правил я выбрал, сонар не анализирует а уже душнит.

Какие выводы можно сделать?

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

  • Сонар однозначно отлавливает много багов но не все.

  • Во много качество сонара определяется настроеными правилами (Quality profiles) которые затем и используются во время анализа. Подружить их все - довольно непросто.

  • Слишком большое количество правил руинит весь смысл анализа.

Двигаемся дальше. PMD анализатор кода.

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

бесплатный, опенсорный.

Sonar не является чем-то уникальным. Давайте рассмотрим другое бесплатное решение - PMD. Кстати, правила PMD могут быть скачены и запущены в Sonar, но с первой попытки у меня это не получилось из-за проблемы с соответствием версий PMD/SONAR/JAVA.

Ставим PMD

Чтобы поставить PMD достаточно скачать с их сайта pmd-dist-7.0.0-rc4-bin.zip и распаковать. Затем добавить в PATH bin папку и запусить команду:

>pmd check -d C:\cleancode -R rulesets/java/quickstart.xml -f html -r report.html

В команде C:\cleancode является папкой проекта где лежит ваш Java код. Результатом работы будет созданный report.html. Вот результаты его работы:

Чистим Java код используя SonarQube и PMD Программист, Telegram, Telegram (ссылка), Sonar, Docker, Java, Длиннопост

Коротко и по делу.

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

Всем кому интересна разработка на Java и смежный мир технологий добро пожаловать в мой телеграм канал. Всем спасибоо за внимание.

Показать полностью 16
[моё] Программист Telegram Telegram (ссылка) Sonar Docker Java Длиннопост
0
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии