• Можно ли сохранить множество картинок оффлайн через PWA для последующей отправки?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    На работе для сервис воркера в PWA используем workbox.
    Картинки не отправляем, но разных форм много. И как раз схожий кейс.
    import { NetworkOnly } from 'workbox-strategies';
    import { BackgroundSyncPlugin } from 'workbox-background-sync';
    import { registerRoute } from 'workbox-routing';
    import { StatusCodes } from 'http-status-codes';
    
    const bgSyncPlugin = new BackgroundSyncPlugin('APIRequestsQueue', {
      // Повторять попытку отправить запрос в течение 8 часов (указывается в минутах)
      maxRetentionTime: 480,
    });
    
    ['POST', 'PUT', 'PATCH', 'DELETE'].forEach((method) => {
      registerRoute(
        ({ url }) => url.pathname.startsWith('/v1'),
        new NetworkOnly({
          plugins: [
            {
              ...bgSyncPlugin,
              /**
               * Этот обработчик будет вызван, когда не удалось выполнить запрос.
               * Информация о запросе будет помещена в очередь и запрос
               * выполнится при подключении к сети.
               * Возвращаем статус 202 Accepted, чтобы в приложении
               * можно было понять из-за чего не удалось выполнить запрос
               * и отреагировать должным образом.
              */
              handlerDidError() {
                return Promise.resolve(new Response(null, {
                  status: StatusCodes.ACCEPTED,
                }));
              },
            },
          ],
        }),
        method,
      );
    });


    Таким образом достигается такой порядок действий:
    1. Заполняем форму
    2. Исчезает интернет
    3. Жмём кнопку ОТПРАВИТЬ
    4. Сервис воркер сохраняет данные запроса в кеше с именем APIRequestsQueue и возвращает 202 код
    5. Сеть появляется
    6. Запросы из кеша APIRequestsQueue уходят по очереди в фоне, без участия пользователя
    Ответ написан
    Комментировать
  • Что такое файлы core на сервере?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Смотрим на любой core-файл с помощью утилиты file:

    $ file core.666
    core.666: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from '/usr/bin/foobar', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0


    Тут видно, что крэшился процесс foobar.

    Далее с помощью:

    gdb -c core.666

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

    С запуском scp всё это скорее всего не связано, ну разве что core-файл остаётся от самого sshd.
    Ответ написан
    Комментировать
  • Что такое файлы core на сервере?

    Smithson
    @Smithson
    20+ лет админю
    Это файлы для отладки падающего процесса. В зависимости от версии unix, могут называться core.МногоЦифр или НазваниеПадающегоСофта.core
    Можете смело удалять, но советую попытаться понять, кто их производит: что-то у вас их очень много (если это не запас за много лет), такими темпами они могут весь диск заполнить.
    Ответ написан
    Комментировать
  • Что такое файлы core на сервере?

    Буквы "y" после второго ввода yes - результат работы команды "yes" (да, есть такая программа!). Собственно, сама по себе она выводит в терминал "y" пока не будет убита.
    А вот почему она (а может и не она?) при уничтожении оставила столько файлов, непонятно. Может быть это особенность запуска yes под ssh, или падало что-то другое.
    Надо по ls -l посмотреть даты создания этих файлов, и будет понятно, сейчас они создались (тогда на 90% что это yes так глюкануло), или даты разные, тогда надо разбираться...
    Ответ написан
    1 комментарий
  • Что такое файлы core на сервере?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Это что-то падало и система создала файло для анализа. Обычно их просто стирают, но если их так много - лучше бы посмотреть - к какому процессу они относятся и в чем там дело.
    Ответ написан
    Комментировать
  • Почему не работает useState при клике?

    @abberati
    frontend-разработчик
    Он работает. Он асинхронный. В документации про это написано. Если ты хочешь что-то делать с новым значением стейта, то это что-то ты должен делать в useEffect

    А в тайм-ауте не меняется из-за замыкания. Это константа. Она никогда не поменяется в замыкании. Никогда.
    Ответ написан
    3 комментария
  • Почему не отображаются слайды Swiper?

    rockfeeler
    @rockfeeler
    Фронтендер, дизайнер, верстальщик-перфекционист
    slidesPerView: 4
    Я вижу на экране больше. Отсюда вывод, что каждый слайд содержит несколько элементов. Я прав? В таком случае есть вероятность, что свайпер не может поместить нужное количество слайдов в установленную ширину экрана. Может, есть смысл сделать отдельный слайд для каждого элемента? Ну, или увеличить количество дублируемых наборов:
    loopAdditionalSlides: [число]
    Ответ написан
    Комментировать
  • Где взять адаптивную сетку для сайта?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Если не нужны фреймворки то делай следующее:
    - у getbootstrap.com и прочих типа getuikit.com есть возможность взять только то, что тебе нужно
    - https://getbootstrap.com/docs/4.4/layout/grid/ или https://getuikit.com/docs/grid
    Сделай свой билд через yarn и webpack или же просто возьми grid
    Ответ написан
    Комментировать
  • Где взять адаптивную сетку для сайта?

    @Araya
    Ответ написан
    Комментировать
  • Javascript сортировка товаров по цене?

    xakplant
    @xakplant
    Автор сайта xakplant.ru
    Вот написал пример сортировки по цене.
    Только parent у меня body, у вас наверное будет какой-то другой

    var items = document.querySelectorAll('.appartments-item');
    var parent = document.body;
    var SortElements = new Object();
    items.forEach(function(item, indx){
      var itemValue = parseInt(item.querySelector('.appartments-item__price').textContent.replace('руб', '').replace(/\s+/g, ''));
      SortElements[itemValue] = {'element': item, 'index': indx} ;
    });
    var keys = Object.keys(SortElements);
    function compareNumeric(a, b) {
      a = parseInt(a);
      b = parseInt(b);
      if (a < b) return 1;
      if (a > b) return -1;
    }
    keys.sort(compareNumeric);
    keys.map(function(key, indx){
      parent.insertAdjacentElement('beforeend', SortElements[key]['element']);
    });
    Ответ написан
    4 комментария
  • Почему не работает gulp pug?

    IlyaDeveloper
    @IlyaDeveloper
    Top Rated | Expert Web Developer
    Бро влом разбираться , смотри вот мой рабочий конфиг :
    let gulp = require('gulp'), // Подключаем Gulp
        cleanCSS = require('gulp-clean-css'),
        sass = require('gulp-sass'), // Подключаем Sass пакет
        pug = require('gulp-pug'), // Подключаем pug
        imagemin = require('gulp-imagemin'), // Подключаем библиотеку для работы с изображениями
        pngquant = require('imagemin-pngquant'), // Подключаем библиотеку для работы с png
        cache = require('gulp-cache'), // Подключаем библиотеку кеширования
        spritesmith = require('gulp.spritesmith'), // Подключаем библиотеку создания спрайтов
        merge = require('merge-stream'), // Подключаем merge
        autoprefixer = require('gulp-autoprefixer');
    
    let browserSync = require('browser-sync').create();
    
    let pathBuild = './dist/';
    let pathSrc = './src/';
    
    let pathFonts = [
        pathSrc + 'fonts/**/*'
    ];
    
    gulp.task('sass', function () {
        return gulp.src(pathSrc + 'sass/**/*.+(sass|scss)')
            .pipe(sass({outputStyle: 'expanded'}).on('error', sass.logError))
            .pipe(autoprefixer({browsers: ['last 15 versions'], cascade: false}))
            .pipe(cleanCSS({compatibility: 'ie8'}))
            .pipe(gulp.dest(pathBuild + 'css'));
    });
    
    gulp.task('cleanCSSBuild', () => {
        return gulp.src(pathBuild + 'css/main.css')
            .pipe(cleanCSS({compatibility: 'ie8'}))
            .pipe(gulp.dest(pathBuild + 'css/'))
    });
    
    gulp.task('pug', function () {
        gulp.src('src/pug/*.+(jade|pug)')
            .pipe(pug({pretty: '\t'}))
            .pipe(gulp.dest('dist/'))
    });
    
    gulp.task('js', function () {
        return gulp.src(pathSrc + 'js/**/*.js')
            .pipe(gulp.dest('dist/js'));
    });
    
    
    gulp.task('img', function () {
        return gulp.src(pathSrc + 'img/**/*')
            .pipe(cache(imagemin({
                interlaced: true,
                progressive: true,
                svgoPlugins: [{removeViewBox: false}],
                use: [pngquant()]
            })))
            .pipe(gulp.dest('dist/img'));
    });
    
    gulp.task('fontsDev', () => {
        return gulp.src(pathFonts)
            .pipe(gulp.dest(pathBuild + 'fonts'));
    });
    
    gulp.task('sprite', function () {
        let spriteData = gulp.src('src/sprite/*.png').pipe(spritesmith({
            imgName: '../img/sprite.png',
            cssName: 'sprite.scss'
        }));
        let imgStream = spriteData.img
            .pipe(gulp.dest('src/img/'));
        let cssStream = spriteData.css
            .pipe(gulp.dest('src/sprite/'));
        return merge(imgStream, cssStream);
    });
    
    gulp.task('browserSync', () => {
        browserSync.init({
            server: pathBuild
        });
    });
    
    gulp.task('watch', function () {
        gulp.watch('src/sass/**/*.+(sass|scss)', ['sass', 'cleanCSSBuild']);
        gulp.watch('src/pug/**/*.+(jade|pug)', ['pug']);
        gulp.watch('src/js/**/*.js', ['js']);
        gulp.watch('src/img/**/*', ['img']);
        gulp.watch('src/sprite/**/*.png', ['sprite']);
    });
    
    gulp.task('default', [
        'img',
        'js',
        'sass',
        'pug',
        'fontsDev',
        'cleanCSSBuild',
        'watch',
        'browserSync',
    ]);


    и json
    {
      "name": "project",
      "version": "1.0.0",
      "description": "project",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "browser-sync": "^2.24.7",
        "gulp": "^3.9.1",
        "gulp-autoprefixer": "^6.0.0",
        "gulp-cache": "^0.4.5",
        "gulp-clean-css": "^3.10.0",
        "gulp-concat": "^2.6.1",
        "gulp-imagemin": "^3.1.1",
        "gulp-minify": "^3.1.0",
        "gulp-pug": "^3.2.0",
        "gulp-sass": "^3.1.0",
        "gulp-uglify": "^2.0.0",
        "gulp.spritesmith": "^6.3.0",
        "imagemin-pngquant": "^5.0.0"
      }
    }
    Ответ написан
    1 комментарий