• Почему нету подсказок при наведении в vscode?

    ae_ph
    @ae_ph
    I'm a owl )
    Попробуйте выставить параметр
    "editor.hover.enabled": true,
    Ответ написан
    Комментировать
  • Как подключить swiper в gulp?

    ae_ph
    @ae_ph
    I'm a owl )
    Вот так вот можно подключить Swiper слайдер в Gulp.
    Слайды будут крутить бесконечно, через каждые 3 секунды - "delay: 3000"
    При наведении указателя мыши на слайдер он остановится.

    1. Файлы слайдера подключаются в gulpfile.js
      node_modules/swiper/swiper-bundle.min.css
      node_modules/swiper/swiper-bundle.js

    2. Затем к index.html подключаем наши файлы JS и CSS.
    3. В JS файле пишем настройки для Swiper слайдер, то как он будет работать.


    P.S. Чтобы использовать импорты (import ****) в gulpfile.js укажите в package.json файле "type": "module",
    Ниже всё показал, вроде всё работает. Сборка может быть сыроватой!

    Структура готовой сборки
    Start_Gulp
    ├── .gitignore
    ├── gulpfile.js
    ├── package-lock.json
    ├── package.json
    ├── app
    │ ├── .htaccess
    │ ├── index.html
    │ ├── css
    │ ├── fonts
    │ │ └── Museo Cyrl 500.otf
    │ ├── img
    │ │ └── favicon.png
    │ ├── js
    │ │ └── main.js
    │ └── scss
    │ ├── style.scss
    │ ├── _fonts.scss
    │ ├── _global.scss
    │ └── _vars.scss
    └── build
    ├── css
    │ ├── libs.min.css
    │ └── style.min.css
    └── js
    ├── libs.min.js
    └── main.min.js

    package.json
    {
      "name": "start-gulp",
      "version": "3.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "Brendan8c",
      "license": "ISC",
      "type": "module",
      "devDependencies": {
        "browser-sync": "^2.29.3",
        "gulp": "^4.0.2",
        "gulp-autoprefixer": "^9.0.0",
        "gulp-concat": "^2.6.1",
        "gulp-cssmin": "^0.2.0",
        "gulp-rename": "^2.0.0",
        "gulp-sass": "^5.1.0",
        "gulp-terser": "^2.1.0",
        "gulp-watch": "^5.0.1",
        "jquery": "^3.7.1",
        "normalize.css": "^8.0.1",
        "smoothscroll-polyfill": "^0.4.4"
      },
      "dependencies": {
        "sass": "^1.69.5",
        "swiper": "^11.0.5"
      }
    }


    gulpfile.js
    import gulp from 'gulp';
    import dartSass from 'sass';
    import gulpSass from 'gulp-sass';
    const sass = gulpSass(dartSass);
    import rename from 'gulp-rename';
    import browserSync from 'browser-sync';
    import autoprefixer from 'gulp-autoprefixer';
    import concat from 'gulp-concat';
    import terser from 'gulp-terser';
    import cssmin from 'gulp-cssmin';
    import watch from 'gulp-watch';
    
    gulp.task('style', function () {
      return gulp.src(['node_modules/normalize.css/normalize.css', 'node_modules/swiper/swiper-bundle.min.css']).pipe(concat('libs.min.css')).pipe(cssmin()).pipe(gulp.dest('app/css'));
    });
    
    gulp.task('script', function () {
      return gulp.src(['node_modules/jquery/dist/jquery.js', 'node_modules/swiper/swiper-bundle.js']).pipe(concat('libs.min.js')).pipe(terser()).pipe(gulp.dest('app/js'));
    });
    
    gulp.task('script-min', function () {
      return gulp.src('app/js/main.js').pipe(concat('main.min.js')).pipe(terser()).pipe(gulp.dest('app/js'));
    });
    
    gulp.task('sass', function () {
      return gulp
        .src('app/scss/**/*.scss')
        .pipe(sass({ outputStyle: 'compressed' }))
        .pipe(rename({ suffix: '.min' }))
        .pipe(
          autoprefixer({
            overrideBrowserslist: ['last 8 versions'],
          })
        )
        .pipe(gulp.dest('app/css'))
        .pipe(browserSync.reload({ stream: true }));
    });
    
    gulp.task('js-watch', function () {
      gulp.watch('app/js/main.js', gulp.series('script-min')).on('change', browserSync.reload);
    });
    
    gulp.task('sass-watch', function () {
      return gulp
        .src('app/scss/**/*.scss')
        .pipe(watch('app/scss/**/*.scss').on('change', gulp.series('sass')))
        .pipe(sass({ outputStyle: 'compressed' }))
        .pipe(rename({ suffix: '.min' }))
        .pipe(
          autoprefixer({
            overrideBrowserslist: ['last 8 versions'],
          })
        )
        .pipe(gulp.dest('app/css'))
        .pipe(browserSync.reload({ stream: true }));
    });
    
    gulp.task('html', function () {
      return gulp.src('app/*.html').pipe(browserSync.reload({ stream: true }));
    });
    
    gulp.task('js', function () {
      return gulp.src('app/js/*.js').pipe(browserSync.reload({ stream: true }));
    });
    
    gulp.task('watch', function () {
      gulp.watch('app/scss/**/*.scss', gulp.parallel('sass-watch'));
      gulp.watch('app/*.html', gulp.parallel('html'));
      gulp.watch('app/js/*.js', gulp.parallel('js-watch'));
    });
    
    gulp.task('browser-sync', function () {
      browserSync.init({
        server: {
          baseDir: 'app/',
        },
      });
    });
    
    gulp.task('default', gulp.parallel('style', 'script', 'script-min', 'sass-watch', 'js-watch', 'watch', 'browser-sync'));


    main.js
    new Swiper('.swiper-container', {
      slidesPerView: 1, // Количество слайдов на один просмотр (слайды, видимые одновременно в контейнере слайдера).
      loop: true, // Режим непрерывного цикла.
      autoplay: {
        delay: 3000, // Задержка между переходами.
        pauseOnMouseEnter: true, // При включении автовоспроизведение будет приостановлено при наведении указателя (мыши) на контейнер Swiper.
      },
      pagination: {
        el: '.swiper-pagination',
        clickable: true, // Делаем точки кликабельными
      },
      speed: 800, // Продолжительность анимации при переключении точек в миллисекундах
    });

    index.html
    <head>
      <link rel="stylesheet" href="css/libs.min.css" />
      <link rel="stylesheet" href="css/style.min.css" />
    </head>
    <body>
    <!-- swiper-container Название класса как и в main.js -->
    <div class="swiper-container">
      <!-- swiper-wrapper Название класса это используем -->
      <div class="swiper-wrapper">
        <!-- swiper-slide Название класса это используем для каждого из слайдов -->
        <div class="swiper-slide">
          <img src="img/Image_1.webp" />
        </div>
        <div class="swiper-slide">
          <img src="img/Image_2.webp" />
        </div>
        <div class="swiper-slide">
          <img src="img/Image_3.webp" />
        </div>
      </div>
    <!-- swiper-pagination Название класса как и в main.js -->
      <div class="swiper-pagination"></div>
    </div>
      <script src="js/libs.min.js"></script>
      <script src="js/main.min.js"></script>
    </body>
    Ответ написан
    Комментировать
  • Как добавить редактирование блока в wordpress?

    ae_ph
    @ae_ph Автор вопроса
    I'm a owl )
    Я использовал плагин "Getting Started with ACF"

    В панели Wordpress нажимаем на плагин "ACF"
    Группы полей, нажимаем "добавить"
    Тип поля, выбираем "повторитель 'Repeater - на английском'"
    Документация – www. advancedcustomfields .com/resources/repeater/
    Функция платная но вы знаете что делать :D ‍☠️
    В гугле бейте "Скачать Advanced Custom Fields Pro 6.1.1" и там вроде самый первый сайт wp-club.
    Опять-же на свой страх и риск в плане безопасности! Я не призываю, просто делюсь.

    Заполняем поля "Ярлык поля" и "Имя поля" – название должно совпадать с тем что у вас в файле php
    Например my_works_fields
    P.S. Должно совпадать вроде "Имя поля" а не "Ярлык поля" я не проверял ещё везде указал одно и то-же...

    Вот мой код для примера Обратите внимание в коде я добавляю только 3 поля! Для текста, ссылки и изображения. Если вы будете в шаблоне плагина добавлять ещё что-то соответственно нужно дописать код!
    <?php if (have_rows('my_works_fields')) : ?>
                    <?php while (have_rows('my_works_fields')) : the_row(); ?>
                    <div class="wrapper-the-work">
                      <div class="the-work">
                        <!-- Получаем значения полей для каждого блока -->
                        <?php $link = get_sub_field('Link');
                        $image = get_sub_field('Image');
                        $title = get_sub_field('Description');
                        ?>
                        <a class="myworks__mysite--piture" href="<?php echo $link; ?>" target="_blank">
                          <img src="<?php echo $image['url']; ?>" alt="<?php echo $image['alt']; ?>">
                          <div class="myworks__mysite--open">
                            <p class="ff2 fz3 myworks__mysite--open-text"><?php echo $title; ?></p>
                          </div>
                        </a>
                      </div>
                    </div>
                    <?php endwhile; ?>
                    <?php endif; ?>


    Добавляем нужные поля, опять-же "Имя поля" или "Ярлык поля" должны совпадать с теми что в файле PHP!

    Вот пример $title = get_sub_field('Description');
    647a30376b941270950303.png

    Чуть ниже я выбрал "блок" среди доступных: "таблица", "блок", "строка".
    Спускаемся ещё ниже и в настройках выбираем привязку к нужно странице на сайте
    647a31cabd11a559189927.png
    Всё все нужные поля заполнили и создали шаблон для блока, в правом верхнем углу жмём кнопку "Save Changes"

    Далее идём в панель Wordpress, переходим в раздел "Страницы" и нажимаем изменить нашу страницу
    Тут страницу где у вас вставлен php код "как я выше показывал".

    Там мы видим наш шаблон который мы создали в плагине "ACF"
    Заполняем все поля которые насоздавали...
    Если хотим добавить ещё один блок, жмём кнопку "добавить" и у нас появится ещё один точно такой-же шаблон.

    Вот пример
    647a353e4f981258692032.png

    Возможно вам нужно будет на этой странице в правом верхнем углу нажать на "Три вертикальные точки"
    В самом низу нажать "предпочтения", далее выбрать с лева блок "панели"
    И в разделе: (Дополнительно | Добавьте дополнительные области в редактор.) Включить кнопку.

    647a36793b2c1976048714.png

    После всего этого у вас должно всё работать!
    Больше не нужно заходить в файл php и добавлять каждый раз код нового блока.
    Достаточно того кода который я привёл выше.
    Нужен новый блок, зашли на страницу добавили ещё один шаблон, заполнили его, нажали кнопку "обновит" страницу и всё у вас ещё один блок на сайте.
    Ответ написан
  • Как обернуть код в ChatGPT?

    ae_ph
    @ae_ph
    I'm a owl )
    В документации OpenAi не написано ничего про то, что нужно оборачивать код.
    Его пишут как и обычный текст
    Ответ написан
    Комментировать
  • Как сделать так чтобы nginx перестал слушать порт?

    ae_ph
    @ae_ph Автор вопроса
    I'm a owl )
    Я нашёл проблему, расходимся )
    В папке /etc/nginx/sites-enabled я ранее создавал файл по "видео из youtub", в этом файле был прописан 81 порт.
    server {
      listen 81;
      server_name example.ru;
    
      location /search {
              root /home/apps/file;
              index file.js;
      }
    }

    Я удалил его просто, ведь он и относился к Nginx
    А нужный мне скрипт запускается и работает с использованием pm2
    Я думал, для его работы нужно было создавать тот файл и указывать директорию
    Ответ написан
  • Почему localStorage.getItem(key) отрабатывает только после второго клика?

    ae_ph
    @ae_ph
    I'm a owl )
    Я исправил данный кода, теперь это должно работать для вас.
    Вот пример на CodePen
    Тот-же код, что и на codepen...

    HTML
    <div class="container">
      <div class="cart">
        <input class="input amount-one" type="text" value="0" />
        <input class="input amount-two" type="text" value="0" />
        <input class="input amount-three" type="text" value="0" />
        <button class="btn">click</button>
      </div>
      <div class="cart">
        <input class="input amount-one" type="text" value="0" />
        <input class="input amount-two" type="text" value="0" />
        <input class="input amount-three" type="text" value="0" />
        <button class="btn">click</button>
      </div>
      <div class="box">
        <input id="clear" type="button" value="clear all" />
        <div class="info"></div>
      </div>
    </div>


    CSS
    body {
      display: flex;
      justify-content: center;
      background-color: #1d1e22;
    }
    .container {
      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
    }
    .cart {
      display: flex;
      flex-direction: column;
      margin: 20px;
    }
    .input {
      padding-left: 20px;
      height: 20px;
      margin-bottom: 5px;
      font-size: 20px;
      border-radius: 10px;
    }
    .btn {
      height: 30px;
      font-size: 20px;
      border-radius: 10px;
    }
    .box {
      display: flex;
      flex-direction: column;
      align-items: center;
      margin: 20px;
    }
    #clear {
      width: 100px;
      height: 40px;
      margin-bottom: 10px;
      font-size: 20px;
      border-radius: 10px;
    }
    .info {
      display: flex;
      justify-content: center;
      align-items: center;
      width: 200px;
      height: 30px;
      border: 2px solid #bbb;
      background-color: #fff;
    }


    JavaScript
    let currentTariff = JSON.parse(localStorage.getItem('cabins') || '[]');
    const passengersMax = 3; // Максимальное количество пассажиров
    let accommodationSum = currentTariff.reduce((acc, curr) => acc + curr.accommodation, 0);
    const btn = document.querySelectorAll('.btn');
    const info = document.querySelector('.info');
    
    // Вывести текущие тарифные данные в информационный блок
    const render = (tariff = currentTariff) => {
      [...tariff].forEach(el => {
        info.insertAdjacentHTML('beforeend', `<div>${el.accommodation}</div>`);
      });
    };
    render();
    
    btn.forEach(button => {
      button.addEventListener('click', function (e) {
        const cart = e.target.closest('.cart');
        const countOne = cart.querySelector('.amount-one').value;
        const countTwo = cart.querySelector('.amount-two').value;
        const countThree = cart.querySelector('.amount-three').value;
        const accommodationPass = parseInt(countOne) + parseInt(countTwo) + parseInt(countThree);
    
        if (accommodationSum + accommodationPass > passengersMax) {
          alert('В этом заказе вы превысили максимальное количество человек');
          return;
        }
    
        const obj = {
          countOne: countOne,
          countTwo: countTwo,
          countThree: countThree,
          accommodation: parseInt(accommodationPass),
        };
    
        // Обновляем текущий тариф и отображаем новые данные
        currentTariff.push(obj);
        updateState();
    
        const sum = currentTariff.reduce((acc, curr) => acc + curr.accommodation, 0);
        info.innerHTML = `<div>Общая сумма: ${sum}</div>`;
    
        accommodationSum = sum; // Устанавливаем сумму размещения на текущую сумму
      });
    
      function updateState() {
        localStorage.setItem('cabins', JSON.stringify(currentTariff));
      }
      // Очищаем входы и информационный блок при нажатии кнопки "clear all"
    function clearData() {
        currentTariff.length = 0;
        localStorage.removeItem('cabins');
        info.innerHTML = '';
        const inputs = document.querySelectorAll('input[type="text"]');
        inputs.forEach(input => {
          input.value = 0;
        });
        accommodationSum = 0;  // Сбрасываем сумму размещения до 0
    }
    
      const clearBtn = document.querySelector('input#clear');
      clearBtn.addEventListener('click', clearData);
    });
    Ответ написан
  • Кроссплатформенная разработка: какой фреймворк выбрать?

    ae_ph
    @ae_ph
    I'm a owl )
    Dart и Flutter хорошо подходят для создания кроссплатформенных мобильных приложений с минимальными усилиями.
    Flutter — это набор инструментов пользовательского интерфейса, который использует язык программирования Dart и позволяет создавать высокопроизводительные, визуально привлекательные приложения, которые могут работать как на Android, так и на iOS.
    Кроме того, Flutter также поддерживает веб-приложения и настольные приложения. Он также популярен среди разработчиков, имеет хорошую поддержку сообщества и большое количество доступных пакетов, которые могут помочь вам в различных аспектах разработки приложений.
    Ответ написан
    Комментировать
  • Prompt-компонент на весь сайт?

    ae_ph
    @ae_ph
    I'm a owl )
    Объяснение:
    Я изменил имя переменной состояния isBlock на isBlocking, чтобы было понятнее, что она представляет.
    Добавил прослушиватель событий к событию beforeunload, который будет запущен, когда пользователь попытается покинуть страницу.
    Добавил этот прослушиватель событий в хук useEffect, чтобы его можно было очистить при размонтировании компонента.
    Добавил функцию handleFormChange, которая будет запускаться каждый раз при изменении формы, она проверяет значение ввода или текстового поля, если оно больше 0, оно устанавливает для isBlocking значение true, в противном случае — значение false.
    Добавил событие onchange в форму и текстовое поле и событие onClick на кнопке отмены, это вызовет функцию handleFormChange, а также позволит пользователю отменить и покинуть страницу без каких-либо подсказок.
    Также добавил в форму кнопку отправки и удалил useEffect, который опрашивал элемент textarea, и setTimeout, который использовался для этого.
    Также добавил сообщение к событию beforeunload, которое будет отображаться как подсказка для пользователя с просьбой подтвердить, хотят ли они покинуть страницу.

    Этот обновленный код теперь будет проверять наличие изменений в форме и текстовой области и предлагать пользователю подтвердить, хотят ли они покинуть страницу, если есть какие-либо несохраненные изменения.
    Это также позволяет пользователю отменить и покинуть страницу без каких-либо подсказок, а также добавлена ​​кнопка отправки.

    function MyPrompt() {
      const [isBlocking, setIsBlocking] = React.useState(false);
      const location = useLocation();
    
      const handleBeforeUnload = (event) => {
        if (isBlocking) {
          event.preventDefault();
          event.returnValue = "Are you sure you want to leave?";
        }
      };
    
      React.useEffect(() => {
        window.addEventListener("beforeunload", handleBeforeUnload);
    
        return () => {
          window.removeEventListener("beforeunload", handleBeforeUnload);
        };
      }, [isBlocking]);
    
      const handleFormChange = (event) => {
        if (event.target.value.length > 0) {
          setIsBlocking(true);
        } else {
          setIsBlocking(false);
        }
      };
    
      return (
        <div>
          <form onChange={handleFormChange}>
            <input type="text" placeholder="Type something here" />
            <textarea placeholder="Type something here"></textarea>
            <button type="submit">Submit</button>
            <button type="button" onClick={() => setIsBlocking(false)}>Cancel</button>
          </form>
        </div>
      );
    }
    Ответ написан
    Комментировать
  • Как сравнить две базы данных?

    ae_ph
    @ae_ph
    I'm a owl )
    Можно выполнять запросы между базами данных для объединения таблиц из разных баз данных, таких как HIVE и Oracle.
    Один из способов сделать это — использовать инструмент под названием Apache Drill, который позволяет запрашивать данные из нескольких источников данных, включая HIVE и Oracle.
    Вы можете использовать оператор SQL JOIN в тренировке, чтобы соединить таблицы из разных баз данных.

    Другой способ — использовать язык программирования, такой как Python, и библиотеки, такие как PyHive или cx_Oracle, для подключения к обеим базам данных и выполнения объединения и сравнения в коде.
    Этот подход может занять больше времени для больших таблиц с миллионами строк.

    Вы также можете использовать сторонние инструменты интеграции данных, такие как Talend, Informatica и DataStage, для объединения и сравнения двух баз данных.
    Лучше всего проверить производительность каждого подхода и выбрать тот, который лучше всего подходит для вашего случая использования.
    Ответ написан
    Комментировать
  • Как поменять разрешение видео mp4, через ffmpeg 600 на 600 Python?

    ae_ph
    @ae_ph
    I'm a owl )
    Вы можете использовать модуль os в Python для выполнения команды ffmpeg для изменения разрешения видеофайла mp4. Вот пример того, как вы можете использовать функцию os.system() для изменения разрешения видеофайла из командной строки:
    import os
    
    input_file = "input.mp4"
    output_file = "result.mp4"
    
    os.system(f"ffmpeg -i {input_file} -s 600x600 {output_file}")


    Этот код изменит разрешение видеофайла "input.mp4" на 600x600 и сохранит его как "result.mp4".
    Параметр -i используется для указания входного файла, а параметр -s используется для указания нового разрешения.
    f"ffmpeg -i {входной_файл} -s 600x600 {выходной_файл}" — это f-строка, которая заменит переменные внутри фигурных скобок значениями переменных входной_файл и выходной_файл.

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

    Если вам нужен больший контроль над процессом и вы хотите получить информацию о видео, вы можете использовать библиотеку ffmpeg-python, которая является оболочкой инструмента командной строки FFmpeg. Эту библиотеку можно установить через pip:

    pip install ffmpeg-python

    Эта библиотека предоставляет простой и удобный интерфейс для выполнения команд FFmpeg в Python.
    Если вы хотите изменить разрешение видеофайла и сохранить то же соотношение сторон, вы можете использовать масштабный фильтр, вы можете использовать эту команду

    os.system(f"ffmpeg -i {input_file} -vf scale=600:-1 {output_file}")


    Здесь -1 в фильтре масштабирования заставит ffmpeg поддерживать соотношение сторон видео.
    Ответ написан
    5 комментариев
  • Как отключить подсветку отступов в Vscode?

    ae_ph
    @ae_ph Автор вопроса
    I'm a owl )
    Я нашёл решение проблемы!
    Это мои настройки в settings.json
    "prettier.tabWidth": 2, // Расстояние отступов. 
    "editor.tabSize": 2, // Число пробелов, соответствующее табуляции.
    "editor.insertSpaces": true, // Вставлять пробелы при нажатии клавиши TAB. Этот параметр переопределяется на основе содержимого файла, если включен параметр "editor.detectIndentation".
    "editor.detectIndentation": false, // На основе содержимого файла определяет, будут ли "editor.tabSize" и "editor.insertSpaces" автоматически обнаружены при открытии файла.
    Ответ написан
    Комментировать
  • Как запустить 2 программы одним файлом?

    ae_ph
    @ae_ph
    I'm a owl )
    Я создал папку "gg"
    В папке "gg" лежит "start.bat" и папка "KM-Goanna"
    В папке "KM-Goanna" лежат 2 .txt файла "1.txt" и "2.txt"

    Содержимое start.bat
    @echo off
    (start "1.txt" "KM-Goanna\1.txt" & start "2.txt" "KM-Goanna\2.txt")
    exit

    При запуске файла "start.bat" открываются разом 2 .txt файла "1.txt" и "2.txt".
    Если расположение файла "start.bat" относительно папки "KM-Goanna" не изменится всё сработает!
    Дело тут не в архивации паки и не в хостинге.
    Ответ написан
    Комментировать
  • Как отформатировать код в HTML?

    ae_ph
    @ae_ph Автор вопроса
    I'm a owl )
    Собственно на самом сайте css-tricks я и нашёл решение )
    Возможно у вас есть свои варианты, когда не используется CMS WordPress
    Ответ написан
    Комментировать
  • Npm i -S; npm i -D; npm i;?

    ae_ph
    @ae_ph
    I'm a owl )
    npm install сохраняет любые указанные пакеты в dependencies по умолчанию.
    Кроме того, вы можете контролировать, где и как они сохраняются с помощью некоторых дополнительных флагов:

    -P, --save-prod: Пакет появится в вашем dependencies. Это значение по умолчанию, если -D или -O не присутствуют.
    -D, --save-dev: Пакет появится в вашем devDependencies.
    -O, --save-optional: Пакет появится в вашем optionalDependencies.
    --no-save: предотвращает сохранение в dependencies.

    Dependencies - это библиотека, которая необходима проекту для эффективного функционирования.
    Если пакет еще не существует в каталоге node_modules, он добавляется автоматически.
    Это библиотеки, которые вам нужны при запуске вашего кода.
    Включен в окончательный пакет кода.

    devDependencies - это пакеты, которые нужны разработчику во время разработки.
    Когда вы устанавливаете пакет, npm автоматически устанавливает зависимости для разработчиков.
    Эти зависимости могут понадобиться в какой-то момент процесса разработки, но не во время выполнения.
    Входит в окончательный пакет кода.

    Пример: npm i <имя_пакета> -D

    Что-бы полностью удалить установленный npm пакет
    Пример: npm uninstall <имя_пакета>
    Ответ написан
    Комментировать
  • Как применить несколько "Слой-фигура"?

    ae_ph
    @ae_ph Автор вопроса
    I'm a owl )
    Я нашёл решение. Нужно было объеденить все выделения в одной 'слой-фигуре' и к ней применять "Инвертированная подложка альфа канала".

    Выбраем инструмент "Перо - G"
    Ткнуть на выделение на одной из 'слой-фигур' и скопировать "Ctrl+C"
    Выбрать другую 'слой-фигуру' и вставить скопированное выделение "Ctrl+V"
    Затем открыть содержимое у 'слой-фигуры' и перетащить 'контур 2' к 'контуру 1' как это показано на скрине.
    625d7c9e1dad5806282943.jpeg

    Теперь это выглядит так.
    625d7db26e23f347807929.png
    Ответ написан
    Комментировать
  • Как можно управлять svg patch параметрами через canvas?

    ae_ph
    @ae_ph Автор вопроса
    I'm a owl )
    Одно из решений с использованием GSAP3 - GreenSock
    CodePen

    Нужно будет допилить до нормального состояния конечно ))
    Ответ написан
    Комментировать
  • Как убрать повторение свойства animation для :hover при повторном наведении на элемент?

    ae_ph
    @ae_ph
    I'm a owl )
    Как вариант через JS писать условия.
    Если курсор попал на объект тогда делаем следующее.
    Вот я сделал пример CodePen
    Ответ написан
    Комментировать
  • Замена превью ссылки в skype?

    ae_ph
    @ae_ph
    I'm a owl )
    Сайт не подключен случайно к серверу Cloudflare?
    Если да, тогда вам нужно очистить кэш там.
    Я не знаю точно о какой версии скайпа идёт речь о браузерной или десктопной.
    Но так-же вам нужно попробовать очищать кэш во встроенной версии Skype
    Ну а если это веб браузер просто сотрите cookies файлы в браузере ctrl + shift + del или F12 > Приложения > Файлы cookies.
    620d4503ac769992864348.png
    Ответ написан
  • Как реализовать видеоплеер с уменьшением длины видео (обрезка)?

    ae_ph
    @ae_ph
    I'm a owl )
    Думаю вам нужно смотреть в эту сторону: Управление видео из JavaScript.
    ссылка 1
    ссылка 2
    А если вы хотите обрезать видео прямо в браузере по таймлайну тогда тут можно на сервере использовать ffmpeg.
    Но я не совсем уверен, чего именно вы хотите добиться.
    Ответ написан
    Комментировать
  • Ошибка в консоли Google Chrome, как понять причину?

    ae_ph
    @ae_ph
    I'm a owl )
    Расширения отключите в браузере
    Ответ написан
    Комментировать