Задать вопрос
  • Как защитить форму отправки писем от ботов и XSS?

    Не изобретайте велосипед , поставьте invisible recaptcha ...

    Если все таки аж распирает от велосипедостроения вшейте пиксель в css или js который будет являться тем кто запишет в сессию пользователя флаг бот это или нет

    Ваш js модуль песполезен, такие фильтрации надо делать на бекенде
    Ответ написан
    2 комментария
  • Почему не удаляется событие?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    проблем с удалением событий не было
    Разве?
    В обоих вариантах обработчики не будут удаляться.
    В removeEventListener нужно передавать тот же самый listener, что и был передан в addEventListener.
    Обратите внимание, что именно не такой же, а тот же самый.
    ТО есть вот так удалится:
    const listener = event => console.log(event);
    element.addEventListener('click', listener);
    element.removeEventListener('click', listener);

    А так уже нет:
    element.addEventListener('click', event => console.log(event));
    element.removeEventListener('click', event => console.log(event));
    ибо это 2 разные функции, не смотря на то, что делают одно и то же, и одинаковы до каждого символа.

    P.S.
    когда программировал в функциональном стиле
    то что в обоих Ваших примерах - это процедурный стиль. От того что Вы завернули код в класс - он не становится ООП, как и то что написали набор функции - не ФП.
    Ответ написан
    6 комментариев
  • Где найти дорожную карту по изучению Линукса?

    Zoominger
    @Zoominger Куратор тега Системное администрирование
    System Integrator
    Идёте в фирму, где используется Linux.
    Устраиваетесь админом.
    Решаете поставленные задачи.
    Всё. Никакие роадмапы не предусмотрят весь тот стек, с которым вы, возможно, будете работать.
    Ответ написан
    Комментировать
  • Как на javascript замерить время выполнения функции (в наносекундах)?

    Robur
    @Robur
    Знаю больше чем это необходимо
    точное время выполнения одного вызова функции получить довольно сложно.

    во первых - performance.now возвращает дробное число, поэтому там в принципе может быть наносекундная точность. однако стандарт определяет что точность должна быть 5 микросекунд. Плюс браузеры могут специально занижать точность чтобы бороться с некоторыми атаками.

    поэтому правильно вызывать функцию много раз и считать среднее.
    так же в ноде есть process.hrtime которая дает наносекунды.

    оба этих метода "в лоб" не дадут нормального результата. Почему? потому что в реальности происходит много всего интересного при выполнении кода.

    в движке есть неимоверное количество оптимизаций, и функция вызванная 10 раз будет иметь совершенно другой код чем функция вызванная 100 раз. То же касается и типов параметров - например вы можете передавать целые или дробные числа.
    На одну вашу написанную js-функцию движок сгенерирует несколько функций которые это реализуют. У этих функций может быть совершенно разный код с разной произодительностью.

    Переключение происходит на лету и в общем виде вы не знаете когда это происходит.

    поэтому само по себе замерение скорости "функции" имеет мало смысла, так как там их несколько внутри. Если интересны детали - погуглите JIT, AOT и v8 optimizations.
    Сейчас важно то что есть "холодные" функции которые работают медленее но надеждее и как правило используются сразу и есть "горячие" варианты, которые компилятор начинает использовать когда видит что код вызван много раз, и условия не меняются. "Горячие" работают быстрее.

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

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

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

    И тут самый главный момент - даже если вы замерите эту скорость, что вы будете делать с этим знанием? В реальной программе при выполнении этого кода скорость может быть совсем не такая как вы намеряли. Эти тесты годятся только для своего общего развития

    На практике имеет смысл измерять скорость у функций которые выполняются намного дольше И там где это создает проблемы. погуглите термин "преждевременная оптимизация".
    В этом случае обычно понятно что создает задержки и измерить время работы одного вызова не составляет труда.
    Если же функция работат так быстро что вы не можете понять насколько именно, то вряд ли вам потребуется это выяснять.

    Для практических задач в браузере есть профайлер, если нужно выяснить что же тормозит в конкретном коде, правильнее всего начать с него.
    Ответ написан
    5 комментариев
  • Как установить kali linux второй системой на андроид телефон?

    CityCat4
    @CityCat4
    Дома с переломом ноги
    Никак. Если кто-то спрашивает "как поставить kali" - она ему не только не нужна, она ему категорически противопоказана.

    Доспехи не делают пейзанина рыцарем.
    Kali не делает нуба "хакиром"
    Ответ написан
    Комментировать
  • Данные списка показать снова в детальном виде?

    @VegasChickiChicki
    Использовать vuex или передавать на другую страницу через props.
    Ответ написан
    Комментировать
  • Кто на моём ПК сливает информацию о моём железе - БРАУЗЕРУ?

    DevMan
    @DevMan
    и где узрета инфа о железе?

    разрешение экрана, очевидно, вполне доступно браузеру, и, соответственно, жс. остальное железо/параметры никак не пострадало.
    Ответ написан
    9 комментариев
  • Почему при выполнении скрипта node.js увеличивается занятая RAM?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Давайте посмотрим, что Вы тут накодили... Я уберу Ваши комментарии из кода и добавлю свои:
    const setup = {port:8000}
    const express = require ('express');
    const puppeteer = require('puppeteer');
    
    const app = express ();
    
    app.get('/', (req, res) => {
        const url = req.query.url;
    
        // вот тут Вы на каждый запрос создаете весьма тяжелую функцию
        // в ней 203 AST ноды
        // и она жрет в среднем 220КБ оперативы
        // (node: 14.4.0; v8: 8.1.307.31-node.33, мерил через process.memoryUsage().heapUsed)
        let scrape = async () => {
    
            // а еще на каждый запрос запускам новый браузер
            // у ноды это особо памяти не отнимет, а вот у системы - прилично
            const browser = await puppeteer.launch({args: ['--no-sandbox']});
            const page = await browser.newPage();
    
            // еще и разрешаем запросу из браузера жить вечно
            // если конечно сервак не оборвет коннект
            await page.setDefaultNavigationTimeout(0);
    
            await page.setUserAgent('Mozilla/5.0 (Linux; Android 7.0; NEM-L51) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.81 Mobile Safari/537.36');
            await page.setViewport({width: 375, height: 812});
    
            // куда мы отправляем браузер?
            // переменная url у нас из req.query.url - а следовательно начинается с /
            // то есть без хоста и протокола...
            await page.goto(url);
    
            // что-то мне подсказывает, что это работает не совсем так
            // как Вы ожидаете
            // https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageevaluatepagefunction-args
            // читаем: If the function passed to the page.evaluate returns a non-Serializable value, then page.evaluate resolves to undefined
            const bottomSheet = await page.evaluate(() => {
                return document.querySelector('div[data-marker="bottom-sheet"]');
            });
    
            // так как undefined !== null данное условие всегда истинно
            if (bottomSheet !== null) {
                // здесь по идее придет Promise.reject который мы не ловим (об этом ниже)
                await page.click('div[data-marker="bottom-sheet"] button');
            }
    
            // и еще раз... ловите доку на нужный метод:
            // https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageselector
            const phoneButton = await page.evaluate(() => {
                return document.querySelector('a[data-marker="item-contact-bar/call"]');
            });
    
            // всегда ложное условие...
            if (phoneButton === null) {
                await browser.close();
                return false; // ...с return внутри...
            }
    
            // еще 1 способ зависнуть (дефолтный таймаут 30 сек)
            await page.waitForSelector('a[data-marker="item-contact-bar/call"]');
    
            await page.click('a[data-marker="item-contact-bar/call"]');
    
            try {
                await page.waitForSelector('span[data-marker="phone-popup/phone-number"]');
            } catch (e) {
                await browser.close();
                return false;
            }
    
    
            const result = await page.evaluate(() => {
                console.log('phone', document.querySelector('span[data-marker="phone-popup/phone-number"]'));
                return document.querySelector('span[data-marker="phone-popup/phone-number"]').innerHTML;
    
            });
    
            await browser.close();
            return result;
    
        };
    
        // не ловим reject промиса
        // и в случае reject не завершаем запрос
        // и он тоже висит в памяти
        scrape().then((value) => {
            console.log(value);
            if (value === false)
                res.send(500);
            // при value === false будет запись в закрытый поток... (или у express есть защита от дурака?)
            res.send(value);
            // абсолютно бесполезное действие...
            scrape = null;
        });
    });
    
    
    app.get('/test', (req, res) => {
        res.send('Тест');
    });
    
    app.listen(setup.port, () => {
        console.log('Сервер: порт %s - старт!', setup.port);
    });
    Ответ написан
    1 комментарий
  • Как запретить доступ для юзеров с VPN?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    От накручивания не баны впнов помогают, а верификация. Например, по номеру телефона.
    Ответ написан
    2 комментария
  • Как сделать автоматический парсер?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    1. Как спарсить не последнюю новость, а любую (например, предпоследнюю)

    Логично, что нужно найти все новости, и выбрать предпоследнюю

    2. И как сделать проверку новых новостей, чтобы программа понимала, что вышла новая новость и сразу парсила её.

    А как вы понимаете, что новость новая? Скорее всего вы помните название последней новости, и при обновлении страницы опять находите последнюю статью, и сравниваете название с тем, которое помните? Неожидано, но для бота все точно так же. Находите последнюю на текущий момент статью -> сохраняете ее название в переменной -> через Х времени заново находите последнюю новость, и сравниваете названия.

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

    Все правильно, вы один раз получили код страницы, и больше его не обновляли
    html = requests.get("https://www.rbc.ru/short_news")
    Ответ написан
    Комментировать
  • Как передать значние input и изменить его в модальном окне?

    0xD34F
    @0xD34F Куратор тега Vue.js
    editTask (task, index) {

    v-model="editidTask.title"

    task.title = this.editTask.title

    Вижу, имена свойств/методов подобраны грамотно - перепутать невозможно.

    this.tasks.map((task, index) => {
      if (index === this.editidTask.id) {

    Во-первых - зачем перебирать массив, если вам известен индекс элемента? Кстати, очень умно - хранить индекс в свойстве с именем "id".

    Во-вторых - не боитесь обновить что-то не то? Работаете с массивом tasks, используя индекс, полученный при работе с tasksFiltered.

    UPD. Исправляем:

    При сохранении копируем свойства редактируемого объекта, а не метода, начинающего процесс редактирования (серьёзно, как можно было перепутать?).

    К чёрту индекс, всё равно удалять с его помощью не получится - для этого нужен индекс в исходном массиве, а не отфильтрованном. Ищем нужный элемент непосредственно в момент сохранения.

    Напрямую к заявленной проблеме не относится, но сказать стоит:

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

    <list

    Почему list, если этот компонент работает с одним элементом массива? Не понимаете, в чём разница между "один" и "несколько"?

    :tasks="task"

    Почему tasks, если передаёте один объект? Повторю свой вопрос - не понимаете, в чём разница между "один" и "несколько"?

    :key="task.title"

    Что, одинаковых title'ов быть не может? Может. Пусть здесь вместо вводимого пользователем текста будет автоматически генерируемый id.

    v-show="isModal"

    Отдельное свойство для управления состоянием модального окна не нужно, достаточно редактируемого объекта - окно открывается, если он не null.

    task.date = this.editTask.date
    task.title = this.editTask.title

    Завтра потребуется редактировать третье свойство - будете копипастить? Перечислять вручную ничего не надо, есть же Object.assign.
    Ответ написан
  • Как вы изучаете языки программирования и технологические стеки БЫСТРО?

    Zoominger
    @Zoominger Куратор тега IT-образование
    System Integrator
    начинать с курсов ... а доки приберечь на потом

    Это вы-то не новичок? Только новички пренебрегают официальной документацией от разработчиков, предпочитая курсики или убогонькую литературу, которая пересказывает ту же документацию, привязав её к таким же убогим частным случаям. Изучая частное, вы будете обезьянкой (я сейчас не про веб, честное слово, просто другого слова нет), которая надрессировалась делать что-то определённое, а на другой задаче растеряется.

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

    Zoominger
    @Zoominger
    System Integrator
    WireShark в режиме дампа.
    Ответ написан
    Комментировать
  • Как находить быстро и много нужной информации?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    учись искать, и все получится

    больше практики

    Гугл и Яша избаловали пониманием человеческого языка, а вот не надо вестись
    Ответ написан
    Комментировать
  • Возможно ли создание онлайн образовательного портала через платформу WIX?

    glaphire
    @glaphire
    PHP developer
    На сайте wix описаны возможные варианты сайтов, которые на нем можно создать - https://ru.wix.com/features/main
    Упоминается возможность просмотра только для юзеров wix, создание магазина и дописывание проекта с помощью node.js. На практике можно наткнуться на множество ограничений, поэтому надежнее писать кастомное решение на своем хостинге или искать платформу с конкретно таким функционалом, нп. Patreon позволяет управлять доступом к видео по ежемесячной подписке.
    Ответ написан
    Комментировать
  • Возможно ли создание онлайн образовательного портала через платформу WIX?

    ArsenyMatytsyn
    @ArsenyMatytsyn
    Руководитель frontend направления, предприниматель
    Образовательный портал, в его нормальном смысле это дорого, долго, и постоянные доработки по улучшению сервиса. А ключевое слово — сервис. Сервисы создаются руками разработчиков, а не конструкторами.

    Я молчу про безопасность проекта и прочие вытекающие в необходимость, к примеру, иметь свою БД под тайной семи печатей.
    Ответ написан
    Комментировать
  • Как включить команды Git в консоли Windows?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    GitHub - это сторонний клиент. Он почти ничего общего не имеет с командой git.
    Для установки git нужно установить, как ни странно, git!

    https://git-scm.com/downloads

    Или командой winget install git
    Ответ написан
    1 комментарий
  • Почему Windows сообщает "Нет доступа" при копировании файлов, хотя я админ?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    ОС понимает, что сейчас все кругом с правами админа и все поголовно *диоты. Вот и запрашивает подтверждение, чтобы вы *ерни не наворотили.

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

    @Qualiant
    Судя по формулировке вопроса, вам пока что рановато реализовывать такие вещи.
    А ответ на ваш вопрос растянется на десятки тысяч символов.
    Ответ написан
    Комментировать