• Как работать с сессиями в 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
    Ответ написан
    Комментировать
  • Как осуществить рандомный выбор функции и последующее ее выполнение?

    "function$((1 + ($RANDOM % 3)))"

    Встроенная в bash функция $RANDOM при каждом вызове вернёт случайное 16-битное целое от 0 до 32767. Можно брать остаток от деления его на 3 – будет 0, 1 или 2 – и добавив единицу приклеить к слову "function" – получится имя нужной функции. Остаётся её вызвать – просто эта строка в bash скрипте, собственно, и вызывает полученную функцию.

    Проверки
    $ ./rand.sh 
    пукпук
    $ ./rand.sh 
    пукпук
    $ ./rand.sh 
    пукпук3
    $ ./rand.sh 
    пукпук3
    $ ./rand.sh 
    пукпук3
    $ ./rand.sh 
    пукпук3
    $ ./rand.sh 
    пукпук3
    $ ./rand.sh 
    пукпук2
    $ ./rand.sh 
    пукпук2
    $ ./rand.sh 
    пукпук2
    $ ./rand.sh 
    пукпук2
    $ ./rand.sh 
    пукпук
    $ cat ./rand.sh 
    #!/bin/bash
    
    function1() {
        echo пукпук
    }
    function2() {
        echo пукпук2
    }
    function3() {
        echo пукпук3
    }
    
    "function$((1 + ($RANDOM % 3)))"
    Ответ написан
    Комментировать
  • Как выполнять следующую функцию массива через некоторое время после предыдущей?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Для реализации задуманного нужен момент окончания работы очередной функции – чтобы от него считать 2 секунды.

    В вопросе не раскрыта природа функций в массиве: то ли они мгновенно отрабатывают, то ли занимают продолжительное время. Синхронные или асинхронные. Что эти функции возвращают: Promise, значение или ничего?

    Можно обернуть каждую в Promise с таймаутом:
    [func1, func2, func3]
      // обернуть каждую в Promise:
      .map((f) => () => new Promise((res, rej) => {
        f();
        setTimeout(res, 2000));
      })
      // и собрать цепочку из этих промисов:
      .reduce((acc, c) => acc.then(c()), Promise.resolve());


    Если эти функции асинхронные, то заменить
    -    f();
    -    setTimeout(res, 2000));
    +    f()
    +    .then(() => setTimeout(res, 2000)));
    Ответ написан
    Комментировать
  • Как установить php в контейнер Docker?

    docker-php-fpm:
    -     build: .
    -     context: ./php-fpm
    +     build: ./php-fpm
    Ответ написан
    Комментировать
  • Как оптимизировать данный код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    async componentDidMount() {
        const lastSongsResponse = await fetch("https://api.laut.fm/station/key/last_songs");
        const lastSongs = await lastSongsResponse.json();
        lastSongs.length = Math.min(7, lastSongs.length);
    
        const promises = lastSongs.map((song) => new Promise((resolve, reject) => {
            const params = {
                method  : 'album.getInfo',
                artist  : song.artist.name.replace(' & ', ', '),
                album   : song.album,
                api_key : 'apikey',
                format  : 'json',
            };
    
            const url = "https://ws.audioscrobbler.com/2.0/?" + Object.keys(params).map((key) => `${key}=${params[key]}`).join('&');
    
            const cover = await fetch(url)
                .then((response) => response.json())
                .then((songData) => songData.album.image[4]["#text"])
                .catch(err => reject(err));
    
            const date = new Date(song.started_at);
    
            const songData = {
                id1        : song.id,
                id2        : song.id + 1,
                artist     : song.artist.name,
                title      : song.title,
                cover      : cover,
                started_at : date.getHours() + ':' + date.getMinutes().toString().padStart(2, '0')
            }
            
            resolve(songData);
        }));
    
        const results = await Promise.all(promises);
    
        this.setState({ results: results })
    }
    Ответ написан
    4 комментария
  • Как работает Promise.resolve в Javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const deferred = () => {
      Promise.prototype.resolve = () => {}; // чтобы не было ошибок )
      return Promise.resolve("web");
    }


    «Нормальное» решение:
    // проверка
    deferred()
      .then(function(res) {
        console.log(200, res);
        return "lab";
      })
      .then(function(res) {
        console.log(100, res);
      })
      .resolve("web");
    
    // реализация
    function deferred() {
      function Box() {
        this.queue = [];
      }
    
      Box.prototype.then = function(func) {
        this.queue.push(func);
        return this;
      }
    
      Box.prototype.resolve = function(first_arg) {
        let arg = first_arg;
        while (this.queue.length)
          arg = this.queue.shift().call(this, arg);
      }
    
      return new Box;
    }
    Ответ написан
    3 комментария
  • FFmpeg - как обрезать видео с конца?

    Узнать длительность клипа, вычесть 10 секунд, подставить полученную желаемую длительность в -t ???:

    ffmpeg -i SOURCE
    // найти duration 
    
    ffmpeg \
      -i SOURCE \
      -t XXX \
      -codec copy  \
      DESTINATION
    При отсутствии перекодирования , т.к. кодеки те же, процесс должен быть очень быстрым.

    Для некоторых форматов ffmpeg покажет приблизительную, не точную длительность.
    Ответ написан
    Комментировать
  • Как заменить jquery на js при работе с динамическими элементами?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    You Might Not Need jQuery (на англ.)
    Ответ написан
    Комментировать
  • Как записать в кавычках переменную с индексом?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    "<div class=\"$array[key]\"> </div>";
    
    "<div class=\"{$array['key']}\"> </div>";
    
    "<div class=\"$object->property\"> </div>";
    См. Variable parsing
    Ответ написан