Задать вопрос
  • Visual Studio Code как создать структуру html?

    RAX7
    @RAX7
    За эту фичу отвечает расширение emmet которое идет в комплекте с vscodом.
    нажимая ! + ентер

    Может все же ! + tab.
    Проверь включена ли настройка "emmet.triggerExpansionOnTab": true
    62c860d52c2d9440252051.png
    Ответ написан
    1 комментарий
  • Как разбирать код чужого сайта?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Я бы советовал посмотреть в сторону гитхаба.
    Там куча открытых исходников, притом - нормально оформленных и, нередко, хотя-бы с минимальным подобием документации.
    Выкачивая сайты же есть шансы получить как минимум обсфуцированный код, разбирать который можно до посинения.
    Ответ написан
    Комментировать
  • Являются ли стрелочные функции аналогом bind функций?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    2 комментария
  • Как описать алгоритм для работы с очередями?

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

    Если же числа небольшие, то для двух касс еще есть решение через динамическое программирование, но его сложно обобщить на большее количество касc.
    Ответ написан
    Комментировать
  • Как проверить передан ли в параметр функции event?

    RAX7
    @RAX7
    Можно с помощью оператора instanceof
    function func(data) {
      if (data instanceof Event) {
        var id = data.target.id;
      } else {
        var id = data;
      }
    }

    Но лучше использовать кастомные события и проверять наличие поля detail в объекте события
    function func(event) {
      const id = event.detail ? event.detail.id : event.target.id;
    }
    domElement.dispatchEvent(new CustomEvent('event-name', { detail: { id: 'id-42' } }));
    Ответ написан
    1 комментарий
  • Отличия GET от POST?

    @stas1212
    Технически между двумя этими методами нет никакой разницы, это все на уровне спецификаций - которые "нужно" соблюдать, но мало кто соблюдает. Фактически же эти спецификации будут использоваться только при проксировании - тоесть если вы используете прокси сервер - то в случае неисполнения запроса типо Get - сервер его повторит( так метод Get идемпотентный).
    Про тело запроса - оно может и в Get - ничего этому не мешает.

    В реальном мире тот же самый Post очень часто используется для получения информации сервера ,а не для записи,происходит это тогда,когда в теле запроса нужно передать какой то объект( например какой то сложный фильтр) и выбирают меньшее из зол - Get с телом хуже чем идемпотентый Post- но если стоит прокси - в случае неудачи такой пост запрос не будет повторен

    Суммируя - есть некая договоренность ,желательно ее соблюдать - но если нет - ничего не случится ))
    Ответ написан
    Комментировать
  • Как получить данные из функции(метода) после выполнения промиса?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    export default class SomeClass {
        async setReservations() {
            const icalUrl = 'someUrlWithData';
            const response = await fetch(icalUrl);
            const text = await response.text();
            return text;
        }
    }

    И вызывать метод через await.
    const foo = new SomeClass();
    const data = await foo.setReservations();
    Ответ написан
    5 комментариев
  • Как сделать размытие по гауссу изображения. Что на вход то поступает?

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