Задать вопрос
  • Как разобраться в битовых масках или как их там?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Про двоичное представление чисел вы же в курсе?
    0 = 0000 0000
    1 = 0000 0001
    2 = 0000 0010
    3 = 0000 0011
    4 = 0000 0100
    5 = 0000 0101
    6 = 0000 0110
    7 = 0000 0111
    8 = 0000 1000
    9 = 0000 1001

    ... и так далее. До 232 или даже до 264 - зависит от системы, 32- или 64-битной и языка программирования.

    Позиции битов считаются справа налево. Крайний правый бит имеет позицию 0. Позиция бита – это степень двойки. Если бит установлен в 1, надо прибавить 2 в степени этой позиции.

    Например, число 3 = 0000 0011 означает 20 + 21 = 1 + 2 = 3.

    Примечательно, что степени двойки – 0, 1, 2, 4, 8, 16, 32, 64, ... – выражаются всего одним включённым битом, одной единичкой, остальные биты – нули.

    Битовые маски – это договорённость, что каждый бит (каждая позиция) значит что-то определённое, что может быть включено или выключено, 1 или 0. Как линейка выключателей.

    Например, с разрешениями ВКонтакте:
    1 - бит 0 - notify
    2 - бит 1 - friends
    4 - бит 2 - photos
    8 - бит 3 - audio

    У ВК линейка длинная, состоит из 32 «выключателей».

    Допустим, вашему приложению требуются разрешения photos и audio – биты 2 и 3 надо установить в 1, остальные 0. Это можно сделать простым сложением: 22 + 23 = 4+8 = 12. В двоичной системе: 12 = 0000 0000 0000 1100

    Для удобства вычисления ВК прямо пишут значения, которые надо прибавить, чтобы получить нужную битовую маску – итоговое число, которое вы передадите в метод АПИ для запроса разрешения.

    Ещё один пример, вам требуется стена wall и offline доступ в любое время. Смотрите в таблице, какие там числа: wall (+8192) и offline (+65536). Значит, вам нужно просить разрешения для маски 73728
    Ответ написан
    Комментировать
  • Как можно переписать это код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вместо return +a[attr] > +b[attr] ? 1: -1;
    можно return +a[attr] - b[attr];

    const sortFunc = function sortFunc(data, elem) {
    	switch( elem.getAttribute('name')) {
    		case 'id':
    		case 'salary':
    			data.sort((a, b) => +a[attr] - b[attr]);
    			break;
    		case 'user':
    		case 'position':
    		case 'gender':
    			data.sort((a, b) => a[attr] > b[attr] ? 1 : (a[attr] < b[attr] ? -1 : 0));
    			break;
    		default:
    			throw('Bad attribute');
    	}
    };
    Ответ написан
    Комментировать
  • В чем ошибка использования arguments функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Calc = function(){
      this.sum = function(){
        return Array
          .prototype
          .slice
          .call(arguments)
          .reduce(function(p,c){return +p+c}, 0)
      }
    }
    
    let c = new Calc;
    c.sum(2,4,6) // 12
    Ответ написан
    9 комментариев
  • Как повернуть многомерный массив на 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 комментария