• Как добавить класс элементу когда другой скрылся вверху?

    XanXanXan
    @XanXanXan
    const panel = document.querySelector("#panel");
    const button = document.querySelector("#button");
    
    const buttonObserverCallback = (entries) => {
      entries.forEach(entry => {
        const isButtonAbove = entry.boundingClientRect.bottom < 0;
        panel.classList.toggle("d-hide", isButtonAbove);
      });
    };
    
    const intersectionObserver = new IntersectionObserver(buttonObserverCallback, {  threshold: 0 });
    intersectionObserver.observe(button);
    Ответ написан
    1 комментарий
  • Как найти все HTML элементы, попадающие в область другого элемента?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно разбить на два этапа:
    1) Сначала подготавливаем массив элементов, - а именно считаем прямоугольную область каждого элемента. Теперь у нас массив прямоугольников. Исходя из того, что области меняться не будут, делаем кое-какие дополнительные вычисления для оптимизации этапа №2.
    2) При каждом выделении мышкой, решаем геометрическую задачу по поиску пересечений прямоугольников, которая уже не имеет прямого отношения к HTML, DOM и т.д.

    Навскидку могу предложить такое решение:

    Режем экран в виде невидимой сетки. Размеры ячеек вы выбираете сами. Пусть это будет сетка 10х10 ячеек. Для каждого элемента заранее считаем, в какие ячейки он попадает. То есть каждая ячейка - это массив ссылок на элементы, которые в неё попадают.

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

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

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

    Это был пример простой оптимизации, далёкой от совершенства.
    Ответ написан
    5 комментариев
  • Как нарисовать прямоугольник с дырками внутри?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Ответ написан
    Комментировать
  • Где есть годные БЕСПЛАТНЫЕ уроки для vue.js?

    @rd_nino
    программист-любитель
    Комментировать
  • Как диспетчер задач узнает что приложение не отвечает?

    KoyaKoya
    @KoyaKoya
    IT Lover
    Приложение получает события из очереди, предоставленной Windows.
    Если приложение не опрашивает очередь событий в течение некоторого времени (5 секунд), например, при длительном вычислении, то Windows предполагает, что приложение зависло, и предупреждает пользователя.
    Чтобы избежать этого, приложения должны передавать "тяжелые" вычисления рабочим потокам или разделять обработку и обеспечивать регулярный опрос очереди.
    Ответ написан
    1 комментарий
  • Как диспетчер задач узнает что приложение не отвечает?

    BormotunJedy
    @BormotunJedy
    Верстальщик
    В Windows (с Vista) реализован механизм Обход Цепочки ожидания (Wait Chain Traversal (WCT)), который при помощи специализированных функций позволяет выявлять взаимоблокировки процессов, работающих в системе. Цепочка ожидания - это причинно-следственная связь между событиями в системе, которая представляет собой последовательность чередующихся пар потоков и событий, каждый поток сопровождается событием, которого он ждет, а это событие, в свою очередь, сопровождается следующим потоком в цепочке, которому оно принадлежит, и так далее. Под событием в данном контексте мы подразумеваем любой тип объекта синхронизации, мьютекс, критическую секцию, COM, LPC/RPC-ответ, сообщения и прочее. Поток ждет событие начиная с момента, когда он его запрашивает и заканчивая моментом, когда он им овладевает. Блокировка находится в собственности потока с момента получения её потоком и до момента, когда он её освобождает. Понятие "владение блокировкой" подразумевает блокировку, ожидающую когда поток-владелец её освободит. Таким образом, если поток А ожидает блокировку, которой владеет поток Б, то можно смело утверждать, что поток А ждет поток Б. WCT позволяет запросить цепочку ожидания для одного или нескольких потоков путем создания сессии через использование функций WCT, таких как OpenThreadWaitChainSession, GetThreadWaitChain, EnumProcesses и GetThreadWaitChain.
    Ответ написан
    2 комментария
  • Как получить координаты точки, если известны координаты трёх других точек и расстояние от этих точек до искомой точки?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Вам просто надо пересечь 3 окружности на плоскости. По "формула пересечения окружностей" гуглится, например, это или это.

    Пересекайте 2 любые окружности и из двух получившихся точек пересечения выбирайте ту, которая лежит на третьей окружности.
    Ответ написан
    1 комментарий
  • Как добавить символ в середине строки?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    text[:34] + '\n' + text[34:]
    Ответ написан
    Комментировать
  • Как проверить, попадает ли географическая точка в правильный шестиугольник?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Вычтите координаты центра из координат точки. Теперь шестиугольник лежит центром в (0, 0).

    Составьте 6 уравнений сторон шестиугольника в виде Ax+By+C=0, так что C положительно (если нет - домножте на -1). Подставьте в эти 6 уравнений координаты точки, все они должны дать положительные значения (или нули, если точка на границе считается лежащей внутри в вашей задаче).

    Почему это работает? Мы просто проверяем, что точка лежит с той же стороны от всех 6 прямых, что и центр (0, 0).

    Как составить уравнения? Найдите координаты 6-ти углов. Если сторона = a, то координаты точек (a, 0), (a/2, sqrt(3)*a/2), (-a/2, sqrt(3)*a/2), (-a, 0) ...

    Для уравнения одной из сторон возьмите в виде A разность по у у соседних точек, а в виде B разность по x (но с другим знаком). Потом подставьте туда координаты одной из точек и возьмите C так, чтобы был 0.

    Можно все 6 уравнений составить на бумажке и закодировать в программе.

    Пример для первой стороны:
    A = sqrt(3)*a/2-0 = sqrt(3)*a/2
    B = a - a/2 = a/2
    C = -A*a - B*0 = -sqrt(3)*a*a/2.

    Поскольку C отрицательно, меняем знаки:
    A = -sqrt(3)*a/2
    B = -a/2
    C = sqrt(3)*a*a/2

    Для второй прямой будет 0*x-a*y+sqrt(3)*a*a/2 = 0

    И да, это работает, если предположить, что шестиугольник маленький или на плоскости. если у вас кривизна земли играет роль, то все сильно усложняется.
    Ответ написан
  • Как разделить слова точками?

    Kurokq
    @Kurokq
    Наполни смыслом каждое мгновенье
    2 комментария
  • Позднее статическое связывание php: как это работает?

    MegaMufa
    @MegaMufa
    Смотрите. Есть такая простая иерархия классов:
    class A
    {
        public static $text = 'class A';
    
        public function selfTest()
        {
            echo self::$text;
        }
    
        public function staticTest()
        {
            echo static::$text;
        }
    }
    
    class B extends A
    {
        public static $text = 'class B';
    }


    Мы создаем экземпляк субкласа и вызываем методы, определенные в предке.
    $obj = new B();
    $obj->selfTest(); // выведет "class A"
    $obj->staticTest(); // выведет "class B"

    self всегда указывает на тот класс, в котором он написал. Здесь метод описан в классе A, и self указывает на класс A, хоть и вызывается из класса B.
    Значение static вычисляется при вызове. И static указывает на класс объекта в котором произошел вызов. В нашем случае он указывает на B, хотя сам код описан в классе A.

    Зачем это надо? Для того, что бы можно было переопределять статичные члены вашего класса в наследниках и вы могли обращаться к новым значениям из методов, описанных в предке.

    С обычными не статичными членами это и так работает, потому что они собираются, когда вы создаете объект класса. Что бы это работало для статичных методов, надо использовать static
    Ответ написан
    1 комментарий
  • Попинайте. Работодатель сказал, что у меня код PHP устаревший. В чем именно проблемы?

    @galliard
    А я бы взял автора на работу. Да некоторые функции и конструкции синтаксиса устарели. Но при всех недочетах у его кода есть 2 весомых плюса:
    1. В нем нет серьезных архитектурных ошибок. Ну разве что die посреди логики, но это легко лечится заменой на эксепшн.
    2. Код понятный!!! Это вообще огромный плюс, который перекрывает все минусы.
    Ответ написан
    Комментировать
  • Почему при выполнении скрипта 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 комментарий
  • Как сформировать такой запрос curl php?

    qork
    @qork
    { background: #F00B42 }
    Ответ написан
    Комментировать
  • Очень хорошо знаю PHP - куда двигаться дальше?

    @anton99zel
    29а класс средней школы №7
    куда двигаться дальше в бэкенде?

    Вся проблема в том, что
    не горю желанием работать в фирмах
    Ответ написан
    Комментировать
  • Очень хорошо знаю PHP - куда двигаться дальше?

    Во-первых, мир PHP сильно шире, чем то, что вы описали.
    Например, умеете вы из PHP работать с
    - RabbitMQ
    - Redis
    -MongoDB
    - ElasticSearch
    Умеете писать автотесты?
    Умеете деплоить через Docker? Хоть один CI/CD?
    Если все ответы "нет", то могу вас обрадовать - вы знаете PHP не "очень хорошо", а средненько, и ответ на ваш вопрос очевиден.

    Во-вторых, Если это всё умеете, и развиваться хотите именно как бэкенд, лично мои предпочтения - Go и/или Node..JS.
    Аргументировать не стану, вам же готовый ответ нужен.
    Ответ написан
    Комментировать
  • Очень хорошо знаю PHP - куда двигаться дальше?

    MvcBox
    @MvcBox
    Software Developer [C/C++/JS(for Node.js)/etc]
    Просто оставлю это здесь
    jeffekt-Danninga-Krjugera-8.jpg
    Ответ написан
    1 комментарий
  • Очень хорошо знаю PHP - куда двигаться дальше?

    EugeneOne77
    @EugeneOne77
    Laravel, Vue, Wordpress разработчик.
    Присоединяясь к ответу выше про хайлоад, добавлю - базы данных конечно. Оптимизация запросов и все такое. И востребовано и мозги скрипят как следует. Ну и микросервисы.
    Ответ написан
    Комментировать
  • Очень хорошо знаю PHP - куда двигаться дальше?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Хайлоад

    Сразу поймёшь, что ничего не знаешь вообще
    Ответ написан
    2 комментария
  • Как отслеживать данные которые присылает сервер?

    glaphire
    @glaphire
    PHP developer
    Поставьте галочку для preserve log, так не будут очищаться запросы) это для хрома
    network.png
    Ответ написан
    Комментировать