Задать вопрос
  • Как исправить, чтобы document on click не срабатывал несколько раз?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Перенесите скрипт обработчика из подгружаемых ajax'ом фрагментов в страницу, чтобы присутствовал лишь раз.

    * * *
    Вообще, если не вешать каждый раз новую анонимную функцию, а вынести обработчик во внешнюю функцию, и отказаться от jQuery, то обработчик сработает лишь однажды:
    const handler = () => {
      console.log('click');
    }
     
    document.addEventListener('click', handler);
    document.addEventListener('click', handler);
    document.addEventListener('click', handler);
    // при клике выведет только 1 сообщение в консоль

    Но у jQuery иная механика:
    $(document).on('click', handler);
    $(document).on('click', handler);
    $(document).on('click', handler);
    // при клике вывалится 3 сообщения
    Ответ написан
    Комментировать
  • Как удалить всё символы до первого / с конца?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно через метод строки lastIndexOf() искать последнее вхождение слеша в строку:
    const dirname = (str) => {
      const pos = str.lastIndexOf('/');
      if (-1 === pos) return str;
      return str.substring(0, pos);
    }
    
    dirname('/siparis/kampanyalar/tumu/cok-karisik-orta-firsati')
    // /siparis/kampanyalar/tumu
    Ответ написан
    Комментировать
  • Значение @ в php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    @ — это Оператор управления ошибками: если он предшествует какому-либо выражению в PHP-коде, любые сообщения об ошибках, генерируемые этим выражением, будут подавлены.
    Ответ написан
    Комментировать
  • Можно как-то вернуть данные из values, чтобы отказаться от then(-ов) для каждого запроса?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const [data1, data2, data3] = await Promise.all(
      ['/test1', '/test2', '/test3']
      .map((url) => http.get(url).then(({ data }) => data))
    )
    .then((values) => {
      console.log('values', values);
      return values;
    });


    Или
    const [data1, data2, data3] = await Promise.all(
      ['/test1', '/test2', '/test3']
      .map((url) => http.get(url))
    )
    .then((values) => values.map(({ data }) => data));
    Ответ написан
    3 комментария
  • Какой алгоритм для вычисления оптимальной задержки для API и сообщения её ПО пользователя, чтобы не генерировать лишнюю нагрузку?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сервер получает запросы 2 типов: Hit (если для него есть задача) и Miss (когда стукнулся, а заданий нет).
    • Штраф запросу Hit – время, которое появившаяся задача ожидала запроса.
    • Штраф запросу Miss – порядковый номер этого холостого запроса от этого клиента - 1 (1-й запрос бесплатно : )

    Задания поступают случайно и непредсказуемо. Исполнители подключаются тоже случайно и непредсказуемо.

    Вопрос как минимизировать штрафы.

    Маловато данных.

    Я бы делал задержку случайной величиной с нелинейным распределением. Вероятнее всего малая задержка, и по экспоненте уменьшается вероятность задержек более длинных.
    График
    602ff598991c9802769845.png
    Или, половина «шляпы» нормального распределения:
    602ff62996122863074501.gif

    Параметр, которым рулить (и рулить очень плавно) — крутизна этой экспоненты распределения.

    Для этого надо оценивать эффективность за последние X секунд-минут-часов.
    • Если больше штрафов за позднее появление рабочего — делать экспоненту круче – чтобы ещё вероятнее была маленькая задержка и менее вероятна длинная.
    • И наоборот, если слишком много обращаются рано — размазывать экспоненту, увеличивая вероятность длинной паузы у очередного запроса.
    Ещё чуть усложнить можно, давая штрафам веса в зависимости от их давности: свежие штрафы весомее чем на дальнем-позднем конце окна.
    Ответ написан
    Комментировать
  • Как обработать массив последовательно?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var array = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'];
    
    array
    // из каждого сделать функцию, возвращающую промис
    .map((el) => () => new Promise((resolve, reject) => $.ajax({
      url: '/assets/themes/theme/send.php',
      method: 'post',
      data: {text: el},
      success: resolve,
      error: reject,
    })))
    // склеить цепочку
    .reduce((acc, c) => acc.then(() => c()), Promise.resolve())
    .catch(err => console.error(err));
    Ответ написан
  • Как работает цикл?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вывод к консоль — друг человека!
    for (let i = 2; i <= 10; i++) {
      console.log('i  %02d', i);
    
      for (let k = 2; k < i; k++) { 
        console.log(' k %02d', k);
        if (i % k == 0) continue;
      }
    }

    Начало вывода:
    i   2
    i   3
     k  2
    i   4
     k  2
     k  3
    i   5
     k  2
     k  3
     k  4
    i   6
     k  2
     k  3
     k  4
     k  5
    i   7
    Ответ написан
    Комментировать
  • Какое максимальное количество операций в бинарном поиске?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    С краями ошиблись: 3 бита (3 вопроса) — это числа от 0 до 7.
    Каждым вопросом уточняется бит, от старших к младшим:
    0  000
    1  001
    2  010
    3  011
    4  100 - четыре?  - больше (старший бит 1xx )
    5  101
    6  110 - шесть? - больше ( 11x )
    7  111 - семь – ага
    Ответ написан
    4 комментария
  • Как работать с сессиями в php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Ответ написан
    Комментировать
  • Как правильно сделать условие?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const messages = {
      'ru': 'Ваше сообщение успешно отправлено!',
      'ua': 'Ваше повідомлення успішно відправлено!',
      'en': 'Your message has been successfully sent!',
      'cn': '您的留言已成功发送!',
    }
    
    const path = window.location.pathname; // чтобы не совпало с ya.ru/zz/search?q=/ru/
    
    const defaultLanguage = 'en';
    
    const language = Object.keys(messages)
      .reduce((acc, c) => path.includes(`/${c}/`) ? c : acc, defaultLanguage);
    
    const text = messages[language];
    Ответ написан
    2 комментария
  • Как разделить цифру на числа и умножить в Javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    let digits = "85172"; // в кавычках, значит это строка
    let product = 1; // произведение
    
    // у строки есть свойство длины: length
    // к букве в строке можно обращаться по номеру её положения
    // буква – тоже строка, надо её перевести в число через Number()
    for (let i = 0; i < digits.length; i++) {
      const digit = Number(digits[i]); // цифра
      product = product * digit;
    }
    
    // умножили. Теперь можно вывести:
    console.log(product); // 560
    Ответ написан
    Комментировать
  • Как ответ сервера через fetch вернуть в виде текста в переменную?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сетевые запросы асинхронны по своей природе: выполняются непредсказуемо долго.

    Попробуйте изменить общую логику приложения так, чтобы результат запроса, когда появится, не просто назначался в какую-то переменную, а вызывал колбэк с результатом.
    function getIndex(adr) {
      // ...
      return fetch(ajaxurl, {
        method: 'POST',
        body: formData
      }).then(resp => resp.text())
        .then(showResult)
        // парашютики не забываем:
        .catch(err => console.error(err));
    }
    
    function showResult(data) {
      console.log(data);
    }
    
    getIndex('https://ya.ru/'); // вернёт промис, ну и фиг с ним


    Либо поместите всю логику дальнейшей работы с результатом прямо в цепочку промисов:
    function getIndex(adr) {
      // ...
      return fetch(ajaxurl, {
        method: 'POST',
        body: formData
      }).then(resp => resp.text())
        .then(showResult)
        .catch(err => console.error(err));
    }
    
    getIndex('https://ya.ru/')
      .then(data => {
        document.querySelector('#output').innerText = data;
      })
      .catch(err => console.error(err));
    Ответ написан
    1 комментарий
  • В чем изьяны моего чудища?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В вашем коде не сравниваются все возможные варианты.
    Он проваливает два примера из вопроса:
    [2, -1, 2, 3, -9] = 6 (у вас получается 5)
    и [-2, -1, 1, 2] = 3 (у вас выводит 2)

    spoiler
    Предлагаю такой вариант решения. Возможно, не оптимальный. Полный перебор.

    Будем двигать «окно» по массиву, считая сумму элементов в нём. Размер окна от всего массива до окошечка размером в 1 элемент.
    Считаем сумму в начальном положении окна. Затем, двигаясь вправо, вычитаем элемент слева и прибавляем элемент справа.

    Минимально возможная сумма — ноль.
    function getMaxSubSum(arr) {
      let max = 0;
      const length = arr.length;
    
      for (let frame = length; frame > 0; frame--) {
        let sum = 0;
        for (let i = 0; i < frame; i++) sum += arr[i];
        max = Math.max(max, sum);
    
        // move frame
        for (let offset = 1; offset <= length - frame; offset++) {
          sum -= arr[offset - 1];
          sum += arr[offset + frame - 1];
          max = Math.max(max, sum);
        }
      }
    
      return max;
    }
    
    
    const tests = () => {
      [
        [[-1, 2, 3, -9], 5],
        [[2, -1, 2, 3, -9], 6],
        [[-1, 2, 3, -9, 11], 11],
        [[-2, -1, 1, 2], 3],
        [[100, -9, 2, -3, 5], 100],
        [[1, 2, 3], 6],
        [[-1, -2, -3], 0],
      ].forEach((el, i) => {
        const result = getMaxSubSum(el[0]);
        console.assert(result === el[1], "Test %d failed: [%s] %d != %d", i, el[0], result, el[1]);
      })
    }
    
    tests();
    Ответ написан
  • Чем руководствоваться при именовании констант?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если пишете не прилжоение, а модуль, который станут использовать другие разработчики, рекомендуется использовать общий префикс для констант именно вашего модуля:
    HABR_ROOT
    HABR_WWW
    HABR_KERNEL


    Как вариант с путями, например, в Laravel они получаются вызовом вспомогательных функций:
    app_path()
    base_path()
    config_path()
    database_path()
    public_path()
    storage_path()
    Причём, в них можно передавать параметром относительный путь внутри, чтобы получить полный. Здесь общий не префикс, а постфикс, т.к. результат больше похож на натуральный язык и, видимо, легче запоминается.
    Ответ написан
    Комментировать
  • Почему постфиксный и префиксный инкременты выдают одно и то же значение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Разница между ++i и i++ только в том, чему равно само это выражение:
    let i = 0;
    alert(++i); // 1 – прибавили 1 и вернули результат
    
    let j = 0;
    alert(j++); // 0 – вернём значение до, и прибавим 1
    
    // после уже всё одинаково
    console.log(i, j); // 1, 1


    Тут подробнее и лучше: Инкремент/декремент
    Ответ написан
    Комментировать
  • Почему код неработает?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    из комментов выяснилась проблема, которая была решена.

    Рекомендуемое решение:
    const results = [];
    const promises = [];
    
    for (let i = 0; i < 10; i++) {
      promises.push(
        fetch('/user', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({user: i}),
          })
          .then(response => response.json())
          .then(data => results.push(data))
          .catch(err => console.error(err))
      );
    }
    
    Promise.all(promises)
      .then(() => console.log("All 10 done!", results));
    Ответ написан
  • Как передать данные между сайтом и сервером через сокеты?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Для работы с WebSocket на сервере понадобится постоянно запущенный PHP процесс.
    Не как обычно, запрос-PHP-ответ – а постоянно работающий на сервере PHP-файл, в нём WebSocket сервер, который слушает на каком-то порте. Принимает и держит открытыми подключения от клиентов. Реагирует на события сообщений от них, отправляет что-то в ответ.

    Например, поставьте Swoole, вот пример кода, там и сервер и клиентский JS. Для локального теста достаточно запустить server.php из примера – он и HTTP сервер, который отдаст веб-страницу с нужным JS, и WebSocket сервер.
    Ответ написан
    Комментировать
  • Стоит ли использовать Redis как брокер сообщений?

    У Redis есть две возможности, имеющие отношение к «сообщениям»:
    1. Pub/Sub – паттерн «издатели/подписчики» – сообщение сразу же, как отправили, доставляется всем подписчикам
    2. Lists – списки – просто структура данных в памяти. В «хвост» добавляются новые задачу, рабочие разбирают задачи из «головы».


    Redis Pub/Sub – это доставка сообщений в (почти) реальном времени, но никак не очередь сообщений. Пропустили сообщение, не приняли, подписались позже — не в курсе того, что было. Laravel, разумеется, работает с Redis PubSub.

    Redis Lists можно использовать как хранилище для очередей задач – с командой блокирующего чтения (напр. BLPOP) это больше похоже на *.MessageQueue. См. очереди в Laravel. Команда Redis BLPOP – блокирующая, ждёт появления в списке нового элемента и эксклюзивно его выхватывает. Можно несколько «рабочих» процессов подвесить к одному Redis'у. Будут висеть и ждать появления задач. Кто-то из них получит очередную задачу и займётся её обработкой.
    Ответ написан
    4 комментария
  • Как высчитать (y) для игрока?

    Плоскость задаётся всего тремя точками. Из заданных 4 можно взять любые 3.

    Далее смотрите уравнение плоскости по трём точкам.
    В общем уравнение плоскости имеет вид ax + by + cz + d = 0
    Получите это уравнение (найдёте a, b, c, d), подставите x, z искомой точки — получите её y
    Ответ написан
    Комментировать