• Как заставить 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


    ```
    Ответ написан
    Комментировать
  • Где найти справку по функциям Nginx для написания модулей?

    starius
    @starius
    программист, аспирант МГУ
    Есть учебник про это: www.evanmiller.org/nginx-modules-guide.html
    Возможно, стоит начать с него, а не со справки.
    Ответ написан
    Комментировать
  • Как использовать 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)
    Ответ написан
    Комментировать
  • Как найти все циклы в неориентированном графе по матрице смежности?

    starius
    @starius
    программист, аспирант МГУ
    Обходите граф в глубину. Стеком вершин назовем маршрут от начальной вершины до текущей вершины, по которому мы до неё добрались. Заведите множество вершин V, которые вы уже посетили. Для каждой вершины помните, из какой вершины вы в неё пришли (словарь P) при обходе. Если при обходе вы видите в числе соседей вершины уже посещённую вершину K, которая не входит в текущий стек вершин, то "разматывайте" путь от K до изначальной вершины, используя информацию из словаря P, это в совокупности со стеком вершин даст цикл. А если K входит в стек вершин, то циклом будет часть стека от K до вершины стека.

    Дополнение не совсем в тему. Есть элегантный алгоритм, который для числа n определяет, входит ли вершина в цикл с повторами длины n. Но так как цикл с повторами, а граф неориентированный, то циклы вида A-B-A-B-A-... тожу будут учитываться. Видимо, можно придумать способ вычесть их количество из полученного числа циклов. Так я и собирался делать, но потом понял, что ничего этого не нужно и задача решается простым обходом в глубину.

    UPD. Оказалось, что мой ответ неправильный. Правильные мысли описаны в научной статье.
    Ответ написан
    Комментировать
  • Музыка для кодинга, под что вы программируете?

    starius
    @starius
    программист, аспирант МГУ
    JPOP и KPOP с Big B Radio:

    $ mplayer 50.7.173.162:8076

    (перез айпишником http:// )
    Ответ написан
    Комментировать
  • 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 подозреваю.
    Ответ написан
    Комментировать
  • TOR на сервере или на клиентах - что предпочтительнее?

    starius
    @starius
    программист, аспирант МГУ
    Лучше локальный Tor-браузер. Во-первых, так безопасней, во-вторых так можно всё списать на пользователей, если вдруг придёт проверка. Никого конкретно не найдут и есть шанс, что просто уйдут. К тому же, если весь трафик пустить через Tor или VPN, то эти товарищи скорее заметят, чем если вы будете пользоваться в норме обычным инетом, а как что-то не работает, идти через Tor-браузер.

    PS. Пожалуйста, пишите Tor, а не TOR.
    Ответ написан
    Комментировать
  • С чего начать школьнику 16 лет?

    starius
    @starius
    программист, аспирант МГУ
    Английский, алгоритмы, потом уже программирование. Из языков C, Lua, С++. Первые два можно полностью освоить за несколько месяцев, с последним придётся повозиться, но оно того стоит. С таким багажом можно переходить на любой другой язык. Если начнёте с раскрученных питона или яваскрипта, то так на нём и останетесь. В 16 лет надо вкладываться в голову, а не в руки. Сейчас велик спрос на питон-программистов и яваскрипт-программистов, а через 5 лет ветер может подуть в другую сторону, да и скучно станет быдлокодить, когда вокруг так много чудесных языков.

    Советую послушать курс Cryptography I. Во-первых, там очень понятный английский для русского уха, во-вторых, рассказывают о криптографии, а ведь с этого всё начиналось.

    Сделайте следующие программы своими привычными инструментами: linux, vim, git. Заведите аккаунт на гитхабе.

    Последнее: если находитесь в Москве, советую поучиться в МШП.
    Ответ написан
    Комментировать
  • Можно ли в 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 комментарий
  • Были ли случаи осуждения за Tor Exit-node в России?

    starius
    @starius
    программист, аспирант МГУ
    https://www.torproject.org/docs/faq#FacingLegalTrouble - как доказать, что вы были Exit-нодой в определённое время.

    Опыт арестованного оператора тора (Австрия): raided4tor.cryto.net
    Но он помимо тора держал дома наркотики и оружие.

    Какое именно ведомство вас пригласило?

    Держите сообщество в курсе. Будет хорошо (в том числе для вас), если об актах полицейского произвола станет известно наибольшему числу людей. Желаю вам успешно разобраться с обвинениями!

    (Оффтоп) дома держать неудобно, как и в РФ вообще. Если уж очень хочется, то дома надо держать промежуточную ноду, а выходную - на сервере, расположенном в другой стране.

    (Оффтоп2) Кстати, правильно писать Tor, а не TOR.
    Ответ написан
    6 комментариев
  • Анонимный хостинг

    starius
    @starius
    программист, аспирант МГУ
    https://cloudflare.com
    а также Tor (скрытые сайты onion)
    Ответ написан
    Комментировать
  • Как настроить Tor, чтобы прокси был из определенной страны?

    starius
    @starius
    программист, аспирант МГУ
    В torrc пропишите ExitNodes {us}
    где us - двубуквенный код страны. Список кодов стран.
    Ответ написан
    Комментировать
  • Существуют ли готовые ~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!
    Ответ написан
    Комментировать
  • Помогите с регуляркой для nginx

    starius
    @starius
    программист, аспирант МГУ
    У меня так получилось:
    server_name ~^(?:www\.)?(?P.+)?\.(?P[^\.]+\.[^\.]+)$;
    Если в домене будет больше 3 частей, то "лишние" отходят к subdomain:
    abc.def.ghi.ru ->abc.def + ghi.ru
    Ответ написан
    Комментировать
  • Новый способ блокировки любого Skype аккаунта

    starius
    @starius
    программист, аспирант МГУ
    Получалось разблокировать аккаунт. Нужно проявлять настойчивость, но не переходить на грубости. Можно КАПСОМ, тогда отвечают быстрее. Имеет смысл цитировать предыдущие диалоги. С N-ой попытки через X часов аккаунт разблокировали.

    Ходят слухи, что обладателям Skype Premium аккаунтов не приходится бояться блокировок.
    Ответ написан