• Как собрать статистику DOM-дерева?

    Решение не смотрел, но я бы решил "в лоб".
    1. Заводим массив из всех типов элементов (h1, b, div, span итд)
    2. document.querySelectorAll
    3. Профит
    Ответ написан
    Комментировать
  • Почему не работает клонирование?

    qork
    @qork
    { background: #F00B42 }
    Ответ написан
    Комментировать
  • Возможность упаковки кругов в прямоугольник?

    Adamos
    @Adamos
    Взять бумажку.
    Нарисовать пример двух вписанных в прямоугольник окружностей.
    Подумать.
    Заподозрить, что точка соприкосновения окружностей всегда будет лежать на линии, соединяющей их центры. Доказать это.
    Провести линию между центрами окружностей и перпендикуляры от центров к сторонам прямоугольника.
    Сообразить, что нужно просто определить, влезет ли линия между центрами в габариты прямоугольника минус радиусы окружностей...
    Немножко посчитать.
    Ответ написан
    1 комментарий
  • Как сжать массив координат?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    Прочитайте про protobuff - возможно это вам поможет.
    Ответ написан
    Комментировать
  • Как редиректить псевдонимы домена через Nginx?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    Зачем обходиться одним блоком, если у вас обработка отличается? При прочих равных, лучше сделать отдельные серверные блоки, чем костылить с if`ами.
    Ответ написан
    3 комментария
  • Как сжать строку для отправки через GET-запрос?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Перевести коды в другую систему счисления.
    Например, взяв 64-разрядную систему [0-9a-zA-Z\-_] из 78900 получим jgQ.
    Если все числа укладываются в определённый диапазон, то можно попробовать отказаться от подчёркиваний и записать каждое число с фиксированным количеством разрядов и лидирующими нулями. Тогда, например, 123_78900_44343_4349 преобразуется в 01XjgQaQT13Z
    Ответ написан
    Комментировать
  • Как на javascript замерить время выполнения функции (в наносекундах)?

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

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

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

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

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

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

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

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

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

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

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

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

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

    notiv-nt
    @notiv-nt
    Как ваше ничего? Да, моё тоже
    location / {
    try_files $uri $uri/ /index.php?$query_string;
    }
    Ответ написан
    2 комментария
  • Где у меня ошибка?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Проблема в том, что числа повторений в задаче ОЧЕНЬ большие.
    Правильное решение должно не строить строку, а хранить ее в виде пар (символ, количество), как в RLE.
    Самое быстрое решение - хранить список таких пар (или 2 списка). Но проще, и должно проходить по времени другое решение: Можно просто хранить массив этих пар (или 2 массива, один для символов, другой - для количества повторения).

    Позиция курсора тут будет храниться двумя числами - в какой группе в массиве он сейчас и где он внутри группы. При перемещении сначала увеличьте или уменьшите позицию внутри группы. Если стало -1 или слишком большим, то переходите к следующей или предыдущей группе. Если таких нет, откатывайтесь на границу.

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

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

    В конце нужно для каждой позиции пройтись по массиву групп, пока не отсчитаете нужное количество символов. Если слишком медленно, то можно M чисел отсортировать и потом одним проходом по массиву групп с указателем в массиве запросов найти все ответы (если текущая позиция-запрос левее текущей группы, переходим к следующей позиции, если текущая позиция в текущей группе - мы нашли ответ).
    Ответ написан
    Комментировать
  • Какой самый быстрый способ итерации массива в JS?

    @dimoff66
    Кратко о себе: Я есть
    Вроде бы понятно, что префиксы(--i, ++i) быстрее постфиксов(i--, i++)


    В циклах никакой сколь либо ощутимой разницы, если вы проводили действительно тесты, они не могли этого не показать.

    Когда-то и где-то читал, что лучший пробег - это с конца до начала, используя конструкцию:

    for(let i = array.length - 1; i >= 0; --i)


    И что, ваши тесты это подтвердили? Похоже на полную чушь. Какая разница языку отнимать единицу или складывать?

    По факту самый быстрый конечно
    for(let i = 0; i < array.length; ++i) let value = array[i]


    for... of медленнее процентов на 30

    forEach медленнее в разы

    Точные цифры зависят от реализации в конкретных браузерах и меняются в процессе их развития.

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

    И есть выражение: "Преждевременная оптимизация - зло". Сначала напишите код, а потом если какие-то его части работают заметно медленно, тогда приступайте к оптимизации. То чем вы занимаетесь - это забивание головы второстепенными вещами.
    Ответ написан
    4 комментария
  • Как не считать 0 за пустую строку?

    Именно для вашей задачи массив излишен, можно решить чуть изящнее:

    function sumInput() {
        let buf = 0;
        let sum = 0;
    
        do {
            sum += Number(buf);
            buf = prompt('Value', 0);
        } while (buf.length > 0);
    
        return sum;
    }
    
    console.log(sumInput());
    Ответ написан
    Комментировать
  • Почему CRC32 файла не рассчитывается и равен FFFFFFFF?

    15432
    @15432
    Системный программист ^_^
    1. Почему же всё-таки CRC32 файла вне зависимости от расширения не рассчитывается в то время, когда остальные алгоритмы работают исправно?

    Он рассчитывается.

    2. Что означает результат "FFFFFFFF"?

    Число 0xFFFFFFFF, в десятичной системе 4294967295

    3. Как альтернативными путями рассчитать CRC32 файла в 11-12 Мб?

    можно взять другой полином, например, CRC-32 CCIT, тогда получится другой результат

    4. Что можно изменить в файле, если результаты расчёта его CRC32 равны FFFFFFFF?

    Изменение значения любого байта в файле приведет к другому значению CRC32. Имя и расширение не является содержимым файла и на хеш не влияет.

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

    Да нет, скорей всего в конце файла уже записано значение CRC32 всех предыдущих байт, из-за чего получается такой эффект. Можете считать это своеобразной проверкой целостности. Если CRC32 файла не будет равно 0xFFFFFFFF, файл будет считаться повреждённым. Видел такое в прошивках устройств.
    Ответ написан
    7 комментариев
  • Как работает сборщик мусор с колбеками Promise?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Сборщики мусора (далее GC) бывают разные, в том же v8 используется сразу 3 типа GC в зависимости от поколения объектов (упрощенно молодое, старое и сложные случаи), но в большинстве своем принцип работы сводится к просчету достижимости из некоторого корня в дереве объектов (например глобального объекта, но не только его). v8 не является исключением, и его GC содержит C++ api для создания таких корней. Из JS мы данным api можем воспользоваться лишь косвенно, через сущности языка предоставляемые либо самим v8 либо платформой (браузером, node.js, deno и т.д.)
    Чтоб было понятно давайте рассмотрим простой пример:
    const h = 'Hello world!';
    const n = 'nothing';
    setTimeout(() => {
      console.log(h);
    }, 1000);
    У нас есть строковые переменные h и n. Переменная n нигде больше не используется и ее память очистится при ближайшей работе GC. А вот переменная h оказалась в замыкании созданном стрелочной функцией. И хотя в JS мы не можем достучаться до h имея ссылку на эту функцию, сама функция все таки имеет ссылку на h, а значит h не может быть уничтожена пока не будет уничтожена сама функция. В терминах GC ссылка на h будет серой, то есть сама ссылка на h недоступна из корня напрямую, но сейчас мы проверяем объекты, которые на нее ссылаются и истина будет зависеть от них (подробнее можете погуглить "mark black white and gray memory in gc").
    Давайте посмотрим на саму стрелочную функцию, которая держит h в замыкании. Из кода видно, что мы ее передаем в функцию setTimeout, о которой известно, что это api предоставленное платформой (а значит вероятно какая-то часть написана на C++), а так же, что она асинхронная. Платформе реализующей setTimeout наша функция понадобится после асинхронного ожидания и никто платформе не сможет гарантировать, что во время этого ожидания не будет работы GC, поэтому ей ничего не остается, кроме как запросить у v8 создание нового корневого дерева объектов, в которое и будет положена ссылка на данную функцию.
    После же выполнения таймаута платформе больше не нужна наша функция, поэтому ссылка на нее будет удалена из дерева объектов. А так как других ссылок на функцию нет, и она больше не доступна ни из одного корня - GC удалит из памяти и функцию и строку связанную h, которая так же стала недоступна из корня.

    Посмотрим на пример из вопроса. У нас есть стрелочная функция, которая удерживает на себе инстанс компонента через this ссылку (так как стрелочные функции замыкают this). Саму функцию в памяти удерживает промис порожденный вызовом loader('url'), так как мы отдали её в метод then. Других ссылок на данную функцию нет, а значит и сама функция и ее замыкание (инстанс компонента) будут "жить" не менее "жизни" промиса.
    Скажем был отправлен запрос на сервер, но потом компонент в котором был объявлен промис и колбек был удален.
    И после удаления приходит ответ от сервера, и он выполнит колбек. Это значит что колбек остался в памяти со всеми переменными контекста
    Если других ссылок не осталось, то инстанс компонента будет удерживаться от очистки через промис.

    Теперь стоит разобраться с самим промисом. У него может быть 3 состояния - pending, resolved или rejected. После перехода в состояния resolved или rejected промис может выполнить сохраненные колбэки в ближайшем микротаске, а после он удалит на них ссылки из себя, в следствии чего, память удерживаемая замыканием колбэка может быть очищена (при отсутствии на нее других ссылок, достижимых из какого-либо корня).
    В состоянии pending промис может потенциально находится бесконечно долго, при этом ссылаясь на все колбэки переданные ему в методы then, catch или finally, а значит так же косвенно ссылаясь на их замыкания. И тут все зависит от того, кто ссылается на данный промис, и достижим ли он из корня. И да, промис вполне может быть удален из памяти так и не дождавшись своего завершения.
    интересное умозаключение
    Если Promise - это обещание, то в данном случае оно будет нарушено?


    В комментах к вопросу есть еще один интересный пример:
    function getSomething(){
      return new Promise((resolve, reject)=>{
        if(sys_condition){
           resolve();
        } 
      })
    }
    
    function testPromise(){
      let config = {....}
      getSomething().then(()=>{
         #use config
         goOn(...config)
      })
    }
    
    testPromise();
    У нас есть вызванная 1 раз функция testPromise, которая получает из функции getSomething промис, в который с помощью метода then сохраняет колбэк, удерживающий в замыкании переменную config. Сам промис она нигде не сохраняет, что здесь очень важно.
    В функции getSomething мы просто возвращаем промис созданный через его конструктор, который как мы уже знаем нигде больше не сохраняется. И на этом могло бы все и закончится, без вызова колбэка независимо ни от чего. Но конструктор промиса выполняет свой колбэк синхронно, а кроме того он передает в него 2 функции - resolve и reject, которые в своем замыкании ссылаются на только что созданный промис (а это уже 2 ссылки на него, хотя мы то его никуда не сохраняли). Переменная reject никак не используется, а значит спокойно может быть удалена после завершения колбэка. Переменная resolve просто вызывается как функция внутри условия, но более тоже никак не используется и никуда не сохраняется, а значит так же может быть удалена.
    В этом примере. если sys_condition = false и resolve не вызовется, это значит что создается утечка памяти
    Нет, утечки памяти не будет. Колбэк созданный в testPromise будет удален вместе с замыканием, так и не вызвавшись ни разу.
    Ответ написан
    3 комментария
  • Почему body "не перекрывает" p?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Потому что в спеке отдельной графой так описано. Про специфичность.

    Стили непосредственно соответствующих элементов всегда предпочитаются унаследованным стилям, независимо от специфичности унаследованного правила


    Чтобы уложить в голове, нужно нарочито утрировать и посмотреть как это работает:

    Ответ написан
    1 комментарий
  • Какой системный язык программирования похож на Javascript?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    C++
    Ответ написан
    Комментировать
  • Как из функции передать переменную в функцию?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Предполагается, что функция func1 всегда принимает в качестве аргумента именно функцию, иначе будет брошено исключение.
    function func1(func) {
      let value = 'val';
      func(value);
    }
    
    function func2(v) {
      alert(v);
    }
    
    func1(func2);
    Ответ написан
    1 комментарий
  • Какими должны быть настроки сервера для объемных страниц сайта?

    fzfx
    @fzfx
    18,5 дм
    вынесите логику по получению списка записей и его компоновке на сторону браузера, отправляйте записи с сервера в браузер порциями с таким объёмом, который не роняет сервер, через websocket или что вам удобнее.
    Ответ написан
    Комментировать
  • Из swift в JavaScript?

    RAX7
    @RAX7
    let message = new Uint8Array([
        0x01,
        21,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        target & 0xFF,
        target >> 8 & 0xFF
    ]);

    Uint8Array
    Ответ написан
    Комментировать
  • Почему не работает фильтр массива объектов на js?

    const filterData = data.filter(el => {
      return (el.cardNum.startsWith('1234') || el.cardNum.startsWith('4234'))
      && (el.cardStatus === 'X' || el.cardStatus === '+');
    });
    
    console.log(filterData);
    Ответ написан
    2 комментария