Задать вопрос
  • Как повернуть многомерный массив на 45 градусов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Для проверки диагоналей не нужно поворачивать матрицу на 45°, достаточно проверять сумму индексов:
    00 01 02
    10 11 12
    20 21 22

    Диагонали слева снизу вправо вверх:
    00        :  0+0 = 0
    10, 01    :  1+0 = 0+1 = 1
    20, 11, 02:  2+0 = 1+1 = 0+2 = 2

    И так далее. Сумма индексов в таких диагоналях постоянна. Максимум в правой нижней клетке составляет удвоенный макс. индекс.

    Чтобы проверить диагонали слева сверху вправо вниз, надо инвертировать индексы одного из измерений, напр. строк: не 0..N, а N..0
    var arr = [
      'o,x,x'.split(','),
      'x,o,o'.split(','),
      'o,x,o'.split(','),
    ];
    
    var r, c, key, diags = {};
    for(r = 0; r < arr.length; r++) {
      for(c = 0; c < arr[r].length; c++) {
        key = r + arr[r].length - 1 - c; // слева сверху вправо вниз
        // key = r + c; // слева снизу вправо вверх
        
        if( diags.hasOwnProperty(key)) {
          if( diags[key] !== arr[r][c]) diags[key] = false;
        } else {
          diags[key] = arr[r][c];
        }
      }
    }
    
    for( key in diags) if( diags[key] === false) delete diags[key];
    // {"0":"x","2":"o","3":"x","4":"o"}
    Ответ написан
  • Как сделать возврат значения из callback?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Функция user_params() отработает сразу и вернет null. А ответ от ВК будет получен когда-то потом и попадёт во вложенную функцию.

    Как вариант, передавайте третьим параметром функцию, которую позже вызовут и в которую передадут ответ ВК:
    function user_params(id, param, callback) {
      vk('users.get', {user_ids: id, fields: param}, function(error, response){
        if (error) {
          console.log(error);
        } else callback(response[0][param]);
      });
    };
    Ответ написан
    1 комментарий
  • Какой плагин использовать для реализации анимации?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вроде бы можно сделать целиком на CSS3.

    Понадобится картинка, которая при повторении даст такой узор – фигура в центре + 4 фрагмента по углам. Анимировать масштаб этого фона и расширяющуюся маску clip-path, которая сначала показывает только одну центральную фигуру, а затем расширяется и открывает весь экран. Ну и в прозрачность увести фон слегка.
    Ответ написан
  • С формой отправляю время заполнения. Как добавить 2 часа к времени сервера?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    $date = new DateTime();
    $date->setTimezone( new DateTimeZone('+0300')); // тут ваш часовой пояс
    echo $date->format('d.m.Y H:i:s') . "\n";
    Ответ написан
    3 комментария
  • Стоит ли изучить backbone js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Чтобы никто не сломал себе ногу, стоит разобраться с модулями в JavaScript – начните использовать сборщик: Require.js или Webpack или Browserify. А код разделяйте в небольшие логически изолированные куски - модули – лежащие каждый в своём файле.

    Backbone.js в 2017 по-моему вполне актуален. Он не конкурирует с тем же React, который играет роль View в паттерне MVC. Посмотрите, например, реализацию простейшего TodoMVC на Backbone + React.
    Ответ написан
    Комментировать
  • Как округлить минуты в нужную сторону?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Получить минуты, округлить в большую сторону до 15-минутного значения, установить это значение минут:
    function roundTS(ts) {
      var D = new Date(ts);
      var m = 15 + Math.ceil( D.getMinutes() / 15);
      D.setMinutes(m);
      return D.getTime();
    }


    А если требуется именно с массивом минут, то примерно так:
    function roundMinArr( D, arr) {
      var i, m = D.getMinutes();  
      arr.sort((a,b)=>a-b);
      for(i in arr) {
        if( arr[i] < m) continue;
        D.setMinutes(arr[i]);
        return D;
      }
      D.setMinutes(60 + arr[0]);
      return D;
    }
    
    var D = roundMinArr( new Date('2017-08-16T12:17+03:00'), [0,15,35,44,59]);
    D.toString() // Wed Aug 16 2017 12:35:00 GMT+0300 (MSK)
    Ответ написан
    Комментировать
  • Как сделать при нечётном клике один звук, а при чётном другой?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно, как и просит ТС, прямо в HTML. При первом клике инициализировать массив из двух аудио, и переназначить функцию onclick:

    this.a=[
      new Audio('https://wav-library.net/sfx/mix/LightSwitch.mp3'),
      new Audio('https://wav-library.net/prmusic/rock/Run.mp3')
    ];
    this.f=()=>{ // это будет новый обработчик клика
      var cc=!!this.cc; // для краткости записи
      this.a[+!cc].pause(), // если предыдущий длинный играет - стоп его!
      this.a[+!cc].currentTime=0, // ..и перемотать на начало.
      a[+cc].play(), // играть новый
      this.cc=!cc // переназначить счётчик ( true | false )
    };
    this.onclick=this.f, // переназначить хэндлер клика
    this.f() // вызвать для первого клика принудительно

    CodePen

    HTML с этим скриптом будет такой:
    <td onclick="this.a=[ new Audio('https://wav-library.net/sfx/mix/LightSwitch.mp3'), new Audio('https://wav-library.net/prmusic/rock/Run.mp3')];
    this.f=()=>{var cc=!!this.cc;this.a[+!cc].pause(),this.a[+!cc].currentTime=0,a[+cc].play(),this.cc=!cc};
    this.onclick=this.f,this.f()">click me!</td>
    Ответ написан
  • Как автоматизировать бота для vk?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Документация ВК по созданию чат-бота.

    Понадобится сервер, на котором постоянно будет работать ваш софт – слушать входящие запросы и в ответ на них вызывать методы API ВК.

    С крупным сообществом вы возможно столкнётесь с проблемой слишком большого числа запросов в единицу времени. Поэтому продумайте механизм очереди задач: при поступлении нового сообщения не обрабаывайте его сразу же, а просто сохраняйте в очередь. А отдельный "рабочий" процесс пусть берет по одному заданию из очереди и пишет им ответ.
    Ответ написан
    6 комментариев
  • Могут ли недобросовестные владельцы приложений ВКонтакте использовать мой access_token?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Токен – это техническая возможность выполнять некоторые вызовы API ВКонтакте от имени пользователя, установившего приложение.

    Как распорядиться такой технической возможностью – целиком на совести автора приложения.

    Чего точно не нужно делать – это копировать по просьбе авторов приложения адресную строку из вашего браузера, когда ниже пишут «Не копируйте!..» В этом случае вы даёте действительно критические разрешения неизвестному приложению, 100% нарушающему правила ВК.
    Ответ написан
    Комментировать
  • Как достать нужное свойство из многомерного объекта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function getById( obj, id) {
      var i, found;
      if( obj.id === id) return obj;
      if( obj.hasOwnProperty('childGroups')) {
        for( i in obj.childGroups) {
          if( found = getById( obj.childGroups[i], id)) return found;
        }
      }
      return;
    }
    
    getById( obj,3) // {"id":3,"parentId":1,"childGroups":[{"id":6,"parentId":3},{"id":7,"parentId":3}]}
    Ответ написан
    Комментировать
  • Категоризация данных. Как сделать по уму?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Руководствуясь принципом KISS, может, просто начать писать через разделитель «категория.тип»:
    image.png|image.jpg|image.gif|audio.mp3

    Это поле в таблице у вас типа ENUM?
    Ответ написан
    1 комментарий
  • Как на php наложить звук на видео?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    На чистом PHP вряд ли. Понадобится библиотека для работы с видео. Скорее всего ffmpeg.

    Проще всего, наверное, установить на сервер ffmpeg и запускать его из PHP через exec() . Это проще, но имеет серьёзные недостатки:
    1. перекодирование может занять длительное время, а PHP по умолчанию имеет таймаут в 30 секунд для ответа веб-серверу.
    2. параллельно запустить несколько перекодировщиков для сервера тяжело – ffmpeg занимает немало памяти и грузит процессоры.

    Поэтому по-хорошему надо организовать очередь задач.
    Ответ написан
  • Как хранить .mp3 и .ogg на сервере?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Самое простое: загрузить файлы из формы методом POST и сохранить их где-то в папке.

    Чуть продвинутее – проверять содержание принятых файлов, чтобы убедиться, что вам загрузили именно аудио, а не фильм mp4 переименованный в mp3. Заодно, может, получить какие-то метаданные: хотя бы длительность трека, а если повезёт, название и имя исполнителя.

    Минус стандартного приёма файлов описанным выше методом в том, что всё время, пока файл качается, под него занят процесс PHP. Т.е. принять одновременно сотню файлов не получится: не хватит памяти. Одно из решений этой проблемы – поручить приём файла веб-серверу. Тот примет, сохранит на диск, и только тогда дёрнет php-скрипт, чтобы тот разобрался с файлом. Это можно сделать например, с веб-сервером nginx и модулем Upload
    Ответ написан
    Комментировать
  • Водяной знак на картинку налету?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Идея так-себе. Одновремено зайдёт 20 человек на сайт – и придётся «налету» процессить сотню картинок. Вряд ли это будет делаться параллельно в 100 потоков. Вы выстроите задания в очередь. И картинки станут появляться в браузерах посетителей с заметной задержкой.

    Надо, видимо, всё-таки держать на своём сервере всю базу картинок с водяным знаком. И постоянно гонять процесс, неторопливо в один поток обновляющий картинки, предпочитая самые давно не обновлённые.
    Ответ написан
    Комментировать
  • Как посчитать количество букв или цифр?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    function countSymbols(s) {
      return s.split('').reduce(
        (p,c) => (p.hasOwnProperty(c)?p[c]++:p[c]=1, p), {}
      );
    }
    var r = countSymbols('hello'); // {"h":1,"e":1,"l":2,"o":1}
    Ответ написан
    Комментировать
  • Какой логотип более правильный?

    Т.к. буквы не рядом, строгая параллельность наклонных не так важна,
    как визуальное равновесие пустого пространства слева и справа от буквы «О».
    Ответ написан
    2 комментария
  • Как достать значение объекта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вариант в лоб, плохой:
    function bad( obj, name) {
      return eval('obj.' + name);     
    }
    bad(r, 'foo.bar'); // 'value'


    Вариант чуть получше, проверяем на каждом шаге, есть ли такое свойство:
    function better( obj, name) {
      var parts = name.split('.'), i, cursor = r;
      
      for( i = 0; i < parts.length; i++) {
        if( !cursor.hasOwnProperty( parts[i])) throw('No such property: ' + parts[i]);
        cursor = cursor[parts[i]];
      }
      
      return cursor;
    }
    
    better(r, 'foo.bar'); // 'value'
    Ответ написан
    Комментировать
  • Как удалить вирус на Mac?

    Вирусов у вас пока, скорее всего, никаких нет. Не верьте веб сайтам, предлагающим что-то установить под любым предлогом. В OS X желательно устаналивать софт только через App Store. Ну, или из установщиков от разработчиков, которым вы очень, очень доверяете.

    1. Регулярно устанавливайте обновления системы через официальный App Store.
    2. Настройте TimeMachine, чтобы делались регулярные бэкапы на внешний диск.
    3. Не ведитесь на абсолютно левые сайты, как на ваших скриншотах – просто игноируйте такие.
    4. Не ходите по пиратским сайтам в поисках бесплатных шрифтов.
    5. Установите в Safari расширение AdBlock Plus, блокирующее рекламу и вредные сайты.
    Ответ написан
    6 комментариев
  • Время php или как его удобней сформировать?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    $date = new DateTime();
    $date->setTimezone( new DateTimeZone('+0000'));
    $date->setTimestamp( time());
    $date->add(new DateInterval('PT2H')); // добавим 2 часа про запас – просят же больше текущей
    
    echo $date->format('c') . "\n";
    Ответ написан
    4 комментария