Задать вопрос
  • Как закрыть XMLHttpRequest от общего доступа?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Использовать одноразовый сессионный ключ, чтобы форсить сценарий:
    «сначала запроси страницу, и только потом — json-данные».
    При генерации страницы, на сервере создаётся ключ, который записывается в сессию (на сервере) и в код страницы.
    При запросе данных из страницы, с запросом отправляется и этот ключ, где сравнивается с записанным в сессию. Только при совпадении отдаются данные, а ключ удаляется из сессии.

    Чтобы не передавать данные в открытом виде, можно их дополнительно упаковать-зашифровать. См. JSON Web Tokens. Но это чисто декоративно, т.к. всё, что оказывается в итоге в открытом виде в браузере клиента – считай, утекло.
    Ответ написан
    Комментировать
  • Как быстро засыпать чтобы было больше времени на изучение программирования?

    Как расслабиться выше в статье на Adme неплохо написано. Про закатить глаза наверх, тоже неплохо, без фанатизма.

    Плюс к этому техника дыхания, направленная на замедление сердцебиения.
    Услышьте, как бьётся ваше сердце – понадобится считать удары.
    • ме-едленный вдох на 4 удара
    • 4 удара пауза
    • медленный выдох на 4 удара
    • и самое трудное, 4 удара пауза без воздуха.
    Далее по кругу. Возможно, не всем это подойдёт. Число ударов, может, не всегда 4 — попробуйте 3 или 5.
    Буквально несколько таких циклов и вы глубоко заснёте, вызвав зависть партнёрши по лежбищу )

    p.s. лежбище держите чистым и свежим. Меняйте/стирайте не реже раза в неделю. Воздух в спальне лучше прохладный 18-22°C.
    Ответ написан
    Комментировать
  • Как создать массив со случайными числами без повторений?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    создать массив допустимых значений и «вынимать» из него случайные.

    const values = [...Array(10)].map((_, i) => i);
    const result = [...Array(5)].map(() => values.splice(Math.floor(Math.random() * values.length), 1)[0]);
    result // [ 2, 5, 3, 4, 1 ]
    Ответ написан
    2 комментария
  • Javascript - асинхронный язык. Означает ли это, что мой код может выполниться "неправильно"?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Операции выполняются последовательно.

    Некоторые известные программисту выражения могут откладывать асинхронные личинки )
    При этом сами выражения выполняются синхронно-последовательно и тут же за ними выполняются следующие строки. Но личинка асинхронности отложена и зреет! )

    let $some_elem = $('.some_elem');          // 1
    $some_elem.addClass('some_class');         // 2
    setTimeout(() => alert("Созрели!"), 1000); // 3 отложили
    $('.some_class').remove();                 // 4
    // этот код выполнился до конца и, казалось бы, делать больше нечего.
    
    // ...через секунду сработал alert

    Тут setTimeout() отрабатывает мгновенно-синхронно - его функция отложить личинку на через-секунду. Представьте, что setTimeout пушит функцию и её время в некий невидимый служебный массив движка JS. А движок заглядывает в этот массив по 100 раз в секунду, когда свободен, не занят выполнением кода, и смотрит, «есть чё?», что пора выполнить?

    Сразу за отработавшим setTimeout() (но никакого alert ещё не случилось) выполняется следующая строка $('.some_class').remove();

    Подробнее читайте про event loop.
    Ответ написан
    4 комментария
  • Почему нестрелочная функция понимает что такое this?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Методы объекта, "this". Цитата оттуда:

    Значение this вычисляется во время выполнения кода и зависит от контекста.

    Например, здесь одна и та же функция назначена двум разным объектам и имеет различное значение «this» при вызовах:
    let user = { name: "Джон" };
    let admin = { name: "Админ" };
    
    function sayHi() {
      alert( this.name );
    }
    
    // используем одну и ту же функцию в двух объектах
    user.f = sayHi;
    admin.f = sayHi;
    
    // вызовы функции, приведённые ниже, имеют разное значение this
    // "this" внутри функции является ссылкой на объект, который указан "перед точкой"
    user.f(); // Джон  (this == user)
    admin.f(); // Админ  (this == admin)
    
    admin['f'](); // Админ (неважен способ доступа к методу - через точку или квадратные скобки)

    Правило простое: при вызове obj.f() значение this внутри f равно obj. Так что, в приведённом примере это user или admin.

    В вашем примере код выполняется в контексте window и не покидает его.
    Ответ написан
    Комментировать
  • Как вычесть из сегодняшней даты 3 дня и сравнить с условной датой, и если до условной даты остается 3 дня то выдать сообщение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const gotTime = (dateStr, days) => {
      const che = new Date(dateStr); // дата события
      che.setDate(che.getDate() - days); // N дней до события
      return che - new Date() > 0; // ещё не наступила граница N-дней-до-события
    }
    
    gotTime('2019-11-14T09:07:02.376+00:00', 3); // true
    
    // сегодня 2019-10-15
    gotTime('2019-10-19T09:07:02.376+00:00', 3); // true
    gotTime('2019-10-18T09:07:02.376+00:00', 3); // false
    gotTime('2019-10-17T09:07:02.376+00:00', 3); // false
    Ответ написан
    Комментировать
  • Как вращать по окружности объект без "разворота"?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const dir = (aFrom, aTo) => (aTo - aFrom + 360) % 360 > 180 ? 'ccw' : 'cw';
    // "ccw" – против часовой, 
    // "cw" – по часовой
    
    dir(30, 60) // "cw" – из 30° в 60° лучше по часовой стрелке топать
    dir(30, 330) // "ccw" – против часовой короче )
    Ответ написан
    3 комментария
  • Как сократить код, используя тернарный оператор?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно всех обмануть, введя вместо переменной аргумент функции
    return [value / n].map(x => x % 1 ? -1 : x)[0]

    Если подумать, -1 возвращают всякие indexOf(), поэтому можно так:
    let a = [];
    return (a[value / n] = 1, a.indexOf(1));

    Но это ещё длиннее ¯\_(ツ)_/¯
    Ответ написан
  • Как правильно сравнить десятичные числа в JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно прогнать числа через .toExponential() – это их нормализует:
    (123.4567).toExponential() // "1.234567e+2"
    и разбить на три части: до запятой [1, 10), после запятой и степень.
    Три целых: [1, 234567, 2]

    Для проверки «равенства ±1» обязательно, чтобы степень (третье число) совпала.
    Разность вторых чисел - буквально вычитаем и берем Math.abs() - если равна нулю, сравниваем только первые числа - на разность не выше 1. Если первые числа равны, то разность вторых не превышать 1 должна.

    С таким же преобразованием числа легко реализовать и другие операции сравнения: >=, <=

    const fuzzy = {
      split: n => {
        const parts = n.toExponential().split('e')
          .map((p, i) => i ? parseInt(p) : p.split('.').map(x => parseInt(x)));
        if (parts[0].length < 2) parts[0].push(0);
        return [parts[0][0], parts[0][1], parts[1]];
      },
      
      eq: (a, b) => {
        a = fuzzy.split(a);
        b = fuzzy.split(b);
        
        if (a[2] !== b[2]) return false;
        const diff = Math.abs(a[1] - b[1]);
        if (diff === 0) return Math.abs(a[0] - b[0]) <= 1;
        if (a[0][0] !== b[0][0]) return false;
        return (diff <= 1);
      }
    }


    Использовать: fuzzy.eq( 12.1234, 12.1233) // true

    тесты
    const tests = [
      [1, 1, true],
      [111, 112, true],
      [0.001, .002, true],
      [0.001, .0025, false],
      [0.001, .003, false],
      [12.345, 1.2345, false],
      [123.88, 123.870, true],
      [-1.11111111, 1.11111110, false],
      [-1.11111111, -1.11111112, true],
      [2.000000001, 2, true],
      [4.9999999998, 4.9999999999, true],
      [7.9, 8.02, false],
      [7.99, 7.98, true],
      [7.99, 7.99, true],
      [7.99, 8.00, true],  // НЕ ПРОХОДИТ! Надо этот случай предусмотреть, но я ушёл спать.
    ];
    
    
    let allok = true;
    tests.forEach(test => {
      if (fuzzy.eq(...test) !== test[2]) {
        console.log("FAIL:", test);
        allok = false;
      } else {
        console.log("OK:", test);
      }
    });
    console.log(allok ? 'All OK!' : "Some tests FAILED");
    Ответ написан
    1 комментарий
  • Как получить всех родителя и родителей родителя?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const getById = id => data.filter(s => s.structureId === id)[0] || false;
    const getChild = me => data.filter(s => s.parentId === me.structureId)[0] || false;
    const getMyParent = me => getById(me.parentId);
    
    const getParentsChain = me => {
      const chain = [];
      let parent = getMyParent(me);
      while(parent) {
        chain.unshift(parent);
        parent = getMyParent(parent);
      }
      return chain;
    }
    
    const getChildrenChain = me => {
      const chain = [];
      let child = getChild(me);
      while(child) {
      	chain.push(child);
        child = getChild(child);
      }
      return chain;
    }
    
    // test
    const me = getById(3);
    console.log([...getParentsChain(me), me, ...getChildrenChain(me)]); /*
    0: Object { name: "Дирекция юкрк", parentId: null, structureId: 1 }
    ​1: Object { name: "Южно-Курильск", parentId: 1, structureId: 2 }
    ​2: Object { name: "Служба главного инженера", parentId: 2, structureId: 3 }
    ​3: Object { name: "Мехцех", parentId: 3, structureId: 4 } */
    Ответ написан
    3 комментария
  • Какие есть javascript-библиотеки, добавляющие пошаговую анимацию на сайт?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    как отлавливать Resolve при CSS-аниации?

    Событие transitionend на элементе с анимацией.
    Ответ написан
    Комментировать
  • Как быстро экспортировать аудио из видео?

    ffmpeg, конечно же. В командной строке или терминале под Windows, Mac OS, Linux.

    В любом плеере (например, VLC) определите время начала нужного фрагмента, его продолжительность и такая примерно команда:
    ffmpeg -ss 16:27.600 -i movie.mp4 -t 5:55  audio.wav

    Это «перемотает» на 16 минут 27 секунд и начиная оттуда, выведет только звук длиной 5 минут 55 сек. в файл audio.wav

    Если в видео несколько аудиодорожек, надо выбрать одну из них. Для этого сначала выведите информацию о файле:
    ffmpeg -hide_banner -i movie.mkv

    А затем выберите нужный audio stream с помощью параметра -map:
    ffmpeg -ss 16:27.600 -i movie.mp4 -map 2:a -t 5:55  audio.wav
    Ответ написан
    1 комментарий
  • Почему после загрузки музыкального видео на ютуб, происходит рассинхронизация звука и изображения?

    Скорее всего, проблема была в некорректной «упаковке» аудио и видео в контейнер AVI – которая нормально читалась локальными плеерами, но скрипты YouTube поперхнулись при оптимизированной переконвертации и появился рассинхрон.

    Сообщение [avi @ 000000000043f780] non-interleaved AVI означает, что в AVI файле отдельно записано всё видео одним куском, потом отдельным сплошным куском всё аудио. А задумаывалось, чтобы они часто чередовались, и плеер считав в буфер кусок, мог проиграть видео и соответствующее ему аудио сразу.

    Помогла локальная переконвертация с помощью ffmpeg:
    ffmpeg -i 01.avi -c:v libx264 -c:a aac 01_youtube.mp4
    Ответ написан
  • Как получить соседний "элемент", если он не элемент, а текст?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вы почти правильно сначала написали. .nextSibling вернёт Node типа TEXT_NODE (3).
    document.getElementById('aa').nextSibling.textContent // "222"


    Искомый текст одинаково содержится в следующих свойствах узла:

    Можно использовать любое из четырёх.
    Ответ написан
    Комментировать
  • Как в jquery обратиться к элементу, который слушает событие?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    e.delegateTarget по идее содержит элемент, на котором висит слушатель.

    См. документацию jQuery по объекту Event.
    Ответ написан
    Комментировать
  • Как сгенерировать число в зависимости от времени суток?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно использовать шум Перлина (напр. реализация на JS) для получения одинаковой псевдослучайной последовательности у всех посетителей.

    Примерно:
    function getUniqueNum(offset = 0) {
      const now = new Date();
      noise.seed(0xCEED);
      let num = 0;
      let hours = now.getHours() + offset;
      while(hours-- >= 0) num += Math.round((1 + noise.perlin2(hours / (24 + offset), now.getDate() / 32)) * 100);
      return num;
    }


    Но вот что делать с разным часовым поясом посетителей?
    Ответ написан
    4 комментария
  • Нормально ли общаться с микросервисами через промисы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Практика – нормальная.

    Обе проблемы «Что, если» надуманы и нерелевантны.
    Что конкретно хотелось бы делать в случае подзадержвашегося ответа? Скажем, установили некий порог в 10 секунд. Ответа всё ещё нет.
    Варианты, собственно: подождать ещё, либо реджектнуть. Ещё можно представить вариант - оборвать предыдущую попытку и отправить то же самое повторно.
    Ответ написан
    Комментировать
  • Зачем в книгах оставляют пустые страницы?

    Издержки печатной верстки:
    • Чтобы набралось число страниц делимое на 4.
    • Чтобы очередная глава началась с правой страницы.
    Ответ написан
    Комментировать
  • Как обнаружить взаимосвязь в массиве чисел?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Пока только по инструментам: порекомендую Python и numpy, pandas, Keras.
    Посмотреть, что за данные, порисовать распределения, посчитать статистические характеристики, «поиграть».

    Upd. как прогнозировать курс валюты с помощью машоба, пишут, например, в работе Foreign Exchange Forecasting via Machine Learning (Stanford, на англ.)
    Ответ написан
    Комментировать
  • Эффект переливать?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    PavelDoGreat/WebGL-Fluid-Simulation – там посмотрите в т.ч. References.

    И целый топик на GitHub: fluid simulation
    Ответ написан
    Комментировать