• Как решать подобные задачи?

    @romazhan
    1. Установи нижнюю границу длины круга равной 1 и верхнюю границу равной некоторому большому числу, например, 10^9. Можно выбрать любое подходящее значение в качестве верхней границы.
    2. Начни бинарный поиск, используя установленные границы. На каждой итерации вычисли среднее значение между нижней и верхней границами длины круга и выполни команду "run k" для этого значения.
    3. После каждой команды "run k" проверь, сколько кругов было пройдено с момента старта. Если количество кругов увеличилось, значит, длина круга была занижена, и ты можешь обновить нижнюю границу длины круга до среднего значения.
    4. Если количество кругов не изменилось, значит, длина круга была завышена, и ты можешь обновить верхнюю границу длины круга до среднего значения.
    5. Повторяй шаги 2-4 до тех пор, пока не будет достигнуто максимальное количество команд (100 в данном случае).
    Ответ написан
  • Как отобразить квадратом выделение нейронной сети?

    @romazhan
    Для отображения квадратом выделения нейронной сети в YOLO, вам нужно использовать функцию `predict`, которая принимает путь к изображению и возвращает список обнаруженных объектов с их координатами:
    from yolo import YOLO
    
    yolo = YOLO()
    
    image_path = "foto.png"
    
    detections = yolo.predict(image_path)
    
    for detection in detections:
        print(detection)
    Ответ написан
    2 комментария
  • FolderPicker открывает обычный FilePicker заместо выбора папки, как исправить?

    @romazhan
    Попробуйте:
    FolderBrowserDialog dialog = new FolderBrowserDialog();
    
    if (dialog.ShowDialog() == DialogResult.OK)
    {
            Console.WriteLine(dialog.SelectedPath);
    }
    Ответ написан
  • Как сделать фильтр слов в (TMP_)InputField?

    @romazhan
    Для реализации фильтра слов в `TMP_InputField` вы можете использовать регулярные выражения. Регулярные выражения позволяют искать в тексте определенные шаблоны символов, которые определяются с помощью специального синтаксиса.

    Для реализации фильтра в вашем случае нужно создать регулярное выражение, которое будет искать слова, которые вы хотите фильтровать. Например, чтобы удалить слово "лох" из текста, можно использовать следующее регулярное выражение: /\bлох\b/gi
    Это выражение ищет слово "лох" (без учета регистра, благодаря флагу "i"), находящееся отдельно от других слов. Символы "\b" обозначают границу слова.

    Чтобы воспользоваться регулярным выражением в вашем скрипте, вам нужно будет использовать класс `System.Text.RegularExpressions.Regex`:
    string inputText = "Привет, меня зовут Иван и я не лох";
    string pattern = @"/\bлох\b/gi";
    string replacement = "";
    string result = Regex.Replace(inputText, pattern, replacement);
    
    Debug.Log(result);
    Ответ написан
    Комментировать
  • Как сделать отслеживание врагов у игрока?

    @romazhan
    В функции `OnTriggerExit2D` вы пытаетесь удалить элемент из списка `enemes`, но сразу же обращаетесь к этому списку без проверки на пустоту. Следует добавить проверку на то, что список `eneme`s не пуст, перед обращением к элементам этого списка.

    По поводу ошибки `ArgumentOutOfRangeException`: возникает она, когда вы пытаетесь обратиться к элементу списка по индексу, который выходит за пределы размера этого списка. Например, если у вас есть список из трех элементов, то допустимые индексы будут от 0 до 2. При обращении к элементу с индексом 3 будет возникать ошибка.

    Чтобы исправить эту ошибку, нужно проверять, что список `enemes` не пуст и что индекс, по которому вы обращаетесь к элементу, находится в допустимом диапазоне. В функции `PlayerVision` нужно проверять, что список `enemes` не пуст перед тем, как обращаться к элементам этого списка. Например, так:
    if (enemes.Count > 0) {
        target = enemes[0];
        Distance = Vector3.Distance(enemes[0].transform.position, transform.position);
        SeeEnemy = true;
        if (enemes.Count >= 2)
            for (int i = 1; i != enemes.Count; i++)
                if (Vector3.Distance(enemes[i].transform.position, transform.position) < Distance) {
                    Distance = Vector3.Distance(enemes[i].transform.position, transform.position);
                    target = enemes[i];
                }
    }

    В функции `OnTriggerExit2D` также стоит добавить проверку на то, что список `enemes` не пуст, перед обращением к элементам этого списка. Например, так:
    if (other.tag == "Enemy")
    {
        enemes.Remove(other.gameObject);
        if (enemes.Count == 0) {
            transform.parent.gameObject.GetComponent().NoTarget();
        } else {
            transform.parent.gameObject.GetComponent().PlayerVision(enemes);
        }
    }

    Проверьте также, что вы правильно указали тег "Enemy" у вражеских объектов, чтобы условие `if (other.tag == "Enemy")` выполнялось только при встрече с врагами.
    Ответ написан
  • Как по компоненту определить GameObject?

    @romazhan
    Для того, чтобы получить объект `GameObject`, ассоциированный с коллайдером, вы можете использовать свойство `gameObject` класса `Collider2D`:
    Collider2D[] Player = Physics2D.OverlapCircleAll(attackPos.position, attackRange, player);
    for (int i = 0; i < Player.Length; i++)
    {
      GameObject playerObject = Player[i].gameObject;
      playerObject.GetComponent<SomeComponent>().TakeDamage(damage);
    }

    В данном случае вы также должны указать тип компонента, который вы хотите получить, так как функция `GetComponent` возвращает объект типа `Component` В данном случае это может быть, например, компонент `SomeComponent`, который содержит функцию `TakeDamage`.

    Почему ваш код работает, хотя вы не указываете тип компонента? Вероятно, у вас в проекте есть класс, наследуемый от `MonoBehaviour`, с именем "SomeComponent", который содержит функцию `TakeDamage`. В таком случае функция `GetComponent` вернет экземпляр этого класса, и вы сможете вызвать функцию `TakeDamage`. Однако это не является наиболее рекомендуемым способом написания кода, так как такой подход не обеспечивает типизацию и может привести к ошибкам в рантайме. Лучше явно указывать тип компонента, чтобы избежать подобных ошибок.
    Ответ написан
  • Как исправить undefined method observe()?

    @romazhan
    Возможно, вы используете устаревшую версию Laravel. В старых версиях Laravel использовался метод `observe` для регистрации наблюдателя модели. В более новых версиях этот метод был удален и заменен на использование сервис-провайдера.

    Чтобы исправить эту ошибку, вам нужно будет удалить строку `UserObserver::observe(User::class)`; из файла `AppServiceProvider` и заменить ее на следующую:
    User::observe(UserObserver::class);

    После этого необходимо будет перезапустить сервис, который реализует автозагрузку сервис-провайдеров (обычно это команда `php artisan serve`).
    Ответ написан
  • Как сделать так чтобы при незаполненном инпуте пользователь переходил на другую страницу?

    @romazhan
    В качестве примера, у вас может быть форма с инпутами, которые обрабатываются в функции `handleSubmit`, которая вызывается при клике на кнопку `submit`. В функции `handleSubmit`, вы можете проверить, заполнены ли инпуты, и если нет, выполнить редирект на специальную страницу ошибок.
    import { useHistory } from 'react-router-dom';
    
    function handleSubmit(event) {
      event.preventDefault();
    
      // Получаем значения из инпутов
      const input1 = event.target.input1.value;
      const input2 = event.target.input2.value;
    
      // Проверяем, заполнены ли инпуты
      if (!input1 || !input2) {
        // Если нет, выполняем редирект на специальную страницу ошибок
        const history = useHistory();
        history.push('/error');
        return;
      }
    
      // Если инпуты заполнены...
    }
    
    render() {
        return (
            <form onSubmit={handleSubmit}>
                <input name="input1" />
                <input name="input2" />
                <button type="submit">Submit</button>
            </form>
        )
    }
    Ответ написан
  • Как правильно сделать сообщение "Сейчас играет" при каждом новом треке?

    @romazhan
    Ошибка указывает, что возникла проблема при запуске функции `Song.my_after` с помощью `asyncio.run`. Возможно, эта функция не является асинхронной, или вы не находитесь в асинхронном контексте при вызове `init_after`.

    Попробуйте обернуть `Song.my_after` в `asyncio.create_task`, чтобы запустить ее как асинхронное задание:
    async def init_after(ctx):
        asyncio.create_task(Song.my_after(ctx))

    Вы можете запустить только асинхронные функции с помощью `create_task`. Если `Song.my_after` является синхронной функцией, вам нужно будет преобразовать ее в асинхронную с помощью декоратора `@asyncio.coroutine`, или с помощью `async def` в Python 3.5 и выше.

    Чтобы отправлять сообщение «Сейчас играет» при каждом новом треке, вы можете добавить отправку сообщения в функцию `play`, которую вы написали:
    async def play(ctx):
        # ...
        await ctx.send("Сейчас играет: {}".format(names[0]))

    Также вы можете отправлять это сообщение в функции `init_after`, которая вызывается после окончания воспроизведения текущего трека:
    async def init_after(ctx):
        # ...
        await ctx.send("Сейчас играет: {}".format(names[0]))
    Ответ написан
  • Как сделать авторизацию в WPF приложении?

    @romazhan
    Да.

    Чтобы реализовать систему авторизации, вам нужно будет сделать следующее:
    -
    Создайте удаленную базу данных MySQL и таблицу, хранящую информацию о пользователях (логины и пароли).
    -
    В вашем WPF приложении создайте окно авторизации с полями для ввода логина и пароля.
    -
    При нажатии на кнопку "Войти" приложение должно отправлять запрос к удаленной базе данных, чтобы проверить, существует ли пользователь с указанными данными.
    -

    Если пользователь существует, приложение должно сохранить информацию о нем в переменную (например, в сессии) и открыть главное окно приложения. Если пользователь не существует, приложение должно вывести сообщение об ошибке.

    Чтобы подключиться к удаленной базе данных MySQL из C#, вам нужно будет установить нужный пакет NuGet. В качестве пакета можете использовать MySql.Data. После установки пакета вы сможете подключиться к удаленной базе данных с помощью кода, похожего на следующий:
    using MySql.Data.MySqlClient;
    
    string connectionString = "server=yourserver;user id=yourusername;password=yourpassword;database=yourdatabase";
    
    MySqlConnection connection = new MySqlConnection(connectionString);
    connection.Open();
    Ответ написан
    Комментировать
  • Почему не поднимается cloudflare wireguard туннель на linux debian 11, и во время запуска этого туннеля отключается интернет?

    @romazhan
    Похоже, что у вас проблема с настройкой туннеля WireGuard. Во-первых, проверьте, что вы указали правильное имя интерфейса WireGuard (`wgcf`) в своих правилах фаервола. Во-вторых, убедитесь, что вы указали правильный адрес сервера WireGuard (`engage.cloudflareclient.com:2408`) в конфигурации туннеля. Также убедитесь, что ваш клиент и сервер имеют совместимые версии WireGuard.

    Если у вас есть другие интерфейсы, такие как `wwan0`, убедитесь, что вы разрешили доступ к туннелю WireGuard через эти интерфейсы. Для этого вам может понадобиться добавить правила фаервола, которые разрешают пакеты, направленные на порты WireGuard (13231, 51820 или другой).
    Ответ написан
  • Нужно ли передавать значения свойствам класса в конструкторе?

    @romazhan
    В этом случае нет необходимости явно инициализировать свойства в теле конструктора.
    Ответ написан
    2 комментария
  • Как соцсети формируют ленту новостей?

    @romazhan
    Алгоритм выдачи новостей, который может учитывать рекламные посты, слайдеры и приоритеты выдачи, состоит в том, чтобы дать каждому посту некую "весовую" оценку, а затем отсортировать новости по этой оценке.

    Например, вы можете присваивать некий базовый "вес" каждому посту в зависимости от его типа (рекламный пост, слайдер, обычный пост и т.д.). Затем вы можете учитывать дату публикации и присваивать больший вес более свежим постам. Также вы можете учитывать приоритет выдачи и присваивать больший вес постам с большим приоритетом.

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

    При использовании БД для хранения новостей, вам нужно будет придумать способ присваивания "весовой" оценки новостям. Это может быть сделано, например, через добавление дополнительного столбца в таблице с новостями, где будет храниться "весовая" оценка каждой новости. В зависимости от вашей реализации, эта оценка может быть целым числом, дробным числом или строкой. Например, вы можете создать столбец "priority" типа integer и хранить там целочисленный "вес" каждой новости. Чем больше это число, тем больший приоритет у новости.

    Что на счет алгоритма выдачи "веса"? Это довольно таки трудоемкая задача. Можно использовать разные подходы для формирования приоритета постов. Один из таких подходов - использование алгоритма баллов, который учитывает несколько факторов, таких как:
    • Время публикации: чем новее пост, тем выше его приоритет.
    • Количество лайков, репостов, комментариев: чем больше активности вокруг поста, тем выше его приоритет.
    • Пользователь, опубликовавший пост: если это популярный пользователь, то его посты могут иметь более высокий приоритет.

    Учитывайте эти и другие факторы при расчете баллов для каждого поста. Например, вы можете присвоить баллы следующим образом:
    • Новый пост: +10 баллов
    • Каждый лайк: +1 балл
    • Каждый репост: +3 балла
    • Каждый комментарий: +5 баллов

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

    @romazhan
    Вызов функции `jsDo` из тега `a` с использованием атрибута `onclick` работает только если функция объявлена в области видимости, в которой выполняется обработчик события `click`. Это означает, что если функция `jsDo` объявлена в модуле, то она не будет доступна для вызова из разметки HTML.

    Одна из возможных реализаций с учетом ООП - это создание экземпляра класса с нужными методами, в которые можно передавать необходимые параметры, и обработка события `click` у тега `a` через вызов этих методов.

    Например, можно создать класс `PopupHandler`, содержащий метод `open`, который будет отвечать за обработку нажатия на ссылку:
    class PopupHandler {
      private ajax: Ajax;
    
      constructor() {
        this.ajax = new Ajax();
      }
    
      open(action: string, title: string): void {
        this.ajax.setRequest({ action, title });
        this.ajax.resultProcessing('.popup__ajax');
      }
    }
    
    const handler = new PopupHandler();

    Теперь вы можете использовать экземпляр класса `PopupHandler` для обработки события `click` у тега `a`:
    <a href="#popup" class="popup-link" onclick="handler.open('two', '#TWO')">Попап №2</a>

    Таким образом, функция `open` будет вызываться при каждом нажатии на ссылку, и вы можете использовать ее для обработки запроса с нужными параметрами.

    Класс `PopupHandler` должен быть объявлен в области видимости, доступной из разметки HTML. Это может быть файл, подключенный к странице через тег script, или модуль, импортируемый с помощью директивы `import`.
    Ответ написан
    1 комментарий
  • Как извлечь ресурсы добавляемые через EmbeddedResources.Add на другой стороне?

    @romazhan
    Вам нужно использовать класс Assembly и метод GetManifestResourceStream. Например, чтобы получить поток данных для встроенного ресурса с именем mainVoice.mp3, вы можете использовать следующий код:
    Assembly assembly = Assembly.LoadFrom(@"путь к скомпилированному файлу");
    Stream stream = assembly.GetManifestResourceStream("mainVoice.mp3");

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

    Важно указать имя ресурса с учетом того, что он может быть вложен в папку ресурсов. Например: (folder/resource) Resources/mainVoice.mp3 -> Resources.mainVoice.mp3.

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

    Чтобы скопировать поток в массив байтов:
    using (MemoryStream memoryStream = new MemoryStream())
    {
        stream.CopyTo(memoryStream);
        byte[] resourceBytes = memoryStream.ToArray();
    }

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

    Также можно использовать класс StreamReader для чтения ресурса из потока данных. Например, чтобы считать ресурс как текстовую строку:
    using (StreamReader reader = new StreamReader(stream))
    {
        string resourceText = reader.ReadToEnd();
    }
    Ответ написан
    1 комментарий
  • Где хранить глобальный стейт приложения, написанного на Винформах?

    @romazhan
    Для хранения глобального стейта приложения существует несколько вариантов:
    1. Хранение в статических переменных: Вы можете хранить глобальный стейт в статических переменных класса. Этот вариант хорошо подходит, если глобальный стейт нужен для всего приложения и не изменяется. Однако, статические переменные могут быть небезопасными в многопоточном окружении (риск неочевидных проблем с тестированием).
    2. Хранение в инстансе главной формы: этот вариант может быть хорошим выбором, если глобальный стейт используется только в рамках главной формы и доступ к нему, из других частей приложения, не требуется. Однако, этот вариант не очень хорош, если главная форма не существует или не открыта.
    3. Использование DI-контейнера: этот вариант может быть хорошим выбором, если Вы используете DI в своем приложении. Вы можете регистрировать ваш синглтон-провайдер базы данных и другие глобальные переменные в контейнере DI и получать доступ к ним из любой части приложения с помощью зависимостей. Я считаю этот вариант самым лучшим, так как он позволяет следовать принципу единственной ответственности, упрощает тестирование, улучшает возможности масштабирования и расширения приложения.

    Важно понимать, что нужно соблюдать соглашения об использовании глобального стейта в рамках вашего приложения и обеспечивать правильное синхронизирование доступа к нему в многопоточном окружении. В общем случае, если Ваше приложение сложное и использует DI, то использование DI-контейнера для хранения глобального стейта может быть хорошим выбором. Этот вариант позволяет управлять зависимостями и обеспечивает хорошую масштабируемость и расширяемость.
    Ответ написан
    Комментировать
  • Как отрисовать шаблон в custom element при повторной вставке на страницу?

    @romazhan Автор вопроса
    Use cloneNode, it should work:
    connectedCallback() {
        return this._shadow.appendChild(this._template.cloneNode(true));
    }
    Ответ написан
    Комментировать
  • Как печатать текст перед input() в Python?

    @romazhan Автор вопроса
    #-*- coding: utf-8 -*-
    from threading import Thread
    from time import sleep
    
    
    def counter() -> None:
        i = 0
        while(True):
            sleep(0.8)
            i += 1
            print(i)
    
    def cmd() -> None:
        while(True):
            print(f'\x1b[FCommand: {input()}')
    
    Thread(target=counter).start()
    Thread(target=cmd).start()

    Видимо только так.
    Ответ написан
    Комментировать
  • Как проверить наличие метода в интерфейсе?

    @romazhan Автор вопроса
    method_exists(InterfaceName::class, "methodName");
    Ответ написан
    Комментировать
  • Как использовать уже натренированный перцептрон?

    @romazhan Автор вопроса
    Уже понял. Рассчитать результат нового случая можно так: `sigmoid(dot(new_case, weights))`, где `dot()` - скалярное произведение входных данных с весами.
    Ответ написан
    Комментировать