Установка luarocks windows и настройка

Обновлено: 06.07.2024

Несмотря на то, что существуют другие веб-фреймворки, использующие Lua, мы в первую очередь сосредоточимся на компонентах, предоставляемых сообществом Kepler.

Приложения и рамки

CGILua предлагает создание веб-страниц LuaPages и LuaScripts на основе WSAPI, но больше не поддерживается. Вместо этого используйте Orbit, Sputnik или WSAPI.

CGILua предлагает создание веб-страниц LuaPages и LuaScripts на основе WSAPI, но больше не поддерживается. Вместо этого используйте Orbit, Sputnik или WSAPI.

В этом руководстве мы постараемся помочь вам понять, что может делать Lua, и узнать больше о его установке и использовании, см. Веб-сайт kepler.

орбита

Все приложения Orbit следуют протоколу WSAPI, поэтому в настоящее время они работают с Xavante, CGI и Fastcgi. Он включает в себя панель запуска, которая позволяет легко запускать экземпляр Xavante для разработки.

Если вы не установили все зависимости, вот шаги, которые необходимо выполнить для настройки Orbit в среде Unix / Linux.

Установка Apache

Установить LuaRocks

Установите WSAPI, FCGI, Orbit и Xavante

Настройка Apache2

Добавьте этот следующий раздел ниже раздела <Directory / var / www /> файла конфигурации. Если в этом разделе указано «AllowOverride None», вам нужно изменить «None» на «All», чтобы файл .htaccess мог переопределить конфигурацию локально.

Перезагрузите сервер, чтобы изменения вступили в силу.

Orbit предоставляет другой вариант, т. Е. Код Lua может генерировать html.

Создание форм

WSAPI

Как упоминалось ранее, WSAPI выступает в качестве основы для многих проектов и имеет несколько встроенных функций. Вы можете использовать WSAPI и поддерживать следующие платформы,

Поддерживаемые серверы и интерфейсы WSAPI включают в себя:

WSAPI предоставляет ряд библиотек, что облегчает нам веб-программирование с использованием Lua. Некоторые из поддерживаемых функций в Lua включают в себя:

  • Обработка запросов
  • Буферизация вывода
  • Аутентификация
  • Загрузка файлов
  • Запросить изоляцию
  • мультиплексирование

В приведенном выше коде вы видите простую HTML-страницу, которая создается и возвращается. Вы можете увидеть использование сопрограмм, которые позволяют возвращать оператор за оператором вызывающей функции. Наконец, возвращается HTML-код состояния (200), заголовки и HTML-страница.

Xavante

  • Обработчик файлов
  • Обработчик перенаправления
  • Обработчик WSAPI

Обработчик файлов используется для общих файлов. Обработчик перенаправления включает переопределение URI и обработчик WSAPI для обработки с приложениями WSAPI.

Простой пример показан ниже.

Lua Web Components

Copas , диспетчер, основанный на сопрограммах, которые могут использоваться серверами TCP / IP.

Cosmo , движок «безопасных шаблонов», защищающий ваше приложение от произвольного кода в шаблонах.

Coxpcall инкапсулирует Lua нативный pcall и xpcall с сопрограмм-совместимыми.

LuaFileSystem , переносимый способ доступа к базовой структуре каталогов и атрибутам файлов.

Rings , библиотека, которая обеспечивает способ создания новых состояний Lua из Lua.

Copas , диспетчер, основанный на сопрограммах, которые могут использоваться серверами TCP / IP.

Cosmo , движок «безопасных шаблонов», защищающий ваше приложение от произвольного кода в шаблонах.

Coxpcall инкапсулирует Lua нативный pcall и xpcall с сопрограмм-совместимыми.

LuaFileSystem , переносимый способ доступа к базовой структуре каталогов и атрибутам файлов.

Rings , библиотека, которая обеспечивает способ создания новых состояний Lua из Lua.

Конечная заметка

Для нас доступно так много веб-фреймворков и компонентов, основанных на Lua, и, исходя из потребностей, их можно выбрать. Существуют и другие доступные веб-фреймворки, которые включают следующее:

Moonstalk позволяет эффективно разрабатывать и размещать динамически генерируемые веб-проекты, построенные на языке Lua; от базовых страниц до сложных приложений.

