Задать вопрос
  • Какое регулярное выражение использовать для валидации числа по нижеуказанным требованиям?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Какое регулярное выражение использовать для валидации числа по нижеуказанным требованиям?
    Никакое, ибо не зачем.

    Валидация делается по событиям keyup и paste
    Почему бы не городить костыли и просто не использовать событие input?

    input с type="number" уже отсеет невалидные символы, хотя валидное число будет далеко не обязательно
    Ответ написан
    4 комментария
  • Как распознать ссылку в строке?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Единственный 100% работающий способ проверить, а ссылка ли в строке - это попробовать ее распарсить как ссылку:
    function isURL(str) {
      try {
        new URL(str);
        return true;
      } catch {
        return false;
      }
    }
    
    console.log(isURL('http://')); // false
    console.log(isURL('http://site.ru')); // true

    И не слушайте тех кто предлагает Вам регулярки. Регулярки это очень дорого как по вычислительным ресурсам, так и по поддержке кода. Люди пользуются регулярками только в 2х случаях:
    1. у них нет времени сделать нормально, но потом они намерены это переделать
    2. они макаки не способные сделать нормально
    Ответ написан
    1 комментарий
  • Как производиться валидация захешированного пароля?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если вводить один и тот же пароль несколько раз- хеш всегда будет разный
    нет. Вся суть хэш функций, что при всей своей необратимости они всегда выдают детерминированный результат, то есть простым языком на одни и те же входные параметры выдаются одни и те же выходные.
    То есть один и тот же пароль всегда даст один и тот же хэш.

    Конкретно с bcrypt - это хэш с солью. То есть у него не 1 входной параметр (пароль), а 2 - пароль и соль. При создании нового хэша генерируется новая соль (в идеале крипто рандомом). Поэтому и меняется хэш. Это усложняет взлом, так как без соли я бы просто мог иметь заранее рассчитанный словарик хэшей для частых паролей, а с солью мне придется делать полный перебор, даже если у пользователя банальный qwerty пароль.

    Для валидации соль хранится в базе вместе с хэшем, мы просто не генерируем новую соль, а хэшируем с сохраненной.
    Ответ написан
    1 комментарий
  • Как создать метод(триггер) для пользовательского плагина jQuery?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ответ написан
    Комментировать
  • Почему не работает Scss в Webpack?

    bingo347
    @bingo347
    Crazy on performance...
    "style-loader",
    MiniCssExtractPlugin.loader
    эти 2 лоадера не работают вместе, или один или другой
    идеально, если использовать style-loader при разработке для быстрой работы HMR, а MiniCssExtractPlugin.loader - в продакшене
    Ответ написан
    Комментировать
  • Как из html сделать картинку?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    https://developer.mozilla.org/en-US/docs/Web/SVG/E...
    svg можно отрисовать на канвасе и сохранить

    с какими библиотеками?
    всем только библиотеки подавай... браузеры и без библиотек много чего умеют
    Ответ написан
    Комментировать
  • Как решить эту задачу си?

    bingo347
    @bingo347
    Crazy on performance...
    Для начала нужно понимание, что памятью на стеке управляет компилятор, и для каждой функции эта память имеет фиксированный размер. А все потому, что в ассемблере, в который скомпилится наш C код нет переменных, вместо них компилятор просто проставит смещения от указателя на конец стека на старте функции. Именно по этому компилятору важно знать размеры всех сущностей на стеке.
    Изменить этот размер в рантайме нельзя, поэтому единственный способ решить эту задачу с массивом символов на стеке - выделить массив с достаточным запасом памяти, чтоб хватило и на исходную строку и на вставляемую подстроку.
    А вот память в куче динамическая. И все аллокации работают именно с ней. И главное мы ее можем выделять в рантайме по мере надобности.
    Учитывая, что массивы в C - это по сути сахар над указателями, то смело можете заявлять своему преподу, что указатель на несколько подряд идущих char в куче и массив char - это одно и то же.

    Вообще, по нормальному я бы объявил структуру вроде такой:
    typedef struct {
    	char* buffer;
    	size_t capacity;
    	size_t length;
    } string;
    и дальше бы работал с ней, заодно разбив код на небольшие функции. Но преподы программирования народ от разработки далекий, и кроме своих лабараторок в программировании не бум-бум в большинстве своем. А в комментах к вопросу было про то, что структуры нельзя...
    Поэтому решение в лоб и в стиле универских лаб:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
    	size_t capacity = 1 << 4; // на старте буду выделять 16 байт
    	size_t length = 0; // строка пока пустая, поэтому 0
    	char* str = malloc(capacity);
    	if (str == NULL) { // с памятью в куче может и облом быть
    		return 1; // вернем код ошибки
    	}
    	printf("Write string and press ENTER to continue:\n");
    	while(1) { // читать символы будем до скончания веков ))
    		char c = getchar();
    		if(c == 13 || c == 10) break; // ну или пока юзер не нажмет ентер
    		length++; // увеличим счетчик символов
    		if(length > capacity) { // если новый символ не влазит в выделеную память
    			capacity <<= 1; // то удвоим ее
    			char* new_str = realloc(str, capacity); // и перевыделим
    			if (new_str == NULL) { // опять чекнем, вдруг облом
    				free(str); // ресурсы надо освобождать
    				return 1; // вернем код ошибки
    			}
    			str = new_str; // в str теперь невалидный указатель, можем его заменить
    		}
    		str[length - 1] = c; // запомним считанный символ
    	}
    	// Здесь решение с вставкой подстроки
    	// с учетом того, что у нас строка str
    	// с длиной length и выделеной памятью под нее capacity
    	free(str); // ресурсы надо освобождать
    	return 0; // вернем код успешного завершения
    }
    с самой вставкой подстроки надеюсь справитесь?
    Ответ написан
    6 комментариев
  • Как в Laravel-mix отключить версионность?

    bingo347
    @bingo347
    Crazy on performance...
    Как в Laravel-mix отключить версионность?
    не использовать mix.version()

    Laravel-mix делался для php-шников не знакомых с FrontOps вообще и с webpack в частности.
    Да, не спорю, он весьма удобен, но за удобство приходится платить отсутствием гибкости.

    Но у меня версия добавляется всегда, если хотя бы к одному правилу применен version()
    У mix нет "правил", у него есть лишь методы, которые мутируют внутреннее состояние модуля laravel-mix
    Ответ написан
    Комментировать
  • Как отловить исключение из неуправляемого кода?

    bingo347
    @bingo347
    Crazy on performance...
    https://docs.microsoft.com/ru-ru/dotnet/api/system...
    ловить можно через обычный try-catch
    Ответ написан
    Комментировать
  • Как организовать работу над проектами из любого места?

    bingo347
    @bingo347
    Crazy on performance...
    1. Сервак торчащий через ssh в интернет, желательно с хорошим каналом и близко к большинству Ваших мест работы.
    2. VSCode с плагином для удаленной разработки
    Ответ написан
  • Как настроить API к закрытой системе?

    bingo347
    @bingo347
    Crazy on performance...
    site-2.ru просто пишет у себя в nginx новый location, по которому требует клиентский сертификат tls (имеющийся на стороне crm.ru, это нужно чтоб никто больше не мог этот location дернуть)
    crm.ru дергает post запрос по этому локейшену и скидывает туда обновления данных
    site.ru в взаимодействии между site-2.ru и crm.ru вообще не нужен
    Ответ написан
  • Как сделать два бандла и отдать их в зависимости от разрешения?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вам нужен динамический импорт. Бэк будет отдавать то что запросят, а что грузить решать будете на клиенте в корневом чанке.
    https://webpack.js.org/guides/code-splitting/

    Я надеюсь Вы в курсе, что на десктопе тоже бывает тач, а на компактных мобильных устройствах он может отсутствовать?
    Ответ написан
  • Как сделать так что бы функция активировалась сразу за предыдущей?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вам нужно запускать следующий таймер из колбэка предыдущего
    что-то вроде такого:
    $(function (){
      var toRed = true;
      function red(){
        function changeFontRed() // Черный сменяется на Красный
        {
          $('#red').toggleClass('red-black');
          $('#red').toggleClass('red');
          yellow();
        } 
        setTimeout(changeFontRed, 1500 )
      }	
      function yellow(){
        function changeFontYellow() // Черный сменяется на Желтый
        {
          $('#yellow').toggleClass('yellow-black');
          $('#yellow').toggleClass('yellow');
          if(toRed) { red(); }
          else { green(); }
          toRed = !toRed; // для желтого будем менять направление по этой переменной
        } 
        setTimeout(changeFontYellow, 1500 )	
      }
      function green(){
        function changeFontGreen() // Черный сменяется на Зеленый
        {
          $('#green').toggleClass('green-black');
          $('#green').toggleClass('green');
          yellow();
        } 
        setTimeout(changeFontGreen, 1500 )	
      }
      green(); // сразу зажигаем только 1 из цветов
    });
    Ответ написан
    1 комментарий
  • Можно ли создать виртуальное ядро в Linux, если имеется кластер ARM?

    bingo347
    @bingo347
    Crazy on performance...
    Ну во-первых, 1,5ггц на х86 и 1,5ггц на arm - две большие разницы, х86 будет быстрее. Хотя на задачах, которые хорошо параллелятся действительно можно выиграть за счет суммарного количества ядер.
    Во-вторых, даже если Вы придумаете как и напишите патч к ядру линукс, чтоб в определенных условиях некоторые процессы вместо запуска отправлялись по сети, то все равно, arm процессор не сможет выполнить код скомпилированный под x86_64.

    Ну и немного чисто теории. Выдвину одну интересную гипотезу, проверять которую не рационально если сравнить трудозатраты и выхлоп.
    Можно написать некий гипервизор, который будет работать на голом железе наших апельсинок (малинок, бананок) и предоставлять их ресурсы некоей сетевой виртуальной машине, которая работая одновременно на нескольких машинах будет виртуализировать их как одну многоядерную. В принцип даже можно будет эмулировать х86, хотя это будет довольно медленно, хотя может оказаться и вполне не заметно на фоне сетевых задержек при обращении в память.
    А вот поверх этой виртуальной машины уже можно будет запустить хоть линукс, хоть фряху, и даже винду, если все же решим х86 эмулировать.
    Можете проспонсировать сию теорию, найду ребят которые за годик другой реализуют прототип этой идеи.
    Ответ написан
    4 комментария
  • Как из консоля сделать массив?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вашу хотелку можно сделать одним простым выражением:
    const consoleArray = Object.keys(console).filter(
      k => typeof console[k] === 'function'
    ).reduce(
      ([cnsl, acc], key) => [Object.assign(cnsl, {
        [key]: (original => (...args) => (
          acc.push(...args),
          original.call(cnsl, acc)
        ))(cnsl[key])
      }), acc],
      [console, []]
    )[1];
    Ответ написан
    1 комментарий
  • Почему разрешается добавить значение в кортеж?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Потому что кортеж в ts это подтип массива, а система типов ts настолько убога, что через нее нельзя выразить, что у подтипа недоступны какие-то методы основного типа.
    qwe[2] = 77
    Тут просто сразу 2 ошибки типов:
    во-первых 77 нельзя присвоить типу undefined - так как [string, number] - это вполне себе сахар над типом
    {readonly length: 2; 0: string; 1: number} & Readonly<typeof Array.prototype>

    во-вторых 2 в индексе опять таки нельзя воткнуть в тип 'length' | 0 | 1 | keyof typeof Array.prototype
    Ответ написан
    Комментировать
  • В git закоммитил в master - как исправить?

    bingo347
    @bingo347
    Crazy on performance...
    # переименуем master в experiment
    git checkout master
    git branch -m experiment
    # удалим удаленный master
    git push --delete origin master
    # зальем текущую ветку на удаленный репо:
    git push -u origin experiment
    # переключимся на комит с которого пойдет мастер по его хэшу:
    git checkout 3624ce5
    # ответвимся от сюда в новую ветку с именем master
    git checkout -b master
    # и залем ее на удаленный репо
    git push -u origin master
    Ответ написан
    4 комментария
  • Как передать метод класса в worker_theards node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Потому что функции не являются сериализуемым объектом
    Если что, сериализуется этим: https://nodejs.org/docs/latest-v12.x/api/v8.html#v...
    Вы можете послать сообщение, а метод поток должен вызывать сам
    Ответ написан
  • Почему XOR 0 убирает дробную часть числа?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Почему число получается целым, уже объяснил Stranger in the Q
    Я же постараюсь объяснить, как это работает, и почему оно не лучше Math.floor:
    В js тип number представлен числами двойной точности по стандарту кодирования IEEE 754, а это значит, что 53 бита выделяются под значимую часть (старший бит - бит знака, если 1 - то число отрицательное) и 11 бит под экспоненту (старший бит опять же бит знака), всего выходит 64 бита. Притом данный стандарт позволяет абсолютно точно работать с целыми числами до ±252 и поэтому до не давнего времени в js честного int не было.
    Теперь к бинарным (не нравится мне перевод "побитовый") операциям, как известно "исключающее или" (xor, ^) с нулем, а так же "или" (or, |) с нулем не меняют число, возвращая другой операнд в неизменном виде. Но тут вклинивается стандарт js и говорит, что бинарные операции выполняются над signed int32 представлением числа и при представлении можно просто отбросить все лишнее, что движки и делают.
    Как отбросить все лишние? Да просто, движок js прекрасно знает, в какой части числа расположена значимая часть, он просто берет младшие 32 бита значимой части и кладет их в int32 контейнер ну и еще переносит бит знака на свое место. Обратное преобразование похоже - в нулевой float64 контейнер раскладываем: старший бит (знак) на свое место, остальные 31 бит - на свое.

    А теперь давайте поэкспериментируем в обычной браузерной консоли:
    Math.floor(1.1) // 1
    parseInt(1.1) // 1
    1.1 | 0 // 1
    1.1 ^ 0 // 1 - как уже писал выше, эффект будет 1 в 1, как и с |
    
    // пока все было ок, но как насчет отрицательных чисел?
    Math.floor(-1.1) // -2 - округляем в сторону -Infinity
    parseInt(-1.1) // -1 - отбрасываем экспоненту
    -1.1 | 0 // -1 - отбрасываем экспоненту и не только (но тут не имеет значения пока)
    
    // попробуем с чем-нибудь побольше
    2 ** 31 // 2147483648
    2147483648 | 0 // -2147483648
    /*
    не зная как преобразовывается число выше, это было бы не очевидно
    но смотрим выше "он просто берет младшие 32 бита значимой части и кладет их в int32 контейнер"
    2 ** 31 в двоичном виде - это единичка и 31 нолик
    и эта единичка попала в бит знака при переноси в int32
    тем самым мы получили самое маленькое число в int32
    */
    
    // давайте еще пример, набью как я большое число от балды:
    34646456436346346212424 // 3.464645643634635e+22
    34646456436346346212424 | 0 // 1178599424
    /*
    ну в первом примере мы видим интересную особенность чисел с плавающей запятой
    мы можем хранить не только дробные числа, но и очень большие целые, правда с потерей точности
    e+22 - это и есть экспонента, это значит число до e нужно умножить на основание системы счисления (10) в степени +22
    а при бинарной операции эта экспонента отбрасывается, как и старшие биты значимой части
    в 32 младших битах осталось 1178599424
    забавно, что я случайно вбил такое число, у которого 32 бит содержал 0 (шансы были 50/50)
    если бы там оказалась 1, то я бы вновь получил отрицательное число
    */
    Ответ написан
    Комментировать
  • Vue.js для мультистраничных приложений с webpack?

    bingo347
    @bingo347
    Crazy on performance...
    Можно.
    Самое простое - посмотреть в сторону nuxt и его generate
    Но если не устраивает, то можно заморочиться и самому сделать сборку под конкретные цели
    Ответ написан
    Комментировать