Задать вопрос
  • Как продлять SSL сертификат на хостинге?

    SagePtr
    @SagePtr
    Еда - это святое
    Если у вас шаред-хостинг, а не VPS, то в популярных панелях управления давно уже есть плагин Letsencrypt, позволяющий автоматизировать процесс. Если там панель годами не обновлялась или какая-то самописная, то возможно, что подобного пункта в панели управления не будет. Касательно платности - это какой-то сюр, Letsencrypt сам по себе бесплатен, да и предполагает автоматизацию процесса (вероятно, бесплатный серт на год - это от другого вендора, который там использовался до повсеместного внедрения LE).
    Ответ написан
    Комментировать
  • Как продлять SSL сертификат на хостинге?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    Ответ написан
    Комментировать
  • Как правильно реализовать (Level System) для игры?

    Seasle
    @Seasle Куратор тега JavaScript
    Возможно как-то так:
    Пример 1
    const lerp = (min, max, value) => (1 - value) * min + value * max;
    
    const LEVELS = 10;
    const MAX_EXPERIENCE = 600000;
    
    const multipliers = [];
    for (let index = 0; index < LEVELS - 1; index++) {
      multipliers.push(
        lerp(1, 2, index / LEVELS)
      );
    }
    
    const total = multipliers.reduce((total, value) => total + value, 0);
    const step = MAX_EXPERIENCE / total;
    const { levels } = multipliers.reduce((store, multiplier, index) => {
      const experience = step * multiplier;
      store.levels.push({
        level: index + 1,
        experience: {
          current: store.total,
          next: store.total + experience,
          need: experience
        }
      });
      store.total += experience;
      
      if (index + 1 === LEVELS - 1) {
        store.levels.push({
          level: LEVELS,
          experience: {
            current: store.total
          }
        });
      }
      
      return store;
    }, { levels: [], total: 0 });
    
    console.log(levels);
    /*
    [
      {
        level: 1,
        experience: { current: 0, next: 47619.04761904762, need: 47619.04761904762 }
      },
      {
        level: 2,
        experience: { current: 47619.04761904762, next: 100000, need: 52380.95238095238 }
      },
      {
        level: 3,
        experience: { current: 100000, next: 157142.85714285716, need: 57142.85714285715 }
      },
      {
        level: 4,
        experience: { current: 157142.85714285716, next: 219047.61904761905, need: 61904.761904761894 }
      },
      {
        level: 5,
        experience: { current: 219047.61904761905, next: 285714.2857142857, need: 66666.66666666666 }
      },
      {
        level: 6,
        experience: { current: 285714.2857142857, next: 357142.8571428571, need: 71428.57142857142 }
      },
      {
        level: 7,
        experience: { current: 357142.8571428571, next: 433333.3333333333, need: 76190.4761904762 }
      },
      {
        level: 8,
        experience: { current: 433333.3333333333, next: 514285.71428571426, need: 80952.38095238095 }
      },
      {
        level: 9,
        experience: { current: 514285.71428571426, next: 600000, need: 85714.28571428571 }
      },
      {
        level: 10,
        experience: { current: 600000 }
      }
    ]
    */

    В примере выше используется линейная интерполяция. На её основе можете изменить шаг между уровнями, например, используя easeInCubic в нормализованном значении:
    Пример 2
    const lerp = (min, max, value) => (1 - value) * min + value * max;
    const easeInCubic = value => value * value * value;
    
    const LEVELS = 10;
    const MAX_EXPERIENCE = 600000;
    
    const multipliers = [];
    for (let index = 0; index < LEVELS - 1; index++) {
      multipliers.push(
        lerp(1, 2, easeInCubic(index / LEVELS))
      );
    }
    
    const total = multipliers.reduce((total, value) => total + value, 0);
    const step = MAX_EXPERIENCE / total;
    const { levels } = multipliers.reduce((store, multiplier, index) => {
      const experience = step * multiplier;
      store.levels.push({
        level: index + 1,
        experience: {
          current: store.total,
          next: store.total + experience,
          need: experience
        }
      });
      store.total += experience;
      
      if (index + 1 === LEVELS - 1) {
        store.levels.push({
          level: LEVELS,
          experience: {
            current: store.total
          }
        });
      }
      
      return store;
    }, { levels: [], total: 0 });
    
    console.log(levels);
    /*
    [
      {
        level: 1,
        experience: { current: 0, next: 58275.058275058276, need: 58275.058275058276 }
      },
      {
        level: 2,
        experience: { current: 58275.058275058276, next: 116608.3916083916, need: 58333.33333333333 }
      },
      {
        level: 3,
        experience: { current: 116608.3916083916, next: 175349.65034965036, need: 58741.258741258745 }
      },
      {
        level: 4,
        experience: { current: 175349.65034965036, next: 235198.13519813522, need: 59848.48484848485 }
      },
      {
        level: 5,
        experience: { current: 235198.13519813522, next: 297202.79720279726, need: 62004.66200466201 }
      },
      {
        level: 6,
        experience: { current: 297202.79720279726, next: 362762.2377622378, need: 65559.44055944055 }
      },
      {
        level: 7,
        experience: { current: 362762.2377622378, next: 433624.70862470864, need: 70862.47086247086 }
      },
      {
        level: 8,
        experience: { current: 433624.70862470864, next: 511888.1118881119, need: 78263.40326340326 }
      },
      {
        level: 9,
        experience: { current: 511888.1118881119, next: 600000, need: 88111.88811188811 }
      },
      {
        level: 10,
        experience: { current: 600000 }
      }
    ]
    */
    Ответ написан
    Комментировать
  • Как работает веб-сервер и node js в связке? Зачем нужен Nginx?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Веб-разработка
    Самое простое - nginx отдаёт статику. На больших объёмах делать это через Ноду неэффективно.
    Посложнее - nginx позволяет управлять ходом запроса. Например, редиректить на https.
    Ещё сложнее - можно настроить nginx, чтобы он умно балансировал запросы между несколькими бэкендами и автоматом блокировал слишком частые попытки подключения.

    Nginx очень хорошо в промышленных масштабах делает определённую часть работы, связанной с http-запросом, поэтому ему эту часть работы и делегируют.
    Ответ написан
    Комментировать
  • Как сделать "табы в табах"?

    @Programmir
    Вначале делаешь табы, потом у каждого таба делаешь табы.
    Ответ написан
    Комментировать
  • Зачем вложенность в scss если есть БЭМ?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега CSS
    Вложенность в SASS как раз позволяет удобно делать БЭМ-селекторы:
    .block {
      foo: bar;
    
      &_element {
        bar: baz;
      }
    }


    Но при использование вложенности scss формируется длинный селектор
    Сам факт использования SASS никак на сложность селекторов не влияет. Результат зависит от исходного кода, а не от инструмента компиляции.
    Да, SASS позволяет навертеть селекторы, если не быть осторожным и писать бездумно, но он к этому не обязывает.
    Ответ написан
    Комментировать
  • Как правильно создать HTML письмо?

    AntonLitvinenko
    @AntonLitvinenko
    HTML coder
    Рекомендую воспользоваться фреймворком MJML, если есть опыт вёрстки, то разобраться с ним пара часов, хорошая документация, есть примеры, онлайн песочница, приложение для компа и возможность запустить под галпом
    Ответ написан
    Комментировать
  • Является ли PHP аналогом Flask?

    yupiter7575
    @yupiter7575
    Python программист
    Погуглите laravel
    Ответ написан
    Комментировать
  • Как исправить проблемы с выдачей результатов поиска при изменения input?

    yarkov
    @yarkov Куратор тега Vue.js
    Помог ответ? Отметь решением.
    Надо отменять предыдущий запрос при запуске нового
    Ответ написан
    Комментировать
  • Как полностью анонимизировать операционную систему?

    GavriKos
    @GavriKos
    Отключить целевой комп от интернета. А еще лучше - если уж такая паранойя - и из розетки выдернуть. По другому - никак.
    Ответ написан
    Комментировать
  • Как слепить такой блок на css?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Ответ написан
    Комментировать
  • Стоит ли предпочитать экшены мутациям во Vuex?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Мутации - строго синхронные короткие процедуры, содержащие только логику смены состояния.
    Экшены - возможно асинхронные процедуры, относящиеся к бизнес-логике и вызывающие мутации для смены состояния.
    Так что вы всё делаете правильно. Бизнес-логика - открыть меню. Для этого надо сменить состояние, установив для меню статус "открыто".
    Если завтра вам понадобится перед открытием меню делать его предзагрузку с сайта, вы поменяете экшен, а мутация останется как есть.
    Ответ написан
    Комментировать
  • Как из нескольких объектов сделать один, сложив значения свойств с одинаковыми именами?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Коротко:

    const sum = (...arr) => arr
      .flatMap(Object.entries)
      .reduce((acc, [ k, v ]) => (
        acc[k] = (acc[k] ?? 0) + v,
        acc
      ), {});

    Длинно:

    function sum() {
      const result = {};
    
      for (const n of arguments) {
        for (const k in n) {
          if (n.hasOwnProperty(k)) {
            if (!result.hasOwnProperty(k)) {
              result[k] = 0;
            }
    
            result[k] += n[k];
          }
        }
      }
    
      return result;
    }

    Использовать, понятное дело, так: const obj = sum(obj1, obj2);.
    Ответ написан
    Комментировать
  • Возможно ли использовать компонентный подход верстки в бекенде?

    profesor08
    @profesor08
    https://nextjs.org/ - react
    https://nuxtjs.org/ - vue
    и другие..
    Ответ написан
    Комментировать
  • Возможно ли использовать компонентный подход верстки в бекенде?

    w3bsmes
    @w3bsmes
    Куратор тега «Глупые вопросы»
    Так возьми это и не извращайся.
    Ответ написан
    Комментировать
  • Как решить проблему с N + 1 запросом БД при выборке модели с getNameAttribute?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Вот это должно работать:
    public function reviews(): HasManyThrough
    {
        return $this->hasManyThrough(
            Review::class,
            Comment::class,
            'commentable_id',
            'reviewable_id'
        );
    }
    
    public function getCommentsCountAttribute(): int
    {
        return $this
            ->reviews
            ->where('commentable_type', Review::class)
            ->count();
    }


    Ну и да, при выборке вы должны указать, что хотите для коллекции постов жадно загрузить comments.
    Ответ написан
    1 комментарий
  • Кто занимается планированием REST API в SPA приложении?

    @sidni
    Php Developer
    Тип который знает бизнес модель описывает девелоперам, потом бек строит апи, а фронт строит фронт, каждый уже примерно должен знать что ему нужно и фронт может успешно строить свои интерфейсы объектов для моков а потом уже может мапить поля с апи, если хочется попытаться договориться чтоб меньше мапить то есть стандарты описания респонса к примеру https://jsonapi.org/
    Ответ написан
    Комментировать
  • Кто занимается планированием REST API в SPA приложении?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    В общем смотрите
    Первоначально приходит бизнес аналитик и составляет ТЗ
    Бэк делают по ТЗ
    Фронт делают по ТЗ
    На бэке документируется через www.swagger.io
    или через любой другой инструмент https://habr.com/ru/post/252237/

    В общем где то так.
    Если вы прокинули ТЗ и БА, то созванивайтесь и сами уточняйте
    Ответ написан
    1 комментарий
  • Почему AJAX возвращает 1 Комментарий 22 раза?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Вместо .data[1]. должно быть .data[i].
    Ответ написан
    Комментировать
  • Где лучше запускать фильтрацию переданного текста комментария, для последующего сохранения?

    megakor
    @megakor
    Go/PHP developer | ВКонтакте
    Много способов как это сделать, но точно не в контроллере.
    Я бы сделал CommentObserver:
    php artisan make:observer CommentObserver --model=Comment

    и там в методе saving(Comment $comment) проверял бы - есть ли право у пользователя (с помощью политики, а не гейта, кстати) и фильтровал бы как надо.
    Ответ написан