Lapis , фреймворк для создания веб-приложений с использованием MoonScript (или Lua), который работает внутри настроенной версии Nginx под названием OpenResty.

Lua Server Pages , плагин скриптового движка Lua, который отбрасывает любой другой подход к встроенной веб-разработке, предлагает впечатляющий краткий путь к традиционным страницам C-сервера.

Moonstalk позволяет эффективно разрабатывать и размещать динамически генерируемые веб-проекты, построенные на языке Lua; от базовых страниц до сложных приложений.

Lapis , фреймворк для создания веб-приложений с использованием MoonScript (или Lua), который работает внутри настроенной версии Nginx под названием OpenResty.

Lua Server Pages , плагин скриптового движка Lua, который отбрасывает любой другой подход к встроенной веб-разработке, предлагает впечатляющий краткий путь к традиционным страницам C-сервера.

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

установка и использование Windows библиотеки luarocks

LuaSocket
Это программа, добавленная библиотекой расширений Lua. Вы можете найти ее на Baidu. Ее проще установить и использовать в среде Linux. Сегодня я изучал установку в Windows.
Мне это показалось более хлопотным, поэтому сначала запишите его!

Генерация LuaSocket соответствует используемой вами версии VS.

1.lua-5.1.4 \ src \ luac.c Основная функция этого файла изменена на luac_main

2.lua-5.1.4 \ src \ lua.c Основная функция этого файла остается неизменной


3. Следующие настройки vs:


4. Скомпилируйте, создаст два важных файла lua51.dll, lua51.exe, напрямую запустите lua51.exe, как показано ниже:


5. Скомпилируйте файл lua51.lib и измените элементы конфигурации vs, как показано на рисунке:


6. Успешно скомпилированный lua51.lib

Затем распакуйте luarocks-master, затем войдите в корневой каталог luarocks-master в консоли cmd и вызовите следующую команду:

install.bat / P "D: \ LuaRocks" / CONFIG "D: \ LuaRocks \ Luarocks" / ДЕРЕВО "D: \ LuaRocks \ LuaRocks" / LUA "D: \ VC ++ Personal Project \ lua \ lua-5.1.4" / INC "D: \ VC ++ Personal Project \ lua \ lua-5.1.4 \ src" / LIB "D: \ VC ++ Personal Project \ lua \ lualib5.1.4 \ Bin \ lualib5.1.4" / BIN "D: \ VC ++ Personal Project \ lua \ lualib5.1.4 \ Bin \ lualib5.1.4 "

Подробное объяснение каждого параметра следующее:

/ P D: \ LuaRocks установленный каталог luarocks

/ CONFIG "D: \ LuaRocks \ Luarocks" Каталог, в котором находится конфигурация luarocks.

/ LUA "D: \ VC ++ Personal Project \ lua \ lua-5.1.4" Корневой каталог, в котором находится исходный код LUA.

/ INC "D: \ VC ++ Personal Project \ lua \ lua-5.1.4 \ src" Каталог, в котором находится исходный код LUA.

/ LIB "D: \ VC ++ Personal Project \ lua \ lualib5.1.4 \ Bin \ lualib5.1.4" Каталог, в котором находится статическая библиотека lua lua51.lib

/ BIN "D: \ VC ++ Personal Project \ lua \ lualib5.1.4 \ Bin \ lualib5.1.4" Каталог, в котором находится библиотека времени выполнения lua lua51.exe lua51.dll


Подробное описание install.bat, установленного luarocks-master, которое включает get_runtime (), который анализирует библиотеку времени выполнения, требуемую lua51.exe MSVCRT,

Вот почему вам нужно выбрать опцию md при компиляции, иначе анализ не будет успешным.Если вы установите принудительную установку, вы получите ошибку luarocks install xxx.


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

Этот проект не самый простой, поэтому возникает вопрос, зачем он нужен, если есть готовые фреймворки типа Keras, TensorFlow и Caffe, где, как говорится, «сел и поехал»? А ответ прост: нужен гибкий инструмент с возможностью расширения, с которым подружится Python. Научились мы отличать кита от чайки, но что нам это даст? IFunny серьёзно делает весёлое приложение и хочет удивлять пользователей новыми фичами, так почему бы не изучить такое богатое направление и применить?

Прочитав этот разбор, вы станете на шаг ближе к просветлению. Готовы? Тогда хватайте ручку, бумагу и приступаем!

