Задать вопрос
  • Какова временная сложность del[pos:] для списка в Python?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Сложность O(n).
    Если делать замеры для списков разных размеров, то увидим что время выполнения растёт линейно, что подтверждает сложность O(n).

    Если же сложность не O(1), то почему? Ведь перемещать ничего не надо.
    Удаление среза реализовано как проход по удаляемым элементам с вызовом Py_DECREF на каждый.

    З.Ы. чисто теоретически сложность O(1) может быть для крайнего случая с pos = 0, если целиком уничтожается вся структура (но так ли это в реальности надо проверять) и pos = n - 1.
    Ну и надо разделять абстрактную алгоритмику и конкретные бенчмарки.

    6867dce1a31c0265426845.png

    Код.
    import time
    import matplotlib.pyplot as plt
    
    
    def test_del_slice_complexity():
        sizes = [10 ** 3, 10 ** 4, 10 ** 5, 10 ** 6]
        times = []
    
        for n in sizes:
            # Создаем список
            my_list = [1] * n
    
            # Замеряем время удаления
            start_time = time.perf_counter()
            del my_list[n // 2:]  # Удаляем 50% элементов
            end_time = time.perf_counter()
    
            elapsed = end_time - start_time
            times.append(elapsed)
    
            print(f"n = {n:>7}: {elapsed:.6f} сек")
    
        # Визуализация результатов
        plt.figure(figsize=(10, 5))
        plt.plot(sizes, times, 'o-', label='Измеренное время')
        plt.plot(sizes, [times[0] * n / sizes[0] for n in sizes], '--', label='Ожидаемое линейное время')
        plt.xscale('log')
        plt.yscale('log')
        plt.xlabel('Размер списка (n)')
        plt.ylabel('Время выполнения (сек)')
        plt.title('Сложность операции del my_list[n//2:]')
        plt.legend()
        plt.grid(True)
        plt.show()
    
    
    if __name__ == "__main__":
        test_del_slice_complexity()
    Ответ написан
    4 комментария
  • Как сделать лог при удалении сообщений?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    В аудит лог не попадают сообщения об удалении, если это сделал сам автор.

    Читайте аудит лог (там написано кто (имеющий права на Manage Messages) удалил чьё сообщение из какого канала) и переписывайте это в отдельный канал, если вас не устраивает встроенный функционал просмотра лога, где всё это реализовано в удобном виде с фильтрами.
    Ответ написан
    Комментировать
  • Из-за ошибки текстовый файлик занимает всё свободное место на носителе, как это исправить?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Используйте loggingс ограничением размера лога параметром maxBytes, чтобы не изобретать велосипед.

    я включаю символ "\n" в функции get_nmea_datetime

    Где?
    Вы накапливаете данные в data, при появлении перевода строки записываете их. Но не добавляете '\n'.

    Ну и, вероятно, могут не выполняться условия выше data=''и оно может не обнуляться.

    З.Ы. ну и в целом: работайте с файлами через контекстный менеджер with, добавьте логирование и обработку исключений (для себя прежде всего), аннотации и комментарии к коду (для других), тем более, если он будет опубликован.
    Ответ написан
    2 комментария
  • Какую CMS использует сайт телешторм?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Использует Next.js, а откуда он получает данные вы вряд ли узнаете, если не спросите напрямую.
    Имхо, это может быть хоть markdown-файлики, хоть записи в Notion, хоть самописная CMS, хоть WordPress через API в режиме headless.
    Ответ написан
    Комментировать
  • Как исправить игнорирование кода при импорте в python?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Используйте коги: https://discordpy.readthedocs.io/en/stable/ext/com...

    main.py:
    import discord
    from discord.ext import commands
    
    intents = discord.Intents.default()
    intents.message_content = True
    
    bot = commands.Bot(command_prefix="!", intents=intents)
    
    async def load_extensions():
        await bot.load_extension("ticket")  # Загружаем Cog без .py
    
    @bot.event
    async def on_ready():
        print(f"Бот {bot.user} готов!")
        await load_extensions()
    
    bot.run("***")


    ticket.py:
    from discord.ext import commands
    
    class TicketsCog(commands.Cog):
        def __init__(self, bot):
            self.bot = bot
    
        @commands.command(name="systicket")
        async def systicket(self, ctx):
            """Обработка команды !systicket"""
            # логика команды
            await ctx.send("Система тикетов работает!")  # Пример ответа
    
    async def setup(bot):
        await bot.add_cog(TicketsCog(bot))  # Важно: await и новое API discord.py 2.0+
    Ответ написан
    Комментировать
  • Как создать/изменить примечание (Note) в Google.Sheets.API?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    from googleapiclient.discovery import build
    from google.oauth2 import service_account
    
    # Укажите путь к скачанному JSON-файлу сервисного аккаунта
    SERVICE_ACCOUNT_FILE = 'ваш_сервис_аккаунт_файл.json'
    
    # Настройка доступа
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE,
        scopes=['https://www.googleapis.com/auth/spreadsheets'])
    
    service = build('sheets', 'v4', credentials=credentials)
    
    def update_note(spreadsheet_id, sheet_name, cell, note_text):
        # Конвертация имени ячейки в индексы:
        col = ord(cell[0].upper()) - ord('A')
        row = int(cell[1:]) - 1
    
        # Получаем ИД листа:
        spreadsheet = service.spreadsheets().get(
            spreadsheetId=spreadsheet_id,
            fields="sheets(properties(sheetId,title))"
        ).execute()
    
        sheetId = [sheet['properties']['sheetId'] for sheet in spreadsheet['sheets'] if
                   sheet['properties']['title'] == sheet_name][0]
        print(sheetId)
    
        service.spreadsheets().batchUpdate(
            spreadsheetId=spreadsheet_id,
            body={
                "requests": [{
                    "updateCells": {
                        "range": {
                            "sheetId": sheetId,
                            "startRowIndex": row,
                            #"endRowIndex": row + 1,
                            "startColumnIndex": col,
                            #"endColumnIndex": col + 1
                        },
                        "rows": [{"values": [{"note": note_text}]}],
                        "fields": "note"
                    }
                }]
            }
        ).execute()
    
    
    # Использование:
    spreadsheetId = 'ваш ид таблицы'
    update_note(spreadsheetId, "Лист3", "B3", "Тестовое примечание.")


    З.Ы. Для "сложных" ячеек ("AA15" итд.), если у вас такие есть, перепишите конвертацию имени ячейки в индексы, текущая работать не будет корректно.

    Чтение примечания с ячейки:
    def read_note(spreadsheet_id, sheet_name, cell) -> str or None:
        response = service.spreadsheets().get(
            spreadsheetId=spreadsheet_id,
            ranges=[f"{sheet_name}!{cell}"],
            fields='sheets(data.rowData.values.note)'
        ).execute()
    
        note = (response
                .get('sheets', [{}])[0]
                .get('data', [{}])[0]
                .get('rowData', [{}])[0]
                .get('values', [{}])[0]
                .get('note'))
    
        return note
    
    # Использование:
    spreadsheetId = 'ваш ид таблицы'
    read_note(spreadsheetId, 'Лист3', 'B3')
    Ответ написан
    1 комментарий
  • Как поставить картинку под текст?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Типа такого?
    683c69607d63c316950911.png
    Код
    <?php
    require 'vendor/autoload.php';
    use PhpOffice\PhpWord\PhpWord;
    
    $phpWord = new PhpWord();
    $section = $phpWord->addSection();
    
    // 1. Сначала добавляем изображение как фон (первый слой)
    $section->addImage(
        __DIR__ . '/img/test.png',
        [
            'width' => 100, // Ширина изображения
            'height' => 100, // Высота изображения
            'wrappingStyle' => 'behind', // Ключевой параметр: изображение становится фоном
            'positioning' => 'relative', // Относительное позиционирование
            'posHorizontal' => \PhpOffice\PhpWord\Style\Image::POSITION_HORIZONTAL_CENTER,
            'posVertical' => \PhpOffice\PhpWord\Style\Image::POSITION_VERTICAL_TOP,
        ]
    );
    
    // 2. Затем добавляем текст (второй слой)
    $section->addText(
        'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam error doloribus doloremque voluptate natus, numquam laudantium ducimus cupiditate, cumque nulla fugit consectetur ipsam nobis illum enim. Rerum, nulla. Laborum, tempora?',
        [
            'name' => 'Arial',
        ],
        [
            //'alignment' => 'center', // Выравнивание текста по центру
            'spaceAfter' => 0,
        ]
    );
    
    $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, 'Word2007');
    $objWriter->save('layered.docx');
    echo "Текст наложен на изображение.";
    Ответ написан
    1 комментарий
  • Взаимодействие с базой данных при сборке файла exe?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    izma, не нужны танцы с бубнами...

    Сделал тестовую программку на Tk и sqlite3. Всё, ожидаемо, собирается.
    1. До БД должен быть абсолютный путь, используем:
    def get_db_path():
        if getattr(sys, 'frozen', False):
            # Если запущен из .exe, использовать путь рядом с исполняемым файлом
            return os.path.join(os.path.dirname(sys.executable), 'database.db')
        else:
            # При обычном запуске — рядом с .py файлом
            return os.path.join(os.path.dirname(__file__), 'database.db')

    2. Собираем: pyinstaller --onefile --windowed app.py
    3. Кладём базу рядом с exe-ником.

    З.Ы. Если база нужна только в режиме чтения можно её тоже интегрировать в exe.
    pyinstaller --onefile --add-data "database.db;." --windowed app.py
    Ответ написан
    2 комментария
  • Сборка python файла с расширением pyw в exe файл??

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Перенести сборку в папку с не таким длинным названием: D:\Yandex....(+100500 символов).
    Не использовать папку/файл с таким длинным названием.
    Ответ написан
    5 комментариев
  • Ошибка при работе Python + 1C?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    obj = rs.Справочники.Номенклатура.НайтипоКоду('0001')

    У вас метод неправильно написан: НайтиПоКоду().
    Ответ написан
    Комментировать
  • Как убрать украинский флаг leaflet с карт Openstreetmap?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    В leaflet.css в .leaflet-attribution-flag добавить display: none !important;.
    683783763cecc419277630.png
    Ответ написан
    Комментировать
  • Найти и декодировать base64 в тексте, как реализовать?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    В notepad++ есть плагин Mime Tools он умеет в Base64 decode. Регуляркой находите, плагином декодируете.
    Ответ написан
    Комментировать
  • Не работает машинка на радиоуправлении, что не так?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Явным образом устанавливаем состояние моторов в void setup():
    // Остановка моторов при запуске
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
      analogWrite(ENA, 0);
      analogWrite(ENB, 0);


    и если нет сигнала - останавливаем моторы в loop():
    void loop() {
      if (radio.available()) {
        int joystickData[2] = {0}; 
        radio.read(&joystickData, sizeof(joystickData));
        controlMotors(joystickData[0], joystickData[1]);
      } else {
        controlMotors(512, 512);  // Нейтральное положение джойстика
      }
    }
    Ответ написан
    Комментировать
  • Как заставить скрипт tampermonkey работать?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    // ==UserScript==
    // @name         New Userscript
    // @namespace    http://tampermonkey.net/
    // @version      2025-05-24
    // @description  try to take over the world!
    // @author       You
    // @match        https://store.steampowered.com/news/app/550
    // @icon         https://www.google.com/s2/favicons?sz=64&domain=steampowered.com
    // @grant        none
    // ==/UserScript==
    
    (function() {
        'use strict';
        function redOctober() {
            var textElements1 = document.querySelectorAll("#responsive_page_template_content > div.page_content_ctn > div > div > div > div > div > div > div > div > div > span");
            textElements1.forEach(function(element) {
                element.style.color = 'red';
            });
        }
        const observer = new MutationObserver(redOctober);
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    })();

    68321e92b64a6910039614.png
    Ответ написан
    Комментировать
  • Почему Powershell автоматически меняет кодировку кода в UTF-16 LE?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Ваш исходник: ReplaceHexBytesAll.ps1 содержит BOM, что мешает PowerShell выполнить скрипт.

    iex "ргуается" на комментарии в коде...

    Это на самом деле про BOM, а не комментарий.
    1. Вам следует удалить BOM: в Notepad++ пересохранить без BOM или в IDE:
    6824822b73416273864509.png
    2. Если хочется однострочник с передачей аргументов, как у вас в начале было:
    iex "& { $(irm 'https://raw.githubusercontent.com/Drovosek01/ReplaceHexPatcher/refs/heads/main/core/v2/ReplaceHexBytesAll.ps1') } -filePath 'C:\Users\dim5x\lol\lol.exe' -patterns '4883EC28BA2F????00??8D0DB0B7380A/11111111111111111111111111111111','C4 25 2A 0A 48 89 45 18 48 8D 55 18 48 8D 4D ?? / 1111 111111 111111 1111111111111111' -makeBackup -showMoreInfo -skipStopwatch -showFoundOffsetsInDecimal"

    682484db5fc42085278250.png

    З.Ы. Насколько целесообразно не сохранять скрипт, а выполнять его в памяти, если подразумевается его более чем однократное использование, — вопрос открытый.
    Ответ написан
  • Как через subprocess выполнять скрипты с пробелами в путях?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    subprocess.Popen(
        f'cmd /k ""{path_app}" "{path_file}""',
        creationflags=subprocess.CREATE_NEW_CONSOLE
    )

    68234e308f567451893958.png
    Ответ написан
    1 комментарий
  • Как автоматически заполнять форму на сайте?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    lukepker,
    1. Поставить Tampermonkey для вашего браузера.
    2. В Tampermonkey => Cоздать новый скрипт => Вставить скрипт => Сохранить.
    3. Перезагрузить https://chgk.tvigra.ru/sendquestion/ .

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

    Прочесть перед вставкой и поменять значения полей на свои:
    Скрипт.
    // ==UserScript==
    // @name         Автозаполнение формы на chgk.tvigra.ru
    // @namespace    http://tampermonkey.net/
    // @version      2025-05-05
    // @description  Автозаполнение формы на chgk.tvigra.ru/sendquestion
    // @author       dim5x
    // @match        https://chgk.tvigra.ru/sendquestion/
    // @icon         https://www.google.com/s2/favicons?sz=64&domain=tvigra.ru
    // @connect      i.pinimg.com
    // @grant        GM_xmlhttpRequest
    // ==/UserScript==
    
    (function() {
        'use strict';
        console.log('[DEBUG] Скрипт запущен!');
        // ФИО и дата рождения.
        const surname = document.querySelector('#surname');
        surname.value = 'Иванов';
        const name = document.querySelector('#name');
        name.value = 'Иван';
        const second_name = document.querySelector('#second_name');
        second_name.value = 'Иванович';
        const birth_date = document.querySelector('#birth_date');
        birth_date.value = '01.12.1980';
    
        // Загружаем фото.
        setTimeout(async () => {
            const fileInput = document.querySelector('input.upl[name="upl"]');
            if (!fileInput) return;
    
            // URL файла в интернете (пример - маленькое изображение).
            // Поставить в @connect в шапке тот домен, где будет лежать ваше фото. Для примера это i.pinimg.com .
            const fileUrl = 'https://i.pinimg.com/736x/57/11/9c/57119ce30030b98dcefab1662598f390.jpg';
            const fileName = 'image.jpg';
            const fileType = 'image/jpg';
    
            try {
                // Загружаем файл
                const response = await new Promise((resolve, reject) => {
                    GM_xmlhttpRequest({
                        method: 'GET',
                        url: fileUrl,
                        responseType: 'blob',
                        onload: resolve,
                        onerror: reject
                    });
                });
    
                // Создаем File объект
                const file = new File([response.response], fileName, { type: fileType });
    
                // Эмулируем загрузку
                const dt = new DataTransfer();
                dt.items.add(file);
                fileInput.files = dt.files;
    
                // Триггерим событие
                fileInput.dispatchEvent(new Event('change', { bubbles: true }));
            } catch (e) {
                console.error('Ошибка загрузки файла:', e);
            }
        }, 1000);
    
        // Место работы, должность, номер, мыло...
        const work_place = document.querySelector('#work_place');
        work_place.value = 'habr';
        const employment = document.querySelector('#employment');
        employment.value = 'TC';
        const home_address = document.querySelector('#home_address');
        home_address.value = 'Москва';
        const phone_number = document.querySelector('#phone_number');
        phone_number.value = '+79992223311';
        const email = document.querySelector('#email');
        email.value = 'email@email.email';
    
        // Галочка.
        const ruleLabel = document.querySelector('label.check_label')
        ruleLabel.click();
    })();
    Ответ написан
    Комментировать
  • Как добавить в дату, записанную в строке, нули перед месяцем и днём?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    d = '2025-2-1'
    l = d.split('-')
    for i, el in enumerate(l):
        if len(el) < 2:
            l[i] = '0' + el
    
    print('-'.join(l))
    Ответ написан
    1 комментарий
  • Как оставить в ячейке гугл таблиц только левую часть до определенного символа?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    =REGEXREPLACE(B1; "#.*"; "")
    6816dc3a05698842704085.png

    З.Ы. с REGEXEXTRACT:
    =REGEXEXTRACT(B1; "([^#]*)")
    Ответ написан
    2 комментария
  • Почему PHP считает int числа после математических операций как float?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    Поскольку 55 / 100 возвращает float, результат тоже будет float.

    Если нужно целое число, можно использовать intval()
    Ответ написан