• Keras: 50000 классов, реально?

    слова – словарные или рандомные наборы символов?
    Обычно распознают по буквам, объединяя результат в последовательность. Распознавание текста – не задача классификации по N классам.
    Я бы вообще порекомендовал не париться, а попробовать готовый Google Cloud Vision API – первые 1000 распознаваний бесплатны, достаточно, чтобы попробовать-убедиться в работоспособности.
    Ответ написан
  • Как сделать "нет результата" для поиска?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно сделать отрисовку всего списка, в которой решать, кого показывать, кого нет.
    Вызывать её при любом изменении поля поиска – событие "input".
    Если понятно, что ни один элемент не попал, показывать заглушку «Ничего не найдено»
    Ответ написан
    Комментировать
  • Как правильно работать с кроном, VK, PHP?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    В БД таблица
    id_кому, timestamp_когда, отправлено_когда (nullable)
    Скрипт по крону раз в 5 минут собирает из базы id_кому тех, где текущее время больше, чем ts_когда, и которые ещё не отправлены (отправлено_когда IS NULL)

    Отправляет, проставляет им время отправки.
    Ответ написан
    Комментировать
  • InnerHTML пересоздает все элементы внутри родителя. Как исправить задачу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Когда innerHTML заменяет содержимое, пропадают слушатели событий.
    Ответ написан
    2 комментария
  • Какой аналог innerHTML = ''?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Чтобы стало чуть «профессиональнее» сумейте сформулировать конкретные минусы обращения к свойствам innerHTML и innerText — и задать вопрос «как бы сделать то-то, но без такого-то недостатка».

    Можно работать с узлами DOM-дерева: см. Node.children.
    Например
    Чтобы удалить все:
    [...document.querySelector('#my-div').children].forEach(el => el.remove())
    Но зачем? Что выиграли?
    Ответ написан
    Комментировать
  • Объясните безопасность AJAX?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Всё, что уходит с клиента — подделывается;
    Всё, что приходит на сервер — надо проверять.

    Посмотрите на JSON Web Token (JWT, произносится "jot" «джёт») — это набор информации, который подписан и зашифрован секретным ключом. Ваш сервер мог бы отправлять в скрипт jwt, содержащий user_id, и подписанный секретным ключом, известным только серверу. Тогда на сервере можно проверить, что назад из AJAX-вызова придёт исходный токен и убедиться в его подлинности.
    Ответ написан
  • Vk. Как запостить фотографию в группу?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Ещё вот эту документацию посмотрите: Загрузка фотографий на стену
    Ответ написан
    Комментировать
  • Как подгрузить содержимое контейнера в нужный блок?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Чтобы не потерять слушателей событий, можно перенести все узлы из одного контейнера в другой:
    dest.append(...src.childNodes);

    Работающий пример. Тут кнопка в контейнере продолжает работать и после переноса.
    Ответ написан
    Комментировать
  • Где можно проверить, можно ли юзать песню в видео на ютубе?

    Говорят, раньше была фишка для проверки, но её убрали.

    Как вариант: завести ещё один канал для тестов и в него загружать проверочное видео с музыкой под вопросом – после загрузки YouTube проверит его своим Content Id. Если что, репутация основного канала не пострадает.
    Ответ написан
    Комментировать
  • Как удалить тег не удаляя содержимое?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const expandNode = (node) => {
      node.after(...node.childNodes);
      node.remove();
    }
    
    [...document.getElementsByClassName("mark")]
    .forEach(expandNode);
    Ответ написан
    1 комментарий
  • Как пойтись по массивам и собрать новые массивы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    // Найти наибольшую длину среди массивов – столько будет строк
    const maxLength = Math.max(...arrayOfObjTest.map(el => el.arr.length));
    
    // Подготовить массив
    const result = [];
    
    // Заполнить каждую из строк i-ми элементами
    for (let i = 0; i < maxLength; i++) {
      result[i] = arrayOfObjTest.map(el => el.arr[i] || 0);
    }
    Ответ написан
    3 комментария
  • Почему свойство length начинает считать с единицы, а не с нуля, если в массиве счет начинается с нуля?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Как раз с длиной всё очевидно. length – количество элементов массива:
    []; // сколько элементов? – 0
    ['a']; // сколько элементов: 1
    ['a', 'b', 'c']  // 3

    Индексы начинают с нуля, потому, что индекс – это смещение.
    Исторически, с низкоуровневых языков программирования.
    В памяти под массив выделена некоторая память, начиная с адреса X.
    Последовательно находятся ячейки одинаковой длины. Чтобы найти, где лежит значение i-го элемента, к адресу X прибавляют i * size байт. Самый первый элемент начинается сразу с адреса X. Его индекс 0.

    Так же и со строкой в JavaScript: к буквам можно обращаться по индексу, как к элементам массива.
    "abcd"[1] // "b"
    "abcd"[3] // "d"
    Представьте, что в начале строки стоит курсор. Курсор возвращает букву перед которой стоит. Индекс – на сколько вправо надо этот курсор подвинуть.

    Эта особенность index / length общепринята во многих языках программирования. Так же, как для интервалов часто принято включать начало и исключать конец: [a; b) – например, в методе массива slice(), который вырезает кусок массива, если указать slice(1, 5) — вытащит элементы с индексами 1, 2, 3, 4 – включая 1-й, но не доходя до 5.
    Ответ написан
    Комментировать
  • Обновить страницу по клику?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    повилось больше 1 продукта, и всё, крах: id ведь на странице должен быть уникальным, а у вас их может быть и больше 1.

    Замените id на класс.
    Что-то типа
    const btnClassName = "btn_refresh";
    
    document.querySelectorAll('.woosb-products').forEach(n => {
      n.insertAdjacentHTML('afterend', `<button class="${btnClassName}">обновить</button>`);
    });
    
    document.addEventListener('click', (event) => {
      if (event.target.classList.contains(btnClassName)) {
        window.location.reload();
      }
    });


    Upd. Так как выяснилось, что кнопка должна быть только одна, лучше только одну и создавать:
    const product = document.querySelector('.woosb-products');
    if (product) {
      const button = document.createElement('button');
      button.id = 'b_epr';
      button.innerText = 'обновить';
      button.addEventListener('click', () => window.location.reload());
      product.insertAdjacentElement('afterend', button);
    }
    Ответ написан
  • Что лучше, самовызывающаяся функция или объект для плагина?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    У 1-го варианта возможен косяк, если вдруг подключат файл с плагином дважды: ошибка из-за переопределения переменной Plugin. Как вам вариант:
    { // обернуть, чтобы не засорять глобальную область
    
      // внутри любая анархия, переменные
    
      // исходный вариант 1
      const Plugin = {
        param1: 1,
        param2: 1,
        method1(){
          //
        },
        method2(){
          //
        }
      };
    
      window.Plugin = Plugin;
    }
    Ответ написан
  • Почему не получается получить состояние стороннего сервиса?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    docker.ping() видимо, возвращает Promise. Надо дождаться его выполнения и только тогда возвращать ответ.
    примерно так
    const promises = endpoints.filter((i) => i.type === 1)
    .map((i) => {
      const result = {
        id: i.id,
        name: i.name,
        type: i.type,
        url: i.url,
        groupId: i.groupId
      };
    
      const settings = (i.url.match('unix:///var/run/docker.sock')) ?
          {socketPath: '/var/run/docker.sock'} : {host: i.url, port: 2375};
      const docker = new Docker(settings);
    
      return docker.ping().then(err => {
        result.status = !err;
        return result;
      })
    });
    
    Promise.all(promises).then((results) => res.send(results));
    Ответ написан
    Комментировать
  • Для чего записывать в переменную?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Названия не удачны: название переменной инвертирует смысл:
    $allowDuplicate = $rsPackInfo->DuplicateNotAllowed;

    "allowDuplicate" позволяет дубликат, а "DuplicateNotAllowed" наоборот, ожидается true, когда дубль запрещён.

    В общем код пахнет так-себе.
    Ответ написан
    Комментировать
  • Как построить такую перспективу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В Adobe Photoshop есть похожий инструмент, называется Vanishing Point.

    4 точки задают сетку, которую можно продлить и за границы четырёхугольника. Т.е. точки только определяют характеристики искажения для целой плоскости. Помещённую на полученную перспективную сетку картинку можно увеличивать и двигать.

    Четырёхугольник считается изначально прямоугольником фиксированной пропорцией ширины к высоте. Например, квадратом. Когда его углы перемещаются, противоположные грани перестают быть параллельными и появляется точка их пересечения (vanishing point) – типа, как бесконечно удалённая точка.

    Подробнее про перспективу и её математику (на англ.) например тут и тут.

    Итого, 4 точки задают формулы, позволяющие изнутри плоскости спроецировать на экран. И в эту плоскость помещается изображение, которое двигают и масштабируют, и получают его отображение на плоскость экрана.
    Маска убирает лишнее в координатах экрана.
    Ответ написан
  • Как сделать рассылку комментария по форумам и площадкам?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Смотрите в сторону автоматизации браузера и безголовых (headless) браузеров. Наверное, затея поможет вам разобраться с новой технической темой, но я бы попросил вас воздержаться от рассылки сообщений и найти более элегантный способ решать конфликт с компанией.
    Ответ написан
  • Как поменять функции местами в js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Есть 2 возможных состояния: работает слайдер, или статичные теги. Одна функция пусть устанавливает одно или второе:
    const sliderOptions = {
      arrows: true,
      dots: false,
      variableWidth: true,
      centerMode: true,
      slidesToShow: 8,
      autoplay: true,
      autoplaySpeed: 2000,
      slidesToScroll: 3,
      nextArrow: '<div class="tags__arrow tags__arrow_next">',
      prevArrow: '<div class="tags__arrow tags__arrow_prev">',
      appendArrows: $('.tags__arrows'),
    }
    
    const sliderSet = (is_on) => {
      if (is_on) {
        $('.tags__option_on').hide();
        $('.tags__option_off').show();
        $('.tags__inner').slick(sliderOptions);
      } else {
        $('.tags__option_on').show();
        $('.tags__option_off').hide();
        $('.tags__inner').slick('unslick');
      }
    }
    
    $('.tags__option_on').on('click', () => sliderSet(true));
    $('.tags__option_off').on('click', () => sliderSet(false));
    
    sliderSet(false); // начальное состояние
    Ответ написан
    Комментировать
  • Как изменить значение переменной?

    Запрос курсов с сайта занимает время — операция асинхронна. Её результат оказывается «потом» в коллбэке, в функции (err, res, body) => { ... }.

    А вот все эти console.log() выполняются прямо сразу – поэтому в них ещё ничего нет и выводится 0.

    Решение – выполнять действия, которым нужны значения курсов, после того, как получены значения курсов. Например, в той же функции. Или из неё вызывать другую.
    Ответ написан
    Комментировать