Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (14)

Лучшие ответы пользователя

Все ответы (14)
  • Код про утечки памяти?

    @beh
    Разработчик python, javascript
    var theThing = null;
    var replaceThing = function () {
        var priorThing = theThing;
        // сохранив функцию в переменной, мы невольно сохраняем и контекст (цепочку областей видимости) 
        // в котором она была объявлена
        // т.е. в данном случае priorThing оказался в контексте unused
        var unused = function () {
            if (priorThing) {
                console.log("hi");
            }
        };
        // здесь ссылка на старый объект заменяется новым, 
        // старый объект ожидает съедения GC, 
        // unused так же отправится в пасть GC...
        theThing = {
            longStr: new Array(1000000).join('*'), 
            // ... и все бы хорошо, если бы не один нюанс который происходит здесь
            // как там пишут: both functions share the same lexical environment
            // т.е. здесь у функции будет тот же контекст что и у unused
            // потому что контекст уже пошарен при создании unused
            // т.е. ссылка на старый объект priorThing будет сохраняться 
            // в общем контексте someMethod каждый раз.
            someMethod: function () {
                console.log(someMessage);
            }
        };
    };
    setInterval(replaceThing, 1000);    // вызываем 'replaceThing' каждую секунду

    в итоге мы получаем следующую картину
    3ba7ea237ca847a380b43f7ac331ce3d.PNG
    более подробно об этой утечке info.meteor.com/blog/an-interesting-kind-of-javasc...
    подебажить пример можно здесь s.codepen.io/beholderrk/debug/jWGyaY
    Ответ написан
  • Django angular coffee?

    @beh
    Разработчик python, javascript
    Мы сделали один большой проект на стеке angular + typescript, и пару мелких на angular + js. В итоге думаем отказаться от angular вообще, смотрим в сторону react на es6 через babel + сторонние библиотеки для ajax, promise, и т.д.

    Причины:
    1. Быстродействие. В нашем случае интерфейс может состоять из большого числа таблиц данные в которых непрерывно меняются (биржевые данные). Т.к. мы не можем повсеместно использовать :: (bind once) - digest цикл angular начинает сильно тормозить, интерфейс перестает быть отзывчивым. После того как рендер таблиц переписали на react (es6 через babel) все работает быстро. Весь остальной интерфейс работает через angular
    2. Чтобы реализовать некоторые вещи через angular, нужно досконально изучить как работает этот фрейморк, причем не по документации а исследуя его код. При этом получившееся решение может оказаться очень сложным для восприятия другими разработчиками. При этом те же самые вещи на React реализуются гораздо проще и понятнее, без траты времени на борьбу с фремворком.
    3. Используя React сложнее принять фиговые решения, чем если использовать angular (например в angular есть 20 способов как передать данные в директиву, когда как в react компонент он только 1). React реализует более простую и строгую концепцию нежели angular
    4. Мы видим что angular 2 совершенно не совместим с angular 1.x, и что у нас нет никаких шансов переехать, т.к. проект очень большой и никто не даст на это денег. Т.е. фактически мы будем вынуждены много лет поддерживать старую версию фреймворка на которую уже через год 2 все забьют, что удручает


    Coffescript тоже пытались использовать, но после анонса es2015 решили что не будем, т.к. все равно большая пачка фич перекочевала из кофескрипта в новый стандарт, решили использовать babel который в будущем можно будет просто отключить.

    Typescript - удобно использовать для написания библиотек, т.к. на выходе мы имеем так же .d.ts файлы которые могут использовать IDE для подсказок, так же .d.ts можно конвертнуть в jsdoc.
    Ответ написан
  • Можно ли в Django писать одни и те же модели для реляционных и документно-ориентированных БД?

    @beh
    Разработчик python, javascript
    Если вы используете postgres, то возможно стоит посмотреть на:
    hstorefield (можно использовать уже сейчас),
    jsonfield (ожидается в версии 1.9)
    Ответ написан
  • Почему иммутабельные данные легче кэшировать?

    @beh
    Разработчик python, javascript
    Рискну предположить что имеется ввиду кэширование в контексте чистых функций.
    Если функция чистая то можно гарантировать при вызове функции с одними и теми же аргументами мы всегда получим одинаковый результат: выходные данные зависят только от входных. А безопасно закешировать результат можно в том случае если аргументы имутабельны.

    Например у нас есть чистая функция для расчета чисел Фибоначчи, мы можем обернуть ее функцией memoize из lodash чтобы кешировать результат:
    // агрумент n является примитивом, а примитив имутабелен
    let fibonacci = _.memoize(function(n) {
      return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
    });
    
    console.time('first call');
    console.log(fibonacci(50));
    // => 12586269025
    console.timeEnd('first call');
    // => first call: 2.508ms
    
    console.time('second call');
    console.log(fibonacci(50));
    // => 12586269025
    console.timeEnd('second call');
    // => second call: 0.300ms

    codepen

    В примере выше функция принимает примитив, а он всегда имутабелен, и проблем нет.
    Теперь напишем пример где в кеширующую функцию можно подавать не имутабельные данные
    let cachedFn = _.memoize((arr) => arr.length);
    
    let arr = [1,2,3];
    console.log(cachedFn(arr));
    // => 3
    arr.push(4);
    console.log(cachedFn(arr));
    // => 3 - !!!
    console.log(cachedFn([...arr]));
    // => 4

    codepen
    Ответ написан