Задать вопрос
  • Чем отличается функция от конструктора и где применять то или это?

    К большому моему (личному) сожалению, Javascript - это язык, в котором возможно и разрешено вообще всё. Язык постоянно дополняется из "хотелок" пользователей.

    И вот в один момент разработчики спецификации ECMA-script решили, а давайте мы всё же оправдаем первые 4 буквы в названии языка, а именно "Java", и дадим пользователям сахарок, нарисованный над нашим прототипным наследованием, чтобы они могли везде писать class, extends и implements, как и все остальные ООП-динозавры. И сделали это.

    И с этим решением в наш прекрасный язык пришло понимание конструктора, как метода, создающего экземпляр класса. Конструктор очень сильно помогает с инкапсуляцией. В языках, имеющих настоящий ООП, есть приватные поля, которые не могут быть инициализированы прямым присваиванием в какой-то внешней функции, создающей объект, потому что к ним нет прямого доступа, и для такого придётся писать публичные сеттеры. А это плохо, потому что кто угодно сможет менять при помощи этих сеттеров то состояние, которое менять не надо.
    А вот из конструктора к приватным полям прямой доступ имеется. В Javascript приватные поля появились, кстати, вот буквально совсем недавно.

    class ClassWithPrivate {
      #privateField;
      publicField;
    
      constructor() {
        this.#privateField = "Доступ только изнутри класса";
      }
    }
    
    const instance = new ClassWithPrivate();
    
    instance.publicField = "Доступ извне класса";
    instance.#privateField; // Ошибка: SyntaxError: Private field '#privateField' must be declared in an enclosing class


    Еще одной особенностью конструктора является то, что он активно используется при наследовании (крестится и плюётся через левое плечо от отвращения). Если в дочернем классе не описан свой конструктор, то будет использован конструктор родителя. Это упрощает ООП.

    class Animal {
    
      constructor(name) {
        this.speed = 0;
        this.name = name;
      }
    
      run(speed) {
        this.speed = speed;
        alert(`${this.name} бежит со скоростью ${this.speed}.`);
      }
    
      stop() {
        this.speed = 0;
        alert(`${this.name} стоит.`);
      }
    
    }
    
    class Rabbit extends Animal {
      hide() {
        alert(`${this.name} прячется!`);
      }
    
      stop() {
        super.stop(); // вызываем родительский метод stop
        this.hide(); // и затем hide
      }
    }
    
    let rabbit = new Rabbit("Белый кролик"); // используется конструктор родителя
    
    rabbit.run(5); // Белый кролик бежит со скоростью 5.
    rabbit.stop(); // Белый кролик стоит. Белый кролик прячется!


    Таким образом, если вдарились в классический ООП, пользуйтесь везде конструктором, потому что ООП развивается десятилетиями, люди прошли сквозь страдания и выработали определённые "лучшие практики" для ООП.
    Если же вы используете объекты в основном как очень простые структуры без классической инкапсуляции с приватными полями, не используете наследование, а весь ваш код написан, в основном, на функциях, то делайте, ради бога, что вам вздумается, и отдельная функция-фабрика для создания объектов - это тоже вариант.
    Ответ написан
    Комментировать
  • Как поправить правила nftables при syn flood атаке?

    @alkeksy
    Я бы отправил через транслятор iptables->nftables что-то вроде
    iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 3 --connlimit-mask 24 -j DROP
    либо с матчем на limit,
    iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
    connlimit ограничивает одновременное количество соединений, connlimit-mask говорит подключения из какого CIDR считать в один каунтер, /24 в примере выше,
    а limit ограничивает количество открывающехся соединений в единицу времени
    Ответ написан
  • Как в nginx отдать файл с другим расширением?

    @dodo512
    Или хотя бы отобразить по ссылке на file.jpeg, сам file.gif

    Создать новую переменную и заменить .jpeg на .gif с помощью map.
    map $uri $gif {
    default         $uri;
    ~^(.*)\.jpeg$  "$1.gif";
    }
    
    
    server {
        location @original {
            try_files $image_folder_1$uri  $image_folder_0$uri $image_folder_1$gif $image_folder_0$gif @errors;
        }
    Ответ написан
    5 комментариев
  • Как в express-validator отменить проверку поля?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    А документация что говорит? Например эта страница: https://express-validator.github.io/docs/guides/cu...

    Плюс есть оператор if: https://express-validator.github.io/docs/api/valid...
    Ответ написан
    1 комментарий
  • Через что блокировать массово IP адреса на сервере?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    man ipset
    Ответ написан
    Комментировать
  • Через что блокировать массово IP адреса на сервере?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Такой массив адресов лучше хранить в ipset, а блокировать в iptables - iptables умеет взаимодействовать с данными из ipset.
    Ответ написан
    3 комментария
  • Как пересобрать массив объектов, выкинув из него лишнее?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Как-то так, если без учёта дубликатов, в один проход.
    function removeSomeShit(arr) {
      const table = {};
      const result = [];
    
      for(const current of arr) {
        const {uid, owner, createdAt} = current;
    
        const uidOvnerKey = `${uid}\0${owner}`;
        const ownerUidKey = `${owner}\0${uid}`;
    
        const matched = table[uidOvnerKey];
    
        if (matched) {
          delete table[uidOvnerKey];
          result.push(matched.createdAt > createdAt ? matched : current);
        } else {
          table[ownerUidKey] = current;
        }
      };
      
      return Object.values(table).concat(result);
    }
    Ответ написан
    1 комментарий
  • Как в nginx создать переменную с датой в формате yyyy-mm-dd?

    karabanov
    @karabanov
    Системный администратор
    map $time_iso8601 $date {
        ~(\d+-\d+-\d+).* $1;
        default "0000-00-00";
    }
    Ответ написан
    Комментировать
  • Как задать в nginx определенную директорию с учетом GET запроса?

    Lynn
    @Lynn
    nginx, js, css
    Как посоветовал ky0, лучше использовать явные аргументы вида $arg_name.

    map $arg_h:$arg_blur $imgdir {
        default                "/image";
        ~^(?<height>\d+):true$ "/tmp/h$height/blur";
        ~^(?<height>\d+):      "/tmp/h$height";
    }
    Ответ написан
    6 комментариев
  • Как задать в nginx определенную директорию с учетом GET запроса?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    Вместо того, чтобы всё усложнять и усложнять свою регулярку, сделайте условия с переменными-аргументами.
    Ответ написан
    2 комментария
  • Почему не отправляется почта через nodemailer?

    С недавнего времени ужесточилась политика обработки входящих email у google и yahoo. Теперь записи DKIM и DMARC обязательны. Без них оно просто не будет обработано сервисом.
    https://habr.com/ru/companies/globalsign/articles/...
    Ответ написан
    Комментировать
  • Как можно обновить head в next.js?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Я бы использовал существующий компонент Head, вместе с контекстом и состоянием, а так же кастомный HeadProvider:
    // _app.js
    import {HeadProvider} from './HeadProvider';
    
    function App({Component, pageProps}) {
        return (
            <HeadProvider>
                <Component {...pageProps} />
            </HeadProvider>
        );
    }

    // HeadProvider.js
    import React, {createContext, useContext, useState} from 'react';
    
    const HeadContext = createContext();
    export const useHead = () => useContext(HeadContext);
    
    export function HeadProvider({children}) {
        const [headData, setHeadData] = useState({
            title: 'Init title',
            description: 'Init description',
            keywords: 'Init keywords'
        });
    
        return (
            <HeadContext.Provider value={{headData, setHeadData}}>
                {children}
            </HeadContext.Provider>
        );
    }

    // MyBestHead.js
    import Head from 'next/head';
    import {useHead} from './HeadProvider';
    
    export function MyBestHead() {
        const {headData} = useHead();
    
        return (
            <Head>
                <title>{headData.title}</title>
                <meta name="description" content={headData.description}/>
                {/* more head items */}
            </Head>
        );
    }

    // MyComponent.js
    import React, {useCallback} from 'react';
    import {useHead} from './HeadProvider';
    
    export function MyComponent() {
        const {setHeadData} = useHead();
    
        const handleClick = useCallback(() => {
            setHeadData({
                title: 'New title',
                description: 'New description',
                keywords: 'New keywords'
            });
        }, [setHeadData]);
    
        return (
            <button onClick={handleClick}>Update Head Data</button>
        );
    }
    Ответ написан
    1 комментарий
  • Как проверить объект на присутствие неизвестного ключа?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    function isPermittedObject(obj) {
      if (!obj) return false;
      
      const permitted = new Set(["v", "c", "g"]);
      let max = 1;
    
      for (const key in obj)
        if (!permitted.has(key) || !max--) 
          return false;
      return true;
    }
    
    console.log(!isPermittedObject({
      v: 1,
      c: 3,
      g: 5
    }))
    
    console.log(!isPermittedObject({
      v: 1
    }))
    Ответ написан
    Комментировать
  • Как проверить объект на присутствие неизвестного ключа?

    @StockholmSyndrome
    const valid = (obj, allowedKeys) => (v => v.length === 1 && allowedKeys.includes(v[0]))(Object.keys(obj))
    Ответ написан
    Комментировать
  • Как в моем случае правильно обработать статику в Nginx?

    @dodo512
    Полный путь к файлу формируется из значения root и строки в try_files.
    Если root /var/www/staticHandle, то в try_files нужно передать "/../static/photos/image.jpg".
    В $uri уже есть "/photos/image.jpg" осталось добавить "/../static".

    try_files $imgdir/$imgfile /../static$uri /../static1$uri /../static2$uri /../static3$uri @image;
    Ответ написан
    Комментировать
  • Почему такая долгая загрузка в Яндекс Диск?

    @Maxim_Q
    Яндекс специально ограничивает скорость и вставляет палки в колеса при использовании Яндекс Диска по webdav, это уже разбирали тысячу раз и все матюкались на это дело. Янедексу не выгодно чтобы вы напрямую подключались к диску, т.к. за вами нельзя шпионить через их приложения.
    Это никак не исправить и никак на это не повлиять, проблема не у вас, а у Яндекса и он это решать не будет.
    Ответ написан
    Комментировать
  • Как по проще сделать редирект к большому списку URL?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    В любом случае будет простыня. Можно сделать через map - и унести простыню в отдельный конфиг.
    Ответ написан
    Комментировать
  • Можно ли в css сделать сквозную кнопку?

    szQocks
    @szQocks
    pointer-events: none;
    Ответ написан
    Комментировать
  • Почему теряется интервал (Next.js)?

    szQocks
    @szQocks
    при изменении зависимостей, создаётся новая функция в useCallback, в котором создаётся ссылка на новый интервал, ссылка на старый интервал - потеряна

    если переменную timer заменить на ref и присваивание setInterval(() => nextButton?.click(), 5000) поместить внутрь второго if, то всё сработает, но лучше бы - логику по интервалу вынести в useEffect, а в handlePlay - менять только флаг стейта
    Ответ написан
    1 комментарий
  • Как убрать дубли с помощью canonical?

    vpetrov
    @vpetrov
    частный SEO-специалист
    Частичные копии - не технические дубли. Поисковая система такой canonical может запросто проигнорировать. Вопрос правильнее решить настройками шаблонизации мета и (или) уникализации контента.
    Кроме того, ситуация может иметь временный характер, тем более - в Яндекс. Он постоянно что-то пересчитывает, закидывает в индекс и выбрасывает - иначе не умеет.
    Ответ написан
    Комментировать