• Apache или nginx?

    Вопрос не имеет однозначного ответа. Оба веб-сервера имеют свои преимущества.

    Вам может быть полезная статья, подробно сравнивающая Apache и Nginx
    на английском языке и её перевод на русский.
    Ответ написан
  • Как отрисовать SVG при наведении?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Отрисовку делают изменяя смещение очень длинного штриха stroke-dashoffset, так, чтобы штрих появлялся, создавая эффект прорисовки.

    В вашем случае, можно делать наоборот - исчезновение сплошной линии цвета фона, скрывающей под собой такую же, но частым пунктиром.

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вкратце:
    1. набросать фигуры по сетке. Пусть они где-то накладываются, где-то выходят за границу полотна.
    2. дать им «расслабиться» – будто они льдины, свободно плавающие. И при этом взаимно-отталкиваются. Для упрощения можно посчитать, что каждая точка отталкивается от всех точек других фигур, сила пропорциональна квадрату расстояния. Просчитать несколько «шагов» такого плавания.

    Для определения, пересеклись ли полигоны, как уже написал Хасан Истамкулов, надо проверять пересечение отрезков. Если у двух фигур найдётся, что какие-то два отрезка пересеклись, значит есть коллизия:
    8186a53eefde4e0dbbba93ce279bf961.png
    Ответ написан
    Комментировать
  • Как правильно отсортировать многомерный массив по индексу?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    usort()

    Вам надо написать функцию, которая будет сравнивать элементы по значению поля с индексом 2, что-то типа
    function cmp($a, $b) {
        if ($a[2] == $b[2]) return 0;
        return ($a[2] < $b[2]) ? -1 : 1;
    }
    
    );
    
    usort($array, "cmp");
    Ответ написан
    Комментировать
  • Как правильно организовать продажу билетов?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    «Бронировать» билеты на время в один клик:

    1. Показывать все доступные билеты, где ни "куплен" ни "забронирован".
    2. По клику на билет AJAX'ом помечать его как забронированный под данного юзера: записывать в поле id юзера. В другое поле - время установки брони. Статус брони снимать автоматом через час-два-три.
    3. Так пользователь увидит выбранные билеты, которые гарантированно не куплены ещё.
    4. Оплатит или не оплатит их.
    Ответ написан
  • Аналог Denwer на MacOS?

    Ответ написан
    Комментировать
  • JS: getImageData / putImageData как скопировать изображение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    у putImageData() две сигнатуры: 3 аргумента или 7 аргументов:
    ctx.putImageData(imagedata, dx, dy);
    ctx.putImageData(imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);


    выдрать из него кусочек.. например [0, 0, 10, 10]

    var pixels = context.getImageData(0, 0, 320, 240);
    var data = pixels.data; // в data попадает одномерный массив.
    target.putImageData( pixels, 15, 15, 0, 0, 10, 10);
    /*
    15, 15 – где разместить (отступив по 15px слева сверху в target'е)
    0, 0 – откуда копировать в координатах context'а
    10, 10 – ширина, высота региона копирования
    */
    Ответ написан
    3 комментария
  • Почему не срабатывает onload() на vk.com?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Так работает:
    var mdk_win = window.open('https://vk.com/mudakoff', 'mdk_win', 'width=600,height=400');
    mdk_win.addEventListener('load', function(){
      console.log('окно MDK загружено');
    });
    Ответ написан
    2 комментария
  • Как сравнить два массива и удалить из второго совпадающие элементы JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    arr2 = arr2.filter(e => !~arr.indexOf(e));
    // facebook.com,ya.ru


    Метод массива filter() создаёт новый массив, в котором остаются только те элементы исходного, для которых функция проверки вернула true.

    Внутри этой функции проверяем, есть ли очередной элемент в массиве arr: вернёт ли indexOf() что-то отличное от -1. Для короткой записи такой проверки удобно использовать побитовое НЕ ~ которое даст 0 в единственном случае, когда операнд равен -1. Его отрицание ! даст true в том же единственном случае. Итого эта функция вернёт true только, если элемент не найден в массиве arr.
    Ответ написан
    2 комментария
  • Есть ли программа или способ наложения водяных меток на видео?

    или ffmpeg с его фильтром overlay

    Например, наложить на видео video.mp4 лого из картинки logo.png в течение первых 30 секунд:
    ffmpeg -i video.mp4 -i logo.png -filter_complex \
      "[0:v][1:v]overlay=10:10:enable=between(t\,0\,30)" -codec:a copy out.mp4
    Ответ написан
  • Как проверить существует ли переменная?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Так, как вы написали, ваш код имеет смысл в двух случаях:

    1. Внутри функции:
    function test(varbl) {
      varbl = varbl || 0;
      alert(varbl);
    }
    
    test();
    test( 100500);


    2. Вне функции, и вы должны были бы где-то выше:
    1. объявить эту переменную: var varbl;
    2. дать или не дать ей какое-то значение: if( Math.random() > 0.5) varbl = 100500;

    Тогда далее ваш код вполне будет работать, без ошибок и именно так, как вы и написали.
    Ответ написан
    Комментировать
  • Как найти синус 10 градусов?

    Приближенные значения обычно смотрят в таблицах или получают в калькуляторах.

    Ещё есть такая формула (ряды Тейлора):
    sin(x) ~= x5/5! + x3/3! + x
    где x в радианах:
    9a5ff766043c4698a193c81dc7c06445.gif

    Если стоит задача именно без техники примерно найти sin(10°) можно воспользоваться бумагой, карандашом, линейкой и циркулем. sin() угла в прямоугольном треугольнике это отношение противолежащего катета к гипотенузе. Если нарисовать окружность радиуса 1, то sin() будет равен самой длине противолежащего катета.

    Нарисуйте окружность радиусом, скажем, 10 см (будем считать 1 = 10см). Отмерьте угол в 1/18 полукруга (прямой угол разделить на три части и ещё раз на три). Опустите перпендикуляр из точки на окружности на горизонтальную ось. Его длина, делёная на 10см будет значением синуса.
    Ответ написан
    6 комментариев
  • Что делает функция JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Логическое И && принимает значение true в единственном случае – если оба операнда true.

    a && b проверяет по очереди: сначала, приводится ли к значению true первый операнд, a? Если нет, то дальше проверять нет смысла и выражение возвращает первый операнд, а.

    Если же a не пустой и при переводе в логическое true | false даёт таки true, то так же проверяется второе выражение, b.

    В вашем примере сначала проверяется, что там в jj. Если пустота, то более ничего не делается. Если же там, например, функция, то надо проверить и второй операнд. Для этого надо выполнить функцию jj(false).

    Таким образом, проверяется, не пусто ли jj, и если не пусто, то вызывается функция jj(false).
    Ответ написан
    Комментировать
  • Как разобраться в битовых масках или как их там?

    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 комментария