И да, можно смело считать эту статью мануалом по установке, причём пошаговым, но можно и обращаться к ней в случае, если вылезла ошибка, а Google отводит глаза в сторону или выдаёт в поисковике несусветную чушь.

Приступая к установке

Немного не доходя до момента, когда нужно написать первый git clone для их проекта, остановимся на этапе железа и окружения.

Вроде бы всё прозрачно и красиво. Но. Начнём с железа. Проект очень и очень требовательный. Особенно к памяти, свопу и видеокарте. Изначально сборка велась на AWS-инстансе с конфигурацией:

  • OS: Linux Redhat 2017.09 (EC2) → Ubuntu 16.04 LTS
  • CPU: 16 x Intel® Xeon® CPU E5-2686 v4 @ 2.30GHz;
  • HDD: 1 Tb;
  • Swap: 16 Gb →128 Gb (. );
  • RAM: 122 Gb (7 x 16 Gb, 1 x 10 Gb);
  • Graphic adapter: GRID K520 → Tesla M60.

Лучше сразу используйте Ubuntu LTS, поскольку в нём уже есть все необходимые базовые компиляторы последних версий или же несложно обновиться до последних версий. В процессе сборки и запуска будет понятно, почему мы так резко перескочили с одной системы на другую, поменяли видеокарту и накинули своп.

Если хотите собрать всё это из любопытства, чтобы посмотреть, как это работает и поиграться, то обзаведитесь как минимум видеокартой с технологией CUDA. Без неё пытаться запуститься бесполезно. Чтобы понимать, какая видеокарта что может — вот линк на вики.

Видеокарта GRID K520 относится к CUDA capability 3.0+. С ней уже можно работать, но не так быстро как хотелось бы.

Поехали? Или постоим чуть-чуть…

Ставим пакет от Nvidia

Приступаем непосредственно к окружению. Для начала убедимся, что у нас g++ версии не ниже 4.9, иначе в самом конце нас может постигнуть фиаско. Берите самый новый, самый свежий g++, только что из репозитория. Далее ставим свеженькие драйвера от Nvidia.


Для Ubuntu 16.04 всё выглядит попроще:

И вот тут можно поступить по-разному. Официальный мануал требует, чтобы мы скопировали файлы в разные места. Можно согласиться с мануалом и скопировать так, как указано. Но можно поступить проще. Из cuda/include скопировать библиотеки в /usr/local/cuda/lib64 .

Установка Lua и LuaRocks

Дальше. Нам нужна Lua и LuaRocks (ещё один менеджер пакетов — мало нам, мало). Тут всё просто для обеих ОС:

Устанавливаем Torch7 и его зависимости

У нас уже есть luarocks-менеджер зависимостей. А теперь самое интересное: нужно поставить часть зависимостей через LuaRocks (всё не выйдет, иначе поставленное и вовсе не взлетит). Вообще, при установке именно этих зависимостей проблем возникнуть не должно, но тут есть много-много маленьких грабелек (а как же без них).

Torch (должен установиться Torch7).

По идее, ничто не остановит вас в этот момент, кроме ошибки с 'half'. Данная проблема решается следующим образом: сначала выполняем в консоли команду

Затем запускаем установку заново.

COCO API: собирается только из исходников, но хотя бы ставится без проблем.

image: проблем нет. Ставим через luarocks: luarocks install image

tds: внезапно это не пакет и вообще ставить надо lua ffi

cjson: по идее проблем нет, разве что пакет называется json.

nnx: и вот тут засада. Вы ведь уже порадовались собранному фреймворку Torch? Тогда клонируем репозиторий в корень torch и ПЕРЕСОБИРАЕМ его целиком. Здесь необходимо уточнить, что сразу собрать с nnx не удастся, в его зависимостях как раз указаны пакеты COCO API, image, tds и cjson.

optim: проблем не найдено, ставится напрямую luarocks install optim .

inn: аналогично luarocks install inn .

Вроде бы всё поставили. Но не покидает чувство что что-то забыли… Что-то важное… Так и есть. Сам проект кто клонировать будет?

Устанавливаем модели для обучения

