Задать вопрос
  • Задача про часы, почему решается именно так?

    HarisNvr
    @HarisNvr
    Начинающий кодер Python
    60 * 24 — это общее количество минут в одном дне (24 часа по 60 минут).

    n % (60 * 24) — это количество минут, оставшееся после деления на полное количество минут в одном дне. Это позволяет нам получить количество минут в пределах одного дня. Вдруг заданное кол-во минут будет больше одного дня, часы сделают полный оборот и встанут на 00:00.

    // 60 — делит количество оставшихся минут на 60, чтобы получить количество часов. Здесь используется целочисленное деление, которое отбрасывает дробную часть.

    minutes = n % 60 вычисляет количество минут, оставшихся после деления на 60. Это будет то количество минут в последнем (неполном) часе.
    Ответ написан
    Комментировать
  • Задача про часы, почему решается именно так?

    hours = n % (60 * 24) // 60
    minutes = n % 60


    Допустим n = 2000 минут

    1. 60 * 24 = 1440
    — это общее количество минут в сутках. Работаем с минутами, т.к. твоё число "n" в минутах.

    2. 2000 % 1440 = 560
    Остаток от деления (%) твоего "n" на общее количества минут в сутках, так как суток может быть несколько, если число "n" велико.

    3. 560 // 60 = 9
    Оставшееся значение минут поделено целочисленным делением на 60 (//60), чтобы узнать значение для часов, поэтому сколько бы минут небыло, у тебя останется только целая часть - часы.

    4. 2000 % 60 = 20
    С минутами наоборот — часы нам не нужны, поэтому просто получаем остаток от деления на 60, сокращая часы. Остаются только минуты.

    Время на часах 9:20
    Ответ написан
    Комментировать
  • Как предотвратить имитацию запросов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Здесь в вопросе - 2 разных вопроса. Мне кажется так:
    1) Как защититься от любого мусора который прилетает с клиента. Скорее всего никак.
    Нужно реагировать только на HTTP запросы которые имеют смысл в контексте пользовательской
    сессии. Тут - как-бы бизнес логика и FSM для сессии должен все решать. Хакеры с помощью
    wget, curl, python могут генерировать фаззингом миллионы самых вариативных запросов
    в поиске вашего слабого места в этой части защиты.

    2) Как защититься от атаки man-in-the-middle.. Это если легальный пользователь
    зашел в свой клиент банк, а некто, кто физически сидит на канале может перехватывать
    IP пакеты. Изменять их. Удалять. Задерживать на какое-то время или делать повторы.
    Здесь коробочное решение это https (TLS/SSL) протокол по идее помогает.
    Ответ написан
    Комментировать
  • Как предотвратить имитацию запросов?

    Elaryks
    @Elaryks
    Да, сымитировать запрос можно. Поэтому есть правило: "Нельзя доверять данным, которые приходят с клиента". Следовательно, данные с клиента нужно проверять на сервере. Критические данные и операции нужно подписывать или хэшировать, чтобы избежать подмены. Например, для защиты от Replay Attack используют одноразовые токены — при повторном запросе токен уже не сработает.
    Ответ написан
    4 комментария
  • Какие могут быть способы определения автоматизации Selenium?

    kshnkvn
    @kshnkvn Автор вопроса
    yay ✌️ t.me/kshnkvn
    Перепробовал кучу разных вариантов, вот что из них может сработать для кого-то (не для меня):
    1. Очень сомнительно, но некоторые люди пишут, что для них это работало:
    Изменение название переменной документа js, используемой Selenium - $cdc_. Для этого достаточно открыть файл chromedriver.exe в любом шестнадцатеричном редакторе (я использовал HxD) изменить её название на любое другое. Это не сработало для меня, но сам chromedriver работает нормально после этого. Так-же я пробовал изменить все переменные где есть слова driver, но это была плохая идея - chromedriver перестал запускать. Без изменения исходников тут точно не обойтись, но я не уверен что это может сработать.
    2. Это более действующий вариант, который даёт хоть какой-то результат. На этой странице можно определить используется chromedriver, или нет и при запуске этой страницы через selenium действительно отображается, что используется webdriver. Добавление следующего куска кода помогло обойти эту идентификацию:
    options.add_experimental_option("excludeSwitches", ['enable-automation'])

    Но это всё-равно не помогло мне.
    Так-же нашел очень сомнительное и вероятнее всего просто нерабочее решение:
    Запуск js-кода, который меняет состояние переменных navigator, включая navigator.webdriver.
    Так он запускается:
    driver.execute_script("var s=window.document.createElement('script'); s.src='javascript.js';window.document.head.appendChild(s);")

    Сам js-код
    // overwrite the 'languages' property to use a custom getter
    const setProperty = () => {
        Object.defineProperty(navigator, "languages", {
            get: function() {
                return ["en-US", "en", "es"];
            }
        });
    
        // Overwrite the 'plugins' property to use a custom getter.
        Object.defineProperty(navigator, 'plugins', {
            get: () => [1, 2, 3, 4, 5],
        });
    
        // Pass the Webdriver test
        Object.defineProperty(navigator, 'webdriver', {
          get: () => false,
        });
        callback();
    };
    setProperty();

    Ерунда в том, что в Chrome вообще отсутствует переменная navigator.webdriver, в этом можно убедиться вводом navigator в консоли браузера, её там нет. Зато эта переменная есть в Firefox, но этот код её не меняет, т.е. он просто ничего не делает, значение переменной Firefox navigator.webdriver всегда равно true при запуске через selenium. В обычном (ручном) режиме она false.

    UPD. Не знаю, как проглядел, но в конечном итоге всё уперлось в проверку reCAPTCHA v3. Эта проверка проходится практически всегда при следующих условиях:
    1. Не используется User-Agent.
    2. Не используется прокси.
    3. Не отключаются уведомления.
    4. Не блокируются запросы на разрешения.
    4. Используется вот этот параметр:
    options.add_experimental_option("excludeSwitches", ['enable-automation'])

    Но при таких параметрах зарегистрировать более одного раза с одного IP не представляется возможным. Как я и указывал в своём вопросе - прокси использовал совершенно разные - от паблик до микро-серверов google cloud, так что дело не в "качестве" прокси а сугубо в факте его использования.
    Ответ написан
    Комментировать
  • Вопрос с собеседования на Java Бекенд. Как гарантировать согласованность операций?

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

    Основная идея заключается в том, что нужно как-то обеспечить транзакционнлсть при общении с левым сервисом.

    Самый простой и часто используемый вариант - Outbox.

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

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

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

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

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

    66ab5b548e5a9142225375.png

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

    2ord
    @2ord
    Это про валюту? Ее нельзя представлять при помощи Float64. Это противопоказано в любых ЯП.

    Просто используй строку.
    Для работы с валютой есть пакеты. Допустим, см. здесь.
    Ответ написан
    Комментировать
  • Как реализовать models для сущностей разных по атрибутному составу?

    @Everything_is_bad
    Вопрос всплывает 100500 раз, есть очень общее решение EAV, в это же время это одна из проблем производительности. Так что в итоге все приходят к своим промежуточный решениям на основе EAV, например в postgresql, часто это через денормализация через jsonb. С другой стороны у тебя мало типов и атрибутов, возможно и "чистый" EAV не будет тормозить.
    Ответ написан
    2 комментария
  • Какой язык программирования лучше для создания асинхронного api и асинхронной работы с бд?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    С таким подходом по задаче - любой.
    Хотите конкретики - пишите конкретику.
    Большие потоки данных очень растяжимое понятие. Кому-то и 100 мб большой поток, кому-то терабайт средненький.
    Тут вообще вопрос не про язык, а про архитектуру, потому что можно даже на батниках написать сервис, и будет работать, если его правильно масштабировать.
    Ответ написан
    4 комментария
  • Как выбрать записи, для которых записи в связанной таблице не равны значению?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Буквально так и пишется дай messages для который нет вот таких
    select ... from messages where not exists (select from comments where comments.message_id = messages.id and comments.author_id = 100);
    Ответ написан
    Комментировать
  • Почему VLC прекращает запись через 22 минуты?

    anthtml
    @anthtml
    Системный администратор программист радиолюбитель
    А в какой формат пишете? Помню раньше на цифровых фотоаппаратах было ограничение 24мин на файл из-за того что какой-то кодек толи mp4 толи h264 требовал дорогой лицензии, а в бесплатной версии предоставлял максимум такое время.
    Ответ написан
    1 комментарий
  • Сколько оперативной нужно веб серверу?

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вопрос должен звучать так -
    Купил ли пользователь лицензию или достаточное число лицензий?


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

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

    Вырожденный и достаточно простой способ реализации - запуск всего приложения на своем сервере с предоставлением удаленного доступа (например по ms rdp) и тщательной настройкой рабочего места пользователя на сервере в режиме киоск (что бы нельзя было получить доступ к файлам программы для их копирования).

    Все иные простые способы будет взломаны, как только это кому либо понадобится достаточно сильно.
    Ответ написан
    Комментировать
  • Почему babel использует метод concat() вместо оператора "+"?

    0xD34F
    @0xD34F Куратор тега JavaScript
    ...или есть какой-то скрытый от меня смысл?

    Есть:

    It will handle cases with Symbol.toPrimitive correctly and throw correctly if template literal expression is a Symbol(). See babel/babel#5791.
    Ответ написан
    1 комментарий
  • Разграничение файлов пользователей в s3 хранилищах?

    kawabanga
    @kawabanga
    Я начал использовать s3 не очень давно и у меня возник такой вопрос.

    Проверьте трафик ваш. S3 может оказаться дорогим решением.

    1/2) И подходит, и нет. Если кратко, у вас должно быть
    ?fileId=123 -> потом проверка доступа на этот файл -> потом отдача файла через ваш сервер ( не через прямую ссылку s3).

    А так, любое решение хранения файлов, и отдача через прокси.
    Ответ написан
    Комментировать
  • Шаблонизаторы Python?

    fenrir1121
    @fenrir1121
    Начни с документации
    Если не считать Django Templates на ум приходит только Mako.

    P.S. меня тоже интересует вопрос какой смысл скрывается за асинхронными шаблонизаторами и в чем проблема Jinja2
    Ответ написан
    Комментировать
  • Низкая скорость отдачи с VPS на конкретный хост?

    Vamp
    @Vamp
    Разница почти наверняка из-за неудачного маршрута PC2->PC1. Маршрут можно посмотреть командой traceroute или mtr (в ubuntu пакет называется mtr-tiny). Далее можно попробовать написать письмо в техподдержку хостера PC2, приложив трейсы (с обоих сторон) и результаты iperf3 (так же с обоих сторон). Тогда хостер может подправить маршрутизацию и скорость восстановится.
    Ответ написан
    5 комментариев
  • Чем заменить службу файлового сервера на Windows?

    VoidVolker
    @VoidVolker Куратор тега Windows
    Dark side eye. А у нас печеньки! А у вас?
    TrueNAS, правда там фряха, а не линукс, но так даже лучше, ИМХО. Куча фич и других плюшек.
    Ответ написан
    1 комментарий
  • PostgreSQL ON CONFLICT неожиданный токен?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега PostgreSQL
    Седой и строгий
    Потому что вы пытаетесь выполнить этот запрос на сервере MySQL.
    Ответ написан
    Комментировать