• Pyrogram пересылает группу медиафайлов несколько раз?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Проблема заключается в том, что Pyrogram метод copy_media_group() отправляет каждый медиафайл как отдельное сообщение, что приводит к отправке нескольких сообщений вместо одного с группой медиафайлов.

    Для исправления этой проблемы вам нужно использовать метод send_media_group() вместо copy_media_group(). Метод send_media_group() отправляет все медиафайлы в одном сообщении, что дает возможность отправлять группу медиафайлов как единое сообщение.

    Ниже приведен исправленный код:
    import pyrogram
    import config
    
    channels = []
    lm = []
    
    with open('channels.txt','r') as f:
      for channel in f.read().split('\n'):
        channels.append(channel)
    
    app = pyrogram.Client('my_account', config.api_id, config.api_hash)
    
    @app.on_message()
    def copy_to_my_channel(app, message):
      print(message)
      if str(message.chat.id) in channels:
        if message.media_group_id is None:
          app.copy_message(from_chat_id=message.chat.id, chat_id=config.my_channel, message_id=message.message_id)
        else:
          if message.media_group_id not in lm:
            media_group = app.get_media_group(chat_id=message.chat.id, message_id=message.message_id)
            app.send_media_group(chat_id=config.my_channel, media=media_group)
            lm.append(message.media_group_id)
        print('Пост опубликован')
    
    app.run()

    В этом коде мы использовали метод get_media_group() для получения группы медиафайлов из оригинального сообщения, а затем отправили ее в новый канал, используя метод send_media_group().
    Ответ написан
  • Как сделать бан на создание веб хука?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Да, в Discord.py можно настроить бота таким образом, чтобы он банил пользователей, создающих веб-хуки в вашем сервере. Для этого нужно использовать событие on_webhooks_update и метод Guild.ban().

    Вот пример кода:
    import discord
    
    client = discord.Client()
    
    @client.event
    async def on_webhooks_update(channel):
        for webhook in await channel.webhooks():
            await channel.guild.ban(webhook.user, reason="Создание веб-хука запрещено")
    
    client.run("Ваш токен от Discord бота")

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

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

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Проблема заключается в том, что strip.show() является блокирующей функцией, которая отправляет данные на ленту и ждет, пока они будут обработаны. Таким образом, если strip.show() вызывается внутри цикла, он будет блокироваться каждый раз, когда выполняется. Это может привести к блокировке программы и невозможности обработки других событий, таких как чтение данных с ИК-приемника.

    Вы можете решить эту проблему, вызывая strip.show() только тогда, когда есть новые данные с пульта. Для этого вы можете привести код к такому виду:
    void loop(){
      if(ir.available()){     //проверка "если поступили данные на ИК транзистор"
        mode = ir.readCommand();     //присваиваем значению переменной значение с ИК транзистора
        Serial.println(mode);     //выводим в порт значение с ИК транзистора
    
        strip.setPixelColor(1, strip.Color(0, 0, 255));     //помечаем 1 пиксел синим цветом
        strip.show();     //подаем сигнал на ленту
      }
    }

    - strip.show() будет вызываться только тогда, когда поступит новый сигнал с пульта.

    Вы также можете изменить функцию irIsr() следующим образом:
    void irIsr(){
      ir.tick();
      strip.show();     //подаем сигнал на ленту
    }

    Также, можно попробовать использовать неблокирующий способ чтения данных с ИК-приемника, чтобы избежать блокировки программы при ожидании данных. Например, можно использовать библиотеку IRremote и метод irrecv.decode() для проверки наличия данных с приемника без блокировки программы.

    Если ответ помог или считаете что может быть полезен другим - не забудьте отметить его как решение вашего вопроса. Успехов!
    Ответ написан
    Комментировать
  • Ошибка ERR_CONNECTION_REFUSED, что не так?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Ошибка "ERR_CONNECTION_REFUSED" и "TypeError: NetworkError when attempting to fetch resource" обычно указывает на то, что удаленный сервер не доступен по указанному адресу или порту.

    В вашем коде, вы указываете порт 3000 в запросе на https://example.com:3000/server/, но в коде сервера, вы слушаете порт 3000 на хосте example.com/server.
    Чтобы исправить это, вам нужно изменить значение host в коде сервера на example.com и удалить /server из пути запроса:
    const host = 'example.com';
    const port = 3000;
    
    // ...
    
    app.post('/server', (req, res) => { // изменить путь на /server
      // ...
    });


    Дополнительное, не обязательное:

    Кроме того, вы используете режим "no-cors" в запросе fetch, что означает, что запрос будет выполнен без использования CORS (Cross-Origin Resource Sharing), что может привести к блокировке запроса браузером из-за политики безопасности CORS. Если вы контролируете и настраиваете сервер, на который отправляете запрос, лучше использовать стандартный режим "cors" или "same-origin".
    const response = await fetch(
      'https://example.com/server/', // изменить путь на /server
      {
        method: 'POST',
        // mode: 'no-cors', // удалить эту строку
        headers: {
          'Content-Type': 'text/plain',
        },
        body: mail,
      }
    );

    После проверки параметров host, port и внесения изменений, ваш POST запрос должен пройти успешно.
    Ответ написан
    7 комментариев
  • Почему не игнорируются файлы venv, добавленной в .gitignore?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    При добавлении файла в .gitignore это не означает, что файл будет удален из репозитория, если он уже был ранее добавлен.
    .gitignore просто указывает Гиту, какие файлы и папки игнорировать в будущем.

    Если файлы уже были добавлены в репозиторий, вам нужно удалить их из Гита при помощи команды git rm и зафиксировать это изменение в новом коммите.

    Так как вы уже попытались удалить файлы venv при помощи команды git rm, и Git сообщил вам об ошибке, скорее всего, проблема в том, что файлы были изменены после того, как вы их добавили в Git.

    Вы можете попробовать выполнить команду git reset HEAD (скорее всего даже git reset venv в вашем случае) перед выполнением команды git rm. Это должно убрать изменения из индекса Git и позволить вам удалить файлы из репозитория.

    Также убедитесь, что вы правильно указали путь к папке с виртуальным окружением в файле .gitignore, и что вы используете правильные разделители пути (например, слэш в Unix-подобных системах или обратный слэш в Windows).

    После того как вы успешно удалите файлы venv, их больше не будет в вашем репозитории.
    Ответ написан
  • Как предотвратить падение PHPUnit в GitLab CI от ошибки типа Warning, прилетающей из bootstrap-точки файла Wordpress-ядра?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Проблема возникает скорее всего из-за того, что bootstrap-точка файла Wordpress-ядра вызывает необходимость доступа к суперглобальным переменным, таким как $_SERVER. Но в GitLab CI эти переменные не установлены, и поэтому возникает ошибка "Undefined array key "HTTP_HOST"".
    При локальном запуске тестов этот массив определен и поэтому вы не видите ошибку.

    Чтобы решить эту проблему, можно попробовать заменить bootstrap="wp-load.php" на bootstrap="tests/bootstrap.php".
    После этого создайте файл tests/bootstrap.php со следующим содержимым:
    <?php
    // Подключаем файл wp-load.php, чтобы иметь доступ к функциям Wordpress
    require_once dirname( __FILE__ ) . '/../wp-load.php';
    
    // Устанавливаем значения для некоторых суперглобальных переменных, которые используются в Wordpress
    $_SERVER['HTTP_HOST'] = 'localhost';
    $_SERVER['SERVER_NAME'] = 'localhost';
    $_SERVER['REQUEST_URI'] = '/';

    Этот файл загружает файл wp-load.php, устанавливает значения для необходимых суперглобальных переменных и предотвращает возникновение ошибок "Undefined array key "HTTP_HOST"".

    Либо можно переопределить значение этой переменной внутри вашего файла phpunit.xml

    Для этого необходимо добавить php настройки внутри вашего phpunit.xml файла, которые переопределят значение HTTP_HOST, напр.:
    <php>
        <server name="HTTP_HOST" value="localhost"/>
    </php>

    Это должно предотвратить появление ошибки.
    Ответ написан
    Комментировать
  • Как в Python получить ip-адрес виртуалки, созданной вагрантом?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Проблема заключается в том, что вы используете тип сетевого подключения public_network, который позволяет вашей виртуальной машине получать IP-адрес от DHCP-сервера, находящегося в вашей локальной сети. Это означает, что IP-адрес, который вы получаете в своей функции __get_local_ip(), может меняться при каждом запуске виртуальной машины, так как он зависит от IP-адреса, выданного DHCP-сервером.

    Если вы хотите назначать статический IP-адрес вашей виртуальной машине, вы можете использовать тип сетевого подключения private_network. Для этого вам необходимо изменить конфигурацию виртуальной машины в Vagrantfile следующим образом:
    Vagrant.configure("2") do |config|
    
      N = 3
    
      (1..N).each do |i|
        config.vm.box = "generic/ubuntu2004"
        config.vm.define "node_#{i}" do |node|
          node.vm.network "private_network", ip: "192.168.50.#{i}"
          node.vm.hostname = "vm#{i}"
          node.vm.provider :vmware_desktop do |vb|
            vb.memory = 2048
            vb.cpus = 1
            vb.gui = false
          end
        end
      end
      config.vm.provision "shell" do |s|
        ssh_pub_key = File.readlines("/home/eugene/.ssh/eugene.pub").first.strip
        s.inline = <<-SHELL
          mkdir /root/.ssh
          echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
          echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
        SHELL
      end
    end

    Здесь мы изменили тип сетевого подключения на private_network и назначили статический IP-адрес каждой виртуальной машине, используя опцию ip. В данном примере IP-адреса будут назначены в диапазоне 192.168.50.1-3.

    Теперь, когда вы запустите виртуальную машину, она всегда будет иметь тот же IP-адрес, что вы назначили в Vagrantfile, и вы можете использовать этот IP-адрес в своей функции __get_local_ip() для получения IP-адреса виртуальной машины.

    Если ответ помог или считаете что может быть полезен другим - не забудьте отметить его как решение вашего вопроса. Успехов!
    Ответ написан
    Комментировать
  • Как сделать автоматическую конвертацию лида в сделку в Битрикс24?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Для автоматической конвертации лида в сделку при переносе в финальную стадию "Завершить работу" в Битрикс24 можно использовать функцию "Автоперевод лидов в сделки" в настройках CRM.

    Для этого нужно выполнить следующие шаги:
    1. Перейдите в раздел "CRM" в верхней панели навигации.
    2. Выберите вкладку "Настройки" и перейдите на вкладку "Лиды".
    3. В разделе "Автоматизация работы с лидами" включите опцию "Автоперевод лидов в сделки".
    4. Выберите нужную воронку для автоматической конвертации лидов в сделки.
    5. Нажмите на кнопку "Сохранить".

    *Точность названий пунктов, разделов и кнопок не могу гарантировать, тк писал по памяти.

    Теперь, когда вы переносите лид в финальную стадию "Завершить работу", он автоматически будет конвертирован в сделку и добавлен в выбранную воронку.
    Если ответ помог, не забудьте отметить его как решение вашего вопроса. Успехов!
    Ответ написан
    4 комментария
  • Проблема с установкой PySat?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Учитывая что вы уже пробовали переустановить Visual C++, всё равно упомяну этот момент в чеклисте:
    1. Установите Visual C++ Redistributable Package: Проверьте, установлен ли на вашем компьютере Visual C++ Redistributable Package, необходимый для запуска приложений, которые используют Visual C++. Если его нет, загрузите и установите его с официального сайта Microsoft: https://support.microsoft.com/en-us/help/2977003/t...
    2. Убедитесь, что у вас установлена последняя версия Visual C++. Вы можете загрузить последнюю версию Visual C++ с сайта Microsoft и установить ее: https://visualstudio.microsoft.com/downloads/
    3. Проверьте, что у вас установлена поддерживаемая версия Python, для которой доступна библиотека PySat. Некоторые версии Python могут быть несовместимы с определенными версиями Visual C++.
    4. Проверьте, что все необходимые зависимости установлены для PySat.
    5. Используйте предустановленный пакет: Возможно, установка предварительно собранного пакета PySat может помочь. Вы можете использовать менеджер пакетов pip для установки предварительно собранного пакета PySat:pip install pysat-bin

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

    Если ответ помог или считаете что может быть полезен другим - не забудьте отметить его как решение вашего вопроса. Успехов!
    Ответ написан
    2 комментария
  • Undefined ^ SyntaxError: Unexpected token u in JSON at position 0 ошибка?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Ошибка Unexpected token u in JSON at position 0 возникает, когда вы пытаетесь разобрать не правильно сформатированный JSON объект. В большинстве случаев это может быть вызвано неправильным синтаксисом при парсинге JSON-строки или пустым ответом (пустой строкой) в ответе от сервера на http запрос.

    Чтобы исправить эту ошибку, вам нужно убедиться, что вы правильно формируете JSON объект перед его парсингом. Возможно, вы пытаетесь разобрать объект, который не является JSON-строкой.

    Если вы используете метод JSON.parse() для разбора JSON-строки, убедитесь, что входная строка содержит правильный синтаксис JSON. Проверьте, чтобы строка начиналась с открывающейся фигурной скобки { и заканчивалась закрывающейся фигурной скобкой }.

    Вот пример правильно сформированного JSON объекта:
    {
      "name": "Иван Иванов",
      "age": 30,
      "city": "Москва"
    }

    Если вы получаете ошибку при попытке отправить сообщение через Discord API, убедитесь, что вы правильно форматируете объект сообщения и передаете его в правильном формате.

    Если проблема не устраняется, пожалуйста, предоставьте более подробную информацию о том, как вы используете Discord.js, какой код вызывает ошибку и какую именно операцию вы пытаетесь выполнить, чтобы можно было предоставить более точный ответ.
    Ответ написан
    Комментировать
  • Как отключить звук, исходящий из приложения на React Native (Android, iOS)?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Для того чтобы убрать звук, который исходит из вашего приложения во время проигрывания видеорекламы, можно использовать API для управления звуком в React Native.

    Для iOS вы можете использовать AVAudioSession из фреймворка AVFoundation для управления звуком на уровне приложения. Это позволит вам установить уровень звука вашего приложения на минимальное значение, когда начинается воспроизведение видеорекламы. После окончания воспроизведения видеорекламы вы можете вернуть уровень звука приложения к его исходному значению.
    Вот пример кода на Objective-C:
    #import <AVFoundation/AVFoundation.h>
    
    AVAudioSession *session = [AVAudioSession sharedInstance];
    NSError *error;
    [session setCategory:AVAudioSessionCategoryPlayback error:&error];
    [session setActive:YES error:&error];
    [session setOutputVolume:0.0f error:&error]; // установить уровень звука на минимальное значение
    
    // начать воспроизведение видеорекламы
    
    [session setOutputVolume:1.0f error:&error]; // вернуть уровень звука на исходное значение


    Для Android вы можете использовать AudioManager для управления звуком на уровне приложения. Это также позволит вам установить уровень звука вашего приложения на минимальное значение, когда начинается воспроизведение видеорекламы. После окончания воспроизведения видеорекламы вы можете вернуть уровень звука приложения к его исходному значению.
    Вот пример кода на Java:
    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    int originalVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0); // установить уровень звука на минимальное значение
    
    // начать воспроизведение видеорекламы
    
    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, originalVolume, 0); // вернуть уровень звука на исходное значение

    Обратите внимание, что эти примеры кода показывают только как управлять звуком на уровне приложения. Вам также нужно будет определить, когда начинается и заканчивается воспроизведение видеорекламы, чтобы правильно установить и вернуть уровень звука приложения.
    Ответ написан
  • Выдает ошибку 'Dispatcher' object has no attribute 'message'. Как исправить?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Ошибка 'Dispatcher' object has no attribute 'message' возникает, потому что в строке
    @dp.message(lambda message: message.text == "Нет") вы используете метод .message, который не существует у объекта Dispatcher.

    Для исправления ошибки вам нужно заменить строку
    @dp.message(lambda message: message.text == "Нет")
    на
    @dp.message_handler(lambda message: message.text == "Нет")

    В итоге, код для обработки сообщений "Да" и "Нет" будет выглядеть так:

    @dp.message_handler(commands="start")
    async def cmd_start(message: types.Message):
        b1 = [
            [
                types.KeyboardButton(text="Да"),
                types.KeyboardButton(text="Нет")
            ],
        ]
        keyboard = types.ReplyKeyboardMarkup(
            keyboard=b1,
            resize_keyboard=True,
            input_field_placeholder="Выберите действие"
        )
        await message.answer("У вас есть аккаунт?", reply_markup=keyboard)
    
    @dp.message_handler(lambda message: message.text == "Нет")
    async def without_puree(message: types.Message):
        await message.reply("Создать аккаунт?")
    
    if __name__ == '__main__':
        executor.start_polling(dp)


    Если ответ помог, не забудьте отметить его как решение вашего вопроса.
    Ответ написан
    Комментировать
  • Почему {...props} с библиотеки не работают в next.js?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Ошибка возникает потому, что тип AuthFieldProps, который вы определили, не включает в себя свойства type, placeholder и required, которые передаются через оператор spread {...props} в input.
    Когда компилятор TypeScript пытается присвоить значения type, placeholder и required к типу AuthFieldProps, он обнаруживает, что эти свойства не определены в интерфейсе AuthFieldProps и выдает ошибку.

    Чтобы решить эту проблему, вам нужно добавить свойства type, placeholder и required в интерфейс AuthFieldProps.

    Рассмотрев тайпинги вашей либы reconnect-ui (которую кстати не обязательно было публиковать на npm), вижу как раз это:
    64033ea6ddbe0579804563.png
    Как можно пофиксить:
    export interface AuthFieldProps extends React.HTMLProps<HTMLInputElement> {
        heading: string
    }

    Здесь мы расширяем интерфейс AuthFieldProps с помощью React.HTMLProps<HTMLInputElement>, чтобы включить все свойства, которые могут быть переданы в input, включая type, placeholder и required.
    Теперь TypeScript не будет выдавать ошибку и ваш компонент должен работать как в React-проекте, так и в Next.js проекте.
    Ответ написан
    Комментировать
  • Почему при подключении ui библиотеки к next.js приложению происходит ошибка?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Ошибка ReferenceError: self is not defined может возникать, если библиотека использует конструкцию "self" для ссылки на глобальный объект в браузере, а в Next.js приложении используется Node.js серверный код, который не имеет доступа к глобальному объекту self (обычно его делают алиасом для this или window).

    Чтобы решить эту проблему, можно попробовать использовать динамический импорт библиотеки в компоненте Next.js, вместо импорта на верхнем уровне модуля. Например:
    import React, { useState } from 'react';
    
    function MyComponent() {
      const [library, setLibrary] = useState(null);
    
      async function loadLibrary() {
        const { Avatar, Badge, Button } = await import('recconect-ui');
        setLibrary({ Avatar, Badge, Button });
      }
    
      return (
        <div>
          <button onClick={loadLibrary}>Load Library</button>
          {library && (
            <div>
              <library.Avatar />
              <library.Badge />
              <library.Button />
            </div>
          )}
        </div>
      );
    }

    В этом примере мы используем динамический импорт библиотеки recconect-ui внутри компонента MyComponent и сохраняем его в состоянии компонента. Когда пользователь нажимает на кнопку, мы загружаем библиотеку и сохраняем ее компоненты в другом состоянии, которое затем используется для отображения компонентов библиотеки.

    Вижу что вы опубликовали recconect-ui как свой пакет на npm - это было не обязательно делать для ведения локальной разработки. Вам нужно починить свою библиотеку.

    Если ответ помог или считаете что может быть полезен другим - не забудьте отметить его как решение вашего вопроса. Успехов!
    Пишите комментарии, если нужна доп.помощь.
    Ответ написан
  • Как реализовать ограниченную длину для border?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Можно сделать при помощи SVG + CSS (лаконичнее и лучше), можно при помощи чистого CSS без SVG.
    Также советую посмотреть на исходники сторонних библиотек/ui-фреймворков - там можно найти примеры качественной реализации подобных элементов.

    Готовый вариант:
    640332a93ec96319083802.png
    Код

    Переменная --circle-progress - контролирует остаток "заполненности"
    <main class="radial-progressbar">
      <svg>
        <circle class="circle-bg" cx="57" cy="57" r="52" />
        <circle class="circle-1" cx="57" cy="57" r="52" />
      </svg>
      <section>
        <h1>97</h1>
      </section>
    </main>

    :root {
      --circle-progress: 60;
    }
    
    body {
      display: grid;
      height: 100vh; 
      place-items: center;
      background: #FFF;
    }
    
    .radial-progressbar {
      position: relative;
    }
    
    .radial-progressbar svg {
      width: 114px;
      height: 114px;
      margin: 1em;
    }
    
    .radial-progressbar .circle-bg {
      fill: none;
      stroke-width: 10px;
      stroke: #1A2C34;
    }
    
    .radial-progressbar [class^="circle-"] {
      fill: rgba(26, 44, 52, 0.7);
      stroke-width: 10px;
      stroke-linecap: round;
      transform: rotate(-90deg);
      transform-origin: 50% 50%;
    }
    
    .radial-progressbar .circle-1 {
      stroke-dasharray: 360;
      stroke-dashoffset: var(--circle-progress);
      stroke: #fc9135;
    }
    
    .radial-progressbar section {
      display: flex;
      position: absolute;
      width: 100%;
      height: 100%;
      top: 0;
      left: 0;
      place-items: center;
      justify-content: center;
      color: #FFF;
    }


    Подробнее тут:
    https://dev.to/shantanu_jana/circular-progress-bar...
    https://stackoverflow.com/questions/14222138/css-p...
    https://codepen.io/jo-asakura/pen/NWWrWj
    https://nikitahl.com/circle-progress-bar-css
    https://www.codewithrandom.com/2022/10/22/circular...
    Ответ написан
    Комментировать
  • Как Найти совпадения значении массива и значении объекта, и вывести ключ найденного значения объекта?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Результатом выполнения приведенной в пример функции в вопросе, будет строка 'James', так как James - единственный подозреваемый, который видел всех убитых людей в день убийства.

    В функции getKiller мы используем метод Object.entries() для перебора объекта suspectInfo и получения доступа к ключам и значениям.
    Затем мы проверяем, были ли все убитые люди видны каждому подозреваемому в день убийства с помощью метода every(). Если это так, то мы сохраняем имя этого подозреваемого в переменной killerName.
    В конце мы возвращаем killerName.

    Пример реализации функции

    function getKiller(suspectInfo, deadPeople) {
      // Создаем объект для хранения информации о том, кого видели подозреваемые
      let seenBySuspects = {};
      
      // Заполняем объект seenBySuspects информацией о том, кого видели подозреваемые
      for (let suspect in suspectInfo) {
        for (let seenPerson of suspectInfo[suspect]) {
          if (!seenBySuspects[seenPerson]) {
            seenBySuspects[seenPerson] = [];
          }
          seenBySuspects[seenPerson].push(suspect);
        }
      }
      
      // Ищем преступника
      for (let suspect in suspectInfo) {
        let allDeadPeopleSeen = true;
        for (let deadPerson of deadPeople) {
          if (!seenBySuspects[deadPerson].includes(suspect)) {
            allDeadPeopleSeen = false;
            break;
          }
        }
        if (allDeadPeopleSeen) {
          return suspect;
        }
      }
      
      // Если преступник не найден, возвращаем null
      return null;
    }

    Сначала мы создаем объект seenBySuspects, который будет хранить информацию о том, кого видели подозреваемые.
    Затем мы заполняем этот объект информацией на основе объекта suspectInfo.
    Затем мы итерируемся по всем подозреваемым и проверяем, видели ли они всех убитых людей.
    Если подозреваемый видел всех убитых людей, мы возвращаем его имя.
    Если ни один подозреваемый не видел всех убитых людей, мы возвращаем null.

    Если ответ помог, не забудьте отметить его как решение вашего вопроса.
    Ответ написан
    Комментировать
  • Как исправить ошибки в консоли при установке пакетов Vue?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Сообщение об ошибке указывает на проблему с разрешением зависимостей, вызванную конфликтом версий eslint.
    Обычно это происходит когда например одна из зависимостей вашего проекта или сам проект требует версии eslint конфликтующей с версией eslint требуемой другой зависимостью вашего проекта.

    Вам нужно устранить конфликт и повторить установку.
    Вот несколько вариантов решения проблемы:

    Сначала обновите npm: npm i -g npm
    1. Обновите версию eslint до версии, которая удовлетворяет требованиям всех зависимостей.
      Попробуйте выполнить следующую команду:
      npm install -D eslint@7.28.0
      Если это не помогает, перейдите к следующему шагу.
    2. Удалите папку node_modules и файл package-lock.json, затем переустановите зависимости с флагом --force:
      npm install --force
    3. Используйте флаг --legacy-peer-deps при установке зависимостей:
      npm install --legacy-peer-deps
      Этот флаг отключает новую систему разрешения зависимостей, введенную в NPM 7, и использует более старую версию. Он может помочь в случае проблем с разрешением зависимостей.

    Ну и настоятельно рекомендую уже не использовать vue-cli при старте новых проектов на Vue, тк это инструмент который в будущем не будет поддерживаться (уже сейчас мало поддерживается).
    Посмотрите в сторону Vite:
    npm create vue@3
    или:
    npm create vite@latest my-vue-app -- --template vue

    Гайд по миграции Vue проекта с vue-cli на vite:
    https://vueschool.io/articles/vuejs-tutorials/how-... (мог уже немного устареть)
    Ответ написан
  • Tilda zeroblock галерея-слайдер не отображает первое изображение, как исправить?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Если галерея появляется после изменения размера окна браузера или переключения на другой слайд, возможно проблема заключается в том, что галерея не имеет определенной ширины и высоты на момент загрузки страницы. Вы можете попробовать решить эту проблему, установив явно размеры для галереи-слайдера:
    window.onload = function() {
      $( document ).ready(function() {
        var Content = '#rec555753100'; //id Zero block
        var Wrapper = '#rec555985001'; //id блока popup окна BF503
        $(Wrapper + " .t-popup__container").html($(Content)).parent(".t-popup");
        $(Wrapper).addClass('ZeroInPopUp');
        $(Wrapper + " .t-slds__main").css({"width": "100%", "height": "auto"}); // Установите ширину и высоту для галереи-слайдера
      });
    };

    Также, вы можете проверить стили для изображений в галерее и убедиться, что они имеют корректные размеры и масштабирование, необходимые для отображения изображений.
    Ответ написан
    Комментировать
  • Не создаётся папка images в папке dist через gulp?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Ваш код кажется корректным.
    Чтобы папка images была скопирована в dist, вы должны убедиться, что у вас есть изображения в папке src/assets/images и что они соответствуют указанным расширениям в path.src.images.
    Ваш код ожидает, что изображения будут находиться в папке src/assets/images и будут иметь любое из этих расширений:
    jpg, png, svg, gif, ico, webp, webmanifest, json, xml

    Если у вас есть изображения в папке src/assets/images, которые не имеют ни одного из указанных расширений, или если изображения находятся в другом месте, то вам следует изменить path.src.images соответствующим образом, чтобы изображения копировались в папку dist/assets/images.
    Например, если ваши изображения находятся в папке src/images и имеют расширение .jpg, вы можете изменить path.src.images на src/images/*.jpg.

    Если ответ помог, не забудьте отметить его как решение вашего вопроса.
    Ответ написан
    Комментировать
  • Как сделать отслеживание ширины экрана автоматически на vue?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Подключите библиотеку @vueuse/core и используйте из неё готовый реактивный хук (1.16 kB весит) useWindowSize, пример:

    <script setup lang="ts">
    import { useWindowSize } from '@vueuse/core'
    const { width, height } = useWindowSize()
    
    function checkChapter(idFromEvent) {
      if (width < 1228) {
        // ...
      }
    }
    </script>
    
    <template>
      <p>{{ width }} x {{ height }}</p>
    </template>
    Ответ написан
    Комментировать