Затянули? Молодцы. А вот теперь будет самая долгая часть. Скачиваем обучающие паки и сетки. И у нас есть два пути. Первый путь — скачать готовые модели и, не обучая сеть, сразу приступить к проверке своей картинки (тут можно смело пропускать шаг тренировки нейросети и сразу ставить зависимости дальше).

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

Решаем ошибки с CUDA

Теперь у нас есть необходимые наборы для тренировки нейросети и валидации тренировки. Кажется, что есть.


Смотрим trace. Хм… Очень похоже на то, что не хватает установленных зависимостей: cunn, cudnn установился криво. Ладно, переустанавливаем. Но дело не в них. Let's make an investigation! Проверяем дальше. Пробуем снова установить cutorch и… Бинго! Модуль cwrap не обнаружен.

Устанавливаем, что ж ещё остаётся делать.

И тут мы снова получаем ошибку, что модуль cwrap не установлен. WTF? Не буду углубляться в механику LuaRocks, но именно пакет cwrap нельзя поставить вот так, сходу. Копаемся в помощнике и находим следующее: «в случае если пакет установлен, но по сути его нет, примените директиву --local». Пакет Шрёдингера. Вроде есть, но его нет. Ладно.


И снова те же грабли. А вот это уже не смешно. Ставить всё это под sudo категорически не рекомендую. Ну вот зачем математическому пакету суперпользователь? Несколько шагов, которые помогают установить этот пакет из rockspec-файла. Проверьте пути LUA_PATH и LUA_CPATH и выполните следующие команды:

Обучаем нейросеть (если модели были скачаны — пропускайте этот шаг)

Справились. Пора приступать к обучению нейросети. Дальнейшие действия могут занять и несколько суток! Внимательно смотрите на те опции, с которыми запускаете тренировку и валидацию!

Итак, приступим. Раз уж нам достался такой мощный инстанс, что же нам мешает загрузить по максимуму процессоры?

Упс… А ведь Nvidia установила свои библиотеки и отмахивается от всяких vcc --version правильной инфой. Только вот библиотеки лежат в /home/ubuntu/cuda/lib64/libcudnn.so.5 . А это значит, что в самый конец файла .bashrc добавляем директиву:

По идее, нас ждёт счастье, но нет. Мы снова можем наступить на грабли. Достаточно серьёзные.
В случае, если грабли найдены не были, то увидите текст, похожий на текст на скриншоте.




Если не сконвертировались модели с ошибкой T_END

Если вас постигла такая замечательная ошибка, то нужно сделать просто серию замечательных шагов:

Если не сконвертировались модели из-за нехватки памяти

Пересобрали. Доустановили. Запускаемся опять с теми же опциями и видим:

Обучаем нейросеть

Вот теперь приготовления завершены. Все модели есть, сети есть, изображения для тренировки и валидации есть. Снова запускаем. Попробуем максимально нагрузить.

Параллельно смотрим htop (не самая лучшая идея, поскольку он не покажет разделение потребляемой памяти по типу).




Мягко говоря, жарковато. Напоминаю: 16 физических процессоров, каждый по 8 ядер, с виртуализацией. И память. Неудивительно, что через несколько минут работы терминал выдал «Убито»!

Повторяем попытку, делаем условия "полегче":

Ещё раз. Использованные 154 Гб памяти — это все банки RAM, часть свопа и часть виртуальной памяти. Останавливаем. Остановка через kill или Ctrl + C не критична вообще. При перезапуске обучения все старые модели затираются.

Даже на амазонской машине можно спокойно оставить скрипт работать и идти заниматься своими делами часа полтора-два.

Как не терять сессию при работе с инстансом Amazon

Кстати, важная пометка: чтобы увидеть, что что-то получилось, результаты тренировки нейросети и т.д., при работе через ssh используйте screen. Внезапно пропала связь и прочее? Не беда. Переподключились к машине, ввели screen -r — и мы снова видим то, на чём вылетели.

Опция -nthreads 4 вымучена перезапусками и засеканием времени тренировки нейросети. Потому что при большей загрузке начинается конкуренция за оперативную память, а параметров у нас очень и очень много (в сумме 17 млн).

На обучающую выборку в 85К изображений. Кстати, каждый чётный шаг обучения скрипта проводит валидацию нейросети.

Вывод в консоль информации по обучению, 16 потоков, 12 эпох

Провели обучение и можно приступать к следующему этапу. На основе полученных DeepMask-моделей необходимо сгенерировать SharpMask.

