Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
14 / 14 / 3
Регистрация: 19.12.2009
Сообщений: 119

Вывод bash скрипта в формате JSON

03.09.2018, 19:39. Показов 6195. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Обращаюсь за помощью к специалистам.

Задача - сделать отображение состояния бекапов встроенными средствами виртуальной платформы Proxmox через Zabbix.
Ничего готового не нашел. Зато нашел опубликованный пользователем skygge на форуме zabbix.com скрипт: Monitoring ProxMox VE virtual machines backup with Zabbix. Скрипт очень хороший, но очень малоинформативный.
После исследования и раздумий принял решение попробовать своими силами и минимальным знанием скриптинга его переделать полноценный шаблон с автоматическим обнаружением виртуалок, и мониторинга состояния бекапа каждой. Если получится, то опубликую на share.zabbix.com.

Проблема: как и ожидал, застрял на выводе результатов в формате JSON, которые нужно передавать в Zabbix.
Вот мой discovery-script на текущем этапе:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
 
# Script for checking ProxMox virtual machines backup. For use in Zabbix. Skygge@2016
 
#Variables
 
backupconfig='/etc/pve/vzdump.cron'
storageconfig='/etc/pve/storage.cfg'
configdir='/etc/pve/local/qemu-server'
 
# Virtual machines
virtualmachines=`find $configdir -type f -name "*.conf" |cut -d "/" -f 6|cut -d "." -f 1`
 
# Backup Configuration for VM's
backupallmachines=`grep '\-\-all' $backupconfig|wc -l`
 
# Check every VM for configured backup
if [ "$backupallmachines" = "0" ]; then
for i in $virtualmachines
do
    backupenabled=1
 
    checkbackup=`grep $i $backupconfig |sed 's/  */ /g'|cut -d "-" -f 1|cut -d " " -f 8-|tr -d "\n"`
    if [ "$checkbackup" = "" ];then
        echo "VM $i is not configured for backups."
        backupenabled=0
    fi
 
    checkbackupenabled=`grep $i $backupconfig | grep "#vzdump" | sed 's/  */ /g'|cut -d "-" -f 1|cut -d " " -f 8-|tr -d "\n"`
    if ! [ "$checkbackupenabled" = "" ];then
        echo "Backup for VM $i is configured, but disabled."
        backupenabled=0
    fi
 
 
echo -e "{\"VM_NUMBER\":\""$i"\", \"BACKUP_STATUS\":\""$i,$backupenabled"\"}"
 
done
fi
(Выводы "echo" оставил пока что сознательно, для траблшутинга. Знаю, что в выводе лишнего быть не должно.)


Вывод сейчас такой:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ./vms_discovery
{"VM_NUMBER":"100", "BACKUP_STATUS":"100,1"}
 
$ sudo ./vms_discovery
{"VM_NUMBER":"106", "BACKUP_STATUS":"106,1"}
{"VM_NUMBER":"103", "BACKUP_STATUS":"103,1"}
{"VM_NUMBER":"101", "BACKUP_STATUS":"101,1"}
 
$ sudo ./vms_discovery
VM 106 is not configured for backups.
{"VM_NUMBER":"106", "BACKUP_STATUS":"106,0"}
{"VM_NUMBER":"103", "BACKUP_STATUS":"103,1"}
VM 101 is not configured for backups.
{"VM_NUMBER":"101", "BACKUP_STATUS":"101,0"}
Вот из этого всего прошу, пожалуйста, помочь мне сделать полноценный JSON. Самое страшное для меня - запятые после блоков данных, которые надо расставить не просто тупо в конце каждой строки, а пропустить последнюю. Вот тут я в лужу сел полностью.

Вот пример вывода, который Zabbix принимает на ура:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
{
        "data":[
 
                {
                        "{#DISKNAME}":"/dev/sda -d sat",
                        "{#DISK_STATUS}":"1,1"
                },
                {
                        "{#DISKNAME}":"/dev/sdb -d sat",
                        "{#DISK_STATUS}":"1,1"
                }
        ]
}
(взято из другого скрипта)

Самое интересное, что тут есть даже готовое решение: Output JSON from Bash script, и им можно было бы попробовать воспользоваться. Вот только прикрутить его у меня ума на текущем жизненном этапе не хватает.

Заранее благодарен за помощь!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2018, 19:39
Ответы с готовыми решениями:

