• Нужно ли мне изучать препроцессор(ы)?

    Нужно понимать что инструменты о которых вы говорите появились не просто так, а потому что в них была острая необходимость. Т.е. если у вас есть большой проект с объемным CSS и вам уже сложно уследить за единством оформления (в одном месте у кнопки бордер 1px в другом 2, и тому подобное), то вы невольно начинаете задумываться о том что неплохо было бы иметь в CSS настоящие переменные ($button_border_width).
    Таким образом если вы не чувствуете острой потребности в этих фишках - не стоит забивать ими голову - процесс обучения будет достаточно мучительным, потому что вы еще не будете понимать, куда все это можно впихнуть.
    Но! Безусловно стоит ознакомиться с основными фишками, которые могут добавить препроцессоры вашему коду. Вам не нужно знать как объявлять переменные и примеси, но нужно знать что это вообще возможно. Т.е. вам хватит парочки обзорных статей.

    Все вышесказанное относится так же и к сборщикам (gulp, grunt), с вопросом о которых, я думаю, вы пришли бы на Тостер через месяц.
    Ответ написан
    Комментировать
  • Как сделать ссылку для уникального ip?

    Во многом я согласен с ответом Сергей не стоит пытаться сделать непробиваемый инструмент.
    Для достижения минимально рабочего результата вам хватит cookie.
    Нужно что-то понадежнее гуглите в сторону super cookie

    Если у вас одностраничное приложение и описанная вами задача должна быть реализована в рамках одной сессии - захватите пользователя с помощью websocket и идентифицируйте через него - но любая перезагрузка страницы сотрет весь прогресс.
    Это с одной стороны полностью исключает передачу ссылки другому пользователю, но с другой усложняет архитектуру сервера, так как, повторюсь, вам придется работать с одностраничным приложением и разруливать права доступа к информации на нем. Плюс мало кого устроит потеря прогресса после перезагрузки страницы.
    Ответ написан
    Комментировать
  • Возможно ли в node.js зашифровать исходный код?

    Ну могу предложить вам примерный путь.

    1. Пишем C++ аддон, который будет шифровать и расшифровывать js файлы с заданным ключем.
    2. Добавляем новый extension в require.extensions. Например encjs:

    var decrypt = require('my_addon').decryptor('private-key');
    require.extensions['encjs'] = function (m, filename) {
        m._compile(decrypt(filename), filename);
    };


    Разрабатываем приложение на js, конечным пользователям отдаем encjs.
    Ответ написан
    Комментировать
  • Как установить более свежую версию nodejs???

    index0h , kale , оставьте свой Windows hate при себе.

    Gasherez , я так понимаю ваша цель все-таки работа через nvm-windows, а не просто обновление версии nodejs.
    В этом случае, главное что вам надо сделать - удалить путь к папке nodejs из PATH. Опционально можете удалить саму папку.
    Так же могу посоветовать обновить npm до последней версии.
    Ответ написан
  • Как реализовать вариадическую чистую функцию без классов типов?

    Вы уверены что хотели получить именно такой массив?

    По поводу той же суммы дам вам интересную идею на поиграться:
    function sum(a) {
      var sum = a;
      
      function _sum(b) {
        if (b === undefined) return sum;
        
        sum += b;
        return _sum;
      }
      
      _sum.toString = function() {
        return sum;
      };
      
      return _sum;
    }
    
    sum(1)(2)(3) + sum(2)(2) + sum(sum(1)(2)(3))(4)(5); // 25


    Некоторые отличия в этой реализации:
    1. Чуть реже создаются новые функции (у вас новая функция появляется при каждом вызове).
    2. Не обязателен последний вызов, чтобы получить значение. Т.е. так же есть возможность получить промежуточное значение и продолжить вычисления. Вообще если вы уверены что в операциях будут участвовать только числа, было бы правильнее определить valueOf, но toString универсальнее.
    3. Ваша реализация не учитывает sum(1)(2)(0)(3)()
    Ответ написан
    2 комментария
  • Два цикла в Canvas с определенной задержкой?

    Андрей Перелыгин , думаю змейкой это вот так:
    jsfiddle.net/en7yco18/5
    Ответ написан
    Комментировать
  • Как правильно устанавливать node аддоны с нативным кодом?

    По поводу рабочего окружения:
    Я бы порекомендовал уйти от Win XP хотя бы на Win 7. Из личного опыта - если вдруг у вас возникнет проблема с установкой модуля на Win XP никто даже не почешется помочь вам с отладкой.
    Так же я порекомендовал бы Visual Studio 2010 или 2013. Здесь в большинстве случаев разницы не будет. После выбора используемой версии советую прописать npm config set msvs_version 2013 (или 2010 соответственно)
    Стоит ознакомиться с рекомендациями приведенными в инструкции по работе с node-gyp

    Установка нативых модулей в iojs это отдельная песня. Шанс что они скомпилируются как подмодули какого-то проекта нулевой, поскольку node-gyp не умеет компилировать под iojs, потому что не знает откуда качать его исходники. Поэтому Вам скорее всего придется устанавливать эти модули отдельно, компилировать их, а потом кидать в папку проекта.
    Для компиляции используйте npm install -g pan-gyp. Это форк node-gyp созданный специально для компиляции под iojs. Собственно для компиляции модуля:
    1. берем его с гитхаба
    2. в package.json в секцию scripts прописываем preinstall: pan-gyp rebuild. (В случае модуля с которым вы мучаетесь, перезаписываем сразу install script)
    3. Из директории модуля запускаем npm install .

    У некоторых нативных модулей действительно есть скомпилированные бинарники, но это целиком ответственность разработчика модуля. И ответственность притом не малая. В случае вашего модуля, такие бинарники отсутствуют. Чаще всего при наличии бинарников у модуля в зависимостях будет висеть node-pre-gyp. (Примеры v8-profiler, v8-debug).
    К слову для приведенных примеров вам совершенно необязательно что-либо перезаписывать.
    Эти два модуля являются подмодулями node-inspector и в большинстве случаев устанавливаются без проблем.

    В заключении:
    Если не хотите вздрагивать при появлении в зависимостях проекта нативных модулей, то советую действительно использовать nodejs, так как компиляция под iojs еще очень не стабильна в плане инструментов.

    Модуль, с которым вы мучаетесь, скорее всего вообще не тестировался на iojs.
    Так же обратите внимание на package.json engine в этом пректе.
    Ответ написан
    1 комментарий
  • Есть ли в jQuery "пауза" в коде?

    Если вам реально нужна синхронная пауза в коде, чего я не рекомендую, то она может выглядеть так:

    function pause(delay) {
      var startTime = Date.now();
    
      while (Date.now() - startTime < delay);
    }
    
    alert(1);
    pause(5000);
    alert(2);


    Если все же вы планируете выполнять в коде некоторые действия, но через определенный промежуток времени вам нужно вызвать alert(2), то это уже отложенное выполнение функции. Операция эта асинхронная, простейший пример реализации setTimeout

    alert(1);
    setTimeout(alert, 5000, 2);
    alert(3);
    Ответ написан
    Комментировать
  • Можно ли склонировать git репозиторий по sha1(хэшу коммита)?

    Я бы посоветовал пользоваться тегами в данном случае, всем станет жить легче:

    git tag -a v0.0.7 -m "Tagged version 0.0.7"
    git push --follow-tags


    git clone repo -b v0.0.7

    В документации ни слова о том, что этот флаг может принимать sha1
    Ответ написан
  • Как заставить Node JS Выполнять код по порядку?

    В поддержку совета Тимур Шемсединов, вот вам код:

    var async = require('async');
    
    var queries = ['query_1', 'query_2'],
        result = '';
    
    async.reduce(
      queries, 
      result, 
      function iterator(result, query, callback) {
        connection.query("SELECT  " + query, function(err_photo, rows_photo, fields) {
          if (err_photo) callback(err_photo);
    
          for (var k=0; k < rows_photo.length; k++) {
            result += 'Записываем значение 2 запроса';
            console.log('1');
          }
    
          callback(null, result);
        })
      },
      function done(error, result) {
        console.log(error, result);
      }
    );


    Также прошу вас отформатировать код в вашем вопросе.
    Ответ написан
    1 комментарий
  • Какие есть текстовые редакторы написанные на javascript с подсветкой синтаксиса?

    Вам стоит обратиться к гуглу с запросом js wysiwyg. Ключевое слово здесь конечно же wysiwyg
    Ответ написан
    Комментировать
  • Где и как правильнее объявлять переменные?

    Не вариант 1 это точно.

    2 или 3 зависит от того на сколько точно вы сформулировали вопрос:
    Если вас интересуют именно переменные, которые будут использоваться только внутри модуля, то вам нужен вариант 3 - это общепринятая на данный момент практика объявления приватных полей и методов класса в js.

    Если же вы все-таки хотите иметь прямой доступ к этим переменным из других модулей, то вам подойдет вариант 2 - это объявление публичных методов и полей класса.

    Ваш код можно переписать следующим образом:

    new function() {
      var privateStaticVariable = 'privateStaticValue';
    
      function Module(num) {
        Object.defineProperty(this,  '_privateOption',  {
           value: 'privateValue' + num,
           enumerable: false,
           configurable: true,
           writable: true
        });
    
        this.publicOption = 'publicValue';
      };
    
      Module.prototype.init = function() {
         console.log(privateStaticVariable);
         console.log(this._privateOption);
         console.log(this.publicOption);
      };
    
      Module.prototype.events= function() {
      };
    
      var module1 = new Module(1);
      var module2 = new Module(2);
    
      module1.init();
      module2.init();
    
      return module1;
    };


    Использование new function это моветон, но раз уж вам так хочется...
    Ответ написан
  • Плохо ли изменять (дополнять) прототипы встроенных объектов JavaScript?

    Ситуация более реалистичная:
    Вы пишете библиотеку А и решили реализовать String.ptototype.toURL
    Кто-то другой пишет библиотеку B и тоже реализует эту функцию.
    Вы подключаете библиотеку B в свой проект и пытаетесь понять, почему написанная вами функция работает не так как задумано.
    Ответ написан
    Комментировать
  • Как узнать о завершении выполнения кода модуля в Node.JS?

    Если уж вы серьезно собираетесь писать PHP подобный сервер, то мой вам совет почитайте про vm модуль, он бы вам пригодился.

    Но честно говоря вы создали себе проблему на пустом месте, потому что сменили язык программирования, но не сменили идеологию мышления.
    Ответ написан
    2 комментария
  • Как в NodeJS сделать EventEmitter для нескольких одновременных запросов?

    Я советую вам посмотреть в сторону обещаний.
    Начните с канонической библиотека promise
    Когда разберетесь с ней, вам возможно потребуется комбайн посложнее, смотрите в сторону Q

    // npm install promise
    
    var fs = require('fs');
    var Promise = require('promise');
    
    // В качестве источника данных в данном случае файловая система,
    // в вашем случае это видимо будет net.Connection
    function dataStoredLoad( dataName ) {
        return new Promise(function(resolve, reject) {
            fs.readFile(dataName, 'utf8', function(err, data) {
                if (err) return reject(err);
    
                resolve(data);
            });
        })
    }
    
    // Это другой способ записать то, что написано в dataStoredLoad
    function dataSourceLoad( dataName ) {
        return Promise.denodeify(fs.readFile)(dataName, 'utf8');
    }
    
    Promise.all(dataStoredLoad, dataSourceLoad).then(function(res) {
        var stored = res[0],
              sourse = res[1];
    
        stored.forEach( function (dataStored, index) {
            sourse.forEach( function (dataStored, index) {
                if ( dataStored.id == dataSource ) {
                     // key.value comparsion procedure and .pop() / .push()
                }
            }
        }
    });
    Ответ написан
    1 комментарий
  • Как сделать базовый объект контейнером верхнего уровня?

    Ваша цель достижима двумя способами:

    Первый позволит Вам писать, так как вы заказывали:
    var a = {};
    console.log(a.document);

    но имейте в виду он опасен. Дело в том, что вы не можете просто так определить window, как прототип для Object - вы получите циклическое наследование - window является объектом типа Object, Object является объектом типа Window. JS просто не позволит Вам такое сделать, поэтому для начала затрем window память о том, что он(а/о) объект
    window.__proto__.__proto__.__proto__ = null;
    ну и теперь правильно присвоим прототип объекту, будем перезаписывать его null прототип:
    Object.prototype.__proto__.__proto__ = window;
    Общий рецепт:
    window.__proto__.__proto__.__proto__ = null;
    Object.prototype.__proto__.__proto__ = window;
    
    var a = {};
    console.log(a.document);

    НО! Я бы не рекомендовал вам творить подобное, это очень опасно.

    Второй вариант короче, безопаснее, но может вам не подойти:

    var a = {__proto__:  window};
    console.log(a.document);


    Остается только понять зачем вам вообще такое понадобилось, возможно есть куда более надежные способы решения проблемы.
    Ответ написан
  • Где ошибка в gruntfile.js?

    Вы забыли запятые:
    }, // <-- Запятая
      //Сжатие
      uglify: {
        build: {
          src: 'production/js/script.js',
          dest: 'production/js/script.min.js'
        }
      }
    Ответ написан
    2 комментария
  • Как использовать шаблон namespace?

    Я бы пожалуй использовал это так:

    var myModuleNS = extend(myApp, 'modules.module2');
    myModuleNS.method = function() {};
    
    //возможно лучше сразу перезаписать прото и не мучиться. 
    //Но это опасный некроссбраузерный код.
    myModuleNS.__proto__ = {
      method1: function() {},
      publicVar1: 1,
      __proto__: myModuleNS.__proto__
    }


    Этот способ мне кажется не очень удобным (это так же отмечено в оригинальной статье в следующих строках: "This works exceedingly well when defining purely namespaces alone, but can seem a little less flexible when you want to define both functions and properties at the same time as declaring your namespaces."), я бы пожалуй модифицировал функцую следующим образом:

    function extend(ns, ns_string, value) {
        var parts = ns_string.split('.'),
            parent = ns,
            pl, i;
    
        if (parts[0] == "myApp") {
            parts = parts.slice(1);
        }
        pl = parts.length;
    
        for (i = 0; i < pl; i++) {
            //create a property if it doesnt exist
            if (typeof parent[parts[i]] == 'undefined') {
                if (value !== undefined && i==pl-1) parent[parts[i]] = value;
                else parent[parts[i]] = {};
            }
            parent = parent[parts[i]];
        }
        return parent;
    }


    Теперь этим вполне можно пользоваться:
    var myModule = extend(myApp, 'modules.myModule', new MyModule());
    //это так же подойдет для расширения существующего пространства имен методами
    extend(myApp, 'modules.myModule.method', function myNewMethod() {});

    Такая конструкция имеет ряд недостатков, например повторная попытка сделать extend myModule, вернет результат первой такой попытки, я бы не ожидал подобного действия от кода.

    Конструкция описанная Сергей Мельников , сомнительна, он рекомендует вам с помощью этой функции получать методы искомого модуля. Теперь давайте представим, что запрашиваемого метода не существует - в ответ на extend вы получите пустой объект и попытаетесь его вызвать, а это ой как не понравится программе...

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

    function MyModule() {
      var module = extend(NS, 'modules.MyModule', this);
      if (module !== this) return module;
      
      //body of module
    }
    Ответ написан
    Комментировать
  • Что лучше: передавать функцию или ее результат в аргумент?

    С точки зрения интерпретатора эти конструкции практически идентичны, единственное, в первом случае в scope создается дополнительная ссылка на результат функции.

    Так что какой вариант использовать, в данном случае - решение стилистическое:
    с одной стороны есть мнение, что если результат вычислений используется лишь в одном месте, то не стоит создавать на него ссылку,
    с другой - сворачивание кода в бессылочную конструкцию приведет к его полной нечитабельности
    funcA(funcB(funcC(funcD(5))));
    Всего должно быть в меру.
    Ответ написан
    Комментировать