Задать вопрос
  • Как реализовать сортировку объектов?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    У Вас не массив, а объект, а у объектов произвольный доступ к элементам по их ключу.
    Ключи как таковые можно получить в виде массива либо функцией Object.keys, которая получает все нумеруемые ключи объекта включая ключи из цепочки прототипов (к не нумеруемым относятся свойства объявленые через Object.defineProperty за исключением явного указания enumerable: true, а также символы (Symbol) и методы ( { method() { ... } } ) из ES2015), либо функцией Object.getOwnPropertyNames, которая получает все собственные ключи объекта, кроме символов (прототип исключен, enumerable не учитывается)
    Случайное перемешивание массива делается элементарно: arr.sort(() => Math.random() - 0.5);

    Как итог, можно получить массив ключей Вашего объекта в случайном порядке:
    var keys = Object.keys(a).sort(() => Math.random() - 0.5);
    Ответ написан
  • Не работает простая функция на JS. Как правильно записать style.top/style.left?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ну во-первых, зачем вот это все? 400 - 0 + 1 да еще + 0 на конце
    Теперь по сабжу, свойства top left right bottom работают только с позиционированием, то есть
    img.style.position = "absolute"; //or "relative" or "fixed"

    Сами свойства top и left желательно указывать строкой с единицами измеренияimg.style.top = random1 + 'px';
    ну и напоследок, работа с dom не оптимальная
    Ответ написан
    Комментировать
  • Можно ли упростить асинхронный код на Promise?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вынесите someObject в замыкание и внутреннюю цепочку промисов перенесите во внешнюю
    someObject = null //не знаю можно ли писать в cs var поэтому так
    Promise.resolve()
    .then(@getObjectDescription.bind(@))
    .then(
      (so) ->
        someObject = so
    )
    .then(@getSomeSpecialFieldValue.bind(@))
    .then(
            (value) ->
              someObject.special_field = value
              return someObject
    )
    .then(
      (someObject) ->
        data = new FormData()
    
        data.append('field', someObject.field)
        data.append('special_field', someObject.special_field)
    
        options =
          method: 'post'
          body: data
    
        return options
    )
    .then(@execute.bind(@, 'rest.api.method'))
    Ответ написан
    1 комментарий
  • Как при сборке задать динамический путь к файлу?

    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, на которую нужно умножить целую часть
    Операции над вещественными числами с ненулевой мантиссой более затратны по количеству тактов процессора
    Здесь нам понадобятся такие вещи как экспонента и натуральный логарифм, которые можно вычислить в виде суммы ряда, так же через суммы ряда вычисляются многие другие математические функции
    Имея экспоненту и логарифм можно выразить степенную функцию
    Деление же можно представить через умножение и степени

    Вот такая вот высшая математика над двоичными числами происходит "за кадром" наших с виду простых программ :)
    Ответ написан
    Комментировать