Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос
TTATPuOT

Антон Неверов

https://code.patriotovsky.ru/
  • 331
    вклад
  • 25
    вопросов
  • 498
    ответов
  • 42%
    решений
Ответы
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • Готовое решение для проверки вхождения координаты в область?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Координаты - это же математика. Вам в целом никакие карты не нужны. Всё зависит от вашего языка.
    Для PHP я когда-то использовал прекрасную PHPGeo. Для других языков есть аналогичные библиотеки со схожим функционалом, обращаться ни к какому API вам не нужно, только лишь посчитать, является ли ваша координата, частью области, указанной вами. Можно это делать даже самостоятельно, если не ленитесь думать (но зачем?).
    Ответ написан 24 февр.
    1 комментарий
    1 комментарий
  • Почему URLSearchParams(window.location.search) показывает true для всех параметров урл если значение есть только в одном?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Сделайте просто
    if (search){
    Если поле пустое или null, то этот if оно не пройдёт. В вашем случае "" != null будет возвращать true.
    Ответ написан 08 февр.
    1 комментарий
    1 комментарий
  • Как при клике на пункт не убирать класс у другого блока?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    const catalogItems = document.querySelectorAll('.select-catalog__item');
    const catalogCount = document.querySelector('.select-catalog__title-count');
    
    const updateActiveCount = () => {
      const activeCount = [...catalogItems].filter(i => i.classList.contains('_active')).length
      catalogCount.innerText = activeCount
      if (activeCount > 0) {
        catalogCount.classList.add('_active')
      } else {
        catalogCount.classList.remove('_active')
      }
    }
    
    for (const item of catalogItems) {
      item.onclick = ({ target }) => {
        const isActive = target.classList.toggle('_active')
        updateActiveCount()
      }
    }
    Ответ написан 05 февр.
    1 комментарий
    1 комментарий
  • Какова нагрузка от использования слайдер Swiper?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Вам кто мешает сделать сначала, а потом уже, при условии, что всё будет глючить, переделать? 20 штук - не так и много, к тому же все они используют одну кодовую базу.
    На готовом решении вы эти слайдеры соберёте условно за 1 час все. Чтобы написать своё у вас уйдёт часа 2 только на то, чтобы продумать структуру общую для всех слайдеров. Сделайте сначала простой вариант. Если не сработает - будете думать, как оптимизировать.

    На Swiper свет клином не сошёлся, есть слайдеры и попроще, и полегче. Вариантов масса:
    https://glidejs.com/
    https://www.embla-carousel.com/
    https://nickpiscitelli.github.io/Glider.js/
    https://swiffyslider.com/
    https://splidejs.com/
    https://github.com/RensTillmann/CarouselJS
    https://github.com/rchisholm/vanilla-slider
    Ответ написан 05 февр.
    1 комментарий
    1 комментарий
  • Как в данном случае работает наследование?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    То, что написано в целом - это самый настоящий говнокод. Класс A не является самостоятельным и при попытке сделать его экземпляр и вызвать A->method() программист получит ошибку в любом случае. Так делать нельзя, независимо от логического обоснования того, что здесь происходит.

    А явление, которое вы наблюдаете называется умными словами позднее статическое связывание (3 пример). Почитать кучу текста всё-таки придётся, этот нюанс в двух словах не объяснить, что вы хотели?
    Ответ написан 05 февр.
    2 комментария
    2 комментария
  • Как сделать чтобы фотографии автоматически учитывая свой размер выставлялись в коллаж?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    object-fit: cover;
    Ответ написан 05 февр.
    Комментировать
    Комментировать
  • Как настроить редирект github pages на https?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Воспользуйтесь документацией
    Ответ написан 30 янв.
    1 комментарий
    1 комментарий
  • Есть ли какой хороший бесплатный плагин импорта для Wordpress?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Я всегда пользуюсь All-in-One WP Migration. Там есть ограничения на размер импортируемого файла, но их можно обойти, загрузив файл напрямую на сервер.

    Не уверен, что он берёт кастомные поля, но меня никогда не подводил.
    Ответ написан 26 янв.
    1 комментарий
    1 комментарий
  • Что за javascript фреймворк на сайте мойгаз.смородина.онлайн?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    React.js
    Все остальные файлы и разметка подключаются и создаются динамически.
    Ответ написан 24 янв.
    3 комментария
    3 комментария
  • Как применить стиль и разметку из примера?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    То, что вы предоставили - это формат шаблонизатора Pug. Ещё такие штуки называют препроцессорами HTML. Они аналогичны препроцессорам CSS: Sass, SCSS и другим. Позволяют меньше писать и кому-то нравятся больше. В чём-то удобнее и, самое главное, умеют работать с JavaScript.

    В вашем случае, чтобы получить чистый HTML достаточно нажать на кнопку View Compiled HTML:
    63cd4b6a0cb32326210456.png
    Ответ написан 22 янв.
    1 комментарий
    1 комментарий
  • Как убрать/изменить границу при сфокусированном textarea?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Попробуйте. Тоже самое работает с select и input.
    .chat-textarea:focus {
      outline: none;
    }
    Ответ написан 22 янв.
    Комментировать
    Комментировать
  • Как поставить изменение картинки только в одном блоке?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    При условии, что в .company__item находятся и .web-active, и .direction-active
    let companyItem = document.querySelectorAll('.company__item');
    
    companyItem.forEach(e => {
        e.addEventListener('mouseover', ({ target }) => {
            target.querySelectorAll('.web-active').forEach(e => {
                e.src="img/web.png";
            });
        });
    });
    
    companyItem.forEach(e => {
        e.addEventListener('mouseout', ({ target }) => {
            target.querySelectorAll('.web-active').forEach(e => {
                e.src="img/web-static.png";
            });
        });
    });
    
    companyItem.forEach(e => {
        e.addEventListener('mouseover', ({ target }) => {
            target.querySelectorAll('.direction-active').forEach(e => {
                e.src="img/arrow-search-active.png";
            });
        });
    });
    
    companyItem.forEach(e => {
        e.addEventListener('mouseout', ({ target }) => {
            target.querySelectorAll('.direction-active').forEach(e => {
                e.src="img/arrow-search.svg";
            });
        });
    });
    Ответ написан 21 янв.
    3 комментария
    3 комментария
  • Как ответить на callback?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Вам не нужно отвечать на предоставленное уведомление. Оно не требует ответа, это обычное сообщение, законченная транзакция.

    Если же речь идёт об ответе на запросы из inline клавиш, то ответить вы на них можете через метод answerCallbackQuery. В теле запроса нужно указать callback_query_id, на который вы отвечаете.

    Но ещё раз - на сообщения отвечать не нужно. Вы можете это делать, но это совершенно не обязательно. Главное отдать код ответа 200, чтобы телеграм понял, что вы получили уведомление.
    Ответ написан 20 янв.
    3 комментария
    3 комментария
  • Сервис/место для хранения файлов WP в 2023?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Самое простое и банальное - использовать S3-совместимое хранилище. Плагинов, которые обеспечат работу с таким хранилищем много, например:
    https://wordpress.org/plugins/amazon-s3-and-cloudfront/
    https://wordpress.org/plugins/ilab-media-tools/
    https://wordpress.org/plugins/wp-s3-smart-upload/

    S3 удобен тем, что вы будете платить только за используемое место, а так же место в облаке будет неограниченным. Самый популярный провайдер в мире - это Amazon Web Services. Но есть ещё Google Cloud Platform и российские Яндекс Облако, VK Cloud, Сбер чё-то там

    Из альтернатив - купить побольше хостинг, пара десятков гигабайт это не так уж и много, чтобы заморачиваться так сильно.
    Ответ написан 20 янв.
    2 комментария
    2 комментария
  • Можно ли разместить тег div внутри table?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Вы можете самостоятельно проверить валидность такой разметки в валидаторе (валидно)
    <!DOCTYPE html>
    <html lang="ru">
      <head>
        <title>test</title>
      </head>
      <body>
        <table>
          <tr>
            <td>
              <div>content</div>
            </td>
          </tr>
        </table>
      </body>
    </html>
    Ответ написан 20 янв.
    Комментировать
    Комментировать
  • Регистрация/авторизации с помощью соц сетей?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Вообще, есть куча разных сервисов, которых предоставляют API авторизации сразу из коробки. Например, старинный uLogin. Он даёт сразу удобные данные в едином формате для многих социальных сетей. Он так же даёт уникальный ID аккаунта, по которому можно определить, зарегистрирован ли пользователь, или ещё нет.
    Но этот вариант плох по многим причинам, основная из которых - зависимость от сомнительного сервиса. Но есть менее сомнительные сервисы, которые выполняют такой функционал.

    Крутые ребята делают авторизацию напрямую. Например, тот же ВК. При авторизации он даёт уникальный ID профиля, по которому вы можете проверить уникальность. В идеальном мире в вашей базе данных будет отдельная таблица для авторизаций через Вконтакте, где будет содержаться VK ID и ID пользователя в вашей системе. При попытке зарегистрироваться вы должны проверить, если ли этот VK ID в вашей системе. Если есть - то авторизовать пользователя как уже зарегистрированного, если нет - внести нужные данные в базу и зарегистрировать нового пользователя.

    Проблемы начинаются, когда гейтвеев становится больше, чем один VK. В этом случае у вас сразу появляется большая куча лишних таблиц и много логики. Это не плохо само по себе, но не опытному программисту может очень сильно навредить в архитектуре. Поэтому проще всего использовать сторонние сервисы, которые предоставляют единый ID для всех социальных сетей, а вы на своей стороне уже можете даже в таблице с пользователями хранить этот ID для дальнейшей проверки. Но вопрос в цене, конечно. И в поддержке российских соц сетей.

    https://auth0.com/learn/social-login
    https://firebase.google.com/products/auth
    Ответ написан 20 янв.
    5 комментариев
    5 комментариев
  • Как подключить клиенский js и css к express?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    В вопросе вы не указали, что именно не работает, но смею предположить, что указаны неправильные ссылки на статичные файлы.

    Во-первых, строкой
    app.use(express.static(__dirname + '/public/css'));

    Вы открываете доступ только к папке /public/css. Если вы хотите открыть доступ ко всей папке public нужно использовать
    app.use(express.static(__dirname + '/public'));

    Во-вторых, вы подключаете скрипты и стили без ведущего слеша. Если перейти на внутреннюю страницу сайта, например на /subpath, то браузер будет искать стили в /subpath/css/index.css. Нужно загружать стили и скрипты с ведущим слешем, чтобы они всегда брались из корня:
    <link rel="stylesheet" type="text/css" href="/css/index.css">
    Ответ написан 20 янв.
    Комментировать
    Комментировать
  • Как сделать lazy-load изображений без вреда для SEO?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    Попробуйте современные технологии
    Ответ написан 19 янв.
    3 комментария
    3 комментария
  • Объясните структуру веб-сервера на node js и socket.io?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    1. Epxress от Nginx отличается главным образом тем, что первый - это сервер для Node.js приложений, а второй для Linux. Вы можете не использовать Express, или не использовать Nginx. По отдельности эти технологии так же будут работать. Чаще всего, ставят связку Nginx + Express для упрощения администрирования нескольких сайтов на одном VPS. Nginx отвечает за внешний роутинг при обращению к сайту, он передаёт запрос нужному Node.js приложению (и не обязательно это должен быть Node.js + Express). А дальше уже Express разбирается с запросом и выполняет бизнес-логику.

    2. По большому счёту, в такой связке проще всего воспринимать Socket.io как расширение для Express, добавляющее поддержку сокетов. Технически, Socket.io не нуждается в Express и может работать на любом другом сервере. Но так как вы задействуете Express, запрос проходит сначала в него, а дальше управление передаётся в Socket.io. Если вас интересует более глубокое погружение - то лучше всего читать документацию Socket.io и смотреть, как работает он.

    3. https://socket.io/get-started/ https://socket.io/docs/v4/server-initialization/#w... - у Socket.io прекрасная документация, которая на примерах показывает различные варианты использования.
    Ответ написан 19 янв.
    1 комментарий
    1 комментарий
  • Как узнать что chat_id выключил бот?

    TTATPuOT
    Антон Неверов @TTATPuOT
    https://code.patriotovsky.ru/
    1) Вы получите повторные сообщения, если с первого раза Telegram не получил код ответа 200 от вашего бекенда.
    2) При попытке отправить сообщение человеку, который заблокировал вашего бота, вы получите 403 ошибку. На неё и ориентируйтесь. Это можно протестировать самостоятельно, остановив бота у себя на аккаунте.
    Ответ написан 19 янв.
    1 комментарий
    1 комментарий
Оценили как «Нравится»
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • Следующие →
Самые активные сегодня
  • Drno
    • 21 ответ
    • 0 вопросов
  • CityCat4
    CityCat4
    • 7 ответов
    • 0 вопросов
  • Bright144
    • 5 ответов
    • 0 вопросов
  • an
    • 2 ответа
    • 3 вопроса
  • Rohan_Singh
    Rohan Singh
    • 5 ответов
    • 0 вопросов
  • vabka
    Василий Банников
    • 5 ответов
    • 0 вопросов
  • © Habr
  • О сервисе
  • Правила
  • Обратная связь
  • Блог

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации