• Использовать String или &str?

    keksmen
    @keksmen
    Just a programmer
    Решение тут не вполне однозначное.

    С одной стороны, гораздо эффективнее было бы таскать ссылки (&str), т.к. их копирование или извлечение ссылки на subslice весьма дёшево. Это позволит создавать и отбрасывать структуры при синтаксическом разборе без оглядки на overhead от владения String.

    С другой стороны, используя ссылки, вы обязуете себя обеспечить тот факт, что исходная строка будет жить дольше, чем ваш AST. Это накладывает приличные ограничения на ваш код.

    В любом случае, я бы порекомендовал использовать &str. Однако, без кода подсказать, как лучше сохранить исходный String до конца обработки запроса, я не смогу.
    Ответ написан
    Комментировать
  • Выделяется ли память при создание &str?

    keksmen
    @keksmen
    Just a programmer
    Тут есть немного недопонимания. Под выделением памяти обычно подразумевают её выделение в динамической памяти, в то время как переменные и аргументы живут в стековой памяти.

    А теперь, отвечая на ваш вопрос:
    • Да, &str - это действительно лишь адрес байтов и длина среза, на который адрес ссылается.
    • Нет, динамическая память при этом не выделяется, т.к. хранение на стеке предсказуемо, однозначно и достаточно для этого случая.
    Ответ написан
    Комментировать
  • Вопрос про владение в Rust, что не так?

    keksmen
    @keksmen
    Just a programmer
    Дело в том, что, как и сказал компилятор, вы пытаетесь использовать значение после его перемещения.
    Рассмотрим участок кода.
    // умножаем  слой на предыдущую  матрицу
    buf = v.mat_mul(&buf);
    // результат записываем в вектор 
    result.push(buf);

    На первой строчке вы определяете новое значение переменной. На второй - перемещаете значение в вектор.
    После перемещения значение в переменной считается недействительным, т.к. его использование может нарушить безопасность памяти. Это один из основных принципов семантики владения.

    Отвечая на ваш второй вопрос: да, клонирование - то, что вам нужно использовать в данном случае.
    // умножаем  слой на предыдущую  матрицу
    buf = v.mat_mul(&buf);
    // результат записываем в вектор 
    result.push(buf.clone());


    Однако, клонирование - операция дорогая. Учитывая, что для умножения нужна всего-лишь иммутабельная ссылка на матрицу, мы можем переписать код следующим образом:
    // вектор, где будут хранится  произведения матриц
    let mut result = vec![];
    
    for v in layers {
    	// пытаемся достать предыдущую матрицу
    	let previous_matrix = match result.last() {
    		Some(last) => last,
    		// а если таковой нет - ей станет входная
    		None => &input,
    	};
    	// умножаем  слой на предыдущую (или входную) матрицу
    	let next_matrix = v.mat_mul(previous_matrix);
    	result.push(next_matrix);
    }


    Метод Vec::<T>::last возвращает Option<&T>, которая содержит ссылку на последний элемент ветора, если таковой существует. Его сложность O(1), поэтому по поводу ухудшения производительности можно не беспокоиться.
    Это именно то, для чего и создавалась переменная-буфер. Теперь нам не нужно производить лишнее клонирование.
    Ответ написан
    1 комментарий
  • Почему условие не работает?

    keksmen
    @keksmen
    Just a programmer
    Дело в том, что вот этот участок
    for k in 0..z
    определяет итерацию от 0 до z-1. Поэтому, k никогда не равно z.
    Если нужна итерация от 0 до z, вам стоит использовать следующий синтаксис:
    for k in 0..=z
    Ответ написан
    Комментировать
  • Какой есть эмулятор браузера на nodejs?

    keksmen
    @keksmen
    Just a programmer
    С phantomjs не сталкивался, но знаю, что задача спокойно решается при помощи electron'а. Он достаточно хорошо задокументирован, однако не факт, что он заработает на сервере, где нет графической оболочки.
    Ответ написан
    9 комментариев
  • Кеш в node-webkit?

    keksmen
    @keksmen
    Just a programmer
    Если вы используете функцию require, то файлы подгружаются и кэшируются в контексте node.
    Никакого докуметированного решения я не нашел, посему спасаюсь обычной очисткой кэша require.
    var x=global.require.cache;
    for (var i in x) delete x[i];
    location.reload()
    Ответ написан
  • Как устроен AngularJS?

    keksmen
    @keksmen
    Just a programmer
    Браузер не понимает, ангуляр сам ищет подобные выражения, парсит их и заполняет в соответствии с текущей областью видимости (scope).
    Ответ написан
    6 комментариев
  • Что делать, если сторонний модуль использует слишком длинные имена?

    keksmen
    @keksmen Автор вопроса
    Just a programmer
    Проблема была решена путём копирования из dependencies используемого модуля некоторые модули в свой dependencies.

    Было:
    package.json
    {
      "dependencies": {
        "js-yaml": "^3.3.1",
        "yards-cli": "0.1.5"
      }
    }

    node_modules/module_name/package.json
    {
      "dependencies": {
        "тяжелый-модуль-с-длинными-именами": "0.0.7"
      }
    }


    Стало:
    package.json
    {
      "dependencies": {
        "js-yaml": "^3.3.1",
        "yards-cli": "0.1.5",
        "тяжелый-модуль-с-длинными-именами": "0.0.7"
      }
    }

    node_modules/module_name/package.json
    {
      "dependencies": {
        "тяжелый-модуль-с-длинными-именами": "0.0.7"
      }
    }


    Путём наблюдения было выяснено, что если некоторые модули из вашего dependencies и dependencies используемого модуля совпадают по имени и версии, то npm понимает, что нет смысла дважды устанавливать его т.к. используемый вами модуль сможет без проблем использовать перенесенный модуль следующим путем:
    require('module_name');

    Использовать осторожно: некоторые модули могут использовать файлы используемых модулей некорректно:
    require('./node_modules/module_name/path/to/file.js');

    Хотя, по факту, следующий код будет эквивалентным и более работоспособным в сложившейся ситуации:
    require('module_name/path/to/file.js');
    Ответ написан
    Комментировать
  • Существуют ли готовые реализации двухуровнего раскрывающего списка(дерева) на JavaScript?

    keksmen
    @keksmen
    Just a programmer
    Вам в любом случае придется самому определять каким образом передавать и хранить эти данные, так что проще ручками написать, чем подстраиваться под готовое решение.
    Ответ написан
    Комментировать
  • Каким образом рассчитывается функция фибоначчи?

    keksmen
    @keksmen
    Just a programmer
    Во-первых, ваш алгоритм не совсем корректен.
    function Fibo(n) {
        if (n<2)
            return n;
        else
            return FIBO(n-1)+FIBO(n-2);
    };

    Во-вторых, в принципе, такой алгоритм является крайне медленным. Вот пример его стэка вызовов для пятого числа.
    78d000dd78de4f5c92b57cc8d2e8d4f0.png
    Если не вдаваться в подробности, то уже 50-е число такой алгоритм будет считать несколько минут.

    Посему могу предложить использовать memoize подход (как в underscore)
    var FIBO2=_.memoize(function(n) {{
        if (n<2)
            return n;
        else
            return FIBO2(n-1)+FIBO2(n-2);
    });

    либо воспользоваться итеративным алгоритмом
    function FIBO3(n) {
        if (n<2) return n;
        var x=0,
            y=1,
            z;
        for (var i=1; i<n; i++) {
            z=x+y;
            x=y;
            y=z;
        }
        return z;
    };


    Итеративный алгоритм опережает остальные по скорости на несколько порядков при разовых вычислениях, однако memoize подход позволяет сэкономить на вычислениях при частом использовании функции (+за одно выполнение закэшируются результаты для всех n, стоящих перед требуемым).
    Ответ написан
    7 комментариев
  • Как получить нужное значение?

    keksmen
    @keksmen
    Just a programmer
    Попробуйте применять фильтр не к "product.data", а к "product" целиком. Так у вас будет доступ ко всем его полям.
    Ответ написан
    Комментировать
  • C чем могут быть связаны тормоза NodeJS?

    keksmen
    @keksmen
    Just a programmer
    При запуске процесса в Windows, помимо всех прочих операции, может выполняться проверка его антивирусным ПО.
    Ответ написан
    Комментировать
  • Как сохранить часть html кода в изображение?

    keksmen
    @keksmen
    Just a programmer
    Конечно, врядли это поможет, но у каждого DOM-элемента есть метод print, отдающий на печать содержимое сего элемента.
    Ответ написан
    Комментировать
  • Как с Sublime Text 3 выделить участок кода между парными тегами на полях?

    keksmen
    @keksmen
    Just a programmer
    Вы уверены, что у вас стоит последний билд? Сейчас сижу и наблюдаю, как при наведении на номера строк появляются треугольники, предлагающие "свернуть" блок кода.
    P.S. из плагинов только package control и color coder.
    Ответ написан
    3 комментария
  • Как задать Кириллические названия html файлов на хостинге?

    keksmen
    @keksmen
    Just a programmer
    Вы можете настроить перехват url'ов на сервере, тут все зависит от стэка решений, который вы используете:
    Для apache обычно используют mod-rewrite, записывая настройки в .htaccess;
    На уровне фрэймворка (вроде rails, express или yii) достаточно правильно настроить модуль маршрутизации.
    Ответ написан
    Комментировать
  • Что происходит когда вызываешь Object.apply(this ) в конструкторе "класса"?

    keksmen
    @keksmen
    Just a programmer
    По факту - обычное наследование.
    Чтото.apply(this);
    Внутри конструктора класса выполнит конструктор другого класса в контексте текущего.
    Что же до Object, то я без понятия, что творится у него внутри.
    Ответ написан
    Комментировать
  • Что за конструкция var $$ = $$ || {};?

    keksmen
    @keksmen
    Just a programmer
    Не знаю из какого это проекта, но на вид это обычная конструкция типа "значение аргумента по умолчанию".
    Ответ написан
    Комментировать
  • Какие существуют варианты GUI для Node.js (iojs)?

    keksmen
    @keksmen
    Just a programmer
    Рекомендую остаться на nw.js т.к. существующие решения весьма ограничены и единственной достойной альтернативой является только atom-shell, который представляет из себя примерно тоже самое и весит примерно столько же.
    Увы, webkit штука не легкая.
    Ответ написан