Задать вопрос
  • Сколько оперативной нужно веб серверу?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Зависит от того, какие сервисы будет обслуживать этот сервер и какую нагрузку эти сервисы будут создавать. Для каждого сервиса эти показатели уникальны. Да, для похожих сервисов они могут быть схожими при условном одинаковом качестве этих сервисов. А могут отличаться в десятки и сотни раз как раз из-за особенностей реализации и разного качества этих сервисов (и еще множества других параметров). Так что в вашем случае вам следует провести нагрузочное тестирование: создать создать нагрузку, более-менее похожую на настоящую и посмотреть что, где и какие ресурсы потребляет. И уже по результатам тестирования решать что делать дальше - оптимизацию, увеличение мощности сервера или еще что-то.
    Ответ написан
    Комментировать
  • Сколько оперативной нужно веб серверу?

    @historydev
    Редактирую файлы с непонятными расширениями
    Вопрос из разряда погадай на шарике.
    Каждый запрос может тянуть от одного до N действий за собой, помимо самого наличия этого запроса (сетевая карта), каждое действие аналогично может тянуть за собой другие действия.

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

    Следом умножаешь кол-во ресурсов на ожидаемое кол-во запросов, а кол-во запросов - это среднее кол-во запросов от обычного юзера твоего проекта.

    Допустим мы выяснили, что на один запрос тратится 100мб оперативной памяти, 0.1% диска и 5 секунд времени это всё занимает, у нас 10 пользователей и 20 запросов в минуту среднее.

    Средняя общее кол-во запросов: (10 * 20) = 200
    Средний расход диска: (0.1 * 200) = 20%
    Средний расход оперативной памяти: (100 * 200) = 20000
    Ответ написан
    Комментировать
  • Не могу решить задание ЕГЭ. Почему мой код не работает?

    Vindicar
    @Vindicar
    RTFM!
    Тебе выше правильно намекнули.
    Во-первых, нужно увидеть простую вещь: дописывание нуля в конец двоичного представления - это то же, что умножение на 2. Назовём это операция А. А дописывание единицы - то же, что умножение на 2 и прибавление 1. Назовём это операция Б. Таким образом, можно избавиться от двоичной системы в задании.

    Второе: операция А будет давать в результате только чётные числа, независимо от аргумента. Аналогично, операция Б будет давать только нечётные числа, независимо от аргумента.

    Третье: результат как операции А, так и операции Б всегда больше аргумента. Более того, больший аргумент даёт больший результат. Это легко показать.
    Пусть у нас есть число x. Результат операции A меньше, чем операции Б над тем же числом, поэтому мы должны проверить только один сценарий: когда к x применяется операция А, а к x - 1 - операция Б. Значит, x станет 2 * x, а x - 1 станет 2 * (x - 1) + 1 = 2 * x - 1. Т.е. для x - 1 результат меньше. Т.е. даже в таком, самом спорном случае, меньшее число даёт меньший результат

    Четвёртое: задачу можно решать задом наперёд. У нас есть целевые числа - значит, мы должны применить к ним алгоритм наоборот, чтобы получить исходные. Это и даст нам диапазон для поиска исходных чисел.

    Дальше уже проще. Смотрим на начало целевого диапазона, число 876 544. Оно чётное, значит, оно могло быть создано только операцией А. Значит, чтобы получить исходное число, нужно поделить его на 2. 876 544 / 2 = 438 272. Это число тоже чётное, оно тоже могло быть создано только операцией А. 438 272/ 2 = 219 136. Оно тоже чётное. Значит, третий раз применяем операцию А наоборот: 219 136 / 2 = 109 568. Исходя из пункта 3, можем сказать, что числа, меньше 109 568, не могут дать результат, больший или равный 876 544.

    Аналогично анализируем верхнюю границу целевого диапазона.
    1 234 567 899 = 2 * 617 283 949 + 1 (операция Б)
    617 283 949 = 2 * 308 641 974 + 1 (операция Б)
    308 641 974 = 2 * 154 320 987 (операция А)
    Значит, исходное число должно быть не более 154 320 987. Вот тебе и диапазон для поиска.
    А поскольку большие аргументы дают большие результаты, то это означает, что ни одно число меньше 154 320 987 не даст результат, который выйдет за верхнюю границу диапазона (1 234 567 899). Т.е. искомые числа - это весь диапазон от 109 568 до 154 320 987. Посчитать, сколько чисел в диапазоне, тривиально.
    Ответ написан
    Комментировать
  • Не могу решить задание ЕГЭ. Почему мой код не работает?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    Потому что 876544 / 8 = 109568. Любая математическая задача начинается с расчёта областей определения и значения.
    Ответ написан
    Комментировать
  • SQLite не хочет добавлять данные, введенные пользователем в тг боте в базу данных, что делать?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    INSERT INTO result(name) VALUES (ilya)
    Вы пытаетесь вставить в колонку name значение из колонки ilya. Строки должны быть в кавычках.
    Для защиты от SQL-инъекции нужно использовать плейсхолдеры
    - cur.execute(f'INSERT INTO result(name) VALUES ({data["Name"]})')
    - db.commit()
    - cur.execute(f'INSERT INTO result(name) VALUES({data['School_class']})')
    + cur.execute('INSERT INTO result(name, class) VALUES (?, ?)', (data["Name"], data['School_class']))
    Ответ написан
    Комментировать
  • Зачем кому-то собирать чужие поисковые запросы?

    mihavxc
    @mihavxc
    Описание не до конца понятно, но судя по всему кто-то от имени юзера делает запросы в Поисковик, чтобы собирать статистику на какой позиции в выдаче нужный сайт. Обычно такое через API запросы собирают, но там есть ограничения по количеству запросов.
    Ответ написан
    Комментировать
  • Где вы берете статистические данные?

    Maksim_64
    @Maksim_64
    Data Analyst
    Специалист который занимается, ответами на данный вопрос называется продуктовый аналитик. Основная их работа это выдвижение гипотез в условиях недостаточности данных. Иными словами сведение к математическому виду определенного утверждения.

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Абсолютно неважно, что было до интересующего вас события. Важно лишь сколько каких шаров было в мешке в момент события.
    Ответ написан
    6 комментариев
  • Как "зафиксировать" список в питоне?

    fenrir1121
    @fenrir1121
    Начни с документации
    Вернуться к изучению основ, разобраться как работают изменяемые объекты, что такое передача по ссылке и по значению, формулировать какую вообще задачу вы решаете подобным кодом.

    Сейчас вы ссылаетесь на один и тот же объект 3 раза, вместо создания нового объекта.
    Исправляется созданием плоской копии списка.
    lst = []
    l = []
    for i in range(3):
        l.append(i)
        lst.append(l[:])
    print(lst)
    Ответ написан
    Комментировать
  • Как поменять формат времени в сообщении discord бота?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Тебе нужен discord timestamp в формате Relative time
    Ответ написан
    1 комментарий
  • При нажатие на кнопку в telebot ни сего не происходит, проблема и её решение?

    Vindicar
    @Vindicar
    RTFM!
    @bot.callback_query_handler(func = lambda callback: True)

    Ты говоришь боту "если пользователь нажал кнопку, вызови функцию ниже, и делай это для любых кнопок" (func = lambda callback: True). Но у тебя в коде ДВЕ функции-обработчика, и обе говорят, что их надо вызывать для любых кнопок. Бот в таком случае вызывает только одну из них.
    Измени func так, чтобы она проверяла, какая кнопка нажата. Например, если укажешь
    func = lambda callback: callback.data == 'register'
    , то только кнопка, отдающая строку "register", будет вызывать срабатывание этой функции.

    Если тебе удобнее сделать выбор внутри функции, то можно сделать так:
    func = lambda callback: callback.data in ('faq', 'register')
    , тогда функция ниже будет вызвана при нажатии любой из двух кнопок, и тебе нужно будет внутри функции выбрать один из двух вариантов.

    В любом случае, нельзя допускать, чтобы у двух и более обработчиков проверка подходила под одну и ту же кнопку.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы intelephense не ругался на Auth::user()->save()?

    delphinpro
    @delphinpro
    frontend developer
    Найдите 10 отличий =)

    667d607210255741153864.png

    667d6079278b8291209444.png

    667d607f0d109127603243.png

    PS

    Правильнее вот такую аннотацию сделать

    /* @var null|\App\Models\User $user */
    $user = Auth::user();


    Всё-таки этот метод может и null вернуть.
    Ответ написан
    4 комментария
  • Обработка params ?fields в апи запросе для вывода в response?

    Vindicar
    @Vindicar
    RTFM!
    Рекурсивно делай. Опиши требуемую функцию:
    def filter_fields(obj: dict[str, ...], fields: list[str]) -> dict[str, ...]:
        """obj - фильтруемый словарь, fields - множество полей, которые надо оставить."""
        ...

    Проблема в том, что поля могут быть вложенным. Тогда первым делом составляешь набор нужных тебе полей верхнего уровня:
    top_level_fields = {}
    for f in fields:
        top, _, bottom = f.partition('.')
        top_level_fields.setdefault(top, [])
        if bottom is not None:
            top_level_fields[top].append(bottom)

    Для
    fields=['boardId', 'name', 'Data.Matches.t.id', 'Data.Matches.m']
    в top_level_fields получишь
    { 'boardId': [], 'name': [], 'Data': ['Matches.t.id', 'Matches.m']}

    Дальше перебираешь поля, собираешь их значения в один мешок и смотришь, есть ли для них нижележащие поля:
    output = {}
    for top, bottom in top_level_fields.items():
        if bottom:
            output[top] = filter_fields(obj[top], bottom)  # что делать, если ключа top нет?
        else:
            output[top] = obj[top]

    Таким образом наберёшь всё, что надо.
    Ответ написан
    Комментировать
  • Где найти ошибку в коде?

    Vindicar
    @Vindicar
    RTFM!
    Почитай про импорты в питоне, какой-нибудь толковый учебник (типа Лутца).
    Ты делаешь относительный импорт (import .something), но это можно использовать только в крупных модулях проекта, а не в корневых файлах. Импортируй как обычно, без точки.
    Ответ написан
    Комментировать
  • Как обрабатывать ошибки в асинхронном коде?

    Vindicar
    @Vindicar
    RTFM!
    try: 
        loop.create_task(exc())
    except ZeroDivisionError as ex:
        print(f"Ошибка {ex} обработана")

    1. Ты создаёшь задачу на базе корутины exc(). Созданная задача не выполнится немедленно, а только встанет в очередь исполнения (хотя в питоне 3.12 это поведение можно изменить, но по умолчанию это так). При этом с корутиной ассоциируется future-объект, который находится в состоянии "ожидание", так как корутина ещё не завершила работу.
    2. Ты проверяешь, не возникло ли исключение в процессе создания задачи. Это может произойти, только если exc() - не корутина. В остальных случаях операция будет успешна независимо от содержания exc(), так как см. пункт 1.
    3. Ты вызываешь loop.run_forever(). Рабочий цикл (loop) смотрит в очередь исполнения, и видит в нём только корутину exc(). Она получает управление.
    4. Корутина exc() выбрасывает исключение, но не ловит его. Ассоциированный с корутиной future-объект переходит из состояния "ожидание" в состояние "отказ", и сохраняет информацию об исключении. exc() завершает работу.
    5. Рабочий цикл проверяет, кто хранит ссылку на task - и понимает, что никто. Как следствие, даже в будущем никто не сможет узнать, что корутина выкинула исключение. Поскольку рабочий цикл - штука типовая, он понятия не имеет, что делала наша корутина и как надо реагировать на исключение в ней. А потому единственный вариант для него - написать в журнал работы о непойманном исключении и надеяться, что программист это увидит и поправит.
    task = asyncio.create_task(exc())
    try:
        # await asyncio.gather(task)  # <- gather() не нужно, если у тебя одна задача
        await task
    except ZeroDivisionError as ex:
        print(f"Ошибка {ex} обработана")

    1. Ты создаёшь задачу (успешно), а потом с помощью await-вызова просишь дождаться её завершения и получить результат.
    2. Корутина main() приостанавливает своё выполнение и сохраняет свой контекст, а также встаёт в очередь, ожидая, когда сработает future-объект, связанный с task.
    3. Рабочий цикл (loop) asyncio смотрит в очередь выполнения и видит, что корутина exc() готова выполняться (она не находится в await вызове, а только начала работу).
    4. Корутина exc() получает управление, выполняется, и генерирует исключение, которое не поймано внутри этой корутины. Future-объект, связанный с этой корутиной, переходит из состояния "ожидание" в состояние "отказ", и сохраняет информацию об исключении. Корутина exc() завершает выполнение. При этом о её future-объекте знает корутина main(), поэтому рабочий цикл не дёргается по этому поводу - у main() будет возможность отреагировать на происходящее.
    5. Рабочий цикл (loop) смотрит в очередь выполнения и видит, что там только корутина main(), причём она готова выполняться - future-объект, который она ждёт, более не находится в состоянии ожидания.
    6. Корутина main() получает управление и восстанавливает свой контекст, продолжая с того места, где она остановилась. Так как future-объект находится в состоянии "отказ", оператор await читает из него информацию об исключении и перевыбрасывает это исключение внутри main().
    7. Это исключение обрабатывается блоком try-except в main() как обычно.
    Ответ написан
    Комментировать
  • Какие способы бэкапа вы используете? Прошу несколько примеров с вашей работы или способов?

    888AndeR888
    @888AndeR888
    IT специалист
    Veem Backup and Replication Community Edition - бесплатна на 10 машин...
    Скрипт ghettoVCB - для ESXi.
    Также мой взор пал на UrBackup, но в бою не использовал, по обзорам классная...
    Ответ написан
    Комментировать
  • Какие способы бэкапа вы используете? Прошу несколько примеров с вашей работы или способов?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Ну, у нас используется Nakivo Backup & Replication. Сейчас его не купить, да и саппорт там просрочен, но работать он работает - бэкапит виртуалки, а также bare-metal винду и линуха.
    Древние системы как правило нужно сбэкапить один раз - туда никто обычно не вносит изменений. Для этого обычно она останавливается, винт вынимается и на нормальной машине делается его тупой посекторный образ через dd, котоый потом жмется bzip2. Потом при желании такой образ можно сконвертить в виртуальный диск для VBox например, для ESXi...
    Я таким образом например бэкапил FreeBSD, поставленную мной же, но... в 2006 году :) (А нужна она - не поверите - запускать эмулятор Netware, который в свою очередь нужен для запуска набора тестового софта, написанного в начале нулевых, исходники ессно утеряны, софт работает под DOS).
    Ответ написан
    Комментировать
  • Почему не работает pip install?

    @Everything_is_bad
    потому что pip внешняя утилита, не нужно ее запускать внутри среды выполнения
    Ответ написан
    3 комментария
  • Как обойти ошибку сервера Telegram при использовании метода answer_photo?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Чтобы отредактировать сообщение с фото нужно использовать edit_media, а не edit_text
    Ответ написан
    8 комментариев
  • Почему некоторые программисты на GO работают с бд на голом SQL без ORM?

    Не гошник, но расскажу в целом.
    1. На 1 уровень абстракции меньше. При работе с ORM нужно думать одновременно и об особенностях твоей ORM-ки и об особенностях базы.
    2. На сыром SQL некоторые вещи сделать проще, чем с ORM-ками.
    3. Лучше сырой SQL, чем тупая ORM-ка.
    4. Некоторые ORM-ки могут негативно влиять на производительность.

    Если тебе приходится при работе с ORM писать куски SQL-я (например для WHERE), передавать названия колонок в параметрах, и при этом ты не можешь использовать специфику твоей базы не опускаясь до уровня сырого SQL, то это плохая ORM.

    Нормальная орм-ка должна упрощать код и при этом не увеличивать пространство для ошибок.
    На сколько я знаю, Go не позволяет хорошую ORM-ку создать чисто из-за своего синтаксиса и системы типов.

    Нормальные ормки я пока видел только:
    1. В C# из-за Linq
    2. В Rust из-за макросов.
    Ответ написан
    8 комментариев