• Почему не удается настроить директиву 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 комментария
  • Как маршализовать функцию или другой объект?

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

    В JS все сериализуется, а не маршализируется.
    Ответ написан
    7 комментариев
  • Как уменьшить svg код?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Пример километрового SVG


    Это не SVG. Это обычная растровая png картинка, которую закодировали в base64 и вставили в SVG. Сжать никак не получится (ну то есть насколько вы растровую картинку сожмете?). Вам нужно эту штуку нарисовать изначально в векторе, тогда она будет маленькая и аккуратненькая.
    Ответ написан
    3 комментария
  • Почему nginx добавляет к путям с стилями uri?

    @KingstonKMS
    Дело не в настройках nginx, а в путях на эти стили в html файлах.
    Ответ написан
    Комментировать
  • Mikrotik. Как правильно сделать переадресацию https трафика?

    @Wexter
    Да никак, почитайте хоть что такое https и для чего оно нужно
    Ответ написан
  • Почему .parentNode underfined?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    let btn = $(this);
    $ - jquery,
    this - HTMLElement,
    $(this) - объект jquery.

    У объекта jquery нет свойства parentNode. У него есть метод parent().
    parentNode есть у HTMLElement.

    remove(), который вам советуют, есть и там и там, но лучше вам понимать что вы делаете, чем полагаться на удачные совпадения.
    Ответ написан
    Комментировать
  • Правильная настройка HTTPS?

    @Desert-Eagle
    Новичок во всем
    Звёзды говорят мне, что без примера вашего конфига, тут мало чем поможешь.
    Ответ написан
    3 комментария
  • Что позволяет записывать в функции статические методы?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Воспользуюсь спорным штампом и отвечу: так происходит, потому что "в JS всё - объект". Соответственно, как объектам, мы можем назначать свойства.
    С примитивами всё несколько сложнее. Мы вроде бы тоже можем назначить им свойство, но это иллюзия. Когда мы делаем подобное с примитивами, например строкой, то вызывается её конструктор String(), а когда операция "под капотом" завершается, то мы снова получаем примитив, таким образом, ошибки назначения свойства не возникает, но и свойство недоступно.

    Это если сжато.
    Подробно объяснять не быстро. Скорее всего Вам тут посоветуют почитать документацию, спецификацию. Я предложу почитать серию книг You Dont Know JS. Можно нагуглить перевод многих глав из этой серии книг.
    Ответ написан
    Комментировать