Задать вопрос
  • Как заставить MutationObserver адекватно срабатывать?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Именно из-за таких как ты отказались от удобного слушателя событий изменения элементов, и придумали наблюдатель.
    Разница? Наблюдатель наблюдает и изредка, когда это не повлияет на скорость работы страницы, сбрасывает весь список изменений. В отличии от слушателя, который слушает каждое событие изменения.

    Так делать нельзя, категорически. Это бессмысленная тяжёлая нагрузка. Ты вызываешь изменения стиля своей функцией, вот из этой функции и производи иные изменения. Тебе не нужны наблюдатели и события для этого.
    Ответ написан
    2 комментария
  • Как разбить массив на части PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    в цикле
    все операции над массивами производятся в цикле
    для перебора массивов в РНР используется оператор foreach
    Ответ написан
    Комментировать
  • Как выравнять img по вертикали в grid?

    Ankhena
    @Ankhena Куратор тега HTML
    Нежно люблю верстку
    Уберите у картинок display grid, у них нет содержимого, не из чего строить сетку.
    А родителю задайте display flex.

    p.s. id это идентификатор, его нельзя применять к разным элементам.
    id="border-grid" вы используете много раз, а можно только 1.
    Используйте для этого классы.
    id для стилизации лучше вообще не использовать.
    Ответ написан
    Комментировать
  • Почему во Vue.js не отображается разметка Schema.org?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    Потому, что сервер возвращает пустую страницу (то что видят боты) а интерфейс регенируется уже на клиенте средствами JavaScript. Чтобы боты видели интерфейс, его желательно сгенерировать на сервере и уже после отправлять в браузер.
    Читайте про Server Side Rendering Vue
    Ответ написан
    3 комментария
  • Зачем требуются различные СУБД, если можно использовать структуры данных языка, например словари и списки в питоне?

    @zexer
    1. Ядро СУБД работает с данными в иной структуре, нежели вы работаете со списками и всякими кортежами.
    СУБД может обрабатывать сильно больше данных и сильно быстрее, чем вы делаете это в питоне, как минимум благодаря индексам (почитайте про индексы).
    2. Кроме того, ваши множества и кортежи надо где-то хранить, где? В виде .txt или .json файлика на компе? Не кажется ли вам, что это немного не надежно?
    3. В БД можно выставить множество ограничений и проверок, например на уникальность данных (чтобы у каждого человека был свой id), на то, чтобы поступающие данные соответствовали нужным типам, проверки на NULL значения, как вы все это будете делать через файлики .txt?
    4. В БД есть понятие транзакции, чего ваши файлики вам разумеется тоже не дадут.
    5. Данные с помощью СУБД легко читать, так как они представлены в табличной форме, к ним удобно применять фильтрации, сортировки, различные соединения таблиц между собой.
    6. И еще десяток различных преимуществ, о которых даже нет смысла рассказывать.
    Ответ написан
    Комментировать
  • Как правильно подключить свой класс через конструкцию use?

    @PetrPo
    // здесь я думаю не правильно указано имя класса ORM с которым работает DayorderHelper в методе GetElement

    Правильно думаешь))
    5f6c89996a4d8519558914.jpeg
    Ответ написан
    Комментировать
  • Как защитить форму отправки писем от ботов и 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 в режиме дампа.
    Ответ написан
    Комментировать