Если была запущена тренировка с другими параметрами, то название папки с моделями будет иное. Но основной путь до неё тот же. Пока идёт обучение DeepMask или построение SharpMask, продолжим установку.

Ставим google-glog

С ним проблем не возникло, потому что он и правда простой и беспроблемный.

Multipathnet, fbpython и целый ворох зависимостей

Теперь от нас всего-то требуется клонировать проект multipathnet, установить к нему зависимости и запустить распознавание. Кажется, я где-то уже слышал что всё «легко и просто».

Не пытайтесь ставить fbpython через Conda или Anaconda и прочее. Как выражается Facebook в инструкции: note that this won't work with anaconda as it ships with it's own libraries which conflict with torch. Если перевести примерно и с долей юмора, то «это их собственная баржа, на ней свои заморочки и свой капитан».

Итак, кто-то опять умолчал о зависимостях.

Гуглим во все стороны, что это за переменные и почему их у нас до сих пор нет.

Я считаю, это прекрасно. Ещё небольшой зоопарк. Ладно. Для тех, кто на Ubuntu:

Дальше всё идёт только для Ubuntu, посколько на RHEL было бессмысленно пытаться обновить всё окружение. На момент написания статьи дальше в RHEL продвинуться просто было невозможно, ограничение на максимальную версию пакетов для инстансов «Амазона» тому виной.

Пользователи Linux могут самостоятельно продолжить установку пакетов, но искать необходимые пакеты необходимо будет вам (ну а если в процессе наткнетесь на грабли — добро пожаловать в комментарии, с радостью помогу решить проблемы).

Ставим fbthrift

НИКОГДАне трогайте build_folly_fbthrift.sh. Иначе придётся откатиться к моменту, когда ничего нет, кроме тренировки модели.

И теперь думаете, что счастье есть и можно устанавливать thpp. Как показала практика — нет. Упираетесь в тысячу косяков… Fbthrift! Для начала:

