Ответы пользователя по тегу Lua
  • Как заставить nginx запускать lua скрипты через luaJIT?

    starius
    @starius
    программист, аспирант МГУ
    Надо устанвить LuaJIT и пересобрать nginx с LuaJIT вместо Lua.
    В Debian для этого применили такой патч (баг):

    diff -ruN nginx-1.6.0.orig/debian/modules/nginx-lua/config nginx-1.6.0/debian/modules/nginx-lua/config
    --- nginx-1.6.0.orig/debian/modules/nginx-lua/config	2014-04-24 13:23:46.000000000 -0300
    +++ nginx-1.6.0/debian/modules/nginx-lua/config	2014-07-24 03:48:10.816586362 -0300
    @@ -131,9 +131,9 @@
                 ngx_feature="Lua library in /usr/"
                 ngx_feature_path="/usr/include/lua5.1"
                 if [ $NGX_RPATH = YES ]; then
    -                ngx_feature_libs="-R/usr/lib -L/usr/lib -lm -llua5.1"
    +                ngx_feature_libs="-R/usr/lib -L/usr/lib -lm -lluajit-5.1"
                 else
    -                ngx_feature_libs="-L/usr/lib -lm -llua5.1"
    +                ngx_feature_libs="-L/usr/lib -lm -lluajit-5.1"
                 fi
                 . auto/feature
             fi


    ```
    Ответ написан
    Комментировать
  • Как использовать stub/mock в lua (busted)?

    starius
    @starius
    программист, аспирант МГУ
    Попробовал протестировать как-то так с использованием stub:

    it("calls getEventType with the event", function()
        function getEventType()
          return 3
        end
        stub(_G, "getEventType")
        processEvent(42)
        assert.stub(getEventType).was.called_with(42)
        getEventType:revert()
      end)


    Не работает, хотя должно бы, исходя из документации. Написал об этом разработчикам.

    В итоге протестировал всё без spy, mock и stub. На мой взгляд, если отслеживаемых функций не безумное множество, то лучше по-простому.

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

    Замечание по коду: не злоупотребляйте глобальными переменными.

    UPD. В busted ответили, что из-за того busted применяет песочницу для тестов, глобальные переменные имеют область видимости в рамках текущего spec-файла или describe-блока. Предложили, как всё-таки протестировать функцию processEvent (присваивать к полям _G), но это потребовало изменять её код. Мораль такова: не пользуйтесь глобальными переменными.

    UPD 2. Советуют объявить глобальные функции в отдельном модуле, который подключать через require в тестах. Тогда глобальные переменные попадут в _G тестов и всё будет работать, как ожидалось. Пример кода взят из ответа:

    -- processEvent.lua
    function getEventType(e)
      ...
    end
    
    function processEvent(e)
      eventId = getEventType(e)
      if eventId == 3 then
        return 3
      else
        return 0
      end
    end
    
    -- process_event_spec.lua
    require 'processEvent'
    
    describe("processEvent", function()
      it("calls getEventType with the event", function()
        stub(_G, "getEventType")
        processEvent(42)
        assert.stub(getEventType).was.called_with(42)
        getEventType:revert()
      end)
    end)
    Ответ написан
    Комментировать
  • Gentoo ошибка при сборке luatex: как исправить?

    starius
    @starius
    программист, аспирант МГУ
    Разработчик пишет, что проблема исправлена. Исправили?
    Ответ написан
    Комментировать
  • Когда точно в Lua массив ( таблица только с array-part ) приобретает hash-part ( становится hash )?

    starius
    @starius
    программист, аспирант МГУ
    В файле ltable.c сказано следующее:

    The actual size of the array is the largest 'n' such that at least half the slots between 0 and n are in use.

    Таким образом, массив охватывает ключи от 0 до такого числа n, что используется хотя бы половина. Давайте ещё посмотрим на код функции computesizes, которая решает, каким будет размер массива при изменении размера таблицы. Эта функция перебирает степени двойки (1, 2, 4, 8 ...) и смотрит, какая доля массива была бы занята, если бы он был такого размера. Останавливается, когда эта доля становится меньше половины. Нетрудно доказать, что при таком алгоритме выбора размера массива и при сплошном заполнении всех ключей от 1 до n обязательно будет выбран размер массива, больший или равный n.

    Кстати говоря, из этого же следует, что при добавлении в конец массива элементов будут накладные расходы, но не на хеш-часть, а на пустые элементы массива, выделенные "про запас". Но так и должно быть, чтобы не перестраивать массив при каждом новом элементе. (В C++ vector.push_back ведёт себя так же.) Если заранее знаете окончательный размер массива и хотите на этом выгадать, то напишите сишное расширение, которое вызывает lua_createtable(L, размер-массива, 0).

    По поводу того, не появится ли хеш-часть при замене значений на различные типы. Не появится. Дело в том, что в паре ключ-значение ключ и значения хранятся в разных полях. Я отследил как используется поле i_val, оказалось только в макросе gval, тип которого нигде не фигурирует (только проверки на nil).

    Кроме того, могу посоветовать использовать rawset и lua_rawseti, так как они не проверяют метаметоды, поэтому должны работать быстрее. Про lua_rawseti я уверен, что работает быстрее, а про rawset подозреваю.
    Ответ написан
    Комментировать
  • Можно ли в nginx конфиге написать код на lua, который бы просто показывал простейшую форму?

    starius
    @starius
    программист, аспирант МГУ
    Ответ - можно.
    См. wiki.nginx.org/HttpLuaModule
    wiki.nginx.org/HttpLuaModule#ngx.print - чтобы что-то напечатать.
    wiki.nginx.org/HttpLuaModule#ngx.req.get_post_args - доступ к данным, отправленным через POST
    Функция Lua os.execute() - выполняет команду.
    Примеры простых конфигов см. по ссылкам выше.

    PS. На Lua можно и полноценный сайт написать: habrahabr.ru/post/240217
    Ответ написан
    1 комментарий
  • Существуют ли готовые ~CMS решения для Lua (Lapis) + Nginx?

    starius
    @starius
    программист, аспирант МГУ
    Не Lapis+Nginx, но Lua: sputnik.freewisdom.org
    Everything is done using Lua. Node storage format? Lua! The permission rules? Lua!
    Ответ написан
    Комментировать