Задать вопрос
  • Как реализовать пролистывание блока при прокрутке с учётом скролла страницы?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Я не знаю с какой стороны уже подступиться и как делать такой эффект. Я пробовал вешать position: sticky на блок и определять высоту родительского блока. Но это работает при медленном скролле, при быстром блок пролетает не успевая закончить слайдер.

    JS, если грубо описать последовательность действий, то:
    - Получаем контейнер со скроллом.
    - Создаем переменную со значением скролла контейнера.
    - Слушаем скролл контейнера, при изменение скролла - пишем значение в переменную.
    - Каждому элементу контейнера, которому необходимо "двигаться" при изменения скролла контейнера - прокидываем callback, который будет выполняться, если переменная со значением скролла контейнера изменилась.
    - Callback отправляет каждый элемент с "движением" из этого контейнера, который уже самостоятельно определяет, как он будет реагировать на каждое изменение переменной.

    Если Вы не готовы тратить время на велосипедо-строение и его поддержку, то лучше использовать чужое велосипедо-строение:
    https://greensock.com/scrolltrigger
    https://locomotivemtl.github.io/locomotive-scroll/
    Ответ написан
    2 комментария
  • В каких IT профессиях джуну можно работать на удалёнке или фрилансе?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Но всё оказалось не так как я предполагал и многие пишут, что джуны-программисты должны работать в офисе.

    Сразу, как их туда возьмут, а так они и в офисе не нужны, а Вы про удалёнку спрашиваете...
    Может всё-таки можно найти удалённую работу в разработке ну или хотя бы в принципе в IT за более менее человеческую плату

    За бесплатно - вероятность больше ноля, это не шутка.
    Ответ написан
    Комментировать
  • Почему react не присваивает ключи?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Each child in a list should have a unique "key" prop

    https://react.dev/learn/rendering-lists#keeping-li...

    // ..
    
    {items.map((i) => (
      <React.Fragment key={i.id}>
        <Item {...i}/>
      </React.Fragment>
    ))}
    
    // ..

    или
    // ..
    
    {items.map((i) => (
      <Item key={i.id} {...i}/>
    ))}
    
    // ..
    Ответ написан
  • Региональные субдомены: как все сделать правильно с точки зрения SEO?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    Содержимое сайтов будет практически одинаковым (каталог, цены).

    Если не изменять контент, то вероятность склейки страниц с основным зеркалом приближается к 100%.

    Фактически, единственный вариант - изменять контент, чтобы общий процент дубликата уменьшался. Как изменять? - я бы делал это автоматически, в БД хранил данные, которые не требуют гео-привязки, а при рендере страницы - подставлял необходимые гео-ключи.

    UPD: автор обновил вопрос, значит пора обновить ответ!

    Как пример, есть сайты:
    spb.vorota-group.ru
    vorota-group.ru
    Они отлично ранжируются в своих регионах. Как мне сделать так же? Я в замешательстве.

    Анализ: (геолокацию явно не передаем).
    https://vorota-group.ru/rolstavni/, ключ "рольставни в москве":
    - Title - "Рольставни — купить в Москве по цене от 6000 руб. роллеты от производителя: заказать установку".
    - Description - "Заказать рольставни в Москве и области. Широкий выбор роллетов от производителей: Alutech, DoorHan, Hormann. Бесплатный выезд замерщика, гарантия, качественная продукция. Заказать готовые рольставни жалюзи можно по телефону: 8 (495) 845 03 35".
    - Ближайший текст -"Ворота и рольставни в Москве и Московской области".
    - Ключ с вариацией слова "Москва" встречается 6 раз.
    - Контакты с привязкой - "г. Москва, Тихорецкий б-р, д. 1".
    https://spb.vorota-group.ru/rolstavni/, "рольставни в санкт перетрубрг":
    - Title - "Рольставни — купить в Санкт-Петербурге по цене от 6000 руб. роллеты от производителя: заказать установку".
    - Description - "Заказать рольставни в Санкт-Петербурге и области. Широкий выбор роллетов от производителей: Alutech, DoorHan, Hormann. Бесплатный выезд замерщика, гарантия, качественная продукция. Заказать готовые рольставни жалюзи можно по телефону: +7 (812) 502 74 02".
    - Ближайший текст "Ворота и рольставни в Москве и Московской области".
    - Ключ с вариацией слова "Петербург" встречается 6 раз.
    - Контакты с привязкой - "г. Санкт-Петербург, Лиговский пр., 30А".

    Вывод 1. Хотим хорошего ранжирования в определенном регионе? - делайте уникальный контент под этот регион для всех страниц. Каждый процент НЕ уникальности контента на всем сайте в целом - увеличивает процент вероятности теневого бана сайт.
    Вывод 2. Для гугла этот сайт не сильно котируется, соответственно необходимо производить анализ ВСЕХ первых 10-20 сайтов конкурентов из ПС гугла, выявлять взаимосвязь и применять полученные сведения, но без ущерба для яндекса
    Ответ написан
    Комментировать
  • Может тег h2 идти сразу после h1 без разбивки текстом?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    Может ли метатег h2 идти сразу после h1?

    Законом не запрещено. Если Вы имеете ввиду seo оптимизацию, то не рекомендую, т.к. если ключ не совпадает с titile, то поисковик попытается найти ключ в ближайшем заголовке, если ключ в заголовке найден, то затем, поисковик попытается найти ближайший (относительно найденного заголовка) сниппет с аналогичным ключом.

    Соответственно, если Вы хотите прогнозируемый сниппет в органике, то лучше вставлять описание (с ключом из заголовка) параграфом под заголовок.
    Ответ написан
    1 комментарий
  • Как проверить правильность hreflang?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    - Google Search Console > International Targeting > Ошибки в hreflang.
    - Google "hreflang checker" > https://hreflangchecker.com/ .
    Ответ написан
    Комментировать
  • Существует ли аналог Proxy и Reflect (как в JS) для Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Существует ли аналог Proxy и Reflect (как в JS) для Python?

    Встроенных аналогов нет, но можно реализовать самому.

    Аналог Proxy:
    class Proxy:
        def __init__(self, target):
            self.target = target
    
        def __getattr__(self, name):
            print(f"Пытаемся получить атрибут {name}")
            if isinstance(self.target, dict):
                return self.target.get(name, None)
            return getattr(self.target, name, None)
    
        def __setattr__(self, name, value):
            if name == 'target':
                super().__setattr__(name, value)
            else:
                print(f"Устанавливаем значение {value} для атрибута {name}")
                if isinstance(self.target, dict):
                    self.target[name] = value
                else:
                    setattr(self.target, name, value)
    
    obj = Proxy({'x': 1})
    print(obj.x)
    obj.x = 2

    Как функция:
    class Proxy:
        def __call__(self, *args, **kwargs):
            print("Объект вызван как функция")
    
    p = Proxy()
    p()

    Аналог Reflect:
    obj = {'x': 1}
    print(getattr(obj, 'x', None))
    setattr(obj, 'x', 2)

    Управлять классами в момент создания:
    class Meta(type):
        def __new__(cls, name, bases, dct):
            print(f"Создается класс {name}")
            return super().__new__(cls, name, bases, dct)
    
    class MyClass(metaclass=Meta):
        pass
    Ответ написан
  • Как ROISTAT понимает что заявка пришла от кампании директа?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    При интеграции Roistat и Директа - к объявлениям или ключевым фраза прикручивается некий roistat_id (или как то так). По нему Roistat понимает, откуда именно пришел посетитель.
    Ответ написан
    Комментировать
  • TypeError: 'NoneType' object is not callable?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    massage_handler - массаж обработчика?

    Табуляция для await message.answer вышла из чата?
    @dp.massage_handler()
    async def echo(message: types.Message):
    await message.answer(message.text)

    Попробуйте так:
    from aiogram import Bot, Dispatcher, executor, types
    
    # Bot init
    bot = Bot(token="6563641220:AAFBWH_TQ4SW_Zk-6sVyBpeX5rSJitWoRQM")
    dp = Dispatcher(bot)
    
    # echo
    @dp.message_handler()
    async def echo(message: types.Message):
        await message.answer(message.text)
    
    # Запуск лонг-полинг
    if __name__ == "__main__":
        executor.start_polling(dp, skip_updates=True)
    Ответ написан
    Комментировать
  • Как удалить из строки каждый третий символ?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    let str = "abcdefg";
    let newStr = "";
    for (let i = 0; i < str.length; i++) {
      if ((i + 1) % 3 !== 0) {
        newStr += str[i];
      }
    }
    console.log(newStr);

    Или:
    let str = "abcdefg";
    let newStr = [...str].filter((_, index) => (index + 1) % 3 !== 0).join("");
    console.log(newStr);
    Ответ написан
    Комментировать
  • Как лучше организовать поиск сотрудников?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Подскажите, как лучше организовать поиск сотрудников, если их больше 2000, делать один запрос к API и получать сразу всех из БД(mysql) и среди них искать нужного или каждый раз делать поиск конкретного пользователя?

    Если данные сотрудников не изменяются и часто необходимо итерироваться по массиву с объектами всех сотрудников, то имеет смысл единоразово получить с бэка весь массив и сохранить его в store для дальнейшего взаимодействия с ним. В ином случае, лучше запрашивать данные с бэка о конкретном сотруднике.

    Вернуть объект сотрудника, id которого равно 2:
    employees

    const employees = [
        {
            "id": 1,
            "name": "Leanne Graham",
            "username": "Bret",
            "email": "Sincere@april.biz",
            "address": {
                "street": "Kulas Light",
                "suite": "Apt. 556",
                "city": "Gwenborough",
                "zipcode": "92998-3874",
                "geo": {
                    "lat": "-37.3159",
                    "lng": "81.1496"
                }
            },
            "phone": "1-770-736-8031 x56442",
            "website": "hildegard.org",
            "company": {
                "name": "Romaguera-Crona",
                "catchPhrase": "Multi-layered client-server neural-net",
                "bs": "harness real-time e-markets"
            }
        },
        {
            "id": 2,
            "name": "Ervin Howell",
            "username": "Antonette",
            "email": "Shanna@melissa.tv",
            "address": {
                "street": "Victor Plains",
                "suite": "Suite 879",
                "city": "Wisokyburgh",
                "zipcode": "90566-7771",
                "geo": {
                    "lat": "-43.9509",
                    "lng": "-34.4618"
                }
            },
            "phone": "010-692-6593 x09125",
            "website": "anastasia.net",
            "company": {
                "name": "Deckow-Crist",
                "catchPhrase": "Proactive didactic contingency",
                "bs": "synergize scalable supply-chains"
            }
        },
    ]


    const employee = employees.find(emp => emp.id === 2);
    Ответ написан
    Комментировать
  • Как оптимизировать проект Next.js?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Делаю форму регистрации на Next.js, 4 страницы. Хочу ускорить загрузку страниц, но не понимаю, какой рендеринг для этого использовать

    Здесь необходимо уточнение, что понимается под "ускорить загрузку", если Вы имеете ввиде именно сборка страницы, то выбирайте пре-рендеринг. Выбирать между SSR и ISR (необходимо страницу заранее сбилдить, либо использовать кеш), SSG (тут итак билд страницы идет заранее, если fallback не равен true).

    SSR
    ISR
    SSG
    Ответ написан
    Комментировать
  • Почему SwiperSlide в столбик?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Попробуйте более подробный вариант кода слайдера от сюда https://codesandbox.io/s/66c8pc?file=/src/App.jsx , что получилось? Если результат прежний, не или не такой, как в песочнице, то выкладывайте здесь полный код своей страницы, на которой выводится слайдер.
    Ответ написан
    Комментировать
  • Как выплачивать деньги пользователям за предоставление услуги?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    У меня есть сайт с онлайн-курсами, на котором учителя создают курсы. Ученики покупают эти курсы. Как мне теперь делать переводы учителю (выплачивать его долю) от имени моего ИП?

    Оферта с обоими, деньги берете от ученика и выплачиваете учителю, оставляя себе разницу. Банковский счёт - Ваш, как буфер.
    Я даже примерно не представляю, где об этом узнать. Может где-то чаты тематические есть?

    Нанять налогового юриста по этому вопросу Вам будет стоить гораздо меньше, чем сыграть с одноруким товарищем. При текущей системе Налог-3 - игра начнётся достаточно рано.
    Ответ написан
    7 комментариев
  • Почему react router не видит айдишник в урле?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    React Router 6 слегка иначе обрабатывается динамические роуты, попробуйте так:
    export const routes = [
      { path: '/', element: <MainPage /> },
      { 
        path: '/posts', 
        element: <Posts />,
        children: [
          { path: ':postId', element: <PostIdPage /> }
        ]
      },
      { path: '/about', element: <About /> },
      { path: '/*', element: <Error /> },
    ]

    const renderRoutes = (routes) => {
      return (
        <Routes>
          {routes.map((route, index) => (
            <Route key={index} path={route.path} element={route.element}>
              {route.children && renderRoutes(route.children)}
            </Route>
          ))}
        </Routes>
      );
    };

    export default function App() {
      return (
        <div>
          {renderRoutes(routes)}
        </div>
      );
    }
    Ответ написан
  • Как скачать аудиофайл с помощью selenium?

    Mike_Ro
    @Mike_Ro Куратор тега Selenium
    Python, JS, WordPress, SEO, Bots, Adversting
    JS не нужен, все относительно просто:
    from selenium import webdriver
    import requests
    import os
    
    # юзаем хром
    driver = webdriver.Chrome()
    
    # ссылка на сайт для примера (может быть временная, поэтому бдим в оба)
    driver.get('https://cdndl.zaycev.net/track/24932675/4srdJGcFYp791F9ABjYLyvNgexnUL8z7GFNMQiNEsrSRee43ZHFr7YoijrrsDraGx7sYdrvkXeKCzu8CwmWR5jBtHr5i49hH8LZ21oYQM6NQzzKomzZKtphTL5f6dNqGddRuMCQNeHGHMkY64WvroQwEvattc4FcXXhJFrxecgAwnEuHvUWxonULTacHy2wXrVhQAWGPgeXg7gnxMr5MNQ6wq9k35Lh3Dkrnuac678AgKKFkN4QY9ymyEL5gi7JfiqomuSVTsYDNb4WHrrFk2ixFia5Lq8ZahJmRgCGCPqJ8ny2jykXrQekfAJdC8e9rxL8wUnLMBcpPeGFJyZ1p64U2VptfeY')
    
    # ищем элемент по css селектору
    audio_element = driver.find_element_by_css_selector("source[type='audio/mpeg']")
    
    # извлекаем url из элемента
    audio_url = audio_element.get_attribute('src')
    
    # качаем файл
    response = requests.get(audio_url)
    if response.status_code == 200:
        # если файл успешно качнули, то сохраняем в downloads (папка downloads уже должна существовать)
        with open('downloads/audio.mp3', 'wb') as f:
            f.write(response.content)
    
    driver.quit()
    Ответ написан
    Комментировать
  • Стоит ли новичку учить next 12 или лучше сразу 13?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Стоит ли новичку учить next 12 или лучше сразу 13?

    Сразу учите 13, затем, при необходимости - дополняйте знания от <=12 версии.
    Слышал что в 13 версии полностью поменяли все концепции

    Позже снова все поменяют, традициям нельзя изменять!
    Ответ написан
    Комментировать
  • Как поборот накрутку 404 страницы?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    Убрать счетчик на 404 странице?
    Ответ написан
    Комментировать