Это установит недостающий thrift_compiler. Далее оказывается, что вообще отсутствует frontend.so. Забыли скомпилироть и положить в папку. Ну ладно (для справки: ниже строка генерации frontend.so для g++

Если у вас чего-то не хватает, скомпилируйте сами. Такое ощущение, что дальше еще и дописывать придется за них код. И предчувствие не обмануло.

Если поймали ошибку вызова методов с неправильным количеством параметров

Вооот, теперь нас ждёт счастье. Ну почти. Добрые самаритяне из Facebook поменяли вызовы функций в torch7, но между делом забыли сделать правильный вызов в thpp. Как мило.

Собираем пакет заново, но это ещё не всё.

Ставим fblualib

Поставим, вдруг упустили. Не мудрено с такой «простой» инструкцией от разработчиков. Проверили, что у нас есть numpy для ВСЕХ версий питона.

Выдаст ошибку при компиляции типа «недоопределённый тип». Всё просто. В файле с ошибкой правим определение типа luaL_reg на luaL_Reg (ЗАЧЕМ меняли вызов, я не знаю!)

Исправили вызов — попробовали. Скомпилировалось? Можно радоваться.

В принципе, уже после данных манипуляций можно было бы просто из

/fblualib/fblualib ещё раз вызвать ./build.sh , но это уже дело вкуса — руками надёжнее.

Запускаем построение SharpMask для обученной нейросети

По идее, мы уже достигли дна, в смысле — дошли до конца инструкции по установке. Осталась самая приятная часть. Кстати, как раз закончился процесс создания SharpMask.

Вполне себе хорошие данные для дальнейшей работы с моделями. Не забывайте добавлять в LUA_PATH /home//?.lua и в .bashrc тоже. Исходя из опыта установки всего проекта и тренировки моделей, просто сделайте линки из multipathnet на deepmask/data и линки sharpmask/model.t7 и deepmask/model.t7 и не занимайтесь копированием файлов.

Если не запускается из-за ошибки в тестах

Из файла fbcoco.lua убираем следующие строки:

Теперь точно не зависнет и не сегфолтнется.

Долгожданная проверка!

Пора запускать проверку!



Очевидно, на картинке собака! Пора подвести итоги.

Результаты бега по граблям

Вы сделали это! И стали на шаг ближе к просветлению. А если ещё и прошли по всем граблям (и даже нашли пару новых, в чём я совершенно не сомневаюсь), то, однозначно, можете зависать над землёй на высоте трёх ци и легко устанавливать все зависимости для проекта одним движением брови.

Задачка была не из лёгких, а информации в интернете было очень и очень мало, особенно по багам с несовместимостью версий.

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

Вообще сам набор после нормальной сборки и приведения в рабочий вид оставил приятное впечатление, если бы не процесс приведения в чувство всей этой Санта-Барбары.

Все трудности преодолели, теперь можно немного поговорить о планах на будущее. А они у нас далекоидущие: в целях эксперимента перейти на CUDA 9.1, cuDNN 7, который обещает почти тройной прирост производительности для алгоритмов свёрточной нейронной сети и усовершенствованной свёрточной нейронной сети. Правда, это потянет за собой пересборку части пакетов (точнее, пересборку inn, cunn, cudnn, cutorch через LuaRocks и правку зависимостей).

Буду рад ответить на ваши вопросы, а если расскажете о собственных граблях, постараюсь разобраться и помочь!

Всё началось с Moonscript и Haxe: мне захотелось поразвлечься с этими новыми для меня языками. Оба позволяют транспилировать свои программы в Lua, а Lua, на мой взгляд, это один из наиболее актуальных языков, поскольку много какое используемое мною ПО позволяет на нём писать внутренние скрипты.

В Lua .hx (Haxe) транспилировался, но выполняться отказался, требуя модуль lua-utf8 . Его необходимо было поставить через luarocks .

На мой взгляд, luarocks документирован плохо и совершенно не очевидно, как оно работает. А работает он так.

luarocks при запуске ищет в директориях по умолчанию ( c:\users\user\appdata\luarocks ) конфигурационный файл, имя которого зависит от версии Lua. В моём случае это config-5.3.lua .

В этом файле много чего требуется написать. У меня конфиг сейчас выглядит вот так:

При таких настройках библиотеки нормально собираются (за исключением тех, которые имеют типично линуксовые зависимости) в dll и кладутся в папку C:\Users\user\AppData\Roaming\LuaRocks\lib\lua\5.3 (см. deploy_lib_dir ).

После этого создадим C:\Lua\includes и положим туда файлы заголовков из lua-5.3.6_win64_dllw6_lib.zip , а .dll и .a положим в C:\Lua\lib .

Для точности хорошо бы ещё добавить к LUA_CPATH строки C:\Users\user\AppData\Roaming\LuaRocks\lib\lua\5.3\?\core.dll и .\?.dll .

На будущее сразу стоит добавить переменную окружения LUA_PATH : LUA_PATH=C:\Users\user\AppData\Roaming\LuaRocks\share\lua\5.3\?.lua;C:\Users\user\AppData\Roaming\LuaRocks\share\lua\5.3\?\init.lua .

Людям, не понимающим, как работает вызов функций в сишных библиотеках, возможно придётся помучаться, потому что правильно собрать эти библиотеки тоже надо уметь (немаловажно, чем собирать и под какую архитектуру). Самый важный параметр в этом — MSVCRT в конфиге, потому что содержимое этого параметра передаётся компилятору при сборке (для gcc , которым я собираю, получается -lmsvcrt ).

Теперь заголовки лежат на своём месте, компилятор найден, нужная библиотека функций Windows линкована динамически.

Командой luarocks install luautf8 скачиваем и собираем библиотеку. После того, как она установится, можно попробовать запустить интерпретатор, набрав в строке lua -l lua-utf8 .

Теперь Lua-код, транспилированный из Haxe, исполняется и показывает юникод (проверено).

Изменение файлов .proto

Если у вас Windows, то далее нужно проделать некоторые манипуляции:

  1. Файлу protoc-plugin/protoc-gen-lua технически является скриптом на Python, поэтому желательно добавить ему расширение .py : protoc-plugin/protoc-gen-lua.py ;
  2. Рядом с файлом protoc-plugin/protoc-gen-lua.py создать файл protoc-gen-lua.bat следующего содержания:

, где вместо MY_PATH подставить директорию с файлом protoc-plugin/protoc-gen-lua.py (например, D:\projects\protobuf-lua-master\protoc-plugin\ )

Компиляция файлов .proto

Допустим, в директории D:\my-proto-files имеется некий файл facebook.proto следующего содержания:

Подробный мануал по синтаксисам protobuf можно найти здесь: proto3 и proto2.

Чтобы превратить его в соответствующий .lua-файл, нужно сделать следующее:

  1. В командной строке запустить компилятор protobuf ( папка_с_protobuf/bin/protoc.exe ) со следующими параметрами: --plugin=protoc-gen-lua=PATH_TO_BAT_FILE --lua_out=PATH_OUT --proto_path=PATH_TO_DIR_WITH_FILE PATH_TO_PROTO_FILE , где
  • PATH_TO_BAT_FILE -- путь до файла protoc-gen-lua.bat ;
  • PATH_OUT -- директория, в которую надо поместить скомпилированный .lua-файл;
  • PATH_TO_DIR_WITH_FILE -- директория, в которой компилятор будет искать импортируемые .proto-схемы. Является необязательным параметром и пригождается в случае импортирования .proto-схем в другие .proto-схемы;
  • PATH_TO_PROTO_FILE -- путь до компилируемой .proto-схемы.

Например, полная команда может выглядеть так:

Компилировать можно как несколько файлов в одной директории, так и несколько файлов в разных директориях:

Более подробную инструкцию найдёте в мануале к компилятору protoc .
На выходе получится файл facebook_pb.lua , который можно подключить и использовать в своём скрипте:

При этом подразумевается, что protobuf-lua установлена в качестве библиотеки в ваш Lua-интерпретатор:

  1. директория protobuf из инструмента protobuf-lua находится в директории подключаемых модулей вашего Lua-интерпретатора. В случае с QUIK это папка %PATH_TO_QUIK%/lua/ , в случае standalone-интерпретатора это обычно директория самого интепретатора.
  2. файл pb.dll находится в директории подключаемых библиотек вашего Lua-интерпретатора. В случае с QUIK это директория %PATH_TO_QUIK%/Include/protobuf/ , в случае LuaForWindows это директория %PATH_TO_LUA%/clibs .
    Подробнее об установке protobuf-lua в качестве Lua-библиотеки можно прочесть в пункте protobuf-lua.

TO BE DESCRIBED

Самостоятельная сборка библиотек

Для того, чтобы определиться со списком необходимых инструментов, нужно понять, что мы будем делать. Конечной задачей всех манипуляций является получение DLL-файла, к которому будет обращаться Lua-интерпретатор при использовании Lua-библиотеки protobuf-lua . Исходный код целевого файла находится в файле protobuf-lua/protobuf/pb.c . Заглядывая в этот файл, видим, что там подключаются заголовки типа lua.h , lualib.h -- это заголовочные файлы Lua-интерпретатора.
Соответственно, нам нужен компилятор C и заголовочные файлы Lua-интерпретатора (а лучше сразу весь дистрибутив интерпретатора, на всякий случай).

Использовался GCC следующей версии:

В терминале MSYS переместиться в папку protobuf-lua/protobuf , где находится файл pb.c ;

Чтобы файл скомпилировался под Windows, нужно убрать/закомментировать строчки 23-33:

Эти строчки можно убрать безболезненно, т.к. процессоры архитектуры x86 и amd64 имеют little endianness, так что препроцессор не вставит функции из endian.h , которые используются далее в файле, в конечный код.

, где %PATH_TO_LUA% -- путь до дистрибутива интерпретатора Lua, %libraries_folder% -- папка с .dll-библиотеками Lua, %lua_library% -- имя .dll-библиотеки Lua.

  • %PATH_TO_LUA% -- D:/programs/LuaRocks/include
  • %libraries_folder% -- D:/QUIK
  • %lua_library% -- qlua
  • Итого: gcc -O3 -shared -o pb.dll pb.c -ID:/programs/LuaRocks/include -LD:/QUIK -lqlua

Линковать лучше с прокси-библиотекой Lua ( qlua.dll ), которая поставляется в коробке с QUIK. Не уверен, что если слинковаться с DLL из, например, Lua for Windows, или с той, что поставляется с LuaRocks, то всё будет работать. Линковка с прокси-библиотекой lua5.1.dll, которая находится в корне QUIK, технически осуществима, но на деле при запуске скрипта происходит ошибка из-за того, что pd.dll вызовет загрузку lua5.1.dll, которая не загружается по умолчанию, и чтобы её загрузить, загрузчик начнёт рыться в системных путях. У меня в системных путях никакой lua5.1.dll не было, от того и возникала ошибка. Линковка с qlua.dll не вызывает таких проблем, т.к. эта библиотека на момент загрузки pb.dll уже загружена терминалом.

Установка в Lua-интерпретатор

В сущности, нужно проделать два шага:

  1. Директорию protobuf с .lua-файлами библиотеки поместить в место, откуда Lua-интерпретатор резолвит Lua-модули, загружаемые директивой require .
  2. Файл pb.dll обернуть в директорию protobuf , и положить эту директорию в место, откуда Lua-интерпретатор резолвит бинарные модули (dll, lib, so, a и т.д), загружаемые директивой require .
  1. Директорию protobuf с .lua-файлами библиотеки, находящуюся в директории protobuf-lua , поместить в %PATH_TO_QUIK%/lua/ ;
  2. Файл pb.dll нужно поместить в директорию %PATH_TO_QUIK%/Include/protobuf/ , где %PATH_TO_QUIK% -- путь до терминала QUIK (например, D:/QUIK ). Если папки Include нет, необходимо её создать.
  1. Директорию protobuf с .lua-файлами библиотеки, находящуюся в директории protobuf-lua , поместить в директорию c Lua-интерпретатором.
  2. Файл pb.dll нужно поместить в директорию %PATH_TO_LUA%/clibs/protobuf , где PATH_TO_LUA -- путь до директории с Lua-интерпретатором.

Для сборки Lua-биндинга для ZeroMQ lzmq нам понадобятся:

  1. менеджер Lua-пакетов LuaRocks ;
  2. Microsoft Visual Studio с компонентами для разработки на C/C++. От выбранной версии (помимо всяческих доработок компилятора) будет зависеть максимальная версия toolset'а (следовательно, версия VC++ redistributable package -- набор библиотек, которые надо будет поставить на систему, в которой будет крутиться QUIK и RPC-сервис).

Разархивировать, в командной строке Windows (cmd.exe) перейти в разархивированную папку.

Установить: install.bat /NOREG /L /P %PATH_TO_LUAROCKS% , где %PATH_TO_LUAROCKS% -- путь, куда нужно установить LuaRocks. Например, D:/Programs/Lua/LuaRocks .

Почитав мануал, опции для установки можете настроить по своему вкусу. Например, /L значит "установить также дистрибутив Lua в папку с LuaRocks" -- он нам пригодится далее, т.к. не у всех стоит отдельный дистрибутив Lua.

Шаги по сборке lzmq

Lua-биндинг lzmq линкуется с DLL ZeroMQ, поэтому нашей задачей будет собрать эту DLL.

Ответ: в RPC-сервисе используется аутентификация в том числе с помощью механизма CURVE, который был реализован после версии 4.0.4 (на текущий момент, эта версия -- самая новая из тех, что есть по вышеуказанной ссылке). Соответственно, эти DLL нам не подходят, и нужно собирать более новую версии libzmq самим.

Кстати, о CURVE. Это протокол, использующий криптографию, и в ZeroMQ он реализуется с помощью криптографических библиотек: libsodium или nacl . В RPC-сервисе он используется для аутентификации и шифрования. Для сборки libzmq я выбрал libsodium , так что надо будет собрать и её.

Суммируя вышесказанное, шаги по сборке lzmq следующие:

  1. Собрать LIB (для статической линковки) или DLL (для динамической линковки) библиотеки libsodium ;
  2. Собрать DLL libzmq , слинковав её с libsodium ;
  3. Установить lzmq в LuaRocks , слинковав её с собранной ранее библиотекой libzmq .
  4. Установленную lzmq переносим в директорию терминала QUIK.

Разбираемся с каждым шагом подробно

Шаг 1: Сборка libsodium

Шаг 2: Сборка libzmq

Шаг 3: Установка lzmq с помощью LuaRocks

  1. LuaRocks
  2. Developer Command Prompt for VS %YOUR_VISUAL_STUDIO_VERSION% -- командная строка разработки от Visual Studio. Можно её не ставить, но тогда нужно убедиться, что директория с компилятором cl и линкером link от Visual Studio находится в PATH .

Читайте также: