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

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

    Вот так вот можно подключить 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 Автор вопроса
    Я использовал плагин "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?

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

    ae_ph
    @ae_ph Автор вопроса
    Я нашёл проблему, расходимся )
    В папке /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) отрабатывает только после второго клика?

    Я исправил данный кода, теперь это должно работать для вас.
    Вот пример на 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);
    });
    Ответ написан
  • Кроссплатформенная разработка: какой фреймворк выбрать?

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

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

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

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

    Вы можете использовать модуль 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 Автор вопроса
    Я нашёл решение проблемы!
    Это мои настройки в settings.json
    "prettier.tabWidth": 2, // Расстояние отступов. 
    "editor.tabSize": 2, // Число пробелов, соответствующее табуляции.
    "editor.insertSpaces": true, // Вставлять пробелы при нажатии клавиши TAB. Этот параметр переопределяется на основе содержимого файла, если включен параметр "editor.detectIndentation".
    "editor.detectIndentation": false, // На основе содержимого файла определяет, будут ли "editor.tabSize" и "editor.insertSpaces" автоматически обнаружены при открытии файла.
    Ответ написан
    Комментировать
  • Как запустить 2 программы одним файлом?

    Я создал папку "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 Автор вопроса
    Собственно на самом сайте css-tricks я и нашёл решение )
    Возможно у вас есть свои варианты, когда не используется CMS WordPress
    Ответ написан
    Комментировать
  • Npm i -S; npm i -D; npm i;?

    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 Автор вопроса
    Я нашёл решение. Нужно было объеденить все выделения в одной 'слой-фигуре' и к ней применять "Инвертированная подложка альфа канала".

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

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

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

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

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

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

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

    Расширения отключите в браузере
    Ответ написан
    Комментировать
  • Как растянуть изображение?

    ae_ph
    @ae_ph Автор вопроса
    Я сделал пример того как я это реализовал.
    Его можно посмотреть тут codepen
    Ответ написан
    Комментировать