• Фреймворки, действительно ли важно?

    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
    Ответ написан
    Комментировать
  • Если изменить значения в конфигурационном файле uploads.ini нужно запускать билд контейнеров или перезагружать и почему?

    neuotq
    @neuotq
    Прокрастинация
    Если упрощенно:

    1. Есть сущность образ - image. Его можно скачать, собрать свой и т.д.
    2. Есть контейнер - он запускается из образа, на основе данных/правил, которые в нём (образе) прописаны.
    3. Контейнер работает, вы в нём что-то делаете, меняете значения и т.д. НО сам образ, на основе которого он сделан, не изменяется. Поэтому при перезапуске контейнера изменения как бы "пропадают". Но на самом деле вы просто запустили контейнер на основе вашего изначального образа.
    4. Есть несколько способов:
      1. Закоммитить изменения в новый образ, который создаётся на основе текущего контейнера.
      2. Подключать внешние диски внутрь контейнера, и на них уже сохраняется информация вне образа и контейнера, а не на пользовательском диске (в облаке или где угодно).


    5. Способ выбирается в зависимости от контекста. В вашем случае, вероятно, правильно будет сделать новый образ, в котором эти настройки будут "вшиты", и контейнер Docker будет запускаться уже с нужными вам uploads.ini.


    Поэтому гуглим доки.

    Если кратко:
    #Получаем наш образ базу
    sudo docker pull mycool_image
    
    #смотрим чё там по образам, видим айдишник нашего
    sudo docker images
    
    #Запускаем в интерактивном режиме, с входом в баш (пример условный)
    sudo docker run -it hash_of_mycoll_image bin/bash
    
    #редактируем и потом сохраняем в нем наш файлик настроек
    nano /path/to/uploads.ini
    
    #Выходим
    exit
    
    #Смотрим список запущенных контейнеров и видим там наш родимый с изменениями
    sudo docker ps -a
    
    #Сохраняем(комитим) изменения в докер контейнере в НОВЫЙ образ
    sudo docker commit hash_of_DOCKER_CONTEINER mycool_image_with_uploads_ini
    
    #Смотрим список образов с сохраненным нашим новым образом, 
    #теперь можем запускать контейнер на его основе
    sudo docker images

    Примерно так. НО всё же, вперёд читать документацию.
    Ответ написан
    Комментировать
  • Laravel Relationships, не использовать left join, как заменить?

    neuotq
    @neuotq
    Прокрастинация
    Это классическая проблема N+1 запроса: при обращении к БД делаем лишних N запросов, хотя можно обойтись одним сразу.
    В Laravel она возникает из-за ленивой загрузки отношений по умолчанию, те при выборке данных модели из БД, отношения не выбираются. Чтобы этого избежать используется with (и его "друзья").
    //Выбрали все посты, данные только по ним
    $posts = Post::orderBy('created_at', 'desc')->limit(20)->get();
    foreach( $posts as $post )
    {
    //обращение к БД за данными по отношению user
      print_r($post->user);
    }
    
    //Два запроса
    // 1.Выбрали все посты, данные только по ним
    // 2. ПО айдишкам из данных таблицы постов, выбрали сразу все нужные из user
    $posts = Post::orderBy('created_at', 'desc')->with('user')->limit(20)->get();
    foreach( $posts as $post )
    {
    //обращение к БД за данными по отношению user НЕ происходит, данные уже есть и скомпонованы
      print_r($post->user);
    }

    Советую читать документацию,
    так же самые распространенные подводные камни с N+1 https://laravel-news.com/laravel-n1-query-problems
    Ответ написан
    1 комментарий
  • Какой алгоритм лучше для коллизий, GJK + EPA или SAT?

    neuotq
    @neuotq
    Прокрастинация
    Сам не гейм прогер и тп. Но один раз в одном проекте косвенно сталкивался с необходимость. решения проблемы расчётов коллизий, был сторонний спец. Он говорил просто SAT хорошо по умолчанию, если не нужно/хватает простых коллизий, легкий не нужно особо морочиться. А вот если в коллизиях твоя фишка, сложная геометрия и прочее, тогда можно играться и с другими. Ну и выходит по умолчанию людям почти всегда достаточно обычных коллизий(условно обычных), вот и стоит SAT.
    Ответ написан
    Комментировать
  • Храню картинку на жестком диске, ссылку в Postgres, ошибка - 404. В чем может быть проблема?

    neuotq
    @neuotq
    Прокрастинация
    Проблема в путях. Ваш веб сервер говорит что файла по такому пути нет. Проверьте настройки веб сервера, что у него root директория, как и где относительно её находятся изображения. В данный момент вы указываете что изображения находятся в публичной директории, в поддиреткории uploads.
    Как я понимаю веб сервер томкат, почитайте про настройки
    https://www.baeldung.com/spring-mvc-static-resources
    Ответ написан
    1 комментарий
  • Внесение данных в input react из внешнего подключаемого скрипта?

    neuotq
    @neuotq
    Прокрастинация
    В целом нужен код. Но если человеческим языком:
    Нов реакте принято не трогать значения напрямую через обращение к DOM элементам. У вас есть определенное состояние, привязанные переменные, разные мутаторы, слушатели событий и тп.
    Поэтому когда вы в ручную ставите значение через input.value вы, скорее всего, нарушаете логику работы вашего приложения. И при фокусе внутренняя логика реакта срабатывает, сверяет текущее состояние приложение(сверяет данные) и приводит в соответствие с ним интерфейс(ваши инпуты).
    А так как вы данные не меняли, у вас как бы обнуляется поле.
    В целом переставайте думать html элементами. Думайте данными, меняйте данные, подключайте данные. Остальное просто интерфейс, который вы собираете как кирпичики подключая к ним провода с данными. Реакт уже сам берёт на себя обновление непосредственно того что будет уже в браузере отображаться. Ваша задача писать логику как это будет меняться, не трогая(почти всегда) сами эти элементы напрямую.
    Поэтому откройте документацию по реакту, посмотрите ролики. Хотя бы базовые основы, там всё просто.
    Ответ написан
  • Как убрать полоски в градиенте, которые из-за блоков div?

    neuotq
    @neuotq
    Прокрастинация
    Старайтесь звездочку особо не использовать, ведь это применение стиля для каждого, а не наследование сверху вниз. Насчёт заднего фона, он так дублируется так не считает высоту полно экранной.
    Сделайте так:
    body {
     //Просим сделать минимальную высоту в 100% процентов от высоты экрана
      min-height: 100vh;
      background: linear-gradient(45deg, #121212, #29005e);
    }
    Ответ написан
    Комментировать
  • Почему не работает range slider?

    neuotq
    @neuotq
    Прокрастинация
    Главная причина в том, что вы отключили pointer events для него в CSS (у range.input : pointer-events: none;).
    Далее, в value вы отправляете просто константу, более того куда и как он будет обновлять значения?

    Обновим немного код, добавив состояния, чтобы потом можно было легко использовать значения в дальнейшей логике.
    import * as React from 'react';
    import styles from './style.module.scss';
    
    export default function App() {
      // состояние для левого
      const [leftVal, setLeftVal] = React.useState(2500);
      // состояние для правого
      const [rightVal, setRightVal] = React.useState(7500);
      //  Константы для ограничения макс и минимального значения
      const MINVAL = 0;
      const MAXVAL = 10000;
      return (
        <div className={styles.main}>
          <div className={styles.slider}>
            <div className={styles.slider__progress} />
          </div>
          <div className={styles.range}>
            <input
              type="range"
              name="range-min"
              min={MINVAL}
              max={MAXVAL}
              value={leftVal}
              onChange={(e) => setLeftVal(parseInt(e.target.value))}
            />
            <input
              type="range"
              name="range-max"
              min={MINVAL}
              max={MAXVAL}
              value={rightVal}
              onChange={(e) => setRightVal(parseInt(e.target.value))}
            />
          </div>
        </div>
      );
    }


    Далее, у вас теперь будет работать только последний(по порядку в коде html/jsx ), тк он будет "наверху" и события мышки просто не могут достучаться до второго. Более того, логика работы нарушается, например он может быть меньше своего левого брата, что не ок. Ну и ещё МНОГО подводных камней. Вся проблема в том, что сам стандартный элемент input range поддерживает только одно значение, а вам нужно да. Логика испольнения этого не то чтобы сложна, но таки не совсем тривиально, нужно немного поработать.

    Вот ссылка, можете изучить пример если идти по вашему пути.
    Либо как это делают через другие html элементы(условно на div), эмулируя порведение.

    На мой взгляд гибое дело с этим возиться, если у вас только не личный интерес поиграться. Если для дела - то берите готовую библиотеку + во всех(или почти всех) UI библиотека он тем или другим способом реализован.
    Ответ написан
    Комментировать
  • Как при import убрать расширение .js?

    neuotq
    @neuotq
    Прокрастинация
    Через import в nodejs реализуется относительно новый принцип модулей(для nodejs) - ECMAScript. Указывать расширение файла при этом обязательно.
    Ответ написан
    Комментировать
  • Почему появляется ошибка DELETE http://127.0.0.1:8000/api/anketa/1 405 (Method Not Allowed)?

    neuotq
    @neuotq
    Прокрастинация
    Такая ошибка, при верном коде в бекэнде, обычно появляется если запрос идёт из формы(не важно напрямую или аякс запрос) и методе в форме/аякс запросе вы указали метод "DELETE". Он не поддерживается, нужно ставить метод POST, а в данных при запросе передавать "_method:"DELETE"". Поэтому если из запрос из условного "HTML"/браузера то тип запроса POST, с пометкой в данных что это DELETE. (через добавления в форму поля _method со значением DELETE или добавление в объект в данные _method:"DELETE")

    axios.post(`/api/anketa/${id}`, {_method: 'delete'})
                    .then(res => {
                        this.getpoluhenie();

    А из сторонних клиентов, которые поддерживают метод DELETE (сам клиент) так делать не нужно, можно использовать метод DELETE напрямую.
    Ответ написан
  • В какой программе или онлайн сервисе можно накидать прототип своего бложека?

    neuotq
    @neuotq
    Прокрастинация
    0. Tailwind CSS хоть и предлагает определенный UI прям в ваниле из коробки, но не навязывает его. Те формально мы можете верстать любой дизайн, легче конечно чтобы ложился на сетку по умолчанию, но и это не проблема.
    1. Изучите инструмент Figma, начать там просто есть много видео/блогов на эту тему.
    2.а Найдите разные готовые ui библиотеки или даже целые готовые дизайны и начинайте верстать.
    2.б Если прям хочется UI элементы взгляните на этот https://www.figma.com/community/file/7688090277999... , но помните не ограничиваете себя им, спокойно используйте и его и рисуйте своё. Просто изучите стандартную сетку/падинги/марлджины и тп чтобы потом меньше тюнить сам Tauilwind нужно было, хотя это тоже полезный навык.
    Ответ написан
  • Как найти самую высокую точку в svg?

    neuotq
    @neuotq
    Прокрастинация
    Смотрите.
    viewBox="0 0 1000 100" - определяют вьюпорт пользователя, те как бы то окошко через которое мы смотрим когда видим картинку svg. Первые две цифры - это минимальные(верхний левый угол) x,y координаты, далее размер длинна вдоль x и y
    Следовательно, самая высокая точка, с тчк зрения этого окошка, будет та, у которой координаты по y будет 0.
    У вас там рисуется <polygon points="0,0 9.090909090909092,11 .... вот как видно первая точка имеет координаты по 0,0 - те по x - самая левая с нулевым отступом от лева, и по y- самая верхняя, с нулевым отступом от min y - верха окошка. Таким образом все у кого будет y - 0 (второе число в паре ч/з запятую) - будут на самом верху, относительно окна просмотра.
    Но координаты могут уходить и за окно просмотра: как в лево/вверх, тогда отрицательные будут, так и в право/низ - будут больше окно просмотра(в вашем случае больше 1000 и 100 для x и y соответвенно)
    Ответ написан
    Комментировать
  • Как обеспечить идемпотентность запросов к API?

    neuotq
    @neuotq
    Прокрастинация
    С кукисами и прочим оставьте это на стандарты что уже вам даёт WP(и/или плагины что вы там используете).
    После нажатия купить, у вас создаётся запись о покупке в БД, со статусом не оплачен. У покупки во всех системах для создания инет магазинов и тп уникальный айди, вот на основе его и можно генерировать уникальный (допустим
    с помощью crypt) ключ идемпотентности.
    После успешной оплаты в БД статус меняется на оплчен и этот заказ и его айди больше никогда не используется. Даже при повторной покупке это будет уже клон этой, но с новым айди.
    Таким образом и себя защитите и в целом простое и относительно надёжное решение.
    Могут быть нюансы только когда оплата прошла, а ваш сервис это узнать через обратный webhook не смогла(допустим был лаг и тп) и запись в БД не стала - оплачен. Но обычно платёжные шлюзы даёт проверять статусы оплаты и по запросу, поэтому если не приходит ответ там в течении какого-то времени, можно запрашивать в ручную. Ну и затем в любом случае устаревает запрос на оплату(почти во всех платёжках есть тайм аут на то, в какое время можно оплатить уже после создания инвойса на их стороне), так что и тут в целом все норм.
    Ответ написан
    4 комментария