Задать вопрос
  • Как остановить цикл map() по условию?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Остановить итерацию в методе map никак.
    Можно найти индекс нужного элемента с помощью метода findIndex() и обрезать массив относительно него.
    Только стоит учесть, что искомого элемента может не быть в массиве, и тогда findIndex() вернет -1
    const arr = [
      {value: 1},
      {value: 2},
      {value: 3},
      {value: 4, active: true},
      {value: 0},
      {value: 0},
      {value: 0},
      {value: 0},
      {value: 0},
    ]
    
    const activeIndex = arr.findIndex(item => item.active);
    wrapper.innerHTML = (activeIndex === -1 ? arr : arr.slice(0, activeIndex + 3)).map(item => `
      <div class="block ${item.active ? "active" : ""}">
        ${item.value}
      </div>
    `).join("")
    Ответ написан
    1 комментарий
  • Чем VirtualBox отличается от Sandboxie?

    bingo347
    @bingo347
    Crazy on performance...
    Мне просто надо проверит несколько программ. Точнее иллюстратор. Он платный, а я скачаю кряк
    Это УК РФ Статья 146 часть 2, а Вы только что рассказали всему интернету, что собрались нарушать закон

    Можете назвать отличия Sandboxie от VirtualBox?
    Sandboxie на сколько знаю - это просто контейнеризация, то есть программы внутри работают по сути с тем же ядром ОС, но с изолированной файловой системой. И работают они на физическом железе, что быстрее, но в случае вируса вполне позволяет использовать уязвимости приводящие к повреждению железа.
    VirtualBox - это полноценная виртуализация, внутри на эмулированном железе работает полноценная ОС, в том числе не только Windows

    Может ли вирус на компе проявиться через неделю???
    Ну например вот

    И как проверить, в песочнице, есть ли вирус.
    Антивирусом. (с)КО
    А может ли антивирус не обнаружить вируса?
    Может

    P.S. иллюстратор сейчас распространяется по подписке, можете купить на месяц, сделать работу, а когда он станет не нужным - просто не продлевать подписку
    Ответ написан
  • Как декодировать данное выражение?

    bingo347
    @bingo347
    Crazy on performance...
    Звездочка здесь относится к типу, а не к имени, и означает, что это указатель, просто синтаксис C позволяет здесь поставить пробел в любом месте (или не ставить его вовсе)
    По итогу, это функция match, которая принимает 2 аргумента - char и указатель на char, и возвращает так же указатель на char
    Ответ написан
    Комментировать
  • Сокращенный импорт для *.tsx и *.jsx, нужно ли добавлять алиасы и в конфиг вебпака и в tsconfig?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    tsconfig.json
    {
        "compilerOptions": {
            "baseUrl": "./",
            "paths": {
                "@*": ["./src/modules/*"]
            }
        }
    }
    остальные параметры по своему вкусу

    с webpack боюсь придется для каждой папки генерировать свой алиас, но учитывая что конфиг webpack - это код, не большая проблема, а за основу для генерации он может брать tsconfig.json
    Ответ написан
    1 комментарий
  • Как вывести данные переменной из async функции?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Асинхронная функция всегда возвращает промис, притом на момент, когда она его вернула результата еще нет, он будет потом, в неопределенном будущем.
    Можно получить результат в колбэк метода then:
    get_user_name().then(alert);
    Или получить его через await из другой асинхронной функции:
    (async () => {
      alert(await get_user_name());
    })();
    Ответ написан
  • Как проверить тип параметров ф-ции?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Типов нет в рантайме, так что нужно проверять по тому что есть, например написать примерно такой тайпгвард:
    const isFormPropsType = (v: FormPropsType | {path: string}): v is FormPropsType => typeof (v as FormPropsType).formName === 'string';

    И соответственно использовать его для проверки:
    const authForms:AuthFormsType = {
      login:(props) =>{
        if(isFormPropsType(props)){
          return <Login 
          formName={props.fromName} 
          onSubmit={props.onSubmit} 
          changeFormStateHandler={props.changeFormStateHandler}
          />
        } 
        return <Login path={props.path} />
      },

    Хотя подозреваю, что можно гораздо проще сделать в данном случае:
    const authForms:AuthFormsType = {
      login:(props) => {
        return <Login {...props} />
      },
    Ответ написан
  • Асинхронность и чистые функции несовместимы?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Чистота функции определяется двумя условиями:
    1. Функция детерминирована
    2. Функция не имеет побочных эффектов
    Если оба этих условия истинны, то тогда функцию можно считать чистой.

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

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

    Из этого становится верно утверждение, что если вызов чистой функции заменить на ее результат, то поведение программы от этого не изменится. А от сюда напрашивается еще один вывод, что программа состоящая только из чистых функций бесполезна. Но можно вынести все грязные операции на край приложения, а бизнес логику описать в виде чистых функций, что даст ей все преимущества таких функций, вроде предсказуемости и простой тестируемости.

    Что же качается асинхронности, то большинство асинхронных операций (если не все) порождают побочные эффекты. Но можно выносить их на край приложения, а основную логику строить в виде чистых функций. Покажу на примере такого сценария:
    1. Пользователь кликает на кнопку
    2. Данные из стейта подготавливаются и отправляется запрос на сервер с ними
    3. Когда пришел ответ данные снова преобразуются и обновляется стейт
    let state = {
        // для простоты будем считать что эти данные уже есть
        formData: {
            text1: 'Hello',
            text2: 'world',
            checkbox1: true,
            checkbox2: false
        },
        // а сюда мы должны положить результат запроса
        requestResult: null
    };
    // querySelector не детерминирован, а подписка на событие - побочный эффект
    document.querySelector('.button').addEventListener('click', clickHandler);
    
    // prepareFormData - чистая функция
    function prepareFormData(formData) {
        return {
            text: `${formData.text1} ${formData.text2}`,
            checkboxes: [
                ['checkbox1', formData.checkbox1],
                ['checkbox2', formData.checkbox2]
            ].filter(([, v]) => v).map(([v]) => v)
        };
    }
    
    const API_URL = '/api/data';
    
    // createRequestSender - чистая функция
    // API_URL - константа, она не меняет результат
    // сама createRequestSender не делает запроса к api
    // она просто "вычисляет" из preparedFormData функцию, притом детерминировано
    function createRequestSender(preparedFormData) {
        const body = JSON.stringify(preparedFormData);
        // а вот возвращаемая функция уже грязная:
        // хотя она и вполне детерминирована,
        // но она вызывает fetch и response.json имеющие побочные эффекты
        // но это никак не влияет на чистоту внешней функции createRequestSender, так как та ее не вызывает
        return async () => {
            const response = await fetch(API_URL, {
                method: 'POST',
                body
            });
            const result = await response.json();
            return result;
        };
    }
    
    // mapResponseToState - чистая функция,
    // а вот если бы мы напрямую изменили state вместо копирования его в результат
    // это бы был побочный эффект, так как state не принадлежит mapResponseToState
    function mapResponseToState(state, responseResult) {
        return {
            ...state,
            requestResult: (responseResult.ok
                ? {
                    showSuccess: true,
                    showError: false,
                    text: responseResult.result
                }
                : {
                    showSuccess: false,
                    showError: true,
                    text: responseResult.error
                }
            )
        };
    }
    
    // обработчик клика clickHandler будет тем самым грязным краем
    async function clickHandler() {
        // чистая операция
        const requestSender = createRequestSender(prepareFormData(state.formData));
        // побочный эффект
        const result = await requestSender();
        // еще чистая операция
        const newState = mapResponseToState(state, result);
        // и снова побочный эффект
        state = newState;
    }
    Ответ написан
  • 300 веб сокетов?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если операции вычисления блокирующие и блокирует они поток надолго, то стоит вынести их в воркеры, само количество воркеров лучше выбрать по количеству логических ядер (хардварных потоков), а распределять задачи можно простым round robin алгоритмом, если сами задачи примерно одинаковые.
    А насчет сокетов, 300 постоянных коннектов на 1 процесс/поток для ноды сущий пустяк, она спокойно переварит несколько десятков тысяч, если поток не блокировать дольше нескольких десятков операций
    Ответ написан
    2 комментария
  • Почему при замене prototype не меняется поведение объектов?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    P.S. я так понимаю в момент создания new User создается ссылка на тот объект, что в User.prototype, при создании нового, а не мутации, ссылки не обновляются, верно ?
    верно
    При создании объекта через new Func ссылка из Func.prototype копируется в новый объект.
    Так же после Вашего хака перестанет работать оператор instanceof, так как он работает на рекурсивном сравнении этих ссылок.
    Ответ написан
    Комментировать
  • Есть ли готовая функция для выявления цвета у картинки?

    bingo347
    @bingo347
    Crazy on performance...
    https://developer.mozilla.org/ru/docs/Web/API/Canv...
    Ну а дальше просто пройтись и посчитать
    Ответ написан
    Комментировать
  • Как динамически передавать дженерик тип?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Если commonName - переменная, то ее тип можно извлечь через typeof
    submitHandlersCreator<AuthFormsDataTypes[typeof commonName]>({
                      dispatch,
                      path: `${location.pathname}${location.search}`,
                      actionName:commonName
                    })
    Но у нее должен быть литеральный тип или юнион литеральных типов, притом из множества ключей AuthFormsDataTypes
    Ответ написан
    Комментировать
  • Ошибка при установке npm пакетов?

    bingo347
    @bingo347
    Crazy on performance...
    1) Для node-gyp нужен python 2 версии
    2) node-gyp не переваривает юникод, избавьтесь от кириллицы в путях
    3) https://gist.github.com/bingo347/e6c8e1fe605ecb26d...
    Ответ написан
    Комментировать
  • Как решить ошибку с this в функции TypeScript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Комментировать
  • Prettier и ESLint (в VSC) конфликтуют по поводу пробелов перед скобками - data() - как их подружить?

    bingo347
    @bingo347
    Crazy on performance...
    Ну во-первых, настроить eslint правильно: https://eslint.org/docs/rules/space-before-functio...
    В Вашем случае нужен не 'off', а ['error', 'always']
    Во-вторых, настроить остальные правила в eslint согласно принятому код стайлу
    В-третьих, заменить prettier на eslint --fix и выкинуть prettier за не надобностью, ибо eslint из коробки умеет все то же, что и prettier и много чего еще, а с плагинами его возможности вообще безграничны
    Ответ написан
    3 комментария
  • Как сделать, чтобы код выполнялся после того, как изменится значение?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Можно запоминать последнее значение и сравнивать текущее с запомненным:
    let lastOnlinePlayers
    util.status('test')
      .then((response) => {
        if (response.onlinePlayers === lastOnlinePlayers) return;
        lastOnlinePlayers = response.onlinePlayers
        if (response.onlinePlayers > botOnlineMatch.maxOnline) {
          botOnlineMatch.maxOnline = response.onlinePlayers
        }
        if (response.onlinePlayers > botOnlineMatch.dayOnline) {
          botOnlineMatch.dayOnline = response.onlinePlayers
        }
      })
    Ответ написан
    4 комментария
  • Купил ssl сертификат, но нет crt?

    bingo347
    @bingo347
    Crazy on performance...
    .key - это приватный ключ, вообще, по хорошему его должны генерировать только Вы, как владелец будущего сертификата. Приватный ключ попавший к третьему лицу, в том числе к регистратору, должен считаться скомпрометированным и небезопасным.
    .csr - это запрос на подпись вышестоящим сертификатом, он содержит все данные будущего сертификата (домен, владелец и т.д.), а так же подпись этих данных через приватный ключ .key
    .csr необходимо отправить регистратору на подпись, подписанный приватным ключом регистратора .csr становится Вашим сертификатом .crt
    Так же любая из этих частей может быть в .pem формате, это текстовый формат, который описывает, что он хранит + сами данные (ключ/сертификат/цепочка сертификатов) в base64.

    P.S. писал все по памяти, за достоверной информацией лучше сходить в гугл. Но одно скажу точно, должен быть или .crt (бинарный формат) или он же завернутый в .pem
    Ответ написан
    1 комментарий
  • Как заставить TS работать с группами типов?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    const f = <T extends T1 | T2>(someObj: T, someEnum: T extends T1 ? typeof E1 : typeof E2) => {
      return (someObj as T1 & T2)[someEnum.a];
    };
    Ответ написан
  • Как задать определенные ключи объекту?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    type TFood = Partial<Record<TFruit, Partial<Record<TFruitProps, string>>>>;
    Ответ написан
    5 комментариев