• Для чего нужен параметр mask в модуле ws?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Это флаг того, нужно ли ксорить тело сообщения по ключу masking-key для предотвращения атак. См. спецификацию протокола тут: https://tools.ietf.org/html/rfc6455#section-5.3
    Ответ написан
    Комментировать
  • Стоит ли писать небольшую клиент-сервер игру на node без express?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Есть куча альтернатив, например тут списком nodeframework.com или тут https://github.com/sindresorhus/awesome-nodejs#web..., а express весьма даже спорный инструмент, например habrahabr.ru/post/243945 и мой коммент habrahabr.ru/post/243945/#comment_8141311 А писать на чистой ноде для простых и сильно оптимизированных задач все еще эффективнее всего, но нужно готовиться к тому, что ничего их коробки не будет, нужно программировать головой и руками.
    Ответ написан
    Комментировать
  • К какому классу можно отнести описанную систему?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Тут есть задача максимально отвязать оборудование от ПО. Конечно, ПО должно знать о структуре и возможностях оборудования, но эти знания можно обобщить и разработать специализированный язык-посредник, т.е. метаязык для формального описания протоколов (программных интерфейсов) устройств. При чем, синтаксические конструкции свои делать не нужно, лучше взять синтаксис, для которого уже разработаны распространенные и оптимизированные парсеры, например JSON. Таким образом, ПО будет знать не интерфейс оборудования, а языка описания этого интерфейса. Точнее, обобщенные элементы интерфейса, каждому из которых поставлены в соответствие обобщения более высокого порядка: команда (процедура, метод), параметр, датчик, измерение, и т.д. В этом метаязыке можно предосмотреть не только декларативные конструкции описательного характера, но и активные, включив в него скрипты например на JavaScript, которые могут описывать алгоритмы работы с теми же структурами, которые метаязык и описывает. Из декларативной части можно динамически строить и пользовательский интерфейс и связывать его с формированием конкретных команд, отправляемых в устройство. Более подробне описать не могу, т.к. не знаю специфики Ваших задач. О метапрограммировании можно кое-что почитать тут: habrahabr.ru/post/227753 и тут: habrahabr.ru/post/137446 ну может еще вот тут: habrahabr.ru/post/154891
    Ответ написан
    2 комментария
  • Можно ли сделать одноразовую атуентификацию NTLM в node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Для чего используется express-ntlm, так это чтобы входить в веб-приложение под тем же логином/паролем, но повторной аутентификации это не исключит. Забудьте идею, из браузера Вы ни как не получите данные аутентификации локального пользователя Windows. Можете посмотреть в направлении nwjs.io но я не думаю, что это перспективно.
    Ответ написан
  • Чем вы отлаживаете Node.js и чего вам не хватает?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Мне стыдно, но я должен признаться, что использую для отладки console.trace, console.dir, console.log. Пошаговая отладка мне нужна вообще 2-3 раза в год , а что нужно часто при разработке Impress (сервера приложений), так это наблюдение за структурами памяти внутри процессов. Для чего я использую node-inspector, так это сделать в консоли нечто типа Object.keys(impress.applications.example.cache.files) и получить ["/app/examples/access.js", "/app/examples/request.js", "/app/examples/simple/jsonPost.json/post.js", "/app/end.js", "/app/lazy.js"]. Это удобно, но вот брекпоинт поставить на обработчик приложения под Impress или где-то в системном коде Impress, мне ни разу не удалось: обработчики вылетают где-попало в системных библиотеках ноды (events, stream, net, fs) в каких-то местах, совершенно не относящихся к тому брекпоинту, которые я ставил. Если использовать cluster/fork Impress не запускается, но слава Аллаху, что у меня есть режим 'single', при котором все происходит в одном процессе и так как-то можно покопаться в памяти. Когда мы допилим Impress до стабильной версии и выпустим доки, то я собирался выделить время и разобраться в отладке, покопаться в этих проблемах и, возможно, что-то соптимизировать специально для совместимости. Вообще спасибо за работу, иногда очень пригаждается!
    Ответ написан
    3 комментария
  • Как создать запрос с декрементом?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Делайте инкремент на -1
    Ответ написан
    Комментировать
  • Как работать с запущенным Node.js приложением через коммандную строку?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вам нужно сделать два приложения, одно - сервис, второе - CLI, а между ними передавать информацию через один из таких способов: HTTP (самое простое и удобное, но нужно реализовать защиту урлов управления или по секретному ключу или по IP или через аутентификацию), через шину сообщений (от Redis, ZMQ, RabbitMQ и т.д.), через файлы конфигурации (CLI пишет в файлы, а сервис мониторит изменения через fs.watch), через IPC и есть еще куча способов.
    Есть и второй способ, Вы можете у HTTP сервера своего нодовского сделать еще и встроенный telnet сервер или ssh сервер и подключаться к нему консолью, как я это люблю. Вот тут человек делает нечто подобное: www.davidmclifton.com/2011/07/22/simple-telnet-ser... Есть даже библиотеки уже тут: https://www.npmjs.com/package/ssh или тут: https://github.com/mscdex/ssh2
    Ответ написан
    1 комментарий
  • Есть ли инструменты для разработки архитектуры проекта?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Комплексное решение Rational Rose - www-03.ibm.com/software/products/ru/ratirosefami Для баз данных есть хорошие инструменты ErWin, BpWin - erwin.com Еще есть Visual Paradigm www.visual-paradigm.com но его я не пробовал. Думаю, что должны быть и другие альтернативы, можно гуглить по словам UML, RUP, software architecture modeling tools. Практически все они сводятся к UML диаграммам из которых потом можно скомпилировать скелет приложения, структуру каталогов и файлов, зачатки документации, заголовки библиотек, и т.д.
    Ответ написан
    Комментировать
  • Можно ли создать массив ссылок на элемены?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Смотря какого типа массив и какого типа элементы. Если массив строк или чисел, то нельзя, а если массив объектов, то можно:
    var objArray = [
      { name: "abc" }, { name: "def" },
      { name: "ghi" }, { name: "jkl" }
    ];
    var objArrayLinks = [ objArray[0], objArray[3] ];
    
    console.dir({
      objArray: objArray,
      objArrayLinks: objArrayLinks
    });
    
    objArrayLinks[0].name = "mno";
    
    console.dir({
      objArray: objArray,
      objArrayLinks: objArrayLinks
    });

    Вывод будет:
    { objArray:
       [ { name: 'abc' },
         { name: 'def' },
         { name: 'ghi' },
         { name: 'jkl' } ],
      objArrayLinks: [ { name: 'abc' }, { name: 'jkl' } ] }
    { objArray:
       [ { name: 'mno' },
         { name: 'def' },
         { name: 'ghi' },
         { name: 'jkl' } ],
      objArrayLinks: [ { name: 'mno' }, { name: 'jkl' } ] }

    Скорее всего, Вы хотите сделать индекс в памяти, для этого вообще не нужно массив, а лучше использовать хеш.
    Например:
    var objHash = {
      object1: { name: "abc" },
      object2: { name: "def" },
      object3: { name: "ghi" },
      object4: { name: "jkl" }
    };
    var nameIndex = { abc: objHash.object1, jkl: objHash.object4 };
    
    console.dir({
      objHash: objHash,
      nameIndex: nameIndex
    });
    
    nameIndex["jkl"].name = "mno";
    
    console.dir({
      objHash: objHash,
      nameIndex: nameIndex
    });
    Вывод будет:
    { objHash:
       { object1: { name: 'abc' },
         object2: { name: 'def' },
         object3: { name: 'ghi' },
         object4: { name: 'jkl' } },
      nameIndex: { abc: { name: 'abc' }, jkl: { name: 'jkl' } } }
    { objHash:
       { object1: { name: 'abc' },
         object2: { name: 'def' },
         object3: { name: 'ghi' },
         object4: { name: 'mno' } },
      nameIndex: { abc: { name: 'abc' }, jkl: { name: 'mno' } } }
    Ответ написан
    Комментировать
  • Решение с многопоточностью для node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Можно сделать и в 1 потоке через очереди и асинхронность. Имеем N массивов A1.. AN, стартуем для них в цикле для каждого свой eachSeries, примерно так:
    async.eachSeries(A1, function(item, cb) {
      // сюда приходит item, когда с ним покончено, то делаем cb()
    }, function() {
      // все готово
    });

    Для каждого массива пока предыдущий элемент не отработает (не вернет управление через callback), то следующий не начнет обрабатываться. Если хочется использовать много процессоров, то разделяете задачу на части и запускаете при помощи cluster много процессов, передаявя каждому свою часть работы через переменные окружения или IPC: worker.send.
    Ответ написан
  • Как сделать синхронный цикл в meteor?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Для примера, вместо get будем использовать process.nextTick, который так же с колбеком, просто замените.
    var util = require('util');
    var j = 0;
    function loop() {
      if (++j < 100) {
        console.log(j);
        process.nextTick(loop);
      }
    }
    process.nextTick(loop);
    Ответ написан
  • Как получить результат работы функции с вложенными функциями nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Что глобальные переменные плохо - это не более, чем расхожее мнение, зачастую сводящееся к религиозному чувству. Приверженцы не могут рационально объяснить, почему именно нельзя. Все доводы о том, что это запутывает код, не выдерживают критики, ведь есть масса примеров, когда введение глобальной переменной наоборот упрощает код и делает его более понятным. Кроме того, в глобальной области видимости лежит куча всего нужного: console, setInterval, clearImmediate, parseInt, Infinity, Math, decodeURI, все встроенные классы и многое другое. Для браузеров еще: document и window. И даже require это глобальная переменная, апологеты почему-то не требуют писать var require = require('require'); Как же так, не порядок, require глобальный. Ересь глобальности затаиласт в самом сердце механизма внедрения зависимостей. На самом деле, не все эти идентификаторы действительно глабальные, и в Node.js могут быть контекты, не будет видно того же require, но сейчас не об этом. А о том, что использование глобальных переменных может давать как полезные, так и вредные плоды. В Вашем случае, вполне можно сделать так:
    // Инициализация глобальной области
    global.model = { // задаем значеня по умолчанию
      alarmId: null // можно поставить, например, -1 или в зависимости от задачи
    };
    // Функция получения 
    function getAlarmId(callback) {
      connection.query('SELECT id from alarm where type=1', function(err, rows, result) {
        if (!err && rows.length === 1) {
          var row = rows[0];
          model.alarmId = row[Object.keys(row)[0]];      
        }
        if (callback) callback();
      });
    }
    // Можем теперь вызвать при старте приложения, обычно без колбека
    getAlarmId();
    // А по ходу исполнения можем вызывать его с колбеком, так и без колбека
    getAlarmId(function() {
      console.dir(model);
    )};
    // Или обновлять по таймеру
    setInterval(getAlarmId, 5000);

    Но лучше всего, не дергать постоянно базу по таймеру или по запросу, а наоборот, сделать основным местом хранения значения - память, и сбрасывать в базу по таймеру, в отложенном режиме, и только если произошли изменения. База нужна нам будет только для постоянного сохранения, операции с ней медленные и асинхронные, а с памятью - быстрые и синхронные. Поэтому, исключив доступ к базе во время обработки HTTP (или других) запросов, мы резко подымаем производительность. Но все это уже не православный REST, а stateful-программирование. Рекомендую почитать еще тут: habrahabr.ru/post/204958 и тут habrahabr.ru/post/247543
    Ответ написан
    Комментировать
  • Насколько важно знание фреймворков JavaScript/NodeJs программистом с точки зрения работодателя?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Чего еще можно желать? Я уже готов нанять Вас к себе )
    Не уж то Вы хотите устроиться на работу к идиотам, которые требуют 100500 новомодных названий, не понимая, что они значат. Если человек может использовать не свое и может сделать свое, то он лучший из профессионалов.
    Ответ написан
    1 комментарий
  • Io.js обязательно ли использовать ключи для запуска ECMA 6?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    habrahabr.ru/post/247837
    И еще посмотрите вывод: iojs --v8-options|grep "harmony"
    и вот такой вывод: iojs --v8-options | grep "in progress"
    Там будут ключи с пояснениями.
    Ответ написан
    Комментировать
  • Путь к модулю node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Если модуль находится в node_modules, то он будет нормально загружаться через имя: require('database'), а Вы скорее всего сделали не модуль, а отдельный файл, который можно загружать не через имя, а через путь, require('/path/database.js') или через require('./database.js') из текущей папки. В некоторых системах находит и require('database.js') или require('./database') или require('/path/database.js'), но лучше писать require('./database.js') или делать полноценный модули в node_midules, который будет иметь свой корневой файл, указанный в своем package.json в параметре "main" и тогда его можно будет загружать по имени из любого места кода (любого каталога и любого js файла в проекте).
    Ответ написан
    Комментировать
  • Как придумывать осмысленные имена для классов?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Какое крутое признание, это действительно уникально что Вы понимаете, что в этом что-то не так. Большинство разработчиков что не сделают, все контроллером зовут. Я думаю, что нужно больше читать и развивать словарный запас, кругозор и сознание, даже не обязательно англоязычную литературу, научно-техническая лексика по большей части интернациональна. Читать можно конечно и статьи в научно-популярных журналах и художественную литературу, но мне ближе и я советую ученых, программистов и философов: Дональд Кнут, Гради Буч, Декарт, Кант, Марк Аврелий, Лао Цзы, Спиноза, Паскаль, Платон, Аристотель, Мамардашвили, Пятигорский, Шантидева, Рассел, Хомский, Норберт Винер, Глушков, Канторович, Лебедев, фон Берталанфи, Уильям Эшби, Дейкстра, извините, если кого не вспомнил, кто вот первый вдруг на ум пришел.
    Ответ написан
    Комментировать
  • CDN и browserify?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Случайный отказ CDN - это паранойя, гораздо более вероятен случайный отказа node.js или nginx. Но если это так, то поставьте в html 1 строчку проверки, если JS собранный browserify в один файл не подгрузился и не установил определенный флаг, то мы просто рефрешаем страницу.
    Ответ написан
    3 комментария
  • Как заставить Node JS Выполнять код по порядку?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Оборачиваем в https://github.com/caolan/async
    async.series([
        function(){ /* выполнится первым */ },
        function(){ /* выполнится вторым */ }
    ]);
    Ответ написан
    1 комментарий
  • Программная архитектура: что почитать?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Может будет интересно посмотреть видео с моего доклада на JSLab в Одессе https://youtu.be/Try7lmWikao и слайды от доклада отдельно: www.slideshare.net/tshemsedinov/nodejs-architecture
    Ответ написан
    Комментировать
  • Всё таки, как работать с мультиязычностью?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Лучше все языковые версии хранить в одном месте, или все на диске или все в базе. Если уж нужно в двух и более местах, если эти шаблоны прямо уж так сильно меняются, то лучше базу принять за основное место и синхронизировать на диск при изменениях или по запросу. Вы же можете генерировать эти json файлы когда захотите. Как хранить в базе есть два варианта, или внутри одного документа/объекта много языковых версий или рядом, добавляя индексируемый ключ. Это зависит от того, какие данные и какие к ним типичные запросы приходят, если данных мало и запросы редкие, то разницы нет. Например, если там 10 форм и у каждой 5 языков, а формы меняются 1 раз в неделю, то удобнее хранить все языки в формах и при изменении перегенерировать JSON на диске. А если это user-generated контент, который нужно постоянно отдавать прямо из базы, то выносите идентификатор языка в ключ с индексом, так запросы будут быстрее. А при большой нагрузке лучше кешировать языковые версии прямо в оперативной памяти на сервере, чтобы быстрее отдавать и реже ходить к базе за ними.
    Ответ написан
    2 комментария