Вывод бд в формате JSON
Всем доброго вечера как в формате JSON получить все базу данных. Идеально бы было если это все записать сюда <?php include...

Вывод данных от сервера в формате JSON
Здравствуйте дорогие форумчане! Помогите пожалуйста получить данные и многомерного массива JSON. Запрос делаю так. try { ...

Рекурсивный спуск по каталогу и вывод в Json формате
Здравствуйте. Делаю рекурсивный спуск по каталогу для вывода списка файлов и подкаталогов с файлами, и есть небольшая проблема. Не могу...

10
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
03.09.2018, 21:56
Так и непонятно чего именно Вы хотите. Вставить в начало "data" с фигурными и квадратными скобками?
Что касается запятых, то самое простое - bash parameter expansion:
Bash
1
RESULT=${RESULT:+${RESULT},}{\"VM_NUMBER\":\""$i"\", \"BACKUP_STATUS\":\""$i,$backupenabled"\"}
1
14 / 14 / 3
Регистрация: 19.12.2009
Сообщений: 119
03.09.2018, 22:16  [ТС]
Цитата Сообщение от Marinero Посмотреть сообщение
Так и непонятно чего именно Вы хотите. Вставить в начало "data" с фигурными и квадратными скобками?
Добрый день!
Хочу получить вывод скрипта в формате JSON. Вот так:

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
        "data": [
 
                {
                        "{#VM_NUMBER}":"106",
                        "{#BACKUP_STATUS}":"106,0"
                },{
                        "{#VM_NUMBER}":"103",
                        "{#BACKUP_STATUS}":"103,1"
                },{
                        "{#VM_NUMBER}":"101",
                        "{#BACKUP_STATUS}":"101,0"
                }
        ]
}

Это я руками в блокноте собрал, чтоб тестировать шаблон под заббикс. Получилось, заббикс принял. Необходимо, чтоб скрипт давал точно такой же вывод, а так же учитывал число данных. В одном случае блок "{#VM_NUMBER}":"106", "{#BACKUP_STATUS}":"106,0" может быть всего один, в другом (в зависимости от числа виртуалок на платформе) - много. У меня на тестовой - три. Вот и имею три блока данных.

Спасибо!
Миниатюры
Вывод bash скрипта в формате JSON  
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
03.09.2018, 22:38
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
 
backupconfig='/etc/pve/vzdump.cron'
storageconfig='/etc/pve/storage.cfg'
configdir='/etc/pve/local/qemu-server'
 
if grep -- '--all' $backupconfig ; then
    unset RESULT
    while read i ; do
        ! grep -qm1 "\svzdump\s*$i" "$backupconfig"
        RESULT=${RESULT:+${RESULT},}"{\"{\#VM_NUMBER}\":\"$i\", \"{\#BACKUP_STATUS}\":\"$i,$?\"}"
    done < <(find $configdir -type f -name "*.conf" -exec basename {} .conf \;)
    echo {\"data\":\[${RESULT}\]}
fi
2
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
03.09.2018, 22:39
Лучший ответ Сообщение было отмечено MR_Andrew как решение

Решение

MR_Andrew, пара трюков с массивами для Bash
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
 
### bash declare array
ARR=()
 
for i in `ls -a`; do
    ## bash append array
    ARR+=("$i")
done
 
 
SAVE_IFS="$IFS"
### separator
IFS=","
### bash join array
JOINED_LIST="${ARR[*]}"
IFS="$SAVE_IFS"
 
echo $JOINED_LIST
в комментариях указаны ключевые слова для поиска

Не по теме:

честно говоря, я бы взял другой язык для реализации подобной штуки(Python, например)

1
14 / 14 / 3
Регистрация: 19.12.2009
Сообщений: 119
04.09.2018, 00:48  [ТС]
Marinero, премного Вам благодарен за ответ!
Но, к сожалению, в Вашем примере разобраться не смог, у меня слишком слабые знания. Понимаю, что Вы переписали мой (и то, это далеко не совсем мой) кусок кода в более оптимальную форму. Но полностью разобраться как это работает у меня не вышло. И не вижу еще одной проверки. У меня их две - на наличие задачи бекапа и на то, что эта задача активна. В оригинальном скрипте этой проверки не было, уже доделал сам. Так вот этой проверки не вижу.
Но выглядит очень внушающе, спасибо!

Max Dark, с большим трудом, но таки разобрался по Вашему примеру, хотя с массивами я ну очень поверхностно знаком. Снова таки, с трудом понимаю как это работает, но оно работает!

Вот как теперь выглядит скрипт:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash
 
# Script for checking ProxMox virtual machines backup. For use in Zabbix. Skygge@2016
 
#Variables
 
backupconfig='/etc/pve/vzdump.cron'
storageconfig='/etc/pve/storage.cfg'
configdir='/etc/pve/local/qemu-server'
 
ARR=()
 
# Virtual machines
virtualmachines=`find $configdir -type f -name "*.conf" |cut -d "/" -f 6|cut -d "." -f 1`
 
# Backup Configuration for VM's
backupallmachines=`grep '\-\-all' $backupconfig|wc -l`
 
# Check every VM for configured backup
if [ "$backupallmachines" = "0" ]; then
for i in $virtualmachines
do
    backupenabled=1
 
    checkbackup=`grep $i $backupconfig |sed 's/  */ /g'|cut -d "-" -f 1|cut -d " " -f 8-|tr -d "\n"`
    if [ "$checkbackup" = "" ];then
        # echo "VM $i is not configured for backups."
        backupenabled=0
    fi
 
    checkbackupenabled=`grep $i $backupconfig | grep "#vzdump" | sed 's/  */ /g'|cut -d "-" -f 1|cut -d " " -f 8-|tr -d "\n"`
    if ! [ "$checkbackupenabled" = "" ];then
        # echo "Backup for VM $i is configured, but disabled."
        backupenabled=0
    fi
 
ARR+=("{\"{#VM_NUMBER}\":\""$i"\", \"{#BACKUP_STATUS}\":\""$i,$backupenabled"\"}")
 
done
SAVE_IFS="$IFS"
### separator
IFS=","
### bash join array
JOINED_LIST="${ARR[*]}"
IFS="$SAVE_IFS"
 
echo '{ "data": [' $JOINED_LIST ']}'
fi
Вывод:
Bash
1
2
sudo ./proxmox-vms-discovery
{ "data": [ {"{#VM_NUMBER}":"106", "{#BACKUP_STATUS}":"106,0"},{"{#VM_NUMBER}":"103", "{#BACKUP_STATUS}":"103,1"},{"{#VM_NUMBER}":"101", "{#BACKUP_STATUS}":"101,0"} ]}
Проверку через jsonlint проходит, и Заббикс так же данный вывод принял. Обнаружение работает, фильтрация тоже. Надеюсь все хорошо! Остались мелкие правки, логика наверно уже меняться не будет.
Спасибо!
честно говоря, я бы взял другой язык для реализации подобной штуки(Python, например)

Не по теме:

Увы, не силен :( Мне очень повезло, что изначальный скрипт был на баше. Был бы он на том же Питоне, то я уже ничего бы не сделал. Разве что идти учить Питон :)

0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
04.09.2018, 11:02
Цитата Сообщение от MR_Andrew Посмотреть сообщение
И не вижу еще одной проверки
Сами же написали
Цитата Сообщение от MR_Andrew Посмотреть сообщение
Выводы "echo" оставил пока что сознательно, для траблшутинга. Знаю, что в выводе лишнего быть не должно.
Если они Вам нужны - покажите варианты строчек $backupconfig для 3 вариантов(сконфигурирован, не сконфигурирован, запрещен)
Цитата Сообщение от MR_Andrew Посмотреть сообщение
в более оптимальную форму
У Вас (в оригинальном) скрипте необоснованно используются переменные, которые в сущности и не нужны. А проверки вообще сильно кривые.
1
14 / 14 / 3
Регистрация: 19.12.2009
Сообщений: 119
04.09.2018, 22:02  [ТС]
Цитата Сообщение от Marinero Посмотреть сообщение
Если они Вам нужны - покажите варианты строчек $backupconfig для 3 вариантов(сконфигурирован, не сконфигурирован, запрещен)
Они выглядят вот так:
Цитата Сообщение от Marinero Посмотреть сообщение
сконфигурирован
Bash
1
2
3
4
5
6
7
$ sudo cat /etc/pve/vzdump.cron
# cluster wide vzdump cron schedule
# Automatically generated file - do not edit
 
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
 
0 0 * * 6           root vzdump 103 --quiet 1 --compress lzo --mailnotification always --mode snapshot --storage backup
Цитата Сообщение от Marinero Посмотреть сообщение
не сконфигурирован
Bash
1
2
3
4
5
$ sudo cat /etc/pve/vzdump.cron
# cluster wide vzdump cron schedule
# Automatically generated file - do not edit
 
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
Цитата Сообщение от Marinero Посмотреть сообщение
запрещен
Правильнее сказать "отключен":
Bash
1
2
3
4
5
6
7
$ sudo cat /etc/pve/vzdump.cron
# cluster wide vzdump cron schedule
# Automatically generated file - do not edit
 
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
 
0 0 * * 6           root #vzdump 103 --quiet 1 --compress lzo --mailnotification always --mode snapshot --storage backup
То есть строка закомментирована.

Цитата Сообщение от Marinero Посмотреть сообщение
У Вас (в оригинальном) скрипте необоснованно используются переменные, которые в сущности и не нужны. А проверки вообще сильно кривые.
Я с Вами целиком и полностью согласен. Но поймите - скрипт, который в первоначальном варианте был опубликован автором Skygge простой и понятный для чтения. Я в нем разобрался Конечно, с точки зрения профессионального программирования он очень не оптимальный и "дубовый". Задачу решаем "в лоб". Зато понятный новичку. Но в Вашем цикле, который выглядит очень внушительно, я уже разобраться не могу. И если понадобиться что-то поправить, то сам я уже не осилю. Тут я могу только догадываться как оно работает.

На данный момент вариант, предложенный Max Dark, подошел. Конечно я еще буду очень тщательно тестировать, но на данном этапе все работает. И логика, пусть и совсем деревянная, тоже работает. Заббикс абсолютно корректно определяет настроенные виртуалки и создает "Элементы данных" только для настроенных. Не настроенные или отключенные пропускает.
Вторая часть скрипта, которая уже будет непосредственно снимать данные, так же готова. Она такая же деревянная, но работает корректно.
Если интересно, то вот:
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/bash
 
# Script for checking ProxMox virtual machines backup. For use in Zabbix. Skygge@2016
 
#Variables
 
backupconfig='/etc/pve/vzdump.cron'
storageconfig='/etc/pve/storage.cfg'
configdir='/etc/pve/local/qemu-server'
 
# Check every VM for existing backup files and check if they're newer than 7 days
parameters=`cat $backupconfig |egrep "($1|\-\-all)"|head -1|sed 's/  */ /g'`
 
if [ "$parameters" = "" ];then
   #echo "Invalid VM number, or backup is not configured."
   echo 0
else
    #read backup configuration file into an array and find the backup storage parameter
    IFS=' ' read -r -a array <<< "$parameters"
    for index in "${!array[@]}"
    do
        if [ "${array[index]}" = "--storage" ]; then
           z=$((index+1))
           backupstorage=${array[$z]}
        fi
    done
 
# read physical backup path from storage configuration file for VM $1
backupdirectory=`cat $storageconfig|grep -A 1 $backupstorage|grep path|rev|cut -d " " -f 1|rev`
 
if [ -d $backupdirectory/dump ]; then
        # check if backup file(s) exists on backup path for VM $1
        backup=`ls $backupdirectory/dump/|grep "$1" |grep -v log|wc -l`
        if [ "$backup" = "0" ]; then
              #echo "VM $1 has no backup file."
              echo 2
        else
            # check if backup file is newer than $2 day(s) for VM $1
            newbackup=`find $backupdirectory/dump/ -type f -name "*$1*" -not -name "*.log" -mtime -$2 | sort -nr | head -1|wc -l`
                if [ "$newbackup" = "0" ]; then
                      #echo "VM $1 backup is older than $2 day(s)."
                      echo 3
                else
                        #check last log file for errors
                        backuplastlog=`ls $backupdirectory/dump/ | grep "$1" | grep log | tail -1`
                        backupresult=`cat $backupdirectory/dump/$backuplastlog | grep -i -E "ERROR|FAILED"`
                                if [ "$backupresult" = "" ];then
                                        #echo "VM $1 backup is OK, no errors found."
                                        echo 7
                                else
                                        #echo "VM $1 backup finished with errors. Please, check logs."
                                        echo 4
                                fi
                fi
        fi
     else
         #echo "Backup directory for VM $1 does not exists."
         echo 1
fi
fi
Понимаю - топорно и даже очень. Массив уже вообще можно даже убрать, так как я переделал логику работы, хотя он и не мешает. Но все работает. Коды возврата скрипт выдает верные. Шаблон в заббиксе настроен на получение кода (цифры), и пачка триггеров по этим кодам. Срок проверки бекапа, который передаем аргумент через $2, задаем в макросе, любое значение. Пользователь сам выставит что ему актуально.


Marinero, спасибо Вам за Ваши труды!
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
04.09.2018, 23:20
Bash
20
21
22
23
24
25
26
27
28
...
for i in $virtualmachines; do
    backupenabled=0
    case $(grep -m1 $i $backupconfig) in
        *[#]vzdump ${i}*) echo "Backup for VM $i is configured, but disabled." ;;
        *${i}*) backupenabled=1 ;;
        *) echo "VM $i is not configured for backups." ;;
    esac
...
1
04.09.2018, 23:58

Не по теме:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/python
# coding=utf-8
 
from os import listdir
from os.path import splitext
from json import dumps
 
 
backupconfig='/etc/pve/vzdump.cron'
storageconfig='/etc/pve/storage.cfg'
configdir='/etc/pve/local/qemu-server'
 
 
def get_vm_list(path):
    """
    получить список имеющихся VM
    :rtype: list(str)
    :param path: путь до директории с конфигами VM
    :return:
    """
    vm_list = list()
 
    for name in listdir(path):
        vm_id, ext = splitext(name)
        if ext == '.conf':
            vm_list.append(vm_id)
 
    return vm_list
 
 
def get_backup_tasks(config):
    """
    получает список задач резервного копирования
    :param config: имя файла с конфигом
    :return: dict[vm_id] = status
    """
    fields_count = 8
    tasks = dict()
    # для каждой строки конфига
    with open(config) as cfg:
        for line in cfg:
            line = line.rstrip()
            # пропустить пустые строки и коментарии
            if len(line) == 0 or line.startswith('#'):
                continue
            fields = line.split(None, fields_count)
            # пропустить строки, не являющиеся задачами
            if len(fields) < fields_count:
                continue
            # выделить из строки задачу и ее параметры
            task, vm_id, params = fields[-3:]
 
            # получить статус задачи: включено/выключено
            if task == 'vzdump':
                task_enabled = True
            elif task == '#vzdump':
                task_enabled = False
            else:
                continue
            tasks[vm_id] = task_enabled
 
    return tasks
 
 
def get_config(backup_cfg, vm_path):
    # получить список задач
    tasks = get_backup_tasks(backup_cfg)
    # получить список ВМ
    vm_list = get_vm_list(vm_path)
 
    config = list()
    # для каждой ВМ из спсика
    for vm_id in vm_list:
        backup_enabled = 0
        if vm_id in tasks:
            if tasks[vm_id]:
                backup_enabled = 1
 
        # получить статус
        task_status = dict()
        task_status["{#VM_NUMBER}"] = vm_id
        task_status["{#BACKUP_STATUS}"] = "{},{}".format(vm_id, backup_enabled)
 
        config.append(task_status)
    return {'data' : config}
 
if __name__ == '__main__':
    print (dumps(get_config(backupconfig, configdir)))
    #print (dumps(get_config('vzdump.cron', '/etc')))
    #print (dumps(get_backup_tasks('vzdump.cron')))
    #print (dumps(get_vm_list('/etc')))

0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
05.09.2018, 09:32
Max Dark,

Не по теме:

ну что и требовалось доказать: вместо скрипта на 20 строк из которых значимых команд: grep, find и цикл получаем одороболо на почти 100 строк...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.09.2018, 09:32
Помогаю со студенческими работами здесь

Сделать вывод новостей, которые генерируются на сервере в формате JSON
итак, здравствуйте, уважаемые форумчане и программисты C# WPF! У меня возникла насущная проблема... Вообщем. Нужно сделать вывод...

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

Выполнение bash скрипта
Здравствуйте, уважаемые форумчане! Возник вопрос по поводу исполнения bash скрипта через PHP Есть BASH скрипт: #!/bin/sh echo...

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

Перевод скрипта с Bash на Batch
Доброго времени суток, подскажите, возможно ли переделать следующий скрипт под бат файл? Заранее огромнейшие спасибо. #! /bin/bash ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru