Задать вопрос
  • Как при сборке задать динамический путь к файлу?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вынесите объявление Users на уровень выше в замыкании
    Ответ написан
  • Почему как js не всегда экранирует обратные слэши?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Потому что js как раз таки всегда экранирует обратные слеши, что обратно Вашему утверждению
    Десериализатор получает на вход строку "PI.\\\\dev-pi2012\\Demo.001;" и экранирует слеши
    Движок js получает на вход строку "PI.\\dev-pi2012\Demo.001;" и опять таки экранирует слеши
    Почувствуйте разницу
    Ответ написан
    Комментировать
  • Как составить запрос в Mongo?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    У find 1й параметр отвечает за условия, возвращаемые поля определяет 2й параметр, но при его наличии будут отсутствовать все остальные поля документа, можно конечно их перечислить, но это придется менять при изменении структуры документа, пример:
    var locale = i18n.getLocale();
     Article.find({}, {
        ['title.' + locale]: 1,
        ['content.' + locale]: 1
    })

    Второй вариант - это преобразовать результат от базы так как Вам надо, пример:
    var locale = i18n.getLocale();
    Article.find().sort('-   created').populate('user', 'displayName').exec(function (err, articles) {
      if (err) {
        return res.status(400).send({
          message: errorHandler.getErrorMessage(err)
        });
      } else {
         articles.forEach(article => {
           article.title = article.title[locale];
           article.content = article.content[locale];
         });
         res.json(articles);
      }
    });
    Ответ написан
    Комментировать
  • В чём ошибка условия if else в игре?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Бегло взглянув на код могу сказать, что эта строчкаgravityGamer(); //Вызываем функцию прыжканикогда не выполняется, так как в обоих ветках условия срабатывает return
    Ответ написан
    2 комментария
  • Как создать сервер на Node.js, [statefull, stateless, echo]?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Примерно так это делается:
    'use strict';
    const net = require('net');
    
    const server = net.createServer(socket => {
        var data = '';
        socket.on('data', d => {
            data += d;
            var p = data.indexOf('\n');
            if(~p) {
                let cmd = data.substr(0, p);
                data = data.slice(p + 1);
                onCommand(cmd.trim(), socket);
            }
        });
    });
    
    server.listen(() => {
        var address = server.address();
        console.log('opened server on', address);
    });
    
    function onCommand(cmd, socket) {
        switch(cmd) {
            case 'open':
                socket.write('opened\n');
                break;
            case 'add':
                socket.write('added\n');
                break;
            case 'process':
                socket.write('processed\n');
                break;
        }
    }


    тестил через telnet, работает
    Ответ написан
    1 комментарий
  • У кого лучше покупать SSL сертификат?

    bingo347
    @bingo347
    Crazy on performance...
    Использую Let'sEncrypt по причине его бесплатности, вполне доволен
    Правда некоторые мобильные браузеры пока ругаются на неподтвержденный сертификат, это связано с тем, что регистратор новый и они его еще не добавили в свою базу
    Ответ написан
    Комментировать
  • Преобразовать в Number() дистанцию?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    var s = '1 234 км';
    var n = +s.replace(/[^\d.]/g, '');
    console.log(n);
    Ответ написан
    4 комментария
  • На avito.ru при открывании консоли блочится страница. Как?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вы поймали вирус в расширениях хрома, как правило он еще и настройки расширений блочит.
    Лечится сбросом настроек:
    Заходим на chrome://settings/
    Жмем "Показать дополнительные настройки"
    В самом низу жмем "Сброс настроек"
    Ответ написан
    Комментировать
  • Как отложить синтаксический анализ JavaScript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Перенесите подключение js вниз страницы
    Ответ написан
  • Почему 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 комментария