• Как обращаться к определенному объекту по классу?

    Знаю что уже решили вопрос, но навскидку ещё вариант для разнообразия:
    console.log(calcSum('.class1'));
    
    function calcSum(selector) {
    	return $(selector)
    		.toArray()
    		.reduce(function(sum, el){ 
    			return sum + (el.textContent | 0) 
    		}, 0)
    		;
    }
    Ответ написан
    Комментировать
  • Почему в архитектуре Модуль-Фасад-Медиатор управляющие функции дублируются?

    :) Фасад - это чисто инкапсуляция! Фасадом мы скрываем или изменяем апи к классу/классам/библиотеке и т.д. В фасаде не зазорно перед доступом к ниже лежащим слоям проверять данные и права доступа, аля Баррикада, создавать нужные обьекты, определять конфигурацию и прочее. А Мадиатор нужен для связи множества классов/обьектов, хотя задачи могут быть даже схожими. Грубо говоря (может легче представить будет): фасад как обёртка над "чем-то целым", а медиатор как прослойка между множеством "чем-то целым".
    Ответ написан
    Комментировать
  • Правильно ли написан код?

    После рефакторинга
    window.onload = init;
    
    // === private
    function init() {
        var audio = $('#myplayer').get(0);
        audio.src = 'http://radio.at.aknet.kg:8008/radio_record.aac';
    
        $('#playpause').click(function() {
            if (audio.paused) {
                this.textContent = 'Остановить';
                audio.play();
                return;
            }
    
            this.textContent = 'Воспроизвести';
            audio.pause();
        });
    
        $('#volume').change(function() {
            audio.volume = this.value / 100;
        });
    
        setInterval(updateTrack, 5000);
    }
    function updateTrack() {
        var url = 'http://www.radiorecord.ru/xml/record_online_v3.txt';
    
        $.getJSON(url, function(json) {
            var key = json.ARTIST + ' - ' + json.NAME;
    
            $('#track').text('Сейчас играет: ' + key);
            $('#sg').attr('href', 'https://www.google.ru/search?q=' + key);
            $('#sn').attr('href', 'http://namba.kg/#!/search/mp3/' + key)
        });
    }
    Ответ написан
    Комментировать
  • NodeJS одновременная запись в один файл

    Вам нужно взять diff библиотеку - например: jsdiff. После редактирования отправляете на сервер patch, который и применяете к тексту. Если пользователи редактируют разные участки текста оба изменения останутся, если же один участок, тогда - вам нужно думать о разрешении конфликтов. Самое простое - "кто последний - того и тапки".
    Ответ написан
    Комментировать
  • Как писать proposals в ecmascript?

    Не хочу вас переубеждать, но `контекст` и `карринг` - вещи не совместимые, и не из-за невозможности, а в силу идеологии. Первое это обьекты, свойства и методы. А второе это функции и аргументы.
    Если хотите смешать, то как написали - через создание делегата. в ес6 немного проще:
    function delegate(fn, ...base) {
    	return function(...args){
    		return fn.call(this, ...base, ...args);
    	}
    }
    Ответ написан
    Комментировать
  • JS promise, как работать в рекурсии?

    rsvp:Chaining
    В первом `then` создаете и возвращаете ещё один промис, внутри которого делаете вашу `theFunction` рекурсию и когда готовы делаете ресолв. И так переходите ко второму `then`.
    Ответ написан
    Комментировать
  • Можно ли каким-либо образом запустить рандомную функцию?

    var Actions = [first, second, third /* .. */ ],
        index = random(0, Actions.length - 1)
        ;
    Actions[index]();
    
    function random(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }
    Ответ написан
    Комментировать
  • Каков по вашему, алгоритм работы программы wordswag.co?

    Рисуете на канвасе исходную картинку, а поверх нее рисуете текст и другие артефакты. Потом весь канвас сохраняете в Битмап, а далее через компрессор и в файл, или куда-то ещё. В чем загвостка?
    Ответ написан
    Комментировать
  • Какую СУБД лучше выбрать для Node.js и есть ли разница?

    Всё же платформу тоже нужно учитывать: если node.js, то я взял бы монгу. Javascript обьекты и nosql базы можно сказать братья) Работать с ними будет очень удобно. Я бы даже предложил взять очень классный модуль для сериализации обьектов в монгу:ClassJS. Смотрите как просто создаются модели для Ajax транспорта и MongoDB драйвера gist

    Если же нужно очень много взаимосвязей между таблицами, то в nosql базах это будет сложно настроить. Лучше выбрать тогда MySQL.
    Ответ написан
    3 комментария
  • Js - суммировать каждый аргумент функции в строку без for, while

    "как можно по другому", ну кто такое спрашивает, это же javascript - здесь есть миллионы разных способов. Лучше бы спрашивали "как надо". Вот так точно не надо:
    function sum() { return eval([].join.call(arguments, '+')).toString() }
    Ответ написан
    Комментировать
  • Cordova/Phonegap app: position: fixed у header в iOS сбивается при вызове клавиатуры (input focus) - почему?

    В мобильных приложениях мы полностью отказались от `position:fixed`, так как это не только на подобные баги сказывается, но и на производительность в целом. Используйте `absolute` для позиционирования блоков. Можете `flexbox` модель попробовать.
    Ответ написан
  • Как побороть боязнь чистого листа?

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

    - Модули, Слои - делите приложения на слои.

    - Тесты - откройте для себя тестирование. Многие до сих пор разрабатывают так - написали код, запустили приложение, проверили результат - а нужно написать код и написать ожидаемый сценарий, а тест раннер запустит эту часть кода и проверит или всё правильно было нами написано.

    Вообщем, счастье в правильной архитектуре.
    Ответ написан
  • Кеширование запроса при вызове функции NodeJS

    Deferred/Promise, реализаций данного шаблона очень много, но вот пример использования
    var cache_ = {},
        Class = require('atma-class');
    
    function getUserData(id, callback) {
        
        var dfr = cache_[id];
        if (dfr == null) {
            // делеаем запрос только с первым вызовом функции с этим id
            dfr = cache_[id] = new Class.Deferred();
            
            vk.api('users.get', {
                'user_ids': id,
                'fields': 'photo_100'
            }, function(err, result) {
                if (err)
                    return dfr.fail(err);
        
                dfr.resolve(result.response[0]);
            });
        }
        
        // подписываемся на окончание загрузки, если же
        // загрузка уже завершилась(успешно или нет),
        // то callback вызывается сраюу
        dfr
            .done(function(response) {
                callback(null, response)
            })
            .fail(callback);
    
    }
    Ответ написан
    6 комментариев
  • Какой принцип использовать для хранения данных в MongoDB?

    Рекомендую почитать "50 Tips and Tricks for MongoDB". Текста не много, а информации полно. Здесь в ответах немного напутали - то, что у вас под 1ым пунктом - это денормализованная коллекция. Плюсы в том, что за один запрос имеете всю информацию по обьекту, ну а минусы соответственно, что сложно применять правки. А 2ой пункт, это уже нормализованная - и тут всё наоборот. Но главное, это грамотно балансировать между ними, а не выбирать одну из сторон. Структура очень зависит не только от структуры данных, но и того - как мы используем эти данные (какие выборки делать будем) и на сколько важна их актуальность. Пару советов из разных сторон:
    - если идете по первому пути - то можете хранить также все подсущности в отдельных коллекциях. Изменяя подсущность, изменяете её в своей коллекции, и не бойтесь писать скрипты для нормализации, которые по крону будут актуализировать основную коллекцию.
    - а если по второму, то храните не только `_id` подсущностей, но также часть обьекта, которая всегда будет нужна, что бы минимизировать запросы.
    Ответ написан
    Комментировать
  • Как заставить http.get (NodeJS) работать синхронно?

    К тому же `http` в ноде асинхронное, поэтому нужен `callback` или `promise`. А ещё нужно код отрефакторить. Вот навскидку:
    var Request = require('request'),
        Class = require('atma-class');
    module.exports = function prepareTiles(tiles, url, ssid, callback) {
    
        var await = new Class.Await();
        tiles.forEach(function(tile) {
            prepareTile(tile, url, ssid, await.delegate());
        });
        await.always(function(){
            callback(tiles);
        });
    };
    
    function prepairTile(tile, url, ssid, callback) {
        var meta = title.metadata;
        switch (meta.tiletype) {
            case 'mark':
                var search = qs.stringify({
                    url: url,
                    ssid: ssid,
                    mark: meta.mark,
                    type: meta.type,
                    format: meta.format,
                    graph: meta.graph
                });
                val_resolve(
                    'http://127.0.0.1:8080/getSingleMark?' + search
                    , tile
                    , callback);
                break;
            case 'youtube':
            case 'telcall':
            case 'skypecall':
                val_onComplete(tile, meta, callback);
                break;
        }
    }
    
    function val_resolve(url, tile, callback) {
        Request.get(url, function(error, res, body) {
            if (error)
                console.error(error)
            val_onComplete(tile, body, callback);
        });
    }
    
    function val_onComplete(tile, model, callback) {
        tile.metadata.value = tpl.make(
            tile.metadata.tiletype, model
        );
        callback();
    }
    Ответ написан
    1 комментарий
  • Как настроить синхронизацию проекта на github и production сервера?

    Всё довольно просто - вэб хук на гитхабе, который стучится `постом`, например, к `http://mydomain/fetch`. На сервере висит обработчик который запускает скрипт, который в свою очередь делает `git pull`. Вот и всё.

    Вот пример как запускать сторонний скрипт, так же можно и `git fetch --all` / `git reset --hard origin/master` запускать
    require('child_process').spawn('cmd', ['/C', 'node', 'tools/fetch.js']);


    А так можно делать файл `touch`, и так как `iisnode` по-дефолту слушает `index.js` - сервер перезапустится.
    require('fs').utimesSync('index.js', new Date(), new Date());
    Ответ написан
    Комментировать
  • Как реализовать элегантный code flow?

    Создать список всех задач, и стратегию на исполнение.
    var Actions = new Dictionary<String, Action> {
        {"foo", w.foo },
        {"bar", w.bar }
    };
    
    var Strategies = new Dictionary<String, List<String>>(){
        {"in one", new List<String> { "foo", "bar" } }
    };
    
    
    // run
    var actions = Strategies["in one"];
    
    actions.ForEach((action)=> Actions[action]());


    Конечно же, можно `Actions` убрать и паковать методы сразу в стратегию, или использовать reflection для вызова методов. Делайте как больше нравится.
    Ответ написан
    1 комментарий
  • JavaScript: почему функция возвращает объект по ссылке?

    Ничего кроме `n` не осталось бы. Работает довольно простой механизм подсчета ссылок - пока к обьекту есть доступ - он остается в памяти. И здесь разумеется работает принцип цепи. a -> b -> c: если к `а` нету ссылки, память освободится вместе с `b` и `c`, и не важно, что на `c` ссылается `b`.
    Ответ написан
  • Как получить селектор CSS, зная только css-свойство?

    Если вас правильно понял, вот ~ код:
    var slice = Array.prototype.slice,
        filter = Array.prototype.filter
        ;
    
    function findSelector(cssProperty){
        var rules = [];
        
        filter
            .call(document.styleSheets, hasRules)
            .forEach(function(styleSheet){
                
                rules = rules.concat(slice
                    .call(styleSheet.rules)
                    .filter(hasCssNameDelegate(cssProperty))
                );
            })
        
        return rules.map(function(rule){
            return {
                selector: rule.selectorText,
                value: rule.style[cssProperty]
            };
        });
        
        function hasRules(styleSheets){
            return styleSheets.rules != null
        }
        
        function hasCssNameDelegate(name) {
            return function(cssRule){
                return cssRule.style && slice.call(cssRule.style).indexOf(name) !== -1
            };
        }
    }
    
    function findSelectorForElement(element, cssProperty){
        var matchesSelector = HTMLElement.prototype.webkitMatchesSelector
            || HTMLElement.prototype.mozMatchesSelector
            || HTMLElement.prototype.msMatchesSelector
            || HTMLElement.prototype.oMatchesSelector
            ;
            
        return findSelector(cssProperty)
            .filter(function(data){
                return matchesSelector.call(element, data.selector);
            
            }).slice(-1)[0];
    }
    
    var tosterSidebar = document.querySelector('.sidebar')
    findSelectorForElement(tosterSidebar, 'width');
    Ответ написан