• Почему вставка элементов занимает такое время?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Про список Просто автор хитренький и считает, что задача получения указателя на нужный элемент в списке - это отдельная задача поиска, которая как раз делается за O(n). Ну а со вставкой все просто - она действительно делается за O(1). Тот факт, что на практике зачастую вставка состоит из поиска и собственно вставки хитренький автор замел под ковер. Остерегайтесь хитреньких авторов!

    Про массив Нетрудно догадаться™, что при вставке в массив на самое первое место, нужно сдвинуть весь хвост массива на один элемент (чтобы было место, куда вставлять). Вот это сдвигание, по самой пессимистичной (когда вставляем в самое начало) оценке и занимает O(n).
    Ответ написан
  • Как поставить лайк на все комментарии видео в тикток?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Ладно, упарываться, так упарываться. Клики + получение новых элементов для кликов + прокрутка + все повторить, но не смешивать. Кликнуть на ролик, вставить и выполнить код в консоль браузера:
    async function clickByElement() {
        let element = document.querySelector('.css-1swe2yf-DivActionContainer.esns4rh0 [aria-pressed="false"]');
        if (!element) return null;
    
        console.log('Клик!')
        element.click();
        while (element.getAttribute('aria-pressed') !== 'true') {
            await new Promise(resolve => setTimeout(resolve, 100));
        }
        
        return true;
    }
    
    async function clickAllElements() {
        let foundClickable = false;
        while (await clickByElement() !== null) {
            foundClickable = true;
        }
        
        return foundClickable;
    }
    
    async function scrollToBottomAndClickAgain() {
        const scrollContainer = document.querySelector('.css-1qp5gj2-DivCommentListContainer.ekjxngi3');
        if (scrollContainer) {
            console.log('Крутим страницу и ждем 10 сек.')
            let lastScrollTop = scrollContainer.scrollTop;
            scrollContainer.scrollTop = scrollContainer.scrollHeight;
            await new Promise(resolve => setTimeout(resolve, 10000));
    
            if (scrollContainer.scrollTop !== lastScrollTop) {
                if (await clickAllElements()) {
                    await scrollToBottomAndClickAgain();
                } else {
                    console.log('Прокрутка выполнена, новые элементы для клика не найдены.');
                }
            } else {
                console.log('Достигли конца прокрутки, больше нечего прокручивать.');
                if (await clickAllElements()) {
                    await scrollToBottomAndClickAgain();
                } else {
                    console.log('Задача окончательно завершена, кликов больше не осталось');
                }
            }
        } else {
            console.error('Контейнер для прокрутки не найден');
        }
    }
    
    async function initiateClicksAndScroll() {
        if (await clickAllElements()) {
            await scrollToBottomAndClickAgain();
        } else {
            console.log('Нет элементов для начальных кликов, проверяем прокрутку');
            await scrollToBottomAndClickAgain();
        }
    }
    
    initiateClicksAndScroll().then(() => console.log('Задача выполнена май генерал!'));
    Ответ написан
  • Как использовать два контекста в методе правильно JS?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Почему бы не получать кнопку просто через event.target? А this прибить к вашему объекту.
    Ответ написан
    Комментировать
  • Как использовать два контекста в методе правильно JS?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Используя стрелочную функцию:
    init() {
        this.targets.forEach((target, index) => {
            target.index = index;
            target.addEventListener("click", (event) => this.animateTab(event, this));
        });
    }

    Используя метод bind():
    init() {
        for (let i = 0; i < this.targets.length; i++) {
            this.targets[i].index = i;
            this.targets[i].addEventListener("click", this.animateTab.bind(this));
        }
    }
    Ответ написан
    3 комментария
  • Почему Object.__proto__ ссылается на Function.prototype, а Function.prototype.__proto__ на Object.prototype?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Object - это функция. У любой функции __proto__ ссылается на тот же объект, что и Function.prototype, потому что, условно говоря, каждая функция создана конструктором Function. Под капотом, разумеется.

    Function.prototype - это обычный плоский объект, созданный (опять же, условно говоря), конструктором Object. Соответственно, аналогично первому пункту, его __proto__ смотрит на Object.prototype
    Ответ написан
    Комментировать
  • Можно ли сохранять в git папку vendor после composer update?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если одни разработчик обновил библиотеки, другие должны как то об этом узнать, чтобы обновится у себя

    Если другие разработчики делают git pull и не обращают внимания на изменения - это их проблемы. Хорошим тоном является уведомление от автора правок в composer.json, что остальным стоит его обновить.

    Список библиотек и версии обновляются не очень часто, а при каждом релизе, приходится выкачивать одни и те же либы

    Вообще говоря композер умеет в кэш и одни и те же версии либ тянутся с кэша.

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

    Если нужно именно поднять окружение с проектом - настройте vagrant и пропишите в README как им пользоваться конкретно для вашего проекта.
    Что касается людей:
    * верстальщики - vagrant
    * технические писатели - я конечно не в курсе вашего проекта, но я бы доступ даже к репозиторию не дал, максимум - завел отдельный репозиторий для них.
    * ревьюер кода (безопасности) - ревьюер, который не может в composer / консоль?? Шутка не удачная.
    * сюда же и вопрос оплаты специалиста - лолшто? Это вообще не связано с окружением вашего проекта, ну вот ни капли.

    Нет возможности просто и быстро передать кому-то код, просто расшарив ссылку на гит

    Если у вас проект НЕ opensource - то такого делать в принципе нельзя. Доступ к репозиторию должны иметь специалисты, которые работают с кодом этого проекта и ни кто другой, а composer тут вот ни капли ни при чем!

    Вопрос в том, можно ли сохранять папку vendor в git

    НЕТ! Вы придумали НЕ существующую проблему и пытаетесь героически ее решить, только от этого решения будет еще хуже.

    насколько это противоречит принятому стилю

    на полностью

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

    1. Вы становитесь вендором кода, который взяли где-то, как следствие вы следите за его обновлением, у изначального вендора и вы проводите аналогичные правки в своем проекте. Если так не делать - баги, найденные в этой зависимости сами себя не пофиксят и этот код будет быстро устаревать.
    2. В код зависимости появляется соблаз провести собственные наработки - это то, что делать нельзя, иначе процесс обновления будет сложнее на порядки.
    3. Ваш репозиторий разбухнет.
    4. Композер вашу зависимость придется явно прописать иначе автолоад может ее не подтянуть.

    Использует ли кто-нибудь такую практику в своих проектах ?

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

    @jasper-blondin
    Вариантов много. Что является "правильным" -- не совсем понятно.

    1. Заведите папочку (раздел) на сайте и создавайте там страницы с любым содержанием (в том числе с использованием компонентов, в том числе с компонентом catalog.element). В самом каталоге для товаров добавьте только одно свойство -- URL кастомной страницы. Для соответствующих товаров указывайте в этом поле адрес созданной кастомной страницы товара, а в шаблоне каталоге делайте проверку: есть кастомный URL -- редирект, нету -- показываем дефолтный шаблон catalog.element.

    2. То же, что и в варианте №1, только использовать встроенный функционал Сайты24 для создания страниц товаров.

    3. Написать свой компонент в виде конструктора, в котором можно будет настраивать внешний вид страницы товара.

    и т.д.
    Ответ написан
    Комментировать
  • Как правильно верстать используя bootstrap?

    ThunderCat
    @ThunderCat Куратор тега CSS
    {PHP, MySql, HTML, JS, CSS} developer
    Как вообще задавать фикс значения используя бутстрап?
    Никак, он не для этого.

    Создавать свой класс? Нормально ли вообще создавать свой класс и юзать его в перемешку с версткой на bootstrap?
    Да, создавать, да, нормально.

    Если да, то как организовывать такие классы в файловой структуре, ведь они будут созданы только в том случае, если возможностей бустрапа не хватит.
    Добавляете файл /assets/css/style.css, подключаете после бутстрап.
    Ответ написан
    Комментировать
  • Как правильно верстать используя bootstrap?

    @alexalexes
    При использовании bootstrap вы не можете мыслить фиксированными шириной.
    У вас есть 12 колонок - 12 долей единиц ширины экрана, и есть с полдюжины разных размеров экранов.
    Самый маленький, малый, средний, большой и очень большой.
    И логика расстановки классов такая:
    "На большом экране и больше у меня слайдер будет шириной 6 из 12 колонок,
    на среднем 8 из 12 колонок,
    от малого и меньше 12 из 12 колонок".
    С этой логикой и навешиваете нужный набор классов на контейнер слайдера.
    JS код не должен фиксировать размер контейнера в пикселях, нужно ему позволить расширяться по bootstrap сетке.
    Ответ написан
    Комментировать
  • Этот код считается трудночитабельным?

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    Для повышения читабельности разбеыте код на отдельные функции. Напромер так:
    <?php
    function getTags($strTag) {
        return array_combine(
            array_map(
                fn($attribute) => array_shift(explode("=", $attribute)),
                explode(" ", trim($strTag))
            ),
            explode(" ", trim($strTag))
        );
    }
    
    function getAttributes($strTag) {
        return array_map(
            fn($attribute) => array_pop(explode("=", $attribute)),
            getTags($strTag)
        );
    }
    
    preg_match_all('/(?<=\<img).*?(?=>)/', $this->html, $match, PREG_PATTERN_ORDER);
    
    $this->tags = array_map(
        fn($strTag) => [
            "original" => "<img " . $strTag . ">",
            "attributes" => getAttributes($strTag)
        ],
        $match[0]
    );


    https://phpize.online/sql/mysql57/undefined/php/ph...
    Ответ написан
    1 комментарий
  • Что за пустота с символами ?

    @humoured
    Вы всё на свете найдёте в коробке с карандашами
    Это BOM-метка. Её ставят некоторые текстовые редакторы в начало файла. В конкретном вашем случае она стоит, скорее всего, в каком-то другом файле-вьюшке, а не в указанном template.php со скрина.
    Какой файл подключается следующим? Ему и меняйте кодировку.
    Ответ написан
    2 комментария
  • Как составить регулярное выражение?

    soulilya
    @soulilya
    Культурный, утонченный и изысканный.
    Посмотри исходный код вот этой библиотеки git
    Ответ написан
    Комментировать