• Как сделать размытие по гауссу изображения. Что на вход то поступает?

    mayton2019
    @mayton2019
    Bigdata Engineer
    На хабре есть статья посмотри https://habr.com/ru/post/142818/

    Ты всё в кучу смешал. При чем тут Фурье? Это совсем другое преобразование и смысл его другой.

    Где в этом уравнение передается информация про цвет или яркость, пикселя?

    Никакая яркость пикселя тебе не нужна. Фильтр применяется последовательно к каждому цветовому каналу отдельно. RGB, CMY рассматриваются как 3д поверхности где высота поверхности равна значению канала.
    Все вычисления лучше нормировать к диапазону вещественных чисел от 0 до 1 а когда все расчеты закончены - обратно приводить к RGB(8:8:8) например.

    В компьютерной графике есть понятие матричных фильтров. Это - самые простые фильтры в смысле ресурсов. И самые общие. Потому что любой фильтр отличается просто размером матрицы и коеффициентами.

    Конвейер такой.
    1) Определяешь размер матрицы (допустим 15 на 15)
    2) Инициализируешь матрицу по любой формуле. Например если все закрасить константой - то будет блур но не красивый с квадратрыми облаками в результате на картинке. Для гаусса - берешь эту формулу и подгоняешь чтобы в центре матрицы был максимум. Матрциа должна быть нормирована так чтобы в сумме не менять энергию всех пикселов которые попадают в квадрат 15 на 15. Подумай сам над этим. Гаусс также параметризуется средним квадратическим отклонением. Это скорее всего параметр сигма в формуле. Чем оно больше - тем размытее картинка. Но делать сигму больше чем 7.5 нет смысла при таком размере.

    2) Матрица применяется к каждому цветовому каналу изображения по принципу перемножисть каждое на каждое и сложить. Пиксели перемножаются на матрицу. Результат всего записывается в центральный пиксель. И так далее.

    3) На краях изображения будет баг. Потому что матрица вылезает за края. Картинки. Ты должен придумать как красить несуществующие пиксели. Можно красить в какой-то средний близкий цвет по расстоянию.

    4) Обычно матричный фильтр работает медленно. Есть оптимизации на низком уровне. В основном - перписывание на длинных командах типа SSE/AVX. И разбиение картинки на полоски с предварительным расчетом умножений. Но это работет для малых матриц. И надо учитывать влияние и размер кешей. Тоесть цифры которые будут получены на 1 конфигурации железа могут сильно отличатсья от другой.
    Ответ написан
    2 комментария
  • Как перезаписать значения из дочернего компонента в родитель?

    yarkov
    @yarkov Куратор тега Vue.js
    Помог ответ? Отметь решением.
    this.$emit('choiceUser', item)
    adaa(selectedUser)
    Ответ написан
    5 комментариев
  • Какие есть схемы аутентификации, не требующие ввода пароля на разных устройствах?

    Adamos
    @Adamos
    Простая математика позволяет создать токен, в котором зашифрованы ID пользователя и хэш от того, чем вы готовы его проверить (пароль, личные данные, ID последнего поста...). Показываете любому пользователю по запросу его токен - указав его, он сможет залогиниться на любом другом устройстве. А будет он его выписывать на бумажку или отправлять себе на мобилу по почте - это уже его трудности.
    Ответ написан
    Комментировать
  • Какие есть схемы аутентификации, не требующие ввода пароля на разных устройствах?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Была такая техника под названием трипкод.

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

    0xD34F
    @0xD34F Куратор тега JavaScript
    Делаем просто, ровно то, что спрошено в вопросе:

    const result = allCass.filter(function(n) {
      return !this.has(n.id);
    }, new Set(defaultCass.map(n => n.id)));

    Делаем сложно, решаем задачу в более общем виде (источником данных могут быть не обязательно массивы; условие, по которому значения признаются равными, не будем зашивать непосредственно в код - будет параметром функции):

    function* diff(data1, data2, key = n => n) {
      const getKey = key instanceof Function ? key : n => n[key];
      const keys = new Set;
    
      for (const n of data2) {
        keys.add(getKey(n));
      }
    
      for (const n of data1) {
        if (!keys.has(getKey(n))) {
          yield n;
        }
      }
    }

    В вашем случае применять так:

    const result = [...diff(allCass, defaultCass, 'id')];

    А можно и так:

    Array.from(diff('abcdE', 'AcD', n => n.toLowerCase())) // ['b', 'E']

    Или так:

    for (const n of diff(Array(8).keys(), Array(5).keys())) {
      console.log(n); // 5 6 7
    }
    Ответ написан
    6 комментариев
  • Как реализовать корректную систему удаления комментария?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    для того чтобы удалить конкретный комментарий, нужно передавать его id, ну и тогда запрос будет:
    DELETE FROM `comments` 
    WHERE `user_id` = :user_id 
    and `id` = :comment_id

    Кроме того, в куках держать айди пользователя нельзя (я спокойно могу напихать в свои куки любой айди и рулить всеми доступами рандомного пользователя). Для этого есть сессии. Так же, для удаления комментариев лучше использовать специальное поле, отвечающее за статус комментария, меняя его на (условно) "удален".

    Так же, для таких случаев лучше подходит яваскрипт и аякс запросы, чем перезагрузка страницы формой.
    Ответ написан
  • Как лучше организовать API для работы с websockets?

    bingo347
    @bingo347
    Crazy on performance...
    WebSocket подразумевает постоянное соединение с сервером, разные эндпоинты подразумевают разные соединения, что само по себе дорого и не дает ни каких преимуществ.
    Притом WebSocket - это двусторонняя связь, любая сторона (и клиент и сервер) может отправить свое сообщение в любой момент времени. Как правило поверх WebSocket используют какой-либо RPC протокол чтобы реализовать механизм запрос-ответ и маршрутизировать различные запросы.
    Ответ написан
    Комментировать
  • Как сделать сортировку по двум параметрам?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сортируем существующий массив:

    arr.sort((a, b) => a.surname.localeCompare(b.surname) || a.name.localeCompare(b.name));

    Собираем отсортированный новый:

    const sorted = (arr, keys) => arr
      .map(n => [ n ].concat(keys(n)))
      .sort((a, b) => {
        let diff = 0;
        a.find((n, i) => diff = i && ((n < b[i]) ? -1 : +(n > b[i])));
        return diff;
      })
      .map(n => n[0]);
    
    
    const sortedArr = sorted(arr, n => [ n.surname.toLowerCase(), n.name.toLowerCase() ]);
    Ответ написан
    Комментировать
  • Как можно менять контент сайта?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Используй TreeWalker, чтобы получить все нужные тебе узлы с документа.

    Например, вот так можно выцепить все текстовые ноды:
    function getTextNodes() {
      var n, a=[], walk=document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false);
      while (n=walk.nextNode()) a.push(n);
      return a;
    }

    Дальше просто обходи результат в цикле и делай автозамену слов в текстовых нодах.
    Ответ написан
    4 комментария
  • Путь коня или какова польза ограничений?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Есть простая оптимизация - из всех возможных ходов из текущей клетки перебирать сначала те, которые ведут в клетку с наименьшим количеством возможных следующих ходов (это надо проверить и все ходы через один ход и посмотреть, а обойдены ли те клетки уже). Эта оптимизация как раз заставит коня ходить сначала вокруг стенки и по спирали подходить к центру.
    Ответ написан
    5 комментариев
  • Насколько сложно написать приложение с распознаванием шахматных фигур?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Если вы так ставите вопрос, то для вас действительно будет сложно сделать качественно распознающий доску продукт.
    Вообще, полагаю, без очень хорошего опыта в использовании сверточный нейронных сетей и вообще в распознавании образов в эту задачу можно сунуться только из академических интересов. Сделать достаточно хороший продукт будет не просто.
    Тем более, что шахматы у всех могут быть немного разные, условия освещения, ракурсы, подвижность камеры...
    Любое новшество должно решать больше проблем. чем создавать, а чтобы такое приложение было полезным нужно очень сильно заморочиться вычесывая баги и специфические ситуации.

    Моно попробовать компромиссный вариант. Если отказаться от чтения произвольной ситуации на доске. а попробовать следить за доской со статической камеры от начала матча, то тут можно многое упростить.
    Вам не придётся распознавать форму фигур с рахных ракурсов, достаточно просто отслеживать занятые клетки доски и ее эволюию между ходами. Зная правила, начальное состояние и видя изображения двцх состояний доски до и после хода можно (вроде бы) однозначно определить какой именно был сделан ход и какое теперь новое состояние.
    В этом случае тоже не просто будет вычесать все баги, но тут уже гораздо проще научить opencv находить габариты доски, выпрямлять перспективные искажения и понимать какие клетки заняты. а какие свободны.
    Моно сделать звуком со стороны программы просьбы убрать руки от доски или вернуть последний ход, если что-то помешало камере сделать кадры между ходами и прога потеряла нить.

    Начал бы я именно с такого MVP, если бы приспичило такое делать.
    С другой стороны, если хочется что-то замутить эдакое, то лучше сделать прикольную доску, которая могла бы переставлять шахматы.
    Реализовать такое можно установив под доску координатный стол с электромагнитом на каретке, как в ЧПУ-фрезере и матрицу датчиков холла -- под каждую клетку по датчику, а в фигуры вклеить обычные магниты.
    Будет продольная каретка, поперечная каретка, электромагнит (или бычный мощный неодимовый, отодвигаемй сервомотором).
    Датчик холла под кажой клеткой даст понять какие клетки заняты. За ходами можно следить по тому, на каких клетках пропадали и появлялись фигуры. Передивгать фигуры можно двигая каретку с магнитом и перетаскивая так фигуры по доске. Придётся заморочиться, чтобы корректно раздвигать фигуры для протягивания коня и для выведения битых фигур с поля. Но выглядеть при должной реализации будет завораживающе волшебно.
    Ответ написан
    1 комментарий
  • Как динамически создать всплывающее окно для элемента?

    @AndrewRusinas
    Конкретно для данного случая используйте Selection API. Можете получить Range, а от него getBoundingClientRect() и рассчитать позицию вашего попапа
    Ответ написан
    1 комментарий
  • Как прочитать из Proxy?

    Alexandroppolus
    @Alexandroppolus
    кодир
    proxyObj[idx]
    Ответ написан
    Комментировать
  • Как проверить наличие в массиве объекта с определённым значением свойства?

    YuriyVorobyov1333
    @YuriyVorobyov1333
    Software Developer
    Есть несколько вариантов
    1) метод find
    data.find(el => el.item === 'geovishap-hatchling') // => {id: 'enemies', item: 'geovishap-hatchling'}
    data.find(el => el.item === 'geovishap-hatchling-3') // => undefined

    2) метод findIndex
    data.findIndex(el => el.item === 'geovishap-hatchling') // => индекс элемента
    data.find(el => el.item === 'geovishap-hatchling-3') // => -1
    Ответ написан
    1 комментарий
  • Как посчитать количество двойных 'X'?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    import re
    
    data = 'ZZYYXYYXZXZXZYXYYXZYZYYZYZZXYYZZXYXYZYZXYZXYZYZXZYZZZZYYZYXYXXXZYXZXYYXXYYYXXZZYYYZXZZZYXXXX'
    
    len(list(filter(lambda x: len(x)==2, re.findall('X+', data))))
    # 2
    Ответ написан
    Комментировать
  • Может ли useEffect работать по-другому?

    @asdasdqwe
    const isInitialMount = useRef(true);
    
    useEffect(() => {
      if (isInitialMount.current) {
         isInitialMount.current = false;
      } else {
          // Your useEffect code here to be run on update
      }
    });

    https://stackoverflow.com/questions/55075604/react...
    Ответ написан
    Комментировать
  • Почему возникает ошибка SyntaxError?

    mayton2019
    @mayton2019
    Bigdata Engineer
    У тебя кажется количество круглых скобочек не совпадает.
    Ответ написан
    2 комментария
  • Как в ряду чекбоксов устанавливать checked только до того чекбокса, который был кликнут?

    0xD34F
    @0xD34F Куратор тега Vue.js
    data: () => ({
      checkedCount: 0,
    }),

    <div v-for="i in 10">
      <label>
        <input
          type="checkbox"
          :checked="i <= checkedCount"
          @change="checkedCount = checkedCount < i ? i : i - 1"
        >
        {{ 2 ** i }}
      </label>
    </div>
    Ответ написан
    Комментировать