Задать вопрос
  • Проблема при сборке проекта NPM?

    bingo347
    @bingo347
    Crazy on performance...
    webpack не установили
    Ответ написан
    Комментировать
  • Как выложить проект node.js и mysql на хостинг?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Классический shared хостинг как правило не поддерживает ноду, так что вариантов тут 2: или искать спец хостинг под ноду или арендовать виртуальный сервер. За сравнительно небольшие деньги сегодня можно получить или виртуалку с настоящим линуксом или OpenVZ контейнер (что в принципе то же linux, но не совсем честный).
    Разобраться, как развернуть свое окружение не особо сложно, но если совсем никак, на фрилансе и сисадмины бывают.
    Ответ написан
    9 комментариев
  • Как получить колбек загрузки внешнего скрипта?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если сторонняя библиотека посылает xhr/fetch запрос, то перехватить его со страницы невозможно никак, разве что обернуть соответствующее апи до загрузки этой библиотеки.
    Если это именно вставка скрипта, то у скрипт элемента есть события load и error связанные с загрузкой, можете подписаться на них. Тут задача уже, как поймать добавление конкретного тега скрипт, думаю MutationObserver прекрасно справится с этой задачей.
    Более подробных советов без кода и понимания, что происходит на странице, тут не дашь
    Ответ написан
    Комментировать
  • Как правильно сделать авторизацию и шифрование для TCP соединения?

    bingo347
    @bingo347
    Crazy on performance...
    TLS поддерживает механизм, когда обе стороны предоставляют сертификаты. Вы можете создать свой CA (корневой сертификат) и подписать им сертификаты каждой из сторон, наличие этой подписи защитит от подделки и каждая из сторон сможет проверить другую. Естественно соединения без клиентского сертификата или подписанные не нашим CA обрываем на этапе рукопожатия.
    При успешном рукопожатии у нас есть сессионный ключ, которым шифруется трафик.
    Так же в целях безопасности я бы ограничил поддержку только протокола TLS1.3, учитывая, что и клиент и сервер - наши приложения, проблем точно не возникнет
    Ответ написан
    1 комментарий
  • В чем практические отличия null от undefined?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    undefined - имеет отдельный тип данных, при том это юнит-тип (имеет единственное значение). Кроме того, это значение по умолчанию для неинициализированных переменных, непереданных аргументов, результата функции, которая ничего не вернула и отсутствующих полей объектов (включая цепочку прототипов), а так же this по умолчанию (с es5). У undefined нет своего литерала, но есть неизменяемая (с es5) глобальная переменная. Кроме того undefined можно получить из оператора void. Забавно, что в v8 это единственный не ссылочный тип данных, а в памяти хранится только тэг типа.
    null - по спеке тоже должен иметь свой юнит-тип, но абсолютно во всех реализациях он имеет тип object. В отличие от undefined, null - это ссылка, а значит в памяти будет тэг типа + указатель. В v8 этот указатель ведет на static память, поэтому любой null всегда равен любому другому null, даже из другого контекста, что соответствует спеке.
    Ответ написан
  • Как правильно работать с двумя массивами одновременно?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ну во-первых, querySelectorAll возвращает коллекцию NodeList а не массив, это важно понимать.
    Во-вторых, у NodeList нет сеттера onclick в отличии от элементов, а следовательно Ваше присваивание туда функции просто не сработает.
    В-третьих, не стоит пользоваться сеттерами вида oneventname, так как это чревато проблемами, используйте метод addEventListener
    В-четвертых, querySelectorAll можно использовать не только на document, но и на элементах
    В-пятых, в обработчик события приходит объект события в качестве аргумента, в котором есть свойство target - элемент на котором событие произошло

    По-итогу:
    function listener(event) {
      const target = event.target.closest('.app__item');
      target.querySelectorAll('.equalizer').forEach(
        elem => elem.style.display = 'block'
      );
      // так как дальнейшие клики будут гонять бесполезный цикл, то лучше отписаться
      target.removeEventListener('click', listener);
    }
    document.querySelectorAll('.app__item').forEach(
      item => item.addEventListener('click', listener)
    );
    Ответ написан
    Комментировать
  • Есть ли альтернатива socket_create (php) для nodejs?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Для создания сервера на базе TCP или Unix Domain Socket:
    https://nodejs.org/docs/latest/api/net.html#net_ne...
    Для создания клиента на базе TCP или Unix Domain Socket:
    https://nodejs.org/docs/latest/api/net.html#net_ne...
    Для создания UDP сокета:
    https://nodejs.org/docs/latest/api/dgram.html#dgra...
    Ответ написан
    1 комментарий
  • Как настроить livereload на node js проекте, использовав webpack-dev-server?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    webpack-dev-server не поддерживает hot-reload для node
    https://github.com/webpack/webpack-dev-server/blob...

    и сам hot-reload не работает "по-волшебству", просто многие лоадеры вставляют дополнительный код для его поддержки
    Ответ написан
    Комментировать
  • Можно ли поместить(записать) переменные в массив?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В js многие операторы не являются выражением, и как следствие их можно использовать только как statement.
    Среди них var, let, const, return, throw (есть пропозал, так что в будущем может изменится), if, for, while и некоторые другие.
    следовательно написать x = delete y.z можно, так как оператор delete - является выражением и возвращает true или false
    а написать x = var y нельзя, так как var ничего не возвращает, даже undefined не вернет.

    можно так:
    var arrey = [];
    var a = 1;
    var b = 2;
    arrey[0] = a;
    arrey[1] = b;

    но правильнее так:
    var arrey = [];
    var a = 1;
    var b = 2;
    arrey.push(a, b);
    или так:
    var a = 1;
    var b = 2;
    var arrey = [a, b];
    Ответ написан
    Комментировать
  • Как передать элемент в callback функцию?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Передавать его еще одним аргументом в loadScript
    let loadScript = (url, callbackScript, elem) => {
        let script = document.createElement('script');
        script.src = url;
        document.getElementsByTagName('body')[0].append(script);
        script.onload = function() {
          callbackScript(elem); // Как в эту функцию передать elem? elem находится снизу при обходе массива
        };
      };
    App.prototype.initModule = function(array) {
        array.forEach(elem => {
          loadStyles.call(DATA, DATA[elem].styleURL); // Вот здесь передаю callback
          loadScript.call(DATA, DATA[elem].scriptURL, callback, elem);
        });
      };


    P.S. метод call не имеет смысла для стрелочных функций, ибо у них нет своего this
    Ответ написан
    2 комментария
  • Как разобраться с выделением памяти в массиве?

    bingo347
    @bingo347
    Crazy on performance...
    Если правильно понял вопрос, то можно выделить память единым куском под всю матрицу:int* matr = (int*)malloc(n * m * sizeof(int));а к конкретной ячейке обращаться как matr[i * n + j]
    тогда и освободить будет просто - free(matr) и все.

    а для текущего примера освобождение памяти будет выглядеть так:
    void free_matr(int m, int** matr) {
      for(int i = 0; i < m; i++) {
        free(matr[i]);
      }
      free(matr);
    }
    Ответ написан
    1 комментарий
  • Go - замена PHP в плане многопоточности и производительности?

    bingo347
    @bingo347
    Crazy on performance...
    Как и руби, go - это write only language...
    Легко и быстро прототипировать. Когда нужно опробовать бизнес идею и выбросить на рынок MVP еще вчера - лучше языка и придумать сложно. Но вот поддерживать потом это больно и дорого...
    Очередной раз скопипастив проверку на ошибку или проброс ее дальше, начинаешь молиться на тех людей, кто придумал DRY и проклинать авторов go, за дизайн этого языка.
    И вот вроде лучик хорошего, вместо наследования нам пытаются продать композицию, только сделана она через одно место и Вы легко потеряете за ней контроль.
    Полиморфизм? Я их знаю 3 вида. И я считаю, что полиморфизм - это как раз тот инструмент, который позволяет делать нам по с учетом DRY, SOLID и прочих красивых аббревиатур... Вот только в go нет ни одного из них... Вместо него Вам дают ужасную утиную типизацию. Серьезно... Когда мне говорят, что в JS утиная типизация, я смеюсь и говорю, что в JS прекрасная система типов и предлагаю посмотреть на go, так как если Вы хотя бы 10 минут изучаете чужой код, то Вы уже как минимум 3 раза спросили себя, какой калека написал здесь interface{} вместо типа...
    PHP хороший язык. Он позволяет писать как говнокод, так и весьма красивое и правильное ООП. Мне лично не хватает в нем ФП, но жить без него там можно. PHP7+ весьма быстр, а с некоторыми аддонами может в многопоток... Не так просто как в go, но может...
    Стоит ли та простота прототипирования и верчения горутинами нескольких человекожизней поддержки кодовой базы чуть сложнее хелловорлда? Решать Вам...

    P.S. Если Вы действительно уперлись по производительности не в IO (БД, диск, сеть и т.д.), а в Ваш любимый php/js/python/java/C# - go Вам не поможет, Вы словите абсолютно те же stop-the-world от gc, в добавок Вы словите издержки на работу шедулера, рулящего Вашими 5 тысячами горутин на 4 потоках cpu... (вы еще не знали, что гипертрединг зло? посчитайте ченить cpu-зависимое на go в нескольких потоках...). Если Вы действительно уперлись в производительность своего ЯП - посмотрите в сторону C++ или Rust. Если не уперлись - переписывать все на хайповый go точно не стоит.
    Ответ написан
    1 комментарий
  • Можете объяснить для нужна опция body в Fetch?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    https://developer.mozilla.org/ru/docs/Web/API/Requ...
    В запросе - это тело запроса, может быть строкой, Blob, ArrayBuffer или FormData

    https://developer.mozilla.org/en-US/docs/Web/API/R...
    В ответе - Readable Stream с телом ответа
    Так же в ответе есть методы для чтения и парсинга тела возвращающие промис
    https://developer.mozilla.org/en-US/docs/Web/API/R...

    Сам fetch принимает или объект запроса или url и параметры запроса, то есть body там как у запроса
    Ответ написан
    Комментировать
  • Как написать функцию для валидации CSS кода?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    1. Распарсить текст в токены
    2. Построить из токенов AST
    Если оба шага успешны - true, если хоть где-то не вышло - false
    Семантика есть в официальной спеке
    Ответ написан
    1 комментарий
  • Как упростить этот javascript код?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const content = document.body.querySelector('.editer');
    const htmlTags = content.getElementsByTagName("*");
    const navs = []; // здесь let не нужен
    
    for(let i = 0; i < htmlTags.length; i++) {
      const htmlTag = htmlTags[i];
      const lastNav = navs[navs.length - 1]; // resH2 всегда будет таким (см. комменты ниже)
      const lastChildOfLastNav = lastNav && lastNav.children[lastNav.children.length - 1]; // resH3 всегда будет таким
      switch(htmlTag.localName) {
      case 'h2':
        setID(htmlTag, i);
        addItem(navs, htmlTag);
        break;
      case 'h3':
        setID(htmlTag, i);
        // тот find что у Вас всегда найдет последний элемент если он есть, не зачем гонять лишний цикл
        if(lastNav) {
          addItem(lastNav.children, htmlTag);
        }
        break;
      case 'h4':
        setID(htmlTag, i);
        // опять же был лишний цикл ради последнего элемента, да еще и в него вложен такой же
        if(lastChildOfLastNav) {
          addItem(lastChildOfLastNav.children, htmlTag);
        } else if(lastNav) {
          addItem(lastNav.children, htmlTag);
        }
        break;
      }
    }
    
    function addItem(obj, {innerText: name, id}) {
      obj.push({
        name,
        id,
        children: []
      });
    }
    
    function setID(htmlTag, i) {
       htmlTag.setAttribute('id', `nav-${i}`);
    }
    Ответ написан
    Комментировать
  • Серия книг "You dont know js" - стоит ли начинать читать?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Есть ли смысл начинать читать её сейчас, или на сегодняшний день она уже слишком устарела?
    Фундаментальные знания не устаревают никогда, а в данной книге именно фундамент.
    насколько я понимаю, написана она опираясь на старый стандарт
    Даже оператор with, который deprecated начиная с es5 можно использовать в самом современном движке js. Каждая новая версия ES лишь дополняет предыдущую, но не отменяет ее, хотя некоторые вещи и становятся нежелательными (вроде использования var после появления let и const), новые вещи основываются на старых (иначе бы babel не работал). Ну а то немногое, что совсем deprecated (вроде оператора with или глобального объекта в качестве this по умолчанию) - как правило плохие практики и в таких книгах почти не освещаются
    Ответ написан
    Комментировать
  • Почему не работает autoplay в Plyr на мобильках?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Play со звуком возможен только синхронно после действия пользователя (клик мыши, нажатие кнопок клавиатуры).
    Проверить, что событие инициировано пользователем можно с помощью event.isTrusted
    Autoplay можно запустить без звука, притом на медиа элементе (теги video, audio) должно быть именно mediaEl.muted = true, а mediaEl.volume = 0 не поможет
    Десктопные браузеры тоже могут блокировать воспроизведение со звуком, но применяют другие политики, например используется статистика (общая и персонально пользователя) для выявления адекватных сайтов с автовоспроизведением (например ютуб и яндекс видео скорее всего запустятся у всех без особых проблем, т.к. пользователи очень часто запускают на них видео)
    Ответ написан
    Комментировать
  • Зачем имена mutations или/и actions писать заглавными буквами + выносить их имена в огромный список констант?

    bingo347
    @bingo347
    Crazy on performance...
    Имена полей объектов не манглятся в отличии от переменных и es-exports
    А так мы получаем бандл меньшего размера, сохраняя читаемость кода
    Ответ написан
    4 комментария
  • Как правильно передать параметры в функцию-обработчик чтобы потом его можно было удалить?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    На моей практике лучшим методом работой с различными EventEmitter/PubSub механизмами - это подписыватель возвращающий отписыватель. То есть некая функция, которая на основе своих аргументов организует подписку и возвращает функцию без аргументов, которая при вызове отменит подписку, отпишет от события и т.д.
    Пример из личной библиотеки:
    import {curry} from 'ramda';
    export const subscribe = curry((target: EventTarget, eventName: string, handler: EventListenerOrEventListenerObject): (() => void) => {
        target.addEventListener(eventName, handler);
        return () => target.removeEventListener(eventName, handler);
    });

    Если убрать ramda и typescript, то останется такое:
    export const subscribe = (target, eventName, handler) => {
        target.addEventListener(eventName, handler);
        return () => target.removeEventListener(eventName, handler);
    };

    Суть: subscribe при вызове подпишет DOM объект target на событие eventName с функцией handler и вернет функцию без аргументов, которая при вызове отпишет DOM объект target от события eventName для функции handler

    В Вашем случае будет так:
    const curry = (i) => (e) => changeCountry(e, i);
    const unsubscribe = subscribe(button, 'click', curry(i));
    // когда подписка больше не нужна, просто вызываем unsubscribe()
    Ответ написан
    Комментировать