• Почему ES 6 ругает на ":" в конструкторе?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    это синтаксис TypeScript и в нативном js это не работает
    Ответ написан
    Комментировать
  • Кто как реализует автозапуск приложений node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    pm2

    Плюсы по сравнению с forever
    умеет садиться в автозапуск *nix систем при том использует все существующие сегодня варианты (при наличии system.d добавится в него, иначе в зависимости от ОС, например в убунту без system.d садиться в init.d)
    Делается это одной командой: pm2 startup

    Умеет следить за памятью и нагрузкой на процессор, что удобно, когда нет времени искать утечку памяти, а приложение должно работать, так же позволяет это все мониторить в реальном времени

    Ротация логов. Перехватывает stdout и stderr, пишет логи в файл, дает возможность подключится к выводу приложения в реальном времени

    Умеет запускать приложения с помощью других интерпретаторов, а так же просто бинарники

    Приложения на node умеет запускать в кластере

    Конфиг с опциями запуска в json
    Ответ написан
    2 комментария
  • Что такое net socket?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    в node.js модуль net реализует протоколы tcp, upd и unixsock
    именно этот модуль позволяет ноде создавать различные сервера, а так же подключаться к другим серверам
    модуль http например написан как обертка над модулем net реализующая протокол http (который работает поверх tcp)
    Сам же класс сокета наследуется от stream.Duplex
    Ответ написан
    Комментировать
  • Как реализовать поиск в mongodb по хештегам?

    bingo347
    @bingo347
    Crazy on performance...
    Ваша структура имеет право на жизнь.
    Что бы искало быстро, создайте индекс по полю tags

    Поиск по полю массиву:
    //простой
    collection.find({ tags : 'планеты' })
    //или планеты или юпитер
    collection.find({ tags : { $in : ['планеты', 'юпитер'] } })
    //и планеты и юпитер
    collection.find({ tags : { $all : ['планеты', 'юпитер'] } })
    Ответ написан
    2 комментария
  • Cannot set property 'innerHTML' of null только в Android-браузере, почему?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Попробуйте подключить Polyfill.io перед всеми скриптами на странице, подключать надо именно с их сайта, эта либа правит api браузера так, чтоб оно соответствовало современным стандартам, а подключать с их сайта надо потому, что они выдают разные варианты либы в зависимости от браузера
    Ответ написан
  • Какой WebSocket сервер посоветуете?

    bingo347
    @bingo347
    Crazy on performance...
    Единственный плюс socket.io - это его удобство
    Внутри у него отвратительный код с кучей деоптимизирующих конструкций, поверьте я его перелопатил весь, реализуя различные костыли к этой библиотеке, чтобы оно просто работало нормально
    Не говоря уже о том, что Вы создадите утечку памяти просто отправив запрос с коллбэком (ожидающий ответа), а другая сторона по какой-то причине не ответит.

    Если нужно реализовать сокеты быстро, socket.io вполне себе хорошее решение
    Если есть время на реализацию чего-то более качественного - библиотека ws, socket.io кстати использует именно ее
    Если нужна эмуляция сокетов в старых браузерах - sockjs, хотя лично мне использовать ее не доводилось, но в зависимостях у нее websocket, которая на момент ее использования (весна 2015) имела неприятные баги, возможно сейчас что-то изменилось
    Ответ написан
  • Как получить из базы время в чужой таймзоне?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Во-первых, нельзя доверять времени клиента, никто не мешает мне подтасовать факты просто переведя часы на своем девайсе
    Во-вторых, передавать время в виде int timestamp не лучшая идея, используйте UTC строку
    В-третих, Вам поможет moment.js
    Ответ написан
  • Почему умножение работает быстрее деления?

    bingo347
    @bingo347
    Crazy on performance...
    По сути процессор умеет работать только с битами
    С целыми числами все выглядит давольно просто:
    1й бит числа определяет знак числа - 0 для положительных и 1 для отрицательных
    У нас есть операции для управления битами:
    • ~ инверсия
    • & конъюнкция
    • | дизъюнкция
    • >> сдвиг вправо
    • << сдвиг влево

    введем арифметические операции по порядку:
    1. Сложение, сводится по сути к сложению битов в столбик
    2. Отрицание или смена знака, -a выражается как ~a + 1
    3. Вычитание a - b выражается через a + -b
    4. Умножение, тут несколько вариантов, зависит от компилятора и его оптимизатора:
      1. Умножение на степени 2 можно представить сдвигом влево: a * 8 приводится к a << 3 т.к. 8 - это 3я степень 2
      2. Простые случаи вроде a * 3 можно заменить на a + a + a
      3. Случаи по сложнее a * 11 складывать a 11 раз само с собой не оптимально
        раскладываем 11 на степени 2: 11 = 8 + 2 + 1
        вычисляем (a << 3) + (a << 1) + a



    С вещественными числами все обстоит сложнее, они тоже представлены в виде битов, но часть битов отводится под целую часть, а часть под мантиссу
    По сути число хранится в экспоненциальной форме, где мантисса представляет степень 2, на которую нужно умножить целую часть
    Операции над вещественными числами с ненулевой мантиссой более затратны по количеству тактов процессора
    Здесь нам понадобятся такие вещи как экспонента и натуральный логарифм, которые можно вычислить в виде суммы ряда, так же через суммы ряда вычисляются многие другие математические функции
    Имея экспоненту и логарифм можно выразить степенную функцию
    Деление же можно представить через умножение и степени

    Вот такая вот высшая математика над двоичными числами происходит "за кадром" наших с виду простых программ :)
    Ответ написан
    Комментировать
  • Как получить составляющий процент из объекта по полю?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Решил немного оптимизировать + унифицировать решение предложенное @mourr
    function countFieldPersent(arr, field) {
        var data = arr.reduce((r, item) => {
            var value = String(item[field]);
            if(typeof r[value] === 'undefined') {
                r[value] = 0;
            }
            return ++r[value], r;
        }, {});
        return Object.getOwnPropertyNames(data).map(label => ({
            label,
            value : (data[label] * 100) / arr.length
        }));
    }
    
    var arr = [{ FirstName: 'Pavel',      LastName: 'Pavlol',  Phone: '1234567',  Gender:'male' },
    { FirstName: 'Ivan', 	     LastName: 'Ivanov', Phone: '1234567',  Gender:'female' }];
    var result = countFieldPersent(arr, 'Gender');
    Правда в моем варианте значения будут сравниваться как строки, так как я их перевожу в ключи объекта data
    Ответ написан
    Комментировать
  • Как индексируется в поисковиках one page app сайты?

    bingo347
    @bingo347
    Crazy on performance...
    Дополню ответ выше пояснениями и примерами
    Сервер для любой страницы должен уметь присылать ответ как в виде готовой html так и в виде данных для генерации данного html на клиенте, соответственно понадобится шаблонизатор способный работать как на клиенте, так и на сервере.
    Такой сайт спокойно смогут просматривать поисковики, а так же браузеры с отключенным javascript, а когда все норм (js работает) мы получили готовую страницу при первом запросе, а дальше работаем по принципу SPA для последующих переходов между страницами.
    Второй важный момент, поисковики ищут внутренние страницы сайта переходя по ссылкам <a href="/page2">Page 2</a>. Соответственно наше SPA должен запускать свой роутинг перехватывая клики по ссылкам и основываясь на атрибуте href кликнутой ссылки
    Третий момент, придется позаботится о historyAPI для удобства пользователя.

    Ну и на последок, как я это все реализовал у себя на сайте
    У меня есть пачка шаблонов описывающих содержимое страниц, они работают как на сервере так и на клиенте
    Есть один базовый шаблон, задающий структуру html документа, он работает только на сервере.
    По запросу определенной страницы, сервер собирает из шаблонов полноценный html и отдает его браузеру, вот так: https://d-belyaev.ru/
    Браузер ищет все теги a на странице и вешает на них обработчик click:
    function render(node) {
        var links = node.getElementsByTagName('a');
        for(let i = links.length; i--;) {
            links[i].addEventListener('click', doLinkClick);
        }
    }
    
    function doLinkClick(event) {
        var href = event.target.getAttribute('href');
        if(!href.startsWith('/')) return true;
        event.preventDefault();
        router(href);
    }

    Роутер по данному href отправляет ajax запрос на сервер, дописывая к нему ?json
    На что сервер уже отвечает по другому: https://d-belyaev.ru/?json
    А реализовано это все вот таким роутом на сервере:
    function indexRoute(request) {
        var pageData = {
            template : 'page-index',
            activeMenuIndex : 0
        };
        if(request.url.query === 'json') {
            request.json(pageData);
        } else {
            request.html(baseTemplate(pageData));
        }
    }

    Правда в нем у меня пока не хватает обработки для 304 статуса (страница в кэше браузера), так как руки пока не дошли
    Ответ написан
    6 комментариев
  • Можно ли задать css стили элементу массива?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В Вашем примере элементы массива - просто числа и никакого отношения к dom и соответственно к css они не имеют, задать css класс можно только для dom элемента через свойство classList
    node.classList.add('class') - добавляет
    node.classList.remove('class') - удаляет
    node.classList.contains('class') - проверка наличия
    Если из массива генерируется html то там вообще просто, дописывайте по условию атрибут class к нужному тегу

    Ну а проверить нечетность n можно таким условием: if(n % 2)
    Ответ написан
    3 комментария
  • Стилизация мини-аудио плеера. Как быть?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    тык
    вполне себе доступное описание апи тега audio
    Ответ написан
    Комментировать
  • Как сделать роутинг доменов в nodejs на VDS?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    запрошеный хост передается в заголовке запроса Host
    все веб-серверы ориентируются именно по этому заголовку.
    Вот простой пример с express:
    var http = require('http');
    var express = require('express');
    var site1App = express();
    var site2App = express();
    
    var site1Req = site1App();
    var site2Req = site2App();
    var server = http.createServer((req, res) => {
        switch(req.headers.host) {
            case 'site1.ru':
            case 'www.site1.ru':
                site1Req(req, res);
                break;
            case 'site2.ru':
            case 'www.site2.ru':
                site2Req(req, res);
                break;
            default:
                //unknown host
                res.writeHead(404);
                res.end();
        }
    });
    server.listen(80);
    Ответ написан
    1 комментарий
  • Есть ли скрипт который даст смотреть HLS видео в стандартных плеерах браузеров?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ответ написан
    Комментировать
  • Источники для изучения Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Полная документация по апи node.js всегда есть на оф. сайте, при том там можно найти документацию под различные версии
    К модулям устанавливаемым через npm как правило есть readme
    Все остальное - это нативный js, с которого и следует начать изучение, например по этой книге
    Ответ написан
    Комментировать
  • Как реализовать загрузку файла через форму с помощью JS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Посмотрите в сторону FileApi
    Ответ написан
    Комментировать
  • Почему элемент игнорируется?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    getElementsByClassName возвращает nodeList, который обновляется при изменениях в dom
    Допустим у Вас выделено 3 элемента, их индексы в nodeList 0, 1 и 2
    Вы перебираете их циклом for(var i = 0; i < selected.length; i++)
    На первой итерации цикла Вы убираете класс у 0 элемента, при этом он так же исчезает из nodeList, который сформирован по этому классу, 1й элемент становится нулевым, 2й - первым, length становится 2
    На второй итерации Вы убираете класс у элемента с индексом 1, который изначально был 2, nodeList опять обновляется
    Третьей итерации уже не происходит, так как i == 2, а selected.length == 1, цикл завершается.
    Оптимальнее, как в плане производительности, так и в плане правильной логики перебирать nodeList d обратном порядке, так элемент будет удаляться с конца nodeList - что быстрее, а у необработанных элементов останутся прежние индексы
    for(var i = selected.length; i--; ){
            selected[i].classList.remove('selected');
    }
    Ответ написан
    2 комментария
  • Как добавить класс во многоуровневом списке?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Попробуйте такую функцию:
    function setSelected(topUL) {
        var top = typeof topUL === 'string' ? document.querySelector(topUL) : topUL;
        var selected = top.querySelectorAll('li.selected');
        for(var i = selected.length; i--;) {
            var current = selected[i];
            while(current !== top) {
                current = current.parentNode;
                if(current.nodeName === 'LI') {
                    current.classList.add('selected');
                }
            }
        }
    }
    на вход принимает селектор или domNode самого верхнего <ul> в дереве
    Ответ написан
    Комментировать
  • Как в Node JS pm2 сделать глобальную переменную в cluster mode?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Каждый экземпляр - это отдельный процесс со своей памятью.
    Посмотрите в сторону redis
    Ответ написан
    Комментировать
  • Какие методы более предпочтительны для работы с двоичными числами?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    js "понимает" 3 системы счисления:
    • 10 - числа пишутся в коде как обычно
    • 16 - числа начинаются с 0x
    • 8 - числа начинаются с 0
    Соответственно в Вашем примере число обрабатывается как восьмиричное

    Number.prototype.toString() сериализует число в строку в любой СС с 2 по 36, но на выходе будет строка, для десириализации можно использовать 2й аргумент у функций parseInt, например так: parseInt('00000000000000000000000011111111', 2)
    Как работать с отдельными битами числа Вы уже нашли в учебнике, так что расписывать не буду.

    p.s. Часто бывает нужно заполнить двоичные константы, чтобы их удобно было передавать через CONST1 & CONST2. Я для таких целей использую такой генератор:
    function* iota() {
        var i = 1;
        while(true) {
            yield i;
            i *= 2;
        }
    }
    Ответ написан