• Как остановить обратный отсчет?

    neuotq
    @neuotq
    Прокрастинация
    countdown возвращает объект с разными свойствами в тч со свойством value, которое при случае когда дата "от" больше даты "до" будет отрицательным. Значит нужно добавить проверку на это значение.

    Примерно так:

    const standart = moment().tz("Europe/Moscow");  
    const nowDay = moment(standart, 'YYYY-MM-DD HH:mm');
      
    const eventDay = moment('2023-05-21 02:05', 'YYYY-MM-DD HH:mm'); 
    
    
    const countDown = () => {     
      const timers = moment(nowDay, 'YYYY-MM-DD HH:mm')
        .countdown(eventDay, "YYYY-MM-DD HH:mm");
      console.log(timers.value)
      if(interval && timers.value <= 0) {
            clearInterval(interval)
       }
          console.log(timers.toString())
       }
    
    const interval = setInterval(countDown, 1000);


    Под себя адаптируйте этот код. Ну и конечно от momentjs и компашки нужно избавиться, но это уже отдельная легаси история.
    Ответ написан
    Комментировать
  • Не работает slick слайдер после того, как отображаю слайды с помощью JS с подгрузкой json данных?

    neuotq
    @neuotq
    Прокрастинация
    А где и как инициализируется сам слик?
    Возможно вы забыли после обновления html его заново инициализировать, чтобы он узнал об изменениях.
    Отдельно отмечу что в Slick есть функции динамического добавления слайдов программно. Может быть вам такой способ больше подойдёт?
    Ответ написан
  • Вопрос с собеседования: Есть ли в PHP нативная возможность инициализировать переменную как в функции preg_match()?

    neuotq
    @neuotq
    Прокрастинация
    Вас проверяли на знание того, как передаются переменные в функция в php. Переменные передаются всегда по значению, те передаёте переменную в функцию, туда копируется в новую переменную значение оригинальной.

    С помощью амперсанда & мы можем заставить передавать ссылку на эту же переменную в памяти. И тогда манипуляции с ней внутри функции будут равны манипуляциям вне.

    С объектами не большая путаница происходит, но только из-за того что многие не думают/забывают что хранится в переменной когда создаётся объект. При создании объекта в саму переменную помещается его идентификатор, по которому php и обращается к этому объекту.
    Ну и соответственно при передаче такой переменной в функцию, мы копируем этот идентификатор в новую переменную. Переменная уже другая, независимая от той что была, но идентификатор объекта тот же. Поэтому манипуляции с объектом в функции(обращение к свойствам/методам) отразятся на объекте с этим идентификатором. И со стороны выглядит словно переменная с объектом всегда передаётся по ссылке(словно стоит амперсанд), но это не так. Например внутри функции вы перезапишете переменную(к примеру присвоите null) то оригинальная переменная с объектом не поменяется.

    А вот есть если передать её по ссылке, те с амперсандом, то внутри функции будет переменная со ссылкой на переменную вне, и поэтому не только манипуляции с объектом, но и перетирание переменной в целом повлияет.

    class A {
        public $foo = 1;
    }
    
    //создали переменную
    //в ней хранится id объекта, сам объект где-то в памяти оптимизированно лежит
    $newObj = new A;
    
    //Вывод 1
    echo $newObj->foo;
    
    function foo($obj) {
    	//в obj скопирован id объекта
    	//тк он тот же, то меняется и оригинальный объект
    	$obj->foo = 2;
    	//локальная переменная перетёрся, больше id объекта не хранит
    	//на внешнюю не повлияло
    	$obj = null;
    	
    }
    
    foo($newObj);
    // получили 2
    echo $newObj->foo;
    
    
    function bar(&$obj) {
    	//obj ссылается на тоже место в памяти, что и внешняя переменная с id объета
    	//тк он тот же, то меняется и оригинальный объект (тут логично, тк по ссылке)
    	$obj->foo = 2;
    	//локальная переменная перетёрся, больше id объекта не хранит
    	//внешняя тоже перетрётся
    	$obj = null;
    }
    
    
    bar($newObj);
    //ошибка предупреждение, нельзя читать свойства на null
    echo $newObj->foo;


    Ну и зная всё это, вы можете написать свою простую функцию, по типа прегматча.
    function mySum($a, $b, &$result) {
    	$result = $a + $b;
    }
    //первые два параметра по значению, в третий передаём переменную
    //она тут же инициализируется (как если бы её до этого написать просто $res;)
    // и передаётся её ссылка внутрь функции
    mySum(1,2, $res);
    
    //3
    echo $res;
    Ответ написан
    Комментировать
  • Как сделать анимацию курсора под текстом?

    neuotq
    @neuotq
    Прокрастинация
    У вас другие слои перехватывают события poiner-events, поэтому конвас как бы не видит их.
    Для этого, например, можно для main__section отключить : pointer-events: none;, а потом для нужных элементов включать, в данном случае для canvasFluid: pointer-events: all;

    PS и помним что такой эффект крайне ресурсоемкий, советую протестировать на "слабых" устройствах, на многих будет МНОГО меньше 60 fps, да даже меньше 10.
    Ответ написан
    4 комментария
  • Как выделить селектор?

    neuotq
    @neuotq
    Прокрастинация
    Пффф, легко.
    Берём вычисляем свгешку, и родитель родителя.
    Да не супер надёжно, но работает) Можно ещё доработать специфичность.
    document.querySelector('[d="M5.293 8.293a1 1 0 0 1 1.414 0L12 13.586l5.293-5.293a1 1 0 1 1 1.414 1.414l-6 6a1 1 0 0 1-1.414 0l-6-6a1 1 0 0 1 0-1.414Z"]').parentElement.parentElement;
    Ответ написан
  • Как выводить несколько значений подряд при клике?

    neuotq
    @neuotq
    Прокрастинация
    Ваш код грязный конечно, даже стили немного.
    Вот я тоже набросал грязное решение. Вам я бы рекомендовал немного переверстать, но в целом(обратите внимание я добавил pointer-events none на .types-select__option-text в css на кодпене это видно)
    Саму идею я думаю вы поймёте и под себя переделаете. Ниже код и кодпен.

    //Данные по содержанию меню
    const furnTypes = [
      {
        'id' : 1,
        'title' : 'Офисная&nbsp;<span>меб</span>ель'
      },
      {
        'id' : 2,
        'title' : 'Техника / сантехника'
      },
      {
        'id' : 3,
        'title' : 'Сборка кухни'
      },
    ];
    
    //Каждое активно может быть только один раз
    const activeMenuItems =   new Set();
    
    const clickHandler = e => {
      if(activeMenuItems.add(parseInt(e.target.getAttribute("furn-id"))) ) {
        //Если поменялся перестроим меню
        updateActiveMenuItems(activeMenuItems);
      }  
    };
    
    //Строим меню на основе данных items, вставляем в target
    //на элементы вешаем событие clickHandler
    buildSelectMenu = (target, items, clickHandler) => 
    {
      //создаем родителя
      const parentUl = document.createElement("ul");
      parentUl.classList.add('types-select__options');
      //Каждый из пунктов
      items.forEach(
        item => {
          const childLi = document.createElement("li");
          childLi.classList.add('types-select__option');
          childLi.setAttribute('furn-id', item['id']);
          childLi.addEventListener("click",clickHandler);
          const childTextBlock = document.createElement("div");
          childTextBlock.classList.add('types-select__option-text');
          // Лучше потом на setHtml заменить, но пока нет поддержки
          childTextBlock.innerHTML = item['title'];
          childLi.appendChild(childTextBlock);
          parentUl.appendChild(childLi);
        }
      )
      //Запихиваем туда куда нужно
      target.appendChild(parentUl);  
      return parentUl; 
    }
    
    const updateActiveMenuItems = ids => {
      
      const parent = document.querySelector('.types-select__active-items');
      parent.innerHTML = '';
      ids.forEach( id => {
        const curItem = furnTypes.find( el => el['id'] === id)
        const activeMenuItemEl = document.createElement("div");
        const activeMenuItemTitleEl = document.createElement("span");
        activeMenuItemTitleEl.innerHTML = curItem['title'];
        const activeMenuItemdeleteButtonEl = document.createElement("button");
        //Лучше через текстовую ноду
        activeMenuItemdeleteButtonEl.innerHTML = 'x';
        activeMenuItemdeleteButtonEl.setAttribute('active-furn-id', curItem['id']);
        
        activeMenuItemdeleteButtonEl.addEventListener("click", e => {
          //Чтобы кликалась не взирая на клик событие родителя
          if(e && e.stopPropagation) e.stopPropagation();
          
          if(activeMenuItems.delete(parseInt(e.target.getAttribute("active-furn-id"))) ) {
            //Если поменялся перестроим меню
             updateActiveMenuItems(activeMenuItems);
          } 
        }); 
        
        activeMenuItemEl.appendChild(activeMenuItemTitleEl);
        activeMenuItemEl.appendChild(activeMenuItemdeleteButtonEl);
        parent.appendChild(activeMenuItemEl);
        
      })
      
    }
    
    // Строим меню
    const furnitureMenu = buildSelectMenu(
      document.querySelector('#furnitureMenu'), 
      furnTypes, 
      clickHandler
    );
    
    document.querySelector('.types-select__btn')
      .addEventListener("click", e => {
        // Странное имя класса, наверное должн быть types-select__menu_active
        document.querySelector('.types-select__menu').classList.toggle("_active");
    } )


    Ответ написан
    1 комментарий
  • Почему не удается получить доступ к смещению типа string в строке?

    neuotq
    @neuotq
    Прокрастинация
    Сама ошибка вполне однозначная, вы обращаетесь к строке по индексу.
    У вас в коде в строке 30:
    $aUnit[$server['unit']][$server['game']]
    Но выше мы видим что
    $aUnit[$unit['id']] = '';
    Ну так делать нельзя. В PHP 7* на этот счёт были предупреждения, видимо вы их игнорировали.
    Ответ написан
    5 комментариев
  • Как задать следующий вопрос chatGPT по API?

    neuotq
    @neuotq
    Прокрастинация
    Контекст вы должны сохранять, а передавать в следующем запросе через роли.
    Простое объяснение тут, пример оттуда:

    completion = openai.ChatCompletion.create(
      model="gpt-3.5-turbo", 
      messages = [
    # system - системная базовая роль, грубо говоря это сама база "Я" gpt
    {"role": "system", "content" : "You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.\nKnowledge cutoff: 2021-09-01\nCurrent date: 2023-03-02"},
    # user - роль юзера кто задаёт вопросы
    {"role": "user", "content" : "How are you?"},
    # Асистент одна из ролей, можно задать ранее в запросе, типа Act as bla blah
    # либо он поймёт что должен быть именно ассистентом смотрите оп ответу в API
    {"role": "assistant", "content" : "I am doing well"},
    # Снова юзер
    {"role": "user", "content" : "How long does light take to travel from the sun to the eart?"}]
    )


    Ну и примерно так строишь цепочку. Ну и да, ресурсо(читай денежно) пожирающе, а что делать. Значит приносить $$ должно больше чем тратится.
    Ответ написан
    Комментировать
  • Как сохранить строку в JS в Windows1251 ANSI?

    neuotq
    @neuotq
    Прокрастинация
    Привет друг.
    Лучше пользоваться любезно представленным для нас Encoding API

    //Создаем энкодер, который нам сделает ArrayBuffer в utf8
    //Без параметра будет кодировка UTF8
    const encoderUTF8 = new TextEncoder();
    //Закодируем строку
    const arrayUTF8 = encoderUTF8.encode("Привет!");
    //Теперь создадим декодер в cp1251, список кодировок и их метки здесь 
    // https://developer.mozilla.org/en-US/docs/Web/API/Encoding_API/Encodings
    let encToCP1251 = new TextDecoder('cp1251');
    //Получаем строку в нужной кодировке
    const strCP1251 = encToCP1251.decode(arrayUTF8);
    
    
    //Генерируем URL
    const url = URL.createObjectURL(
      //Создаем файл
      new File([strCP1251], "foo.txt", {
      type: "text/plain",})
    );
    
    //Создаём ссылку
    let aElement = document.createElement('a');
    aElement.href = url;
    aElement.download = 'filenameCP1251.txt';
    aElement.textContent = 'Скачай меня полностью!';
    document.body.appendChild(aElement);


    Живая демка

    Ответ написан
  • Почему у некоторых людей не работает сайт при переходе из инстаграм?

    neuotq
    @neuotq
    Прокрастинация
    Я бы смотрел в сторону VPN которые используют люди.
    Cloudflare будет грузиться и показывать хоть что-то, даже есть доступ к ресурсу запрещен.
    Поэтому остаются сетевые проблемы и задержки/таймауты из лагов VPN. У народа часто фигня разная стоит.
    Поэтому этот пресловутый белый экран как раз таки и показывает проблемы с отправкой/получением данных. Бразуер(не важно встроенный или нет) будет в таких случаях частенько висеть.
    Попробуйте несколько дней потестить с включенными бесплатными разными VPN из топа Маркета/Апстора. Проследить статистику. Особенно полезно это сделать на мобильном интернете среднего качества с просадками, а не на стабильном wifi
    Ответ написан
    Комментировать
  • Почему нет(?) популярного REST API для IMAP?

    neuotq
    @neuotq
    Прокрастинация
    Как верно выше сказали вы путаете протокол и сервисы/серверы.
    IMAP - это протокол(прикладного уровня, почитайте про модель OSI), те некое соглашение чтобы всё по сети работало одинаково везде и всегда.
    REST API - это совсем другое, работает внутри другого протокола HTTP.
    Поэтому вам нужно искать не API к IMAP, а сервер IMAP в котором есть нужные API. Такие есть, гуглить нечто вроде
    "imap server with rest api"
    И там уже сами разработчики серверов реализовывают разные штуки, от управление аккаунтами, до манипуляция с самыми почтовыми ящиками и почтой.
    Ответ написан
    2 комментария
  • Есть ли у этого название?

    neuotq
    @neuotq
    Прокрастинация
    Это называется деление с остатком, берёте целую часть - неполное частное.
    Реализуется либо через специальные операторы в языке(в некоторых есть сразу целочисленное деление), либо округлением вниз.
    Ответ написан
    Комментировать
  • Фреймворки, действительно ли важно?

    neuotq
    @neuotq
    Прокрастинация
    Самое важное это повторение уже сделанной работы.
    Фреймворки для вас это уже сделанная работа, которую не нужно повторять. Более того, если фреймворк популярный - это качественная работа, с высокой насмотренностью, известными проблемами и тп.
    И вот будет ли у вас такое же качество?
    Почитайте ещё про фактор автобуса - вас сбил грузовик/автобус, вы погибли. Что делать с вашим наследием, копаться в нём? Делать новое? Кто этим займётся?
    Отдельный вопрос что ваши штуки нужно будет другим людям специально изучать, если подключаться к проектам что вы ведёте или вели. И зачем это бизнесу? как найти людей которые знают ваши инструменты ваш подход?
    К примеру даже у крупных компаний проблемы с подобным: например движок EA frostbite, который они мучают и при наёме новых людей их нужно прям обучать обучать всем фишкам, костылям и тп. С UE, Unity таких проблем нет.

    Так что, если делаете лично для себя, само развитие и тп - это круто и праивльно, делать свои костыли, экспериментировать.
    Если вы делаете для кого-то другого - вы подставляете заказчика, подкладываете бомбу под бизнес. Которая может потом сильно затруднить развитие.
    Ответ написан
    7 комментариев
  • Что я делаю не так?

    neuotq
    @neuotq
    Прокрастинация
    genre_rock = df[ (df['genre_name'] == 'rock') & (df['total_play_seconds'] > 0) ]
    Ответ написан
    Комментировать
  • Есть ли смысл делать анимацию без JS?

    neuotq
    @neuotq
    Прокрастинация
    Анимация = анимации рознь.

    Конкретный ответ со списком вы тут не увидите, это будет большая статья, со множественными "а вот тут", "но здесь" просто потому что многое зависит от контекста, задач, планирование.
    Главные рекомендации это не делать на js то, что отлично реализуется с помощью css. Этим к сожалению часто болеют многие фронтендеры, особенно из тех кто принципиально не любит вёрстку. Банальные примеры некоторые виды трансформаций объектов при булевых сменах какого параметра(условно навел/убрал наведения, вкл-выкл и тп).

    Но нужно иметь ввиду, что там где у вас выходит сложная логика, разные усложнённые сценарии, динамические параметры запуска и тп и тд. Без js естественно никуда.

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

    В целом информации на эту тему достаточно в интернете, мудрить здесь особо не стоит. Поэтому повторюсь: просто здравый смысл и держать в уме знание css и не брезговать его использовать. Нередко кстати сами верстальщики уже готовят эти анимации, но это уже отдельный разговор организации команд и внутрипроектной кухни. Я сторонник того что фронтэндер, пусть и не обязан прям верстать верстать, но знать вёрстку/css должен на очень хорошем уровне.
    Ответ написан
    Комментировать
  • Есть ли список распространённых и общепринятых слов для именования переменных в PHP?

    neuotq
    @neuotq
    Прокрастинация
    Нет, специальных договорённостей общепризнанных нет, кроме:
    • понятное название по контексту, не использовать однобуквенные. Лучше целые слова/сочетания слов либо известные всем сокращения.
    • с маленькой буквы, в регистре CamelCase (если несколько слов)
    • название классов с большой буквы.


    $variableNameExample = "Hi Im the best of the best";
    Ответ написан
  • Почему условие выполняется не корректно?

    neuotq
    @neuotq
    Прокрастинация
    Вы в условии используете оператор and который будет false если хотя бы одно из условий неверно.

    Поэтому меняйте его на or, те хотя бы одно из этих условий true, должен туда заходит. А иначе, если хотя бы одно false, то условие уйдёт в пароль надёжный.

    if (len(password) < 8) or (number_count(password) < 3) or (password.islower() == 1):
    Ответ написан
    4 комментария
  • Генерация ссылки на чат TeleBot?

    neuotq
    @neuotq
    Прокрастинация
    Проверьте какой именно пакет вы установили, вам нужен pyTelegramBotAPI, возможно вы перепутали с https://github.com/KyleJamesWalker/telebot. Последний хоть и добавил к себе pyTelegramBotAPI, но там значительное отставание в версии.
    Ответ написан
    Комментировать
  • Как можно организовать такую систему регистрации и авторизации на Wordpress?

    neuotq
    @neuotq
    Прокрастинация
    Реализовать через систему ролей и возможностей.
    В вордпрессе уже есть своя встроенная система ролей.

    Далее с помощью например этого плагина вы можете расширить ей, добавляя свои роли и свои возможности. А потом уже в коде вашего плагина/темы проверять по наличию возможности права на ту или иную фичу.

    Поэтому вам нужно продумать систему ролей и их возможностей, а далее просто дабавлять в нужные места проверки.

    Код там будет потом прям тривиальный. Допустим вы уже создали разные возможности/допуски, раскидали их по ролям, ну и далее просто:

    <?php if ( current_user_can( 'capability_name' ) ) echo 'This user can do something'; ?>


    Самый сложный для вас этап будет верно выстроить саму иерархию ролей и возможностей. Тут уже решайте вместе с вашей командой.
    Ответ написан
    Комментировать
  • Почему выдает данную ошибку?

    neuotq
    @neuotq
    Прокрастинация
    sys.argv - массив аргументов командной строки, sys.argv[0] - имя скрипта, sys.argv[1] - первый аргумент и тп.
    Значит вы должны запускать скрипт с каким-то аргументом. Если почитать сам скрипт это можно их найти в блоке try: до else
    : те '--config', '-c', '--merge' и тп.
    Значит нужно запускать так например:
    python setup.py -c
    Ответ написан
    Комментировать