Задать вопрос
  • Как красиво использовать динамически подгружаемый API?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Вот те простой хэлпер для ленивой загрузки одной функции:
    function lazyAsync(lib) {
      let promise;
      return async function (...args) {
        promise ??= lib();
    
        return (await promise).call(this, ...args);
      };
    }
    
    const doSomething = lazyAsync(async () => {
      // тут загружаем
      const doSomething = await loadLib('doSomething');
    
      // тут что-то делаем с загруженным
    
      // тут возвращаем конечную функцию
      return data => {
        // тут делаем с аргументами
        return doSomething.process(imgData);
      };
    });
    
    // если сразу загружается нужная функция - можно не усложнять
    const doSomething = lazyAsync(loadDoSomethingProcess);
    
    await doSomething(1);
    await doSomething(2);
    await doSomething(3);
    Ответ написан
    Комментировать
  • Как добавить авторизацию в каждый последующий запрос коллекции Postman?

    petermzg
    @petermzg
    Самый лучший программист
    66b377a8d838f387114270.png
    66b377c874caf398469806.png
    var res = pm.response.json();
    pm.environment.set('token', res.token);

    66b377dacc9ab075006401.png
    Ответ написан
    Комментировать
  • Не будет ли процессор i5-9400f "бутылочным горлышком" для видеокарты 3060ti?

    Wispik
    @Wispik
    Не будет
    Ответ написан
    Комментировать
  • Как вложить span в textarea?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Никак.
    Textarea - зона текста, там может быть только текст.
    Если хотите большего - есть только три варианта, два - геморройные, с кучей коссбраузерных несовместимостей и особенностей, которые обязательно заставят вас рвать волосы на заднице:
    1. Отказаться от textarea и использовать contentEditable div.
    2. Подкладывать под(или поверх с pointer-events:none) div, который копирует содержимое textarea 1:1 со всеми стилями и отступами и раскрашивает его как надо.

    ...и третий, рекомендуемый лично мной:
    3. Использовать одну из долгоживущих готовых библиотек, в которых всё давно отладили и предоставили удобные интерфейсы.
    Ответ написан
    3 комментария
  • Задача про часы, почему решается именно так?

    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 Team для вашего 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).

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