Задать вопрос
  • Как сделать поиск по буквам в масиве?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    JSON у вас некорректный: беспорядок в кавычках.

    Примерно так решается задача:
    $search = 'b';
    
    $json = '{"1":{"name":"Browser"},"2":{"name":"Браузер"},"3":{"name":"Повар"},"4":{"name":"bонки"}}';
    $data = json_decode($json);
    
    $found = array();
    foreach($data as $entry) {
    	$name = $entry->name;
    	if( false !== mb_stristr( $name, $search)) {
    		array_push( $found, $name);
    	}
    }
    
    print_r($found);
    /* Array
    (
        [0] => Browser
        [1] => bонки
    ) */
    Ответ написан
    Комментировать
  • Случайное число с заданной вероятностью, какой алгоритм?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Делают длинный диапазон, составленный из отрезков, пропорциональных вероятностям.
    0..22 : "0"
    22..22+19=41: "1"
    41..41+16=57: "2"
    ...
    ..100: "8"

    Выбор из него с линейной вероятностью даст желаемое распределение.

    Например, выпало 56 – попадает в диапазон, относящийся к "2"
    Ответ написан
    1 комментарий
  • Почему users.get не возвращает информацию о 1000?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Варианты:
    1. id повторяются
    2. id и короткое имя указывают на одного пользователя
    3. id отрицательны
    4. id не числа и не короткие имена
    Ответ написан
  • Можно ли как-то делать автопостинг в VK API без колесика рядом с датой, которое ведет на standalone приложение?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Технически можно постить не через API, а имитируя действия пользователя в браузере. Например, в безголовом браузере phantom.js или web view в Electron или nw.js
    Ответ написан
  • Как написать алгоритм поиска соседних элементов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Идея с отдельной работой по X и по Y неплохо работает. На каждом кадре проверяем каждую из 200 точек (это совсем не много).

    Сортируем массив точек по их X-координате. Двигаемся слева направо, выбирая очередную точку.

    Смотрим от неё влево (чтобы не проверять одну связь дважды, выбираем полуплоскость от точки) и отбираем только те точки, чей X отличается не более, чем на radius.

    Из них смотрим только на те, у которых Y не более, чем на radius отличается (уже в любую сторону: и вверх и вниз).

    У них проверяем уже евклидово расстояние – корень из суммы квадратов расстояний по X и по Y – чтобы было не больше radius. У таких есть «связь» – рисуем им ребро.

    Работающий fiddle (неминифицированный исходник на github)
    538264abb31847baa28fe05e015ac13c.png

    На компе даёт около 60 fps, на мобильнике от 40 до 55, т.е. совершенно приемлемая скорость при 200 точках.

    Первая версия ответа

    Интересна ситуация, наихудшая для оптимизации: когда за 1 кадр может поменяться максимальное число связей. Предположу, что это сетка из равносторонних треугольников, где длина ребра равна «триггерной» дистанции:
    картинка треугольной сетки
    5297fe1c584f4551aca5b77a2a987549.jpg
    Тут большинство точек, кроме крайних, взаимосвязаны. У каждой по 6 ближайших соседей. Примерно 200 * 6 / 2 = 600 связей (чуть меньше из-за краёв).

    Если такую сетку пропорционально увеличить на любую малую величину, сразу все связи порвутся, их станет ноль. Пусть на месте останется, скажем, левый верхний угол сетки. Тогда наибольший путь проделает нижний правый угол. Тут вопросы к особенностям вашей задачи:
    1. округляются ли координаты до целых или до какой-то точности?
    2. какой наибольший путь может проделать за один кадр точка?

    В идеальном мире всем достаточно проделать бесконечно малый шаг, и, вуаля!, было 600 связей, стало 0. Такой же шажок назад – не было связей, и вот их 600. Т.е. надо бы в каждый кадр проверять 600 ребер. Считать это за теоретический предел оптимизации?

    Сущности
    Точки и рёбра. Ребро ссылается на две точки. Точка ссылается на рёбра. Ребро имеет длину и, в зависимости от длины, может быть «видимым».

    Важнее всего следить за рёбрами, длина которых близка к пороговой – и с меньшей и с большей стороны. Такие стоит проверять почти каждый кадр, т.к. статус ребра может поменяться за один кадр. Прочие рёбра и кандидаты в рёбра проверять можно изредка.

    Можно давать рёбрам веса, пропорциональные желаемой частоте их обновления. Скажем, от 0 до 1. Вес равный 1 значит, что нужно проверять каждый кадр. Например, вес W = Math.max(0, D - Math.abs( length - D))/D, где D – пороговая дистанция.

    Остаётся сделать механизм, отбирающий рёбра в работу на очередном кадре, исходя из их весов. Запоминать время, когда ребро было обновлено. Приоритет его попадания в обработку равен W * (time - timeUpdated)
    Ответ написан
    3 комментария
  • Как оптимизировать svg-файл, в котором находится 5 000 точек, для встраивания на страницу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Браузеру тяжеловато отрисовываеть такое количество элементов.

    Canvas вместо SVG не рассматривали?
    Ответ написан
    1 комментарий
  • 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).
    Ответ написан
    Комментировать