• Как задать порт в параметрах команды ssh?

    bingo347
    @bingo347
    Crazy on performance...
    Для команды ssh - флаг -p и порт:ssh -p 2222 user@host
    Для scp - флаг -P (заглавная) и порт:scp -P 2222 /local/file user@host:/remote/file
    Для rsync - через флаг -e можно указать кастомный шелл, соответственно отдаем туда ssh с флагом -p:rsync -e 'ssh -p 2222'

    UPD: Помимо этого можно в папке ~/.ssh (там где ключи) создать файл с именем config (без расширения) и задать там нужным хостам алиасы и многие настройки, включая порт, пользователя по умолчанию и альтернативный ключ, после чего во всех ssh утилитах можно будет писать только алиас:ssh alias
    Документация по доступным параметрам
    Плагин к vscode для подсветки и автодополнения в файле ~/.ssh/config
    Ответ написан
    Комментировать
  • Buffer в Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Это хранимые байты в 16-ричной системе счисления
    Ответ написан
    Комментировать
  • Какой node js фреймворк выбрать?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если прямо модно и мейнстримно, то NestJS, но он сильно завязан на TypeScript (что несомненно плюс) и декораторах (которые нестандартные, а значит, ИМХО, жирнючий минус)
    Помимо вот такого серьезного фреймворка есть микрофреймворки и библиотеки под конкретные задачи:
    Например для создания HTTP серверов есть express, он самый популярный, он под капотом у NestJS, но при не очень грамотном построении приложения легко убить производительность (тут совет использовать его роутер с первых дней)
    В качестве хороших альтернатив есть Koa и Hapi.
    Под websocket обычно все используют socket.io, из плюсов помимо популярности - его протокол реализован на многих языках, как в качестве сервера, так и клиента. В остальном, ИМХО, только минусы.
    В качестве альтернативы есть ws-api, но популярность низкая, typescript версия пока под альфой, и все не доходят руки доделать
    Ответ написан
    Комментировать
  • Почему расширеный интерфейс в TS не принимается компилятором?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Расширение интерфейсов (это именно расширение, а не наследование) работает по принципу И, а в формировании Record Вы от него ожидаете принципа ИЛИ.
    Типы в TypeScript подчиняются достаточно строгой математике, за счет которой он способен статически типизировать всю мощь хаоса динамического JavaScript.
    Если не брать в расчет способность интерфейсов к слиянию, то расширение интерфейсов можно считать сахаром над операцией & над типами, то есть это:
    interface Field {
      value: any,
      validation?: FieldValidation
    }
    
    interface InputField extends Field {
      value: string,
      placeholder: string,
      textarea?: boolean,
      maxChars?: number,
      type?: 'text' | 'email' | 'password' | 'tel' | 'url',
      dark?: boolean,
      disabled?: boolean,
      onInput?: () => any,
      onKeyDown?: () => any,
      onFocus?: () => any,
      onBlur?: () => any
    }
    аналогично этому:
    interface Field {
      value: any,
      validation?: FieldValidation
    }
    
    type InputField = Field & {
      value: string,
      placeholder: string,
      textarea?: boolean,
      maxChars?: number,
      type?: 'text' | 'email' | 'password' | 'tel' | 'url',
      dark?: boolean,
      disabled?: boolean,
      onInput?: () => any,
      onKeyDown?: () => any,
      onFocus?: () => any,
      onBlur?: () => any
    }

    А ожидаемую Вами логику можно получить c помощью операции | следующим образом:
    interface BaseField {
      value: any,
      validation?: FieldValidation
    }
    
    interface InputField extends BaseField {
      value: string,
      placeholder: string,
      textarea?: boolean,
      maxChars?: number,
      type?: 'text' | 'email' | 'password' | 'tel' | 'url',
      dark?: boolean,
      disabled?: boolean,
      onInput?: () => any,
      onKeyDown?: () => any,
      onFocus?: () => any,
      onBlur?: () => any
    }
    
    interface SelectField extends BaseField {
      options: string[],
      value: string,
      placeholder: string,
      dark?: boolean,
      disabled?: boolean,
      onSelect?: () => any,
      onKeyDown?: () => any,
      onFocus?: () => any,
      onBlur?: () => any
    }
    
    type Field = InputField | SelectField;
    const fields = ref<Record<string, Field>>({
            name: {
              value: '1',
              placeholder: '123'
            },
    });


    P.S. Для одного доклада по TypeScript готовил такой пример:
    https://gist.github.com/bingo347/00652993abf31702c...
    Если поймете, как оно работает, то познаете большую часть дзена TypeScript
    Ответ написан
    2 комментария
  • Какая разница между await и Promise?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    (async () => {
      const result = await {
        then(resolve) {
          console.log('Привет сахар');
          setTimeout(() => resolve(10), 3000);
        }
      };
      console.log('Ух ты, данные из таймера:', result);
    })();

    (async () => {
      try {
        await {
          then(_, reject) {
            console.log('Привет сахар');
            reject(new Error('Ошибочка'));
          }
        };
        console.log('Это никогда не выполнится');
      } catch (e) {
        console.log('Ух ты, эксепшн:', e);
      }
    })();

    console.log('Промисы никуда не делись?', (async () => {})() instanceof Promise)
    Ответ написан
    Комментировать
  • Как получить названия функций из объекта, который является результатом выполнения функции?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Не совсем понятен вопрос, но догадываюсь, что нужна правильная типизация данного хука, IDE именно на нее смотрят для формирования списка автокомплита.
    Можно сделать примерно так: https://www.typescriptlang.org/play?#code/C4TwDgpg...
    Ответ написан
    Комментировать
  • Как сделать свой плагин для Vue2 если проект на TypeScript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Комментировать
  • Почему при сравнении результат отличный от троичного условного оператора?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В выражении -1 ? 1 : 2 значение -1 приводится к типу boolean и получается true
    В выражении -1 == true значение true приводится к числу и получается 1
    https://habr.com/ru/company/ruvds/blog/347866/

    P.S. лучше использовать строгое сравнение (=== и !==) и приводить типы явно
    Ответ написан
    2 комментария
  • Как остановить цикл 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
    Ответ написан
    Комментировать