• Как в systemD запустить программу на Python в виртуальном окружении?

    grantur5707
    @grantur5707
    Vova316, а сама команда вручную у вас корректно выполняется от имени пользователя pi?
    sudo -u pi /home/pi/www/env/bin/python3 /home/pi/www/run.py

    Возможно проблема с правами доступа к скрипту.

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

    sudo chown -R pi:pi /home/pi/www
    sudo chmod -R 755 /home/pi/www

    Чтобы уж точно проверить, что проблема связана с правами пользователя, попробуйте временно запустить сервис от имени root:

    [Service]
    User=root

    Если это работает, проблема, скорее всего, связана с правами пользователя pi.
    Написано
  • Когда лучше использовать cms?

    grantur5707
    @grantur5707
    Adamos, парадокс в том, что на ларе я довольно мало коммерческих проектов разрабатывал, даже напротив, занимался в большей мере исключительно доработками, а единичным проектом был для себя. Делали админку для хранения критически важных данных по платежам, персональных данных пользователей. В тот момент была весомая причина, чтобы выбрать лару в угоду безопасности. Но вопрос то первоначальный был про CMS. Несмотря на то, что было много случаев взлома сайтов на битриксе, всё же сейчас не мало крупных проектов на нём используются и поддерживаются по сей день.
    Написано
  • Как отправить длинное SMS с помощью SMPP?

    grantur5707
    @grantur5707
    szQocks, так что за предъява мне я не понимаю?) Если ты не знаешь сразу несколько языков, это не значит, что другой не может их знать. Да, я не привык выкладываться сразу же на гит после завершения очередного проекта, и что с того?
    Написано
  • Как отправить длинное SMS с помощью SMPP?

    grantur5707
    @grantur5707
    szQocks, всё, что нужно, написано и так в документации https://www.npmjs.com/package/smpp
    Я предоставил лишь общее решение, позволяющее отправлять длинные сообщения. Насколько я знаю, поддержка отправки длинных сообщений в данной либе отсутствует
    Написано
  • Как сделать чтобы sphinx выдавал сперва точные совпадения а потом остальные?

    grantur5707
    @grantur5707
    djacode, смотря на конфиг я вижу вы его особо не трогали. Могу посоветовать использовать морфологию лемматизации, которая может быть точнее для сложных языков, как русский

    morphology = lemmatize_ru_all, lemmatize_en_all

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

    SELECT * 
    FROM bitrix 
    WHERE MATCH('сто лет') 
    OPTION ranker = SPH_RANK_PROXIMITY_BM25 
    ORDER BY custom_rank DESC, rank DESC, date_change DESC;
    Написано
  • Как сделать чтобы sphinx выдавал сперва точные совпадения а потом остальные?

    grantur5707
    @grantur5707
    djacode, ранжирование происходит динамически на основе выбранного алгоритма ранжирования (ranker) и зависит от многих факторов, таких как количество совпадений, близость слов, их частота и т.д. Каждому документу, подходящему под запрос, присваивается "вес" (в данном случае - rank), который и используется для сортировки результатов.

    Когда вы выполняете запрос в Sphinx, механизм ранжирования учитывает несколько факторов:
    - Частота совпадений. Чем больше терминов запроса встречается в документе, тем выше его релевантность.
    - Близость совпадений. Чем ближе друг к другу находятся термины из запроса, тем выше оценка релевантности. Например, в запросе "сто лет" документы, где эти слова находятся рядом, будут иметь более высокий ранг.
    - Позиция терминов. Если термины запроса находятся в начале документа, документ может быть оценен выше.
    - Полнотекстовая релевантность. Различные алгоритмы ранжирования используют специфические подходы для вычисления релевантности. Например, в BM25 используется статистический подход, учитывающий, насколько часто слово встречается в документе по сравнению с другими документами.

    ranker - это алгоритм, который используется для вычисления значения ранка для каждого документа. Sphinx поддерживает несколько ранкеров, например:

    SPH_RANK_PROXIMITY_BM25: Комбинация близости терминов и статистической модели BM25.
    SPH_RANK_BM25: Статистическая модель, основанная на частоте терминов в документе и коллекции.
    SPH_RANK_NONE: Не использует ранжирование, результаты выводятся без оценки релевантности.
    SPH_RANK_MATCHANY: Оценивает совпадение любых терминов в документе.

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

    Например, когда у вас есть запрос "сто лет", и вы сортируете по custom_rank DESC, rank DESC, date_change DESC, это значит, что сначала Sphinx отсортирует результаты по пользовательскому весу (custom_rank), затем по значению ранка, которое он вычисляет динамически для каждого документа на основе выбранного алгоритма ранжирования, и уже в последнюю очередь - по дате изменения (date_change).
    Написано
  • Как исправить ошибку отключения распознавания речи?

    grantur5707
    @grantur5707
    Timurkaaa, пардон, недоглядел... Тогда всё очень просто получается, в основном программе ничего не меняем, оставляем .run, но в commands/explorer.py разделяем процесс запуска команды и воспроизведения звука:

    import pyautogui
    import pyglet
    import threading
    
    # Открытие проводника
    def open_explorer():
        pyautogui.hotkey('win', 'e')
    
    def play_sound():
        song = pyglet.media.load('speak/yes.mp3')
        song.play()
        pyglet.app.run()
    
    threading.Thread(target=play_sound).start()
    
    open_explorer()
    
    print("[F.R.I.D.A.Y]: Запрос выполнен")
    Написано
  • Как исправить ошибку отключения распознавания речи?

    grantur5707
    @grantur5707
    Vindicar, тогда нужно заменить .run на .Popen(), чтобы не блокировался основной поток и команда работала асинхронно
    Написано
  • Возможно ли включить сортировку во время touchstart?

    grantur5707
    @grantur5707
    Кирилл Белаш, добавьте дополнительное предотвращение стандартных действий браузера для событий touchstart и contextmenu

    var sortable = new Sortable(listElement, {
        animation: 150,
        onStart: function (evt) {
            console.log('Начало сортировки');
        }
    });
    
    let isDragging = false;
    let initialTouch = null;
    let moved = false;
    
    listElement.addEventListener('contextmenu', function (e) {
        e.preventDefault();
    });
    
    listElement.addEventListener('touchstart', function (e) {
        initialTouch = e.touches[0];
        isDragging = false;
        moved = false;
    }, { passive: true });
    
    listElement.addEventListener('touchmove', function (e) {
        let touch = e.touches[0];
        let deltaX = Math.abs(touch.clientX - initialTouch.clientX);
        let deltaY = Math.abs(touch.clientY - initialTouch.clientY);
    
        if (!isDragging && (deltaX > 10 || deltaY > 10)) {
            isDragging = true;
            moved = true;
            e.preventDefault();
            sortable.option("disabled", false);
        }
    }, { passive: false });
    
    listElement.addEventListener('touchend', function () {
        if (moved) {
            isDragging = false;
            sortable.option("disabled", true);
        }
        moved = false;
    }, { passive: true });
    Написано
  • Как сделать чтобы sphinx выдавал сперва точные совпадения а потом остальные?

    grantur5707
    @grantur5707
    djacode, переиндексация тоже имеет смысл, если вы хотите улучшить качество поиска на уровне самого индекса и использовать более точные алгоритмы ранжирования. Обратите внимание на то, какие методы ранжирования поддерживает Sphinx. Правильность выбора ранкера может значительно повлиять на результаты поиска.
    Написано
  • Как удалить Content-Security-Policy?

    grantur5707
    @grantur5707
    samael228, вы используете неправильный синтаксис директивы CSP. В частности, символ * не может быть использован перед доменом, как в случае *.game-analytics.ru, когда вы пытаетесь добавить этот источник в child-src
    Написано
  • Возможно ли включить сортировку во время touchstart?

    grantur5707
    @grantur5707
    Кирилл Белаш, используйте preventdefault в комбинации с проверкой движения пальца, чтобы не блокировать прокрутку страницы. Можно также включать и отключать сортировку на основе движения пальца, чтобы предотвратить случайное блокирование. Или на крайняк использовать пассивные обработчики для touchstart и touchmove, которые позволяют браузеру управлять событиями лучше, не блокируя стандартное поведение.

    var sortable = new Sortable(listElement, {
        animation: 150,
        onStart: function (evt) {
            console.log('Начало сортировки');
        }
    });
    
    let isDragging = false;
    let initialTouch = null;
    let moved = false;
    
    listElement.addEventListener('touchstart', function (e) {
        initialTouch = e.touches[0];
        isDragging = false;
        moved = false;
    }, { passive: true });
    
    listElement.addEventListener('touchmove', function (e) {
        let touch = e.touches[0];
        let deltaX = Math.abs(touch.clientX - initialTouch.clientX);
        let deltaY = Math.abs(touch.clientY - initialTouch.clientY);
    
        if (!isDragging && (deltaX > 10 || deltaY > 10)) {
            isDragging = true;
            moved = true;
            e.preventDefault();
            sortable.option("disabled", false);
        }
    }, { passive: false });
    
    listElement.addEventListener('touchend', function () {
        if (moved) {
            isDragging = false;
            sortable.option("disabled", true);
        }
        moved = false;
    }, { passive: true });
    Написано
  • Возможно ли включить сортировку во время touchstart?

    grantur5707
    @grantur5707
    Пардон, спутал с другой библиотекой. Тогда придётся по-другому действовать. Поскольку sortable.js не поддерживает явное начало сортировки на touchstart, можно запустить сортировку при касании, используя логику из событий touchmove и touchend:

    var sortable = new Sortable(listElement, {
        animation: 150,
        onStart: function (evt) {
            console.log('Начало сортировки');
        }
    });
    
    let isDragging = false;
    let initialTouch = null;
    
    listElement.addEventListener('touchstart', function (e) {
        initialTouch = e.touches[0];
        isDragging = false;
    });
    
    listElement.addEventListener('touchmove', function (e) {
        if (!isDragging) {
            let touch = e.touches[0];
            let deltaX = Math.abs(touch.clientX - initialTouch.clientX);
            let deltaY = Math.abs(touch.clientY - initialTouch.clientY);
            
            if (deltaX > 10 || deltaY > 10) {
                isDragging = true;
                sortable.option("disabled", false);
            }
        }
    });
    
    listElement.addEventListener('touchend', function () {
        isDragging = false;
        sortable.option("disabled", true);
    });
    Написано
  • Как подключить своего бота к аккаунту тг для автоответов?

    grantur5707
    @grantur5707
    Ttpzy, подключение бота через Telegram Business не означает, что сам бизнес-аккаунт начнёт автоматически отвечать за бота. Проверьте права и настройки бота. Бот должен быть правильно настроен на получение сообщений. Если используется webhook, убедитесь, что сервер, на котором развернут бот, доступен и корректно обрабатывает запросы от Telegram.
    Написано
  • PHP Отправка xml в EDI kontur через API?

    grantur5707
    @grantur5707
    wyw1204, А вы уверены, что структура исходных данных должна быть xml? Для начала стоит разобраться какой исходный контент быть до преобразования в байты.
    Написано
  • Как отключить автоматическое завершение работы браузера при выходе из функции в Playwright?

    grantur5707
    @grantur5707
    Дмитрий Зеленев, Пожалуйста)
    Потому что его экземпляр чаще всего нужен только для первоначальной инициализации браузера, после чего сам Playwright больше не используется напрямую в вашем коде
    Написано
  • Как вытаскивать cookie на java+selenide?

    grantur5707
    @grantur5707
    Daria, укажите более свежую версию Selenium в зависимостях:

    dependencies {
        testImplementation 'com.codeborne:selenide:7.2.0'
        testImplementation 'org.seleniumhq.selenium:selenium-java:4.4.0'
    }


    Вместо Selenide.getWebDriver() попробуйте использовать WebDriverRunner.getWebDriver() для получения экземпляра WebDrive:

    import com.codeborne.selenide.WebDriverRunner;
    import org.openqa.selenium.Cookie;
    
    // ...
    
    Set<Cookie> cookies = WebDriverRunner.getWebDriver().manage().getCookies();
    
    for (Cookie cookie : cookies) {
        if (cookie.getName().equals("refresh")) {
            String refreshToken = cookie.getValue();
            System.out.println("Refresh Token: " + refreshToken);
        }
    }
    Написано
  • Тесты в django. Не создается задача через форму, на локал хосте все работает как надо. Что исправить?

    grantur5707
    @grantur5707
    sramis, А вы точно используете правильное имя URL в reverse()? В первом случае вы используете 'task:task_create', а во втором 'task_create'. Это может приводить к тому, что reverse('task_create') не находит нужный URL. Если в вашем urls.py имя URL задано как 'task:task_create', то измените строку в тесте на:

    response = self.client.post(reverse('task:task_create'), form_data, follow=True)


    Вы также можете добавить отладку ошибок формы в ответе:

    if 'form' in response.context:
            form = response.context['form']
            print("Form errors:", form.errors)
        else:
            print("No form in response context")
    Написано