• +1
    Ох. Вы только не обижайтесь, идея здравая, но её качество вам бы подкачать.

    var workerCount = require('os').cpus().length;
    

    не делайте так, процы с гипертрейдингом (или как там называется эта маркетинговая шляпа) наивно отдают х2 ядер, что по факто вранье и толком не работает. Вынесите в конфиг.

    Статус 999 — детский сад. Есть rfc на статусы ответов, возьмите подходящий код.

    Забудьте про синхронные вызовы. ИМХО их использование нельзя оправдать ничем. Ну разве что эмм. невысоким уровнем разработчика. Очень невысоким.

    Забудьте про global. Или реквайрте явно, или передавайте параметром. Глобали вообще нет оправданий, даже если это написал Ризинг. Но он так не сделает.

    Именование функций местами сбивает с толку. Не пишут ok, пишут isOk, ибо булен-флаг.

    И последнее (на что у меня хватило сил) — реквайр ноды устроен хитро и конечно же кеширует последующие require, но идея делать его на каждый запрос вызывает оторопь.

    В общем у вас есть место для улучшений.
    Построение модульной системы на основе Nodejs
  • 0
    Вот таки да, у нас реклама висит — «отдохните в отпуске в кредит!»
    ИМХО если денег нет — какой нафик отпуск?
    На деньги, которых у них нет люди покупают вещи которые им не нужны :)
    Хитрые льготные периоды
  • 0
    А, собственно, что Вам мешает использовать кастомный фильтр, который преобразует «максимальную строку» в число?
    lodash (underscore) — знай свою стандартную библиотеку
  • +1
    Здорово описано, ждём продолжения.
    Дизайн и архитектура в ФП. Часть 2
  • –2
    Ох, как-то привык в JS к тому что создать объект ничего не стоит, так что совсем красиво не сделать, в яве хешмапы жуть какая-то (как-то раньше пристально не смотрел на нее).

    А вообще конечно по нормальному нужно вести от общего к частному

    vw.setScrollBarVerticalEnabled(false);
    


    Что все равно ужасно, но хоть логичнее по структуре.
    JavaScript to APK. Подводные камни разработки под Android для тех, кого задолбал PhoneGap. Построение мостов из Java в JavaScript
  • 0
    Вот за такое API
    vw.setVerticalScrollBarEnabled(false);
    


    Разработчика нужно п… дить кирзачами отрывать руки дать в репу заставить самого этим пользоваться.
    Этож просто какая-то жесть.

    А по итогу-то что получается — только Java, только хардкор? Как не посмотрю — все кривенько :(
    JavaScript to APK. Подводные камни разработки под Android для тех, кого задолбал PhoneGap. Построение мостов из Java в JavaScript
  • +16
    Меня больше всего во всем этом цирке 2 вещи забавят:
    1. Никто не боится демонстрировать в магазинах фрагменты трупов расчлененных млекопитающих, отличающихся от людей на 2-3% по ДНК. Никого не беспокоят выставленные свиные головы и прочее. А видите ли человеческий трупик — это прям ужас-ужас!
    2. Все больше вводится всякого маразма «оградить и не пущать», но строго до 18! С первым звонком взрослой жизни опекаемое доселе чадо получает обязанность взять в руки огнестрел и уже получить навык «зачистки». Так вот, без лишних ласк.

    Нужно не от информации «вредной» защищать, а учить критически мыслить и верно ещё оценивать — но они же на самом деле не идиоты — рыть самим себе могилки :-)

    В чистом итоге — сраное ханжество, морализм, попил бюджетов и попрание прав и свобод.
    Как будут защищать детей от вредной информации?
  • 0
    Если посмотреть в кот — либа ужасна
    this._MAX_KIDS = (options.max_processes || Math.ceil(require('os').cpus().length * 1.25));
    

    тут в трех местах поперхнутся можно.
    И самое главное — непонятно зачем извращаться с поддержкой очередей если есть async? Ну допилить кое-чего по мелочи, но там все красивое уже есть.
    Нагружаем Node под завязку (2-я из 12 статей о Node.js от команды Mozilla Identity)
  • 0
    Пример от этого удачнее не становится.

    counter = 5
    console.log counter-- until counter is 2
    
    CoffeeScript: Подробное руководство по циклам
  • 0
    В данном случае, для получение значений массива использовать нужно именно of, а не in.

    ой ли?
    вот две записи, дающие одинаковый результат
    result_in = ( val for val in ['a', 'b', 'c'][0...2])
    result_of = ( val for key, val of ['a', 'b', 'c'][0...2])
    

    Но почему первая — корректна, а вторая — путь на темную сторону?
    Потому что:
    var key, result_in, result_of, val;
    
    result_in = (function() {
      var _i, _len, _ref, _results;
      _ref = ['a', 'b', 'c'].slice(0, 2);
      _results = [];
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        val = _ref[_i];
        _results.push(val);
      }
      return _results;
    })();
    
    result_of = (function() {
      var _ref, _results;
      _ref = ['a', 'b', 'c'].slice(0, 2);
      _results = [];
      for (key in _ref) {
        val = _ref[key];
        _results.push(val);
      }
      return _results;
    })();
    

    Мы же не будем спорить о том, насколько неэффективно обращаться с массивом как объектом?
    CoffeeScript: Подробное руководство по циклам
  • 0
    Алсо —
    expr = /foo*/g;
    alert "#{array[0]} : #{expr.lastIndex}" until (array = expr.exec('foofoo')) is null
    

    пример явно не удачный, потому как это же явно
    expr = /foo/g
    console.log "#{array[0]} : #{expr.lastIndex}" while array = expr.exec 'foofoo'
    
    CoffeeScript: Подробное руководство по циклам
  • 0
    Алсо —
    alert i for i in [1..10] when i % 2 is 0
    

    ИМХО удачнее будет
    for i in [1..10] when not( i % 2) then console.log i
    
    CoffeeScript: Подробное руководство по циклам
  • 0
    Алсо — с места
    [value for i, value of ['a', 'b', 'c'][0...2]] # a, b
    

    и до конца раздела — это вы о чем?
    Во-первых не нужно писать of [arr], нужно in [arr]
    Во вторых — смысла конструкции вообще не понял — может проще сразу было
     ['a', 'b', 'c'][0...2]
    

    не?
    CoffeeScript: Подробное руководство по циклам
  • 0
    Эм, за напоминание о слайсах — спасибо, в отместку — там опечатка есть
    [list1, list2 ...]  #[1,2,3,4,5,6] 
    

    Не, чтобы получить плоский список надо сказать
    [list1..., list2...]
    
    CoffeeScript: Подробное руководство по циклам
  • +1
    лучше null
    Нам не нужен ваш кофе
  • +3
    Бла-бла-бла — кидалтское нытье и занудство.

    Автору стоит вернуться к взрослой реальности.
    Не хотите наш CS — ну и xрен с вами! Не нравится ответ на SO на CS — ну и хрен с вами!
    Это ваши проблемы и не вам мне указывать где что и на чем писать.
    Я же не начинаю ныть, что вот тут книжка по алгоритмам на сях, тут — на лиспе, а тут вообще не пойми чего? Раз оно надо мне, значит и с этим я разберусь.
    Нам не нужен ваш кофе
  • 0
    Ну, многослойные абстракции нам дает DI, за связанностью следит ООП, а сокращать код помогают mixin-ы.

    Я как бы не настаиваю, но есть некие best practice, игнорировать которые черевато боком, мне ли не знать.

    Но в любом случае — успехов, хоть я лично за unix-way и держусь подальше от комбайнов.
    Impress: многоцелевой сервер приложений для Node.js
  • +1
    Есть такой вопрос провокационный — а почему Вы не пишите на node.js?

    Зачем Вы изобрели собственный механизм импорта\экспорта?
    Почему не используете сторонние клиентские библиотеки — для работы с датой, строками и т.д? Всякие lodash-underscore уже стандарт де-факто.

    Я уж молчу про то, что использование global — жуткий моветон, который еще как-то можно простить в тестах, но в продакшен-коде — ни-ни.
    Impress: многоцелевой сервер приложений для Node.js
  • 0
    Что-то мне подсказывает, что криворукие люди не напишут в продакшен машину регулярных выражений.

    А что быстрее будет работать — честно говоря пофик, микрооптимизации меня никогда не интересовали.
    Разбор регулярных выражений
  • –1
    Вот лучше бы Фридла почитали, чтобы вместо ужаса типа
    (www\.[A-z\d\.\+\-]+) было что-то типа /(w{3}\.[-a-z\d+.]+)/i
    Разбор регулярных выражений
  • 0
    Только ComonJS, только хардкор :)

    Пишем на coffee, жмем clinch-ем и вуаля!
    Получается что-то типа такого — демо и исходники.
    YAMD: еще один велосипед для описания модулей в JS
  • 0
    Ниже куча ссылок на подобные проекты.
    Плюс еще есть TinyData, которая полноценный запросник по слабоструктурированным данным :)
    jsFind. Выборка данных из массива объектов
  • 0
    Ну, этой книги у меня нет, однако если мы о тупом баге в стеках — то он довольно давно поправлен почти во всех браузерах.

    Изменения в спеках и объяснялка на SO.

    Я вот знаю про скрытые классы при создании объекта, про преобразования массива если он содержит разные типы данных, про преобразование полиморфных функций, а вот по поводу «скомпилированной сущности» в отношении регулярок — не, не видел. Может лишнего удумали?
    Почем оптимизация или «бесплатных завтраков не бывает»
  • +1
    О как.
    Могу я попросить ссылку на документацию (вероятно в реализациях браузеров?) об этом факте?
    Почем оптимизация или «бесплатных завтраков не бывает»
  • –1
    Он и инлайновый-то каждый раз новый создается — пруф
    Просто инлайновый быстрее — по многим очевидным причинам.
    Почем оптимизация или «бесплатных завтраков не бывает»
  • 0
    ХМ… пруф?

    У меня вот как-то другие получаются результаты:
      var n, re1, re2, res;
    
      re1 = /test/;
    
      re2 = /test/;
    
      res = (function() {
        var _i, _results;
    
        _results = [];
        for (n = _i = 0; _i <= 1; n = ++_i) {
          _results.push(/test/);
        }
        return _results;
      })();
    
      console.log('re1 === re1 ->', re1 === re1); // re1 === re1 -> true
    
      console.log('re1 === re2 ->', re1 === re2); // re1 === re2 -> false
    
      console.log('res[0] === res[1] ->', res[0] === res[1]); // res[0] === res[1] -> false
    


    Или я не верно понял идею?

    поиск продолжается с места предыдущего найденного результата

    Это о чем? я знаю только о поведении реплейса с флагом 'g' и экспериментальном флаге 'y', но у нас тут другая ситуация вроде.

    PS. А за что человека-то заминусовали — все верно заметил.
    Почем оптимизация или «бесплатных завтраков не бывает»
  • 0
    Кто знает :) Строим на века, вдруг в этом месте будет лаг и интерфейс пользователя фризоваться начнет? :)

    На мой вкус ничего там делать было не надо, данных проФайЛера (я правильно понял?) не было конечно — virgin premature.
    Почем оптимизация или «бесплатных завтраков не бывает»
  • +1
    Ох.
    Уж положа руку на сердце по-моему там вообще ничего оптимизировать не надо.
    Тем более изобретать велосипедов и «обходится без регулярки».
    Регулярные выражения — простой и выразительный способ описания алгоритма обработки грамматики, с первого взгляда объясняющий что, зачем и почему тут происходит.
    Более того — я твердо верю что это лучший и безальтернативный способ работы с грамматиками — так что их надо тупо выучить и применять.

    Ну и основная идея поста была не в том, что что-то можно оптимизировать, а в том, что это накладно. Я не оперирую терминами «читабельность» и т.д. Тупо цифры: сложность — +столько-то, размер — +столько-то, effort — +столько-то. И в итоге поддержка кода превращается в ад. Как бы так вот.

    PS. хм, ну и на что тут будет похож вариант «без регулярок»?
    Почем оптимизация или «бесплатных завтраков не бывает»
  • 0
    Погуглил про interning, выяснил что JS сам интернит строки-как-литерал, а динамически создаваемые — нет.
    Однако идеи приведенного примера так и не понял — есть переменная, которая не используется, замыкание по идее возвращающее то же самое — профит-то в чем?
    Почем оптимизация или «бесплатных завтраков не бывает»
  • +1
    Называете класс CurrentUserSingleton и проблем точно не будет

    Вы меня явно недооцениваете :)

    А кроме шуток — вот уже не первый раз в итоге скатываюсь к тому, что DI + Registry наше все.
    Тут нам и ре-юзабельность малой кровью, и возможность моки подпихивать и черт в ступе, если нужен.

    Получается, к сожалению, такой если не god-object, конечно, но просветленный — это точно, но ничего не поделать, где-то в системе должны же зависимости хранится.
    Использование паттернов проектирования в javaScript: Порождающие паттерны
  • 0
    Так яж про семантику.
    user = new User # as singleton — плохо
    user = Registry.get 'current_user' — хорошо

    Использование синглтона как раз и отражает первую проблему в программировании — называние вещей.
    Использование паттернов проектирования в javaScript: Порождающие паттерны
  • 0
    Эмм… как это не важно? Объект он на то и объект, что обладает собственной «уникальностью» (ну, в грубом приближении). И когда мы создаем новый — он должен быть новым.
    А то потом получаем всякое, что у Пети пол женским стал, потому что кто-то новую запись сделал, взяв как конструктор объект пользователя.
    Использование паттернов проектирования в javaScript: Порождающие паттерны
  • 0
    Синглтон — дурацкий антипаттерн, убивающий читабельность и понимабельность кода чуть более, чем совсем.
    Тот факт, что мы получаем ссылку не должне скрываться за декларацией создания нового объекта, это просто ложное утверждение, типа true = false # Happy debugging!.

    Правильно использовать #clone() или фабрику объектов.
    Использование паттернов проектирования в javaScript: Порождающие паттерны
  • 0
    Да не за что, жадность — первое на чем вечно накалываешься :)

    О парсинге HTML, тут кабэ такая мыслишка — я не говорю о том, что это невозможно регулярками — они неплохо с этим справляются и частенько парсеры внутри себя их и используют.

    Я о том, что в реальном мире HTML вполне вероятно может оказаться сломанным и все пойдет плохо. Суть парсеров в том, что их писали реально мозговитые ребята (уж точно поумнее меня) и они с этой проблемой так или иначе боролись. Тесты, документация и т.д. — это блин непросто все. Так что лучше взять готовое.
    Regexponline – интерактивный анализатор и редактор регулярных выражений
  • +3
    Оххх.
    (<([a-z]+[^>]*)>)(.*)(</\2>) -> (<([a-z]+[^>]*)>)(.*?)(</\2>)

    Но вообще парсить HTML регулярками черевато :)
    Regexponline – интерактивный анализатор и редактор регулярных выражений
  • +1
    Java(+Spring) :)

    О, там да, там офигенски все просто. Пишем простыню XML-я и все заработает. И еще фабрики фабрик фабрик.
    Этой астронавтикой можно только на чужие большие бабки развлекаться, за свои уж лучше что попроще.

    Вы действительно считаете, что это проще, чем вместо function f(x) написать int function f(float x)?

    Оооо… Так, последний раз, мессадж такой — пока вы кодите в песочнице у вас вся эта фигня работает. И рождает чувство ложной безопсности.
    Как только код становится модулем и его зовет кто-то сторонний, в реальном мире — оно становится дырявым и фейлится. Это раз.
    Тесты, ассерты и т.д. писать все равно придется, их объявление типа не отменяет. Хотя, можете не писать, дело ваше.
    Javascript умирает или перерождается?
  • –1
    Вот это я имел в виду пол гимором.

    Покажите мне из коробки AOP язык, который используется в реальности.

    Но не как часть языка. Только в рантайме в общем случае можно что-то проверить.

    Да и фик с ним. Ну нет проверки, все равно от нее толку мало. Пишите тесты, ставьте логгеры, проблема проще решается. Для этого не надо изобретать четырехколесного лисапеда, типа как микрософт сделали.

    Ну нельзя сделать ПО безопасным, налепив на него стикер «Безопасное», как любят делать в MS. Нет серебрянной пули :)
    Javascript умирает или перерождается?
  • 0
    Там же есть корявый JS github.com/Meettya/clinch/blob/master/lib/file_processor.js#L57

    Исчо раз — в JS можно сделать true AOP, для того есть всякие модули, но по мне вся эта фигня уменьшает читаемость кода, как и миксины. Только миксины — неизбежное зло, а вот аспекты можно и упростить.

    Мысль короче такая — нафик не нужен этот TS, он замыкает на себя разработку и по факту ничего не гарантирует. Нужны проверки — их есть в JS. Все.
    Javascript умирает или перерождается?
  • 0
    Обычный CoffeeScript синтаксис, добавьте в стакан немного скобокочек и кавычечек и получите JS.

    Я бы сказал это аспект в его истинной форме, после того, как какой-нить метапроцессор обработал наш исходник и вставил вызовы функции туда, где они нужны. Ведь именно это и происходит на самом деле.

    Ничто не мешает использовать AOP-фреймверки для JS, но лично мне они кажутся оверкильными и ухудшающими понимание где и что происходит с кодом.

    Так что если отбросить всю мишуру — это аспект. Или метод-декоратор. Оно просто работает.

    Таки гимор-то где? Почему эта конструкция не может быть использована там, где нам нужна проверка типов или что там еще надо проверить?
    Javascript умирает или перерождается?
  • 0
    Практика заворачивания в аспект — github.com/Meettya/clinch/blob/master/src/file_processor.coffee#L42

    rejectOnInvalidFilenameType = (methodBody) ->
      (filename, cb) ->
        unless _.isString filename
          return cb TypeError """
                    must be called with filename as String, but got:
                    |filename| = |#{filename}|
                    """
        methodBody.call @, filename, cb
    
    <..somewhere in class...>
    
    loadFile : (rejectOnInvalidFilenameType (filename, cb) ->
      <...method body...>
    )
    


    гиде гемор?
    Javascript умирает или перерождается?