Как изменить луа скрипты

на форуме есть тема 'помощь в изменении скриптов' туда часто кидают луа скрипты и просят заменить команду в этом гайде я покажу как заменить команду или любую другую активацию. 1.Узнать активацию скрипта Если скрипт активируется командой это функция - sampRegisterChatCommand Активация клавишами...

Carlos777


  • #1

Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

на форуме есть тема ‘помощь в изменении скриптов’
туда часто кидают луа скрипты и просят заменить команду
в этом гайде я покажу как заменить команду или любую другую активацию.

1.Узнать активацию скрипта
Если скрипт активируется командой это функция — sampRegisterChatCommand
Активация клавишами ( как чит-кодом ) — testCheat
Нажатие одной кнопки — isKeyJustPressed

Рассмотрим на примере sampRegisterChatCommand.

1.Если скрипт скомпилированный и не под протектором, и не под хайдером.
Можно легко заменить команду в любом HEX-редакторе.
Зайдем к примеру на сайт — (тык)
Справа в панели вводим название команды и меняем её.
Нажимаем на буквы команды и меняем их.
Но есть один минус — вы сможете заменить команду на команду такой же длины.
Можно конечно установить любую длину, но нужно заниматься памятью и изменять размеры прототипов.

1599992170001.png

2.Если скрипт скомпилированный и под протектором, хайдером и остальным мусором.
Вообще его можно использовать в любом скрипте, этим способом можно
заменить команду на команду любой длины.
Создаем новый луа скрипт
прописываем в нём.

addcommand = sampRegisterChatCommand -- sampRegisterChatCommand функция которую хотим заменить

function sampRegisterChatCommand(cmd, ...)
  if cmd == 'cpf' then --  команда которую хотим заменить
    cmd = 'guide' -- команда НА которую хотим заменить
  end
  return addcommand(cmd, ...)
end

Компилируем его с помощью компилятора LuaJIT, заходим на сайт
(тык)
Заходим во вкладку ‘Joiner’
Выбираем первым скриптом — скрипт в котором хотим заменить команду
Выбираем вторым скриптом — скомпилированный скрипт который мы только-что написали.

Качаем, и вставляем в папку.

Надеюсь гайд был понятным, и теперь вы небудете кидать скрипты в ‘Помощь в изменении’.​

  • #2

Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Когда уже гайд как делать лоадеры, мы уже заждались

Carlos777


  • #3

Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Когда уже гайд как делать лоадеры, мы уже заждались

нет

Перенос статьи

Эта тема была перенесена из блока «Статьи». Автор оригинала: Krutoy.

6DxDx3P.png
Как известно, чем лучше инструмент, тем выше скорость работы.
Я программирую на Lua больше года, и перепробовал множество инструментов.
В этой статье я покажу, какие есть инструменты для успешного программирования на Lua для двух модов Minecraft’а: ComputerCraft и OpenComputers.

1. Внутриигровой редактор

AKhf1fDm.pngb6CWlfhm.pngKeOwSvfm.png

Умеет уйму недостатков и неудобен в работе, за то всегда под рукой.
Для ComputerCraft есть программа «LuaIDE», которая входит в состав операционки OneOS (второй скрин)
Для OpenComputers пока редакторов кроме стандартного нет.
Пара советов для редактора OC:

  • Для быстрого поиска существующего файла в консоли введите первые символы и жмите TAB, например edit i [TAB] —> edit /init.lua
  • Для удаления всей строки нажмите CTRL+DELETE

2. Текстовые редакторы

8d7312xm.pngu9VGa7Tm.pngCCbMnm.png

Их несколько:

  • Notepad++
    Стандарт скриптовика. Прост и легок в обращении. Плюсы — малый размер, куча плагинов и расширений. Лучшее средство для начинающего программиста Lua.
  • Sublime Text
    Более продвинутый инструмент. Плюсы — расширенный интерфейс, выбор из разнообразных тем, поддержка плагинов, включая подсветку ошибок при написании кода.
    Сам пользуюсь этим редактором на компе, расширив плагинами Corona EditorLua LoveSublime Linter — lua
  • SciTE, Atom
    Для хипстеров. По функционалу такие же как выше.

Для удобной работы с компьютерными модами есть несколько приемов:

— Через папку сохранения в одиночной игре:
В Windows это папка, примерно C:UsersUserNameAppDataRoaming.MCServerNamesavesComputersopencomputersaddress-address-add-addrs
Сохраненные файлы в папке жесткого диска игрового компьютера будут тут же там обновляться.
Не забудьте изменить в конфиге configOpenComputers.cfg значение bufferChanges на false

— Через Pastebin:

  • Пишете код в редакторе
  • Вставляете его на Pastebin
  • Вписываете код для запуска в игре (заменив XXXXXX на код пасты):
  • pastebin get XXXXXX name

— Через облачное хранилище с прямыми ссылками:

  • Сохраняйте и работайте с файлами прямо в папке облачного хранилища, с возможностью доступа по прямым ссылкам.
    Например, в дропбоксе это папка Public (в новых аккаунтах ее нет)
  • Загружайте обновленные файлы на ОС компьютер через интернет-плату программой wget, получив прямую ссылку на файл, например:
    wget -f https://dl.dropboxusercontent.com/u/12345678/file.lua
  • Для удобства вы можете написать короткую программу, которая при нажатии клавиши, например F5, будет выполнять такую загрузку автоматически

3. IDE

yWb7wdcm.png TqQHadwm.png szuWwI3m.png

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

Рассмотрим по отдельности:

  • ZeroBrane Studio 
    Суперлегкая (у меня занимает 17мб оперативки) и быстрая кроссплатформенная IDE. Визуальные темы, мониторинг переменных, выделение локальных и глобальных переменных, проверка на неиспользуемые переменные и прочие ништяки.
  • Lua Development Tools
    Преимуществ от ZeroBrane практически нет, скорее минусы в роде отсутствие темной темы и требовательности к оперативке.
  • Cloud 9
    Облачное браузерное IDE.
    По стандарту отсутствует отладка. Ее нужно устанавливать в проект самостоятельно.
    Плюс — вам не нужно ничего устанавливать на компьютер. Но самое приятное, что к каждому файлу в этой IDE можно обратиться по постоянной прямой ссылке, что крайне упрощает заливку файла в игру. Так же, вы можете раздавать ссылку на проект другим и совместно редактировать код.

Сам я использую Sublime для быстрого редактирования файлов, LDT для больших проектов на стадии написания кода, Cloud9 для совместных проектов с другими программистами, и для отладки текущих проектов в игре.
О ZeroBrane Studio узнал совсем недавно, поэтому планирую перейти на нее в ближайшее время, что и другим советую.

How to create and run as well as manage Lua scripts

Jump to:

  • To run a Lua script
  • To run a Lua script when launching Netfabb
  • To add a Lua script to the library
  • Editing a Lua script
  • Using the debugger

To run a Lua script

  1. Open the Lua Script Library through Prepare > Run Lua Script. Use the appearing dialog to load, save, and execute Lua scripts as well as to create new ones.
  2. Select the script to be run.
  3. Click Execute Script.

Top

To run a Lua script when launching Netfabb

A command-line option allows running a Lua script in Netfabb when you launch it.

  1. Navigate to the installation folder of Netfabb, typically C:Program FilesAutodeskNetfabb Ultimate 2019.
  2. Find the netfabb.exe executable and create a shortcut to it.
  3. Edit the shortcut and add «/startluascript=pathtoluascript.lua» to what is already specified in the Target: field, adjusted for your Lua script file’s respective path and name.
  4. Click Apply.

With a shortcut provisioned like this, you can have Netfabb load a Lua script right at launch.

Note: You cannot provide start parameters for the script itself similar to how you would call the Lua interpreter with the script name and start parameters for that script. Instead, you will have to use different means to communicate the startup parameters, such as by writing a file, for example. For a working example for this visit this response in the Netfabb forum.

Top

To add a Lua script to the library

The library has two options to make a new script available for execution in Netfabb:

  • Duplicate an existing script: Right-click an existing script and choose Duplicate. The duplicate is added to the library with the _Duplicated suffix.
  • Create a new script: Add the bottom of the library window, click New Script. In the new dialog, you may provide a name and a description. You can now type or paste your Lua code into the code window, or use the Import Script function to load code from a file.

Top

Editing a Lua script

To begin editing a script, choose Prepare > Run Lua Script, select the script to be edited, and click Edit Script.

Ctrl+Z is available for undoing changes.

Use Check Syntax to have Netfabb test for mistakes like missing quotation marks or closing brackets.

To save any changes, click Apply Changes, otherwise click Cancel to discard them. Both buttons close the dialog and return to the library.

Top

Using the debugger

To begin debugging a script, choose Prepare > Run Lua Script, right-click the script to be debugged, and choose Run Debugger from the context menu.

Flow controls

  • Next steps through each line of code. It does not jump into functions, however, but executes them whole.
  • Step into follows a line’s jump into functions so that you can step through the function’s individual lines.
  • Step out executes the rest of the function immediately and returns to the line after the one that called the function.

    Note: Any remaining functions called on the same level and in the same line are executed immediately as well. If you require a deeper insight into executing multiple functions, even nested functions, consider using breakpoints instead or in addition to stepping into and out of functions.

  • Continue executes the rest of the entire script and closes the debugger.

Debugging read-outs

  • Global variables: Variables that are always defined and available
  • Local variables: Variables which are valid and available in the current scope only
  • Breakpoints: Position the cursor on a line, verify that the correct line is displayed, such as lua:18, then click Add to place a breakpoint. Select a breakpoint in the list and click Remove to discard it.
  • Log: Any logging calls (using system:log()) are reproduced here regardless of the current logging channel.
  • Stack: Displays the current stack counter

Top

How to create and run as well as manage Lua scripts

Jump to:

  • To run a Lua script
  • To run a Lua script when launching Netfabb
  • To add a Lua script to the library
  • Editing a Lua script
  • Using the debugger

To run a Lua script

  1. Open the Lua Script Library through Prepare > Run Lua Script. Use the appearing dialog to load, save, and execute Lua scripts as well as to create new ones.
  2. Select the script to be run.
  3. Click Execute Script.

Top

To run a Lua script when launching Netfabb

A command-line option allows running a Lua script in Netfabb when you launch it.

  1. Navigate to the installation folder of Netfabb, typically C:Program FilesAutodeskNetfabb Ultimate 2019.
  2. Find the netfabb.exe executable and create a shortcut to it.
  3. Edit the shortcut and add «/startluascript=pathtoluascript.lua» to what is already specified in the Target: field, adjusted for your Lua script file’s respective path and name.
  4. Click Apply.

With a shortcut provisioned like this, you can have Netfabb load a Lua script right at launch.

Note: You cannot provide start parameters for the script itself similar to how you would call the Lua interpreter with the script name and start parameters for that script. Instead, you will have to use different means to communicate the startup parameters, such as by writing a file, for example. For a working example for this visit this response in the Netfabb forum.

Top

To add a Lua script to the library

The library has two options to make a new script available for execution in Netfabb:

  • Duplicate an existing script: Right-click an existing script and choose Duplicate. The duplicate is added to the library with the _Duplicated suffix.
  • Create a new script: Add the bottom of the library window, click New Script. In the new dialog, you may provide a name and a description. You can now type or paste your Lua code into the code window, or use the Import Script function to load code from a file.

Top

Editing a Lua script

To begin editing a script, choose Prepare > Run Lua Script, select the script to be edited, and click Edit Script.

Ctrl+Z is available for undoing changes.

Use Check Syntax to have Netfabb test for mistakes like missing quotation marks or closing brackets.

To save any changes, click Apply Changes, otherwise click Cancel to discard them. Both buttons close the dialog and return to the library.

Top

Using the debugger

To begin debugging a script, choose Prepare > Run Lua Script, right-click the script to be debugged, and choose Run Debugger from the context menu.

Flow controls

  • Next steps through each line of code. It does not jump into functions, however, but executes them whole.
  • Step into follows a line’s jump into functions so that you can step through the function’s individual lines.
  • Step out executes the rest of the function immediately and returns to the line after the one that called the function.

    Note: Any remaining functions called on the same level and in the same line are executed immediately as well. If you require a deeper insight into executing multiple functions, even nested functions, consider using breakpoints instead or in addition to stepping into and out of functions.

  • Continue executes the rest of the entire script and closes the debugger.

Debugging read-outs

  • Global variables: Variables that are always defined and available
  • Local variables: Variables which are valid and available in the current scope only
  • Breakpoints: Position the cursor on a line, verify that the correct line is displayed, such as lua:18, then click Add to place a breakpoint. Select a breakpoint in the list and click Remove to discard it.
  • Log: Any logging calls (using system:log()) are reproduced here regardless of the current logging channel.
  • Stack: Displays the current stack counter

Top

Одной из отличительных особенностей всех продуктов комплекса НЕЙРОСС и, в частности, IP-контроллеров БОРЕЙ, ЯРС v.1 (снят с производства!) и других является возможность модификации и расширения алгоритмов работы продукта посредством скриптов автоматизации. С помощью скрипта возможно, например, изменить или полностью заменить алгоритм доступа в контроллере БОРЕЙ. Или реализовать логику сопряжения со внешней информационной системой по протоколу HTTP. Или управлять исполнительными устройствами по заданному алгоритму.

В данном документе приведены общие сведения о скриптах автоматизации, их возможностях и руководство программиста по написанию таких скриптов.

ВНИМАНИЕ

Скрипт автоматизации может существенно изменить «заводскую» логику работы продукта. Потому разработку скрипта рекомендуется проводить только опытному пользователю. Производитель продукта не несёт ответственности за несоответствие реальных и заявленных свойств продукта в случае, если такое расхождение возникло вследствие внесения изменений в скрипт автоматизации.

Оглавление

Общие сведения

Скрипт автоматизации — текстовый сценарий, выполнение которого осуществляется программными средствами продукта.

Данный сценарий всегда один. Он может быть пустым — в таком случае скрипт не делает ничего. В скрипте могут быть команды управления — они выполняются по мере выполнения скрипта.

Скрипт автоматизации должен быть написан на языке Lua (версия 5.1). Разработчику доступны стандартные средства языка (операторы, структуры данных и др.), часть функций стандартной библиотеки (см. далее), а также наборы констант и функций, определённых в прикладных Lua-модулях продукта. Прикладные Lua-модули специально разработаны для упрощения написания скриптов и двустороннего взаимодействия с программными средствами продукта — чтобы можно было из скрипта вызывать какие-либо функции продукта или, наоборот, передавать управление в скрипт в процессе функционирования продукта.

В разных продуктах могут быть доступны разные прикладные модули. Так, модуль управления доступом pacs.lua недоступен (не работает) в ИГНИС и, наоборот, функции ИГНИС в модуле ignis.lua не работают в контроллере БОРЕЙ.

Скрипт автоматизации выполняется в «песочнице» — защищённом окружении. Если в ходе работы скрипта возникает ошибка, то выполнение скрипта просто прерывается — нарушается работа функций, так или иначе связанных со скриптами (например, алгоритмов доступа), НО общая работоспособность продукта сохраняется, на стабильность работы программных средств поведение скрипта не влияет.

ВНИМАНИЕ

В случае IP-контроллеров (БОРЕЙ, ИГНИС и пр.) скрипт автоматизации является изменяемыми данными также, как любые другие конфигурационные данные продукта (как, например, настройки сетевых интерфейсов или параметры доступа). Потому после внесения изменений в скрипт, успешной отладки и апробации сценария ОБЯЗАТЕЛЬНО создавайте резервную копию. Резервная копия будет содержать скрипт автоматизации, и в случае, если файловая система на SD-карте вдруг будет повреждена, скрипт будет восстановлен вместе с остальными конфигурационными данными из резервной копии.

Как редактировать скрипт

Для удобство редактирования и отладки скрипта автоматизации предназначен текстовый online-редактор, доступный в наших продуктах по адресу http://[ip-address]/lua-editor/ или http://[ip-address]/internal/lua-editor/.

  1. В левом блоке — текст скрипта автоматизации. Внесите в него изменения, для сохранения нажмите на кнопку «Сохранить» внизу.
  2. В правом блоке можно просматривать lua-код модулей и сниппеты — примеры скриптов автоматизации. Для просмотра сниппета или модуля выберите его в раскрывающемся списке под правым блоком.
    1. Lua-код модулей обычно содержит определение констант, структур, функций, а также обеспечивает удобную для разработчика «обёртку» на доступными функциями основных программных средств.
      ЗАМЕЧАНИЕ: в списке обычно можно посмотреть Lua-код всех модулей всех продуктов, их можно подключить к скрипту автоматизации, но фактически «отсутствующий» модуль просто не будет работать.
    2. Сниппеты — блоки кода, из которых можно почерпнуть идеи при разработке скрипта. Или можно скопировать «куски» сниппета в свой скрипт. Библиотека сниппетов постоянно пополняется разработчиками с добавлением примеров создания скриптов автоматизации.
  3. При сохранении скрипта автоматизации выполнение текущего скрипта будет автоматически прервано. После чего будет запущен новый скрипт.

ВНИМАНИЕ

При сохранении скрипта автоматизации полностью перезапускается вся виртуальная Lua-машина, в следствие чего перезапускаются и системные Lua-скрипты — такие, например, как алгоритмы управления доступом и другие.

Скриншот редактора скриптов приведён на изображении ниже.

Как отлаживать скрипт

Сообщения об ошибках в Lua-скрипте, а также отладочные сообщения, выводимые из скрипта с помощью модуля log.lua, записываются в журнал аудита. Просмотр этих сообщений в реальном времени возможен при помощи веб-приложения «Журнал аудита», доступного с веб-страницы Рабочий стол.

  1. Авторизуйтесь в веб-интерфейсе и перейдите на Рабочий стол.
  2. Перейдите в веб-приложение «Журнал аудита».
  3. На второй вкладке «Фильтры» выберите в списке логгер web.
  4. В настройках фильтрации укажите следующие строки (первая строка:
    1. * — OFF
    2. LuaManager — DEBUG
    3. lua_scall — DEBUG
    4. neyross::LogLuaModule — DEBUG
  5. Пример корректно настроенного логгера:
  6. Перейдите на третью вкладку «Живой журнал».
  7. Установите флаги DEBUG, INFO, WARN, ERROR для вывода сообщений всех возможностей уровней тревожности.
  8. При выполнении Lua-скрипта на странице будут появляться соответствующие сообщения. Более свежие сообщения выводятся сверху.

Руководство разработчика

Общие сведения о Lua

Скрипт автоматизации должен быть написан на языке Lua версии 5.1.

Официальный сайт языка Lua (на английском языке) — http://www.lua.org/

Официальная документация по языку Lua версии 5.1 — http://www.lua.org/manual/5.1/ (английский язык)

Перевод документации по языку Lua версии 5.1 на русский язык: http://www.lua.ru/doc/

Также можно ознакомиться с документацией на русском языке для последней актуальной версии Lua (5.3 на момент написания статьи) по ссылке http://lua.org.ru/contents_ru.html. Большая часть содержимого также актуальна и для версии 5.1, поддерживаемой продуктами НЕЙРОСС.

Ограничения стандартной библиотеки

В скриптах автоматизации доступны следующие разделы стандартной библиотеки:

  • Basic Functions
  • Coroutine Manipulation
  • Modules
  • String Manipulation
  • Table Manipulation
  • Mathematical Functions

Следующие разделы недоступны (не могут быть использованы) в скрипте автоматизации:

  • Input and Output Facilities
  • Operating System Facilities

Прикладные Lua-модули

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

Модуль Продукты Краткое описание

alarm.lua

БОРЕЙ
ЯРС
Модуль интеграции с подсистемой охранно-тревожной сигнализации контроллера.

common.lua

Все продукты Модуль общесистемных функций. Получение системных даты / времени, генерация UUID-ов и так далее.

deviceio.lua

БОРЕЙ
ЯРС

fec.lua

БОРЕЙ
ЯРС

Модуль взаимодействия с периферией на контроллерах БОРЕЙ и ЯРС.

Модуль позволяет:

  1. Получать состояние входов.
  2. Управлять выходами (рекомендуется управлять выходами через deviceio-сервис).
  3. Управлять светодиодной и звуковой индикацией на Wiegand-считывателях.

http.lua

Все продукты

Модуль поддержки HTTP-протокола; модуль позволяет:

  1. Отправлять HTTP-запросы на указанный адрес.
  2. Асинхронно обрабатывать ответы на отправленные ранее HTTP-запросы.

ignis.lua

ИГНИС

log.lua

Все продукты Модуль аудита позволяет выводить в журнал аудита текстовые сообщения с заданным уровнем логирования

longate.lua

ЯРС

loninput.lua

ЯРС

lonpacs.lua

ЯРС

pacs.lua

БОРЕЙ
ЯРС

Модуль интеграции с подсистемой доступа в контроллерах БОРЕЙ, ЯРС.

Модуль позволяет реализовать свой алгоритм доступа вместо предустановленного или внести изменения в стандартные алгоритмы, переопределив отдельные части алгоритма.

storage.lua

Все продукты Модуль для долговременного сохранения настроек / параметров скрипта автоматизации в форме ключ=значение

tenso.lua

timer.lua

Все продукты

Асинхронное выполнение отложенных по времени или периодических действий.

Для данного модуля отсутствует lua-файл, соответствующий код недоступен для просмотра в веб-редакторе скрипта автоматизации.

terminal.lua

СОВЕТ

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

Подключение прикладного Lua-модуля осуществляется функцией require. Рекомендуемая форма использования:

local log = require("log")

Вызвать функцию Lua-модуля в таком случае можно следующим образом, например:

local logger = log.get_logger("MyLogger")

alarm.lua

Описание временно недоступно.

common.lua

Данный модуль предоставляет общесистемные функции. Перечень функций приведён в таблице ниже.

Функция Аргументы Результат Описание
now() нет число с плавающей точкой

Возвращает число с плавающей точкой, соответствующее количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд)

uuid() нет строка

Генерирует уникальный идентификатор по стандарту ISO. Возвращает строковое представление идентификатора, например:

550e8400-e29b-41d4-a716-446655440000

localtime(t) число таблица Lua

Для переданного числа возвращает структуру данных с полями для года, месяца, дня и так далее.

В аргументе передать число с плавающей точкой, соответствующее количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд).

Структура данных соответствует tm (POSIX), см. https://linux.die.net/man/3/localtime_r, к структуре добавлено поле ms с количеством миллисекунд.

mktime(tm) таблица Lua число Принимает на вход структуру tm (POSIX; см. https://linux.die.net/man/3/localtime_r) в форме Lua-таблицы и возвращает число с плавающей точкой, равное количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд)
iso8601_print(t) число строка

Для переданного числа (формат см. common.now()) возвращает строку представления даты и времени в формате ISO8601.

В аргументе передать число с плавающей точкой, соответствующее количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд).

iso8601_parse(s) строка число Принимает на вход строку в формате ISO8601 и возвращает соответствующее данной строке число с плавающей точкой, равное количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд)

deviceio.lua

Описание временно недоступно.

fec.lua

Данный модуль позволяет управлять выходами (на плате контроллера БОРЕЙ, ЯРС, а также на модулях расширения АМ-06) и световой / звуковой индикацией подключенных к контроллеру считывателей.

В перечислении fec.TYPE описаны различные типы периферии. Для управления пригодны типы fec.TYPE.RELE (выход на плате контроллера) и fec.TYPE.SART_RELE (выход на модуле расширения). Для управления выходами следует использовать функцию set_value(тип периферии, ID элемента, состояние), где в первый параметр необходимо передать одно из значений перечисления fec.TYPE, во второй параметр — идентификатор (адрес) элемента для управления, в третий параметр — требуемое состояние (для выходов это 0 = Выключено, 1 = Включено). Например:

local fec = require("fec")
fec.set_value(fec.TYPE.RELE, 1, 1)

В этом примере выполняется включение первого реле на плате контроллера.

Нумерация выходов начинается с 1. Адрес выхода на модуле расширения определяется его адресом на шине.

К контроллеру БОРЕЙ (и ЯРС) можно подключить два считывателя, на плате есть выходы для управления красным, зелёным светодиодами и звуковой индикацией. Управлять светодиодами и бипером можно также с помощью функции set_value. Возможные режимы индикации светодиода определены в перечислении fec.DIOD. Доступно некоторое количество предустановленных режимов различной частоты и скважности. Звуковую индикацию можно только либо включить, либо выключить (см. перичесление fec.BEEPER).

Поскольку управление светодиодной / звуковой индикацией на считывателях осуществляется в рамках алгоритмов доступа и состояние красного, зелёного светодиодов и звука взаимосвязано (если красный светодиод горит, то зелёный погашен и др.) — для удобства управления всей индикацией реализована функция-обёртка fec.set_reader(ID считывателя, зелёный светодиод, красный светодиод, звук). Пример использования функции приведён ниже:

local fec = require("fec")
fec.set_reader(1, fec.DIOD.MODE_OFF, fec.DIOD.MODE_025_025, fec.BEEPER.MODE_OFF)

http.lua

Модуль позволяет отправлять HTTP-запросы прямо из Lua-скрипта, а также асинхронно обрабатывать ответы на отправленные ранее запросы.

Для отправки запроса и обработки ответа необходимо:

  1. Определить объект-обработчик ответа (Lua-таблицу) с методом on_http_response(данные ответа).
  2. Создать объект-запрос посредством вызова функции-фабрики http.with(объект-обработчик). Функция возвращает создаёт и возвращает объект-запрос.
  3. Вызывать на объекте-запросе метод transmit(параметры запроса). Запрос будет отправлен в соответствии с заданными параметрами запроса. По мере получения ответа (или если запрос не удастся) будет асинхронно вызван метод on_http_response у созданного на первом шаге объекта-обработчика.

Ниже приведён пример использования модуля HTTP для отправки GET-запроса на IP-адрес веб-сайта http://example.com.

local log = require("log")
local http = require("http")
local logger = log.get_logger("script.lua")

-- обработчик ответа на HTTP-запрос
local example_handler = {}

-- этот метод обработчика будет вызван при получении ответа на запрос
function example_handler:on_http_response(response_data)
  if response_data == nil then
    logger:error("connection has failed; no response received")
  else
    logger:debug("response received; status="..response_data.status..", type(body)="..type(response_data.body))
  end
end
 
-- параметры запроса
local http_request = {
  url = "http://93.184.216.34",  -- адрес http://example.com
  method = http.METHOD.GET,
  version = http.VERSION.HTTP10,
  timeout = 5000
}

-- отправка HTTP-запроса
logger:debug("querying http://example.com")
http.with(example_handler):transmit(http_request)

В параметрах запроса можно указать следующие данные:

  • method — используемый HTTP-метод, значение из перечисления http.METHOD; значение по умолчанию http.METHOD.GET;
  • version — используемая версия протокола HTTP, значение из перечисления http.VERSION; значение по умолчанию http.VERSION.HTTP11;
  • url — целевой адрес / URL запрашиваемого ресурса, обязательный параметр;
  • timeout — таймаут ожидания ответа / сетевого соединения, в миллисекундах; по умолчанию 13000 (13 секунд);
  • header — таблица HTTP-заголовков (см. далее);
  • body — тело запроса (см. далее).
Заголовки HTTP-запроса

Можно указать произвольные заголовки HTTP-запроса в форме Lua-таблицы со строковыми парами типа «ключ = значение». При этом «ключ» будет выступать в роли имени HTTP-заголовка, а «значение» — в роли значения HTTP-заголовка.

Пример:

-- параметры запроса
local http_request = {
  url = "http://93.184.216.34",
  method = http.METHOD.GET,
  version = http.VERSION.HTTP10,
  timeout = 5000
}
 
http_request.header = {}
http_request.header["X-Extra-Header"] = "my extra header value"
Тело HTTP-запроса

Модуль позволяет отправлять в HTTP-запросах (PUT или POST) данные в форме текста или JSON.

Для передачи запроса с телом в форме текста достаточно присвоить параметру запроса body соответствующее строковое значение. Например:

local http_request = {
  url = "http://10.1.30.3:8080/myservice",
  method = http.METHOD.POST,
  body = "<a>hello XML</a>"
}
http_request.header = {}
http_request.header["Content-Type"] = "text/xml; charset=UTF-8"

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

local http_request = {
  url = "http://10.1.30.3:8080/myservice",
  method = http.METHOD.POST
}
http_request.body = {
  myParam = "A",
  wowThisIsSubTable = {}
}
http_request.body["ohNumberHere"] = 42
http_request.body.wowThisIsSubTable["robot"] = "kill all human"

При отправке запроса с такими параметрами HTTP-заголовок Content-Type будет автоматически установлен в application/json, а тело запроса будет содержать следующий JSON-документ:

{
  "myParam": "A",
  "ohNumberHere": 42,
  "wowThisIsSubTable": { "robot": "kill all human" }
}

ВНИМАНИЕ

При преобразовании Lua-таблицы в JSON поддерживаются все типы данных КРОМЕ массивов (таблиц с числовыми ключами).

Обработка ответа

При поступлении ответа или сбое при отправке запроса асинхронно вызывается метод on_http_response(response_data) на объекте-обработчике. Параметр метода — это Lua-таблица, содержащая следующие данные:

  • status — код HTTP-ответа, число в соответствии со спецификацией [https://ru.wikipedia.org/wiki/Список_кодов_состояния_HTTP];
  • header — HTTP-заголовки ответа в форме Lua-таблицы (аналогично HTTP-заголовкам запроса);
  • body — тело ответа.

Если отправка запроса не удалась и ответ не был получен, то аргумент метода равен nil.

Тело ответа в зависимости от Content-Type может быть либо Lua-таблицей (если Content-Type ответа равен application/json — тело автоматически преобразуется в Lua-таблицу), либо текстом / строкой (в остальных случаях).

ignis.lua

Описание временно недоступно.

log.lua

Модуль позволяет выводить текстовые сообщения в журнал аудита.

Для вывода сообщений разработчику необходимо:

  1. Подключить модуль log.lua в скрипт автоматизации командой require.
  2. Создать объект-логгер с заданным именем, вызвав функцию log.get_logger(имя-логгера).
  3. В требуемом месте скрипта вывести сообщение в журнал аудита с заданным уровнем «тревожности», вызвав один из методов trace, debug, info, warn или error у объекта-логгера.

Пример приведён ниже:

local log = require("log")
local logger = log.get_logger("MyLogger")
 
local answer = 42
logger:debug("The answer is "..tostring(answer))

Обратите внимание:

  1. В журнал аудита сообщения выводятся от имени компонента программных средств neyross::LogLuaModule, а потому в настройки журнала аудита следует добавить соответствующий фильтр, например: neyross::LogLuaModule | DEBUG.
  2. Имя объекта-логгера также выводится в журнале аудита перед заданным текстовым сообщением. В скрипте автоматизации можно создать и использовать любое количество объектов-логгеров с разными именами. Это позволяет различить сообщения в журнале аудита от разных логических разделов скрипта автоматизации.
  3. В журнале аудита для каждой записи также выводится имя функции (если таковая есть), в которой вызван объект-логгер и номер соответствующей строки в скрипте, что ещё более упрощает понимание — к какой части скрипта относится соответствующее сообщение в журнале аудита.
  4. Различные методы объекта-логгера выводят в журнал сообщения с разным уровнем «тревожности». Доступны следующие методы и уровни по приоритетам (от низкого / неважного до высокого / тревожного):
    1. trace (только для отладочного режима, в журнал не попадают никогда);
    2. debug (отладочные сообщения);
    3. info (информационные сообщения);
    4. warn (сообщения-предупреждения);
    5. error (сообщения об ошибках).
  5. Методы объекта-логгера принимают на вход один строковой параметр. Для формирования строки из нескольких параметров используйте оператор конкатенации строк .. и функцию приведения нестроковых типов к строке tostring из стандартной библиотеки.

longate.lua

Описание временно недоступно.

loninput.lua

Модуль предоставляет API для мониторинга состояния входов (зон) на модулях расширения ЯРС.

loninput.lua позволяет «подписаться» на изменения состояния входов. Для управления «подписчиками» в модуле доступны следующие функции:

Функция Назначение Комментарии

add_listener(key, listener)

Добавить объект подписчика

Функция принимает следующие параметры:

  • key — уникальный идентификатор подписчика, позволяет впоследствии «удалить» подписчика по указанному ключу, см. remove_listener;
  • listener — Lua-таблица (объект) с функцией-методом on_loninput_input_state_changed; требования к таблице подписчика приведены ниже.
remove_listener(key) Удалить объект подписчика Единственный аргумент key указывает на добавленного ранее подписчика, которого необходимо «отписать» от получения уведомлений.

Каждый объект-подписчик должен быть представлен Lua-таблицей с функцией on_loninput_input_state_changed(device_address, input_index, raw_state, logical_state).

Данная функция будет вызвана:

  1. при изменении состояния входа какого-либо модуля расширения,
  2. сразу в процессе добавления подписчика через add_listener для всех входов всех модулей (что позволяет получить текущее состояние нужных входов в момент добавления подписчика).

В функцию on_loninput_input_state_changed передаются следующие параметры:

Параметр Тип данных Описание
device_address Число Адрес устройства, к которому относится вход (зона)
input_index Число Индекс входа (зоны), которому соответствует состояние
raw_state Число Технический код состояния входа (зоны), полученный от модуля; возможные коды перечислены в таблице RAW_INPUT_STATE
logical_state Число Логическое состояние входа значения из перечисления LOGICAL_INPUT_STATE

Логическое состояние входа может быть следующим:

  • 0 (LOGICAL_INPUT_STATE.UNKNOWN) — значение не известно;
  • 1 (LOGICAL_INPUT_STATE.OFF) — вход выключен, нормальное состояние (логический 0);
  • 2 (LOGICAL_INPUT_STATE.ON) — вход включен, тревожное состояние (логическая 1).

lonpacs.lua

Модуль предоставляет API для интеграции с подсистемой доступа модулей расширения ЯРС, таких как МДС и М2. Модуль позволяет модифицировать стандартные алгоритмы доступа.

Подсистема доступа в модулях расширения ЯРС по своей структуре и поведению отвечает требованиям спецификаций Onvif (Profile C, Access Control Service, Door Control Service). В частности, состояние точек доступа, команды управления ими и другие аспекты отвечают указанным спецификациям. Рекомендуется ознакомиться с данными спецификациями перед использованием модуля lonpacs.lua.

Получить список точек доступа с их идентификаторами можно через поле lonpacs.ap_instance, которое заполняется при инициализации модуля и виртуальной Lua-машины (до того, как будет выполняться пользовательский Lua-скрипт). Поле lonpacs.ap_instance содержит Lua-таблицу, в которой ключами являются токены точек доступа, а значениями — Lua-таблицы с системными параметрами точек доступа. Структура таблицы представлена в коде ниже:

lonpacs.ap = {
  "токен первой точки доступа" = {
    ...
  },
  "токен второй точки доступа" = {
    ...
  },
  ... -- и так далее
}

Каждая точка доступа в списке — это либо точка доступа модуля расширения МДС, либо одна из точек доступа М2.

Управление точкой доступа

Для управления точками доступа на модулях расширения доступна функция transmit_status(token, status), которая позволяет отправлять модулям команды управления. Функция принимает следующие параметры:

Параметр Тип Описание
token Строка Идентификатор (токен) точки доступа, которой необходимо управлять
status Число Команда управления (требуемый статус точки доступа); значение из перечисления lonpacs.AP_COMMAND (см. ниже)

Для управления точкам доступа доступны следующие команды (значения параметра status):

Команда Значение Описание
STATUS_QUERY -1 Запрос состояния точки доступа
RESTORE 12 Переключиться в дежурный режим работы
OPEN_BLOCKED 21 Разблокировать точку доступа
CLOSE_BLOCKED 22 Заблокировать точку доступа
DISABLE 13
INITIATE_PASS 18 Инициировать проход
Состояние точки доступа

Модуль lonpacs.lua позволяет «подписаться» на события изменения состояния точек доступа, мониторинга связи с точками доступа, изменения состояния прохода (фазы алгоритма прохода). Для управления «подписчиками» в модуле доступны следующие функции:

Функция Назначение Комментарии

add_listener(key, listener)

Добавить объект подписчика

Функция принимает следующие параметры:

  • key — уникальный идентификатор подписчика, позволяет впоследствии «удалить» подписчика по указанному ключу, см. remove_listener;
  • listener — Lua-таблица (объект) с функциями-обработчиками изменений; требования к таблице подписчика приведены ниже.
remove_listener(key) Удалить объект подписчика Единственный аргумент key указывает на добавленного ранее подписчика, которого необходимо «отписать» от получения уведомлений.

Каждый объект-подписчик должен быть представлен Lua-таблицей со следующими функциями:

Функция Назначение Комментарии
lonpacs_on_ap_status_changed(token, ap_status) Получение и обработка изменений состояния точки доступа

В функцию передаются следующие параметры:

  • token (строка) — уникальный идентификатор (токен) точки доступа;
  • ap_status (число) — код состояния точки доступа; значение из перечисления lonpacs.AP_STATUS (см. ниже);
lonpacs_on_pass_status_changed(token, status, notify_key) Получение и обработка изменений состояния алгоритма прохода

В функцию передаются следующие параметры:

  • token (строка) — уникальный идентификатор (токен) точки доступа;
  • status (число) — код состояния алгоритма прохода (см. ниже);
  • notify_key (строка) — код уведомления для отправки соответствующего извещения (возможного вызова lonpacs.notify).
lonpacs_on_connection_changed(token, connection) Получение и обработка изменений состояния связи с точкой доступа

В функцию передаются следующие параметры:

  • token (строка) — уникальный идентификатор (токен) точки доступа;
  • connection (число) — состояние связи, возможные значения определены в перечислении lonpacs.CONNECTION:
    • 0 (ONLINE) — точка доступа на связи;
    • 1 (OFFLINE) — не связи с точкой доступа;
    • 2 (UNKNOWN) — состояние связи неизвестно.

Параметр ap_status может принимать одно из следующих значений:

Состояние точки доступа Значение Описание
USER_QUERY 0 Точка доступа в состоянии ожидания транзакции
FORCE_OPEN 1 Взлом двери
EPB 2 Старт транзакции прохода по кнопке выхода
HOLD_OPEN 5 Дверь удержана открытой (удержание двери)
DENIAL 6

Завершение транзакции прохода:

  • истек таймаут ожидания ответа от базы данных
  • отказ от базы данных
  • невалидный уровень доступа пользователя в ответе от базы данных
  • невалидная временная зона в уровне доступа пользователя
OPEN 10 Дверь открыта при совершении прохода
DISABLE 13

Точка доступа в состоянии «заблокирована».

  • дверной контакт не работает
  • кнопка выхода не работает
  • входные сообщения от считывателя игнорируются.
DOOR_CLOSED 15
  • Снята тревога «взлом двери» (дверь закрыта)
  • Дверь закрыта при при завершении транзакции прохода через точку доступа
INITIATE_PASS 18

Старт транзакции прохода пользователя (при получении разрешения на доступ).

Точка доступа переходит в состояние ожидания открытия двери.

OPEN_BLOCKED 21

Точка доступа в состоянии «открыта и заблокирована»:

  • замок двери открыт
  • кнопка выхода не работает
  • дверной контакт не работает
  • входные сообщения от считывателя игнорируются

 Текущая транзакция пользователя обрывается.

CLOSE_BLOCKED 22

Точка доступа в состоянии «закрыта и заблокирована»:

  • кнопка выхода не работает
  • дверной контакт работает
  • входные сообщения от считывателя игнорируются

 Текущая транзакция пользователя обрывается.

LOCK_ACTUATOR_ERROR 32 Неисправное состояние замка (не является состоянием точки доступа)
BLOCKED_HOLD_OPEN 53 Удержание двери точки доступа в состоянии «закрыта и заблокирована»
BLOCKED_FORCE_OPEN 54 Взлом двери точки доступа в состоянии «закрыта и заблокирована»
ARMED_CLOSE_BLOCKED 105

Точка доступа в состоянии «закрыта и заблокирована постановкой под охрану связанной группы зон»:

  • кнопка выхода не работает
  • дверной контакт работает
  • считыватель работает 

Текущая транзакция пользователя обрывается.

ARMED_CLOSE_BLOCKED_FORCE_OPEN 106

Взлом двери точки доступа в состоянии «закрыта и заблокирована постановкой под охрану связанной группы зон«

ap_status определяет интегральное состояние составляющих точку доступа элементов (замок, дверной контакт). Для получения состояния этих элементов нужно использовать функцию lonpacs.parse_ap_status(ap_status)

Функция parse_ap_status возвращает Lua-таблицу следующего вида:

{
  door_state = ..
  lock_state = ..
  mode = ..
  alarm = ..
}

где значение полей таблицы следующее:

Поле Описание Возможные значения
door_state Состояние двери (открыта, закрыта, …)

Возможные значения определены в lonpacs.AP_DOOR_PHYSICAL_STATE:

  • UNKNOWN — состояние неизвестно;
  • OPEN — дверь открыта;
  • CLOSED — дверь закрыта;
  • FAULT — неисправность двери.
lock_state Состояние замка

Возможные значения определены в lonpacs.AP_LOCK_STATE:

  • UNKNOWN — состояние неизвестно;
  • LOCKED — закрыт;
  • UNLOCKED — открыт;
  • FAULT — неисправность замка.
mode Режим точки доступа (разблокирована, заблокирована, …)

Возможные значения определены в lonpacs.AP_MODE:

  • UNKNOWN — состояние неизвестно;
  • LOCKED — дежурный режим;
  • UNLOCKED — разблокирована;
  • ACCESSED — проход;
  • BLOCKED — заблокирована.
alarm Состояние тревоги точки доступа (удержана дверь и др.)

Возможные значения определены в lonpacs.AP_ALARM_STATE:

  • UNKNOWN — неизвестно;
  • NORMAL — норма;
  • DOOR_OPEN_TOO_LONG — удержание двери;
  • DOOR_FORCED_OPEN — взлом двери.

Значение кода состояния алгоритма прохода (фазы прохода) status, полученного в функции lonpacs_on_pass_status_changed(token, status, notify_key), может принимать одно из следующих значений:

Код (условный) Принимаемое значение Описание
ACS_DENIED 42 Доступ запрещен
NO_PASS 3 Проход не совершен
PASS 4 Проход совершен
ACS_ID_PRESENT 95 Предъявлен идентификатор СКУД (запрос пользователя СКУД в базе ЯРС)
ARM_ID_PRESENT 107 Предъявлен идентификатор для управления постановкой на охрану связанной группы зон
DISARM_ID_PRESENT 108 Предъявлен идентификатор для управления снятием с охраны связанной группы зон
REPEATED_PRESENT 59 Повторное предъявление идентификатора в ходе транзакции СКУД

pacs.lua

Модуль предоставляет API для интеграции с подсистемой доступа (только для контроллеров БОРЕЙ и ЯРС). Модуль позволяет либо модифицировать стандартные алгоритмы доступа, либо реализовать собственный алгоритм.

Подсистема доступа в контроллерах БОРЕЙ, ЯРС по своей структуре и поведению отвечает требованиям спецификаций Onvif (Profile C, Access Control Service, Door Control Service). В частности, состояние точек доступа, команды управления ими и другие аспекты отвечают указанным спецификациям. Рекомендуется ознакомиться с данными спецификациями перед использованием модуля pacs.lua.

Общие сведения

Подсистема доступа в контроллерах БОРЕЙ, ЯРС поддерживает две точки доступа (поддержка дополнительных точек доступа на модулях расширения ЯРС осуществляется в Lua-модуле lonpacs.lua). Соответственно, первый считыватель относится к первой точке доступа, а второй — ко второй. У каждой точки доступа есть строковой уникальный идентификатор, называемый токеном.

Получить список точек доступа с их идентификаторами можно через поле pacs.ap, которое заполняется при инициализации модуля и виртуальной Lua-машины (до того, как будет выполняться пользовательский Lua-скрипт). Поле pacs.ap содержит Lua-таблицу, в которой ключами являются токены точек доступа, а значениями — Lua-таблицы с системными параметрами точек доступа. Структура таблицы представлена в коде ниже:

pacs.ap = {
  "токен первой точки доступа" = {
    "#" = 0,
    ...
  },
  "токен второй точки доступа" = {
    "#" = 1,
    ...
  }
}

Соответственно, для перебора точек доступа (например, чтобы для каждой точки доступа проинциализировать свой алгоритм) удобно использовать следующий код:

for key,item in pairs(pacs.ap) do
  if item["#"] == 0 or item["#"] == 1 then
    -- код обработки точки доступа с токеном = key
  else
    logger:error("unexpected access point number; #="..item["#"].."; token="..key)
  end
end

В контроллере БОРЕЙ точек доступа всегда ровно две, с номерами 0 и 1. Точка доступа с номером 0 (у которой значение свойства pacs.ap["токен"]["#"] равно 0 — это первая точка доступа), точка доступа с номером 1 — вторая.

В настройках доступа у контроллера можно выбрать «Режим работы» — «Две односторонние», «Одна двусторонняя», «Пользовательский». В стандартных режимах работы «Две односторонние» и «Одна двусторонняя» программные средства самостоятельно реализуют алгоритм доступа, таблицы параметров (pacs.ap["токен"]) содержат параметры, которые пользователь может изменить через веб-приложение. В режиме «Пользовательский» таблицы параметров по умолчанию обычно пусты.

ВНИМАНИЕ

Для реализации собственной логики доступа с помощью Lua-скриптов пользователю следует выбрать в настройках контроллера режим = «Пользовательский». В этом режиме системные параметры алгоритма доступа (которые обрабатываются не в Lua-скрипте, а в основных программных средствах) не задаются через веб-интерфейс, и должны быть определены пользователем прямо в Lua-скрипте. Инструкция по установке системных параметров приведена в разделе «Изменение системных параметров» далее.

Управление состоянием точки доступа, а также режимом её работы (начало транзакции доступа, завершение транзакции и так далее) осуществляется из Lua-скрипта. Соответствующие функции описаны в разделе «Управление точкой доступа».

В каждый момент времени состояние точки доступа описывается N-мерным вектором:

Режим работы точки доступа
  1. Дежурный / Ожидание прохода (Locked)
  2. Выполняется проход (Accessed)
  3. Заблокировано (Blocked)
  4. Разблокировано (Unlocked)
  1. Режим Locked устанавливается в программных средствах при сбросе транзакции доступа (см. pacs_reset).
  2. Режимы Blocked / Unlocked устанавливаются по командам блокировки / разблокировки точки доступа (см. pacs_block, pacs_unlock).
  3. Режим Accessed должен быть установлен из Lua-скрипта в момент начала доступа (открытия двери).
Состояние двери Неизвестно (Unknown)
Открыто (Open)
Закрыто (Closed)
Неисправность (Fault)
Определяется из Lua-скрипта.
Состояние замка Неизвестно (Unknown)
Открыт (Unlocked)
Закрыт (Locked)
Неисправность (Fault)
Определяется из Lua-скрипта.
Тревожный статус Норма (Normal)
Взлом двери (DoorForcedOpen)
Удержание двери (DoorOpenTooLong)
Определяется из Lua-скрипта.
Статус тампера Неизвестно (Unknown)
Корпус закрыт (NotInTamper)
Вскрытие корпуса (TamperDetected)

Автоматически определяется программными средствами по факту вскрытия / закрытия корпуса контроллера.

Не следует управлять этой осью состояния из Lua-скрипта.

Точки доступа поддерживают внешние команды управления блокировки, разблокировки, восстановления режима, включения / отключения, разрешения и подтверждения доступа. При обработке таких команд программные средства передают управление в Lua-скрипт. Также при предъявлении идентификатора, изменении состояния периферии (входов), выполенении внешних команд над точками доступа и т.д. подсистема доступа передаёт управление в Lua-скрипт. Пользователь может запрограммировать реакцию на соответствующие события с помощью функций-обработчиков (см. раздел «Функции-обработчики»).

Через каждую точку доступа в один момент времени может осуществляться одна транзакция доступа. Транзакция доступа — это процесс, который начинается с момента идентификации доступа, и завершается при возврате точки доступа в начальное состояние. В случае удержания двери транзакция доступа продолжается.

Транзакция доступа начинается либо вызовом pacs.authenticate в случае разрешения доступа, либо по вызову pacs_grant (для случая анонимного доступа). Завершается транзакция по вызову pacs_reset. Соответствующие функции описаны в разделе «Управление точкой доступа».

В процессе транзакции сохраняются идентификационные признаки посетителя и прочая информация, эти данные подставляются во все извещения, формируемые контроллером.

Часть извещений (в основном о запрещении доступа) формируются программными средствами. Пользователь также может в любой момент времени отправить извещение из Lua-скрипта с помощью функции pacs_notify, с указанием кода извещения. Для отправки доступно более полусотни извещений. Полный список доступных для отправки извещений приведён в документации на HTTP-API контроллера в части СКУД.

Изменение системных параметров

В режиме доступа «Пользовательский» для реализации алгоритма может потребоваться задать из Lua-скрипта для каждой точки доступа системные параметры. Для указания параметров из Lua-скрипта предназначена функция pacs.set_configuration(token, {...}), в первом аргументе необходимо передать токен точки доступа, во втором аргументе — Lua-таблицу с параметрами. Например:

for key,item in pairs(pacs.ap) do
  local configuration = {}
  configuration["input.mode"] = "card"
  pacs.set_configuration(key, configuration)
end

Ниже приведены основные системные параметры, которые можно / нужно настраивать:

Параметр Ключ Значение Описание
Режим идентификации input.mode

Одно значение из: card, pincode, card_and_pincode, card_or_pincode

Позволяет определить требуемый режим идентификации — какие идентификаторы посетителя ожидаются на вход + как они будут проверяться.

ВНИМАНИЕ: этот параметр необходимо задать, если из Lua-скрипта будет вызвана функция pacs_authenticate с передачей идентификаторов посетителя; в противном случае идентификаторы не будут верифицированы по базе данных контроллера, доступ безусловно будет запрещён.

Число попыток ввода данных input.retry_limit Целое число больше 0 В случае, если input.mode равен card_and_pincode — определяет количество попыток ввода пинкода после предъявления карты.
Время ожидания ввода данных input.retry_timeout Целое число больше 0, в секундах В случае, если input.mode равен card_and_pincode — определяет время ожидания ввода пинкода после предъявления карты.
Формат карты other.card_format Одно значение из: auto, Raw-64, Raw-VL

auto — автоматический выбор формата; для Wiegand формат выбирается исходя из количества переданных бит (26 — Wiegand-26, 37 — Wiegand-37), для 1-Wire всегда Wiegand-26

Raw-64 — используются все 64 бита карты (отсутствующие биты дополняются 0) в форме одного 64-битного числа; код предприятия при этом равен 0.

Raw-VL — используются только переданные от считывателя биты, в форме одного 64-битного числа; код предприятия при этом равен 0.

Маска (номера карты) other.card_mask FFFFFFFFFFFFFFFF 64 бита маски в формате HEX-строки из 16 символов
Набор параметров блока «Контроль повторного прохода» Описание временно недоступно.
Набор параметров блока «Проход под принуждением»

Только в режиме идентификации «Карта и пинкод»

Описание временно недоступно.

Набор параметров блока «Проход с подтвержденеим» Описание временно недоступно.
Набор параметров блока «Доступ по правилу N-лиц» Описание временно недоступно.
Функции-обработчики

Модуль позволяет разработчику определить глобальные Lua-функции с заданными именами. Такие функции-обработчики будут вызваны программными средствами контроллера по мере выполнения функций доступа.

ВНИМАНИЕ

В данном случае это должны быть именно «глобальные функции», определённые, например, следующим образом:

function pacs_reader_input(token, data)
  -- тело функции
end

Локальные функции с таким же именем не будут вызваны:

local pacs_reader_input = function(token, data)
  -- функция не будет вызвана
end

Ниже приведён список доступных для определения функций-обработчиков:

Функция Назначение Комментарии
pacs_reader_input(token, data) К считывателю предъявлен идентификатор

Вызывается тогда, когда к считывателю контроллера предъявлен идентификатор.

ВАЖНО: проверка идентификатора ещё не осуществлялась. В случае, если данные предъявлены к считывателю Wiegand / 1-Wire, выполняется разбор считанных битов и определение номера карты / кода предприятия в соответствии с системными параметрами other.card_format, other.card_mask.

В первом аргументе token передаётся токен точки доступа, на которой предъявлен идентификатор; во втором аргументе передаётся Lua-таблица с идентификаторами:

{
  "facility_code" = "123",
  "card_number" = "12345",
  "pincode" = "12345"
}

Если идентификатор отсутствует (например, не вводился пинкод), то соответствующее поле таблицы также отсутствует.

Обычно в коде данной функции выполняется вызов pacs.authenticate для начала транзакции доступа.

pacs_accessed(token, args) Получена внешняя команда на инициацию транзакции доступа.

Первый аргумент token — токен точки доступа.

Второй аргумент args — параметры разрешения доступа:

{
  "use_extended_time" = true,
  "access_time_duration" = число (unix-timestamp),
  "open_too_long_time_duration" = число (unix-timestamp),
  "pre_alarm_time_duration" = число (unix-timestamp)
}

Подробную спецификацию команды инициации транзакции доступа смотри в спецификациях Onvif.

pacs_granted(token) Доступ разрешён (в результате проверки идентификатора)

Данная функция-обработчик вызывается тогда, когда вызов pacs.authenticate завершился успешно (если идентификаторы были переданы в pacs.authenticate, то они были верифицированы по базе данных, у пропуска есть все необходимые права и разрешения на доступ).

Первый аргумент token — токен точки доступа.

pacs_denied(token) Доступ запрещён (в результате проверки идентификатора)

Данная функция-обработчик вызывается тогда, когда в результате pacs.authenticate принято решение о запрещении доступа.

Первый аргумент token — токен точки доступа.

pacs_enabled(token) Точка доступа включена (по внешней команде) Первый аргумент token — токен точки доступа.
pacs_disabled(token) Точка доступа отключена (по внешней команде) Первый аргумент token — токен точки доступа.
pacs_identification(token, event) Изменилось состояние ожидания ввода данных в режиме «Карта и пинкод»

Первый аргумент token — токен точки доступа.

Второй аргумент event — один из retry (требуется повторный ввод пинкода), card (считана карта, требуется ввод пинкода), timeout (истекло время ожидания ввода пинкода).

pacs_external_locked(token) → boolean Должен быть восстановлен режим работы точки доступа (обычный режим работы)

Режим работы точки доступа должен быть восстановлен — по внешней команде (из веб-интерфейса или по Onvif; см. Onvif Profile C). Это функция-обработчик для внешней команды, обычно в коде данной функции выполняется вызов pacs_reset.

Функция должна возвращать булевое значение — true, если точка доступа перешла в обычный режим работы, и false, если команда не может быть выполнена.

Первый аргумент token — токен точки доступа.

pacs_external_unlocked(token) → boolean Точка доступа должна быть разблокирована

Режим работы точки доступа должен быть изменён на «Разблокировано» — по внешней команде (из веб-интерфейса или по Onvif; см. Onvif Profile C). Это функция-обработчик для внешней команды, обычно в коде данной функции выполняется вызов pacs_unlock.

Функция должна возвращать булевое значение — true, если точка доступа разблокирована, и false, если команда не может быть выполнена.

Первый аргумент token — токен точки доступа.

pacs_external_blocked(token) → boolean Точка доступа должна быть заблокирована

Режим работы точки доступа должен быть изменён на «Заблокировано» — по внешней команде (из веб-интерфейса или по Onvif; см. Onvif Profile C). Это функция-обработчик для внешней команды, обычно в коде данной функции выполняется вызов pacs_block.

Функция должна возвращать булевое значение — true, если точка доступа заблокирована, и false, если команда не может быть выполнена.

Первый аргумент token — токен точки доступа.

pacs_external_authorization(token, decision) Разрешение доступа по внешней команде Первый аргумент token — токен точки доступа.
pacs_input(port, device, type_, id, raw) Изменение состояния элемента периферии

Параметры port и device всегда константны, значения не имеют.

Параметр type_ определяет тип элемента периферии, чьё состояние изменилось. Значение из перечисления fec.TYPE (модуль fec.lua).

Параметр id определяет идентификатор элемента периферии, чьё состояние изменилось. Например, для входов на плате БОРЕЙ это значения от 1 до 8.

Параметр raw содержит «сырое» значение состояния элемента периферии. Способ приведения «сырого» значения к логическому описан ниже в разделе «Изменение состояние периферии).

pacs_cancel_transaction(token) Получена внешняя команда на прерывание транзакции доступа Первый аргумент token — токен точки доступа.

СОВЕТ

При использовании стандартных алгоритмов «Две односторонних точки доступа», «Одна двусторонняя точка доступа» перечисленные в таблице функции-обработчики уже определены, в них выполняется логика стандартных алгоритмов доступа. Пользователь может переопределить эти обработчики в своём скрипте. Таким образом, переопределив ВСЕ функции пользователь реализует полностью свою логику доступа, НО при этом получит доступ ко всем параметрам, задаваемым для стандартных алгоритмов через веб-интерфейс — через поле pacs.ap (см. раздел «Модель данных» выше).

Изменение состояния периферии

При изменении состояния какого-либо элемента периферии (обычно, это различные входы) вызывается функция-обработчик pacs_input. Ниже приведён Lua-код, который позволит в зависимости от типа элемента периферии получить его логическое состояние.

local fec = require("fec")
 
-- Логическое состояние элемента
local VALUE = {
	OFF     = 0,
	ON      = 1,
	SHORT   = 2,
	BROKEN  = 3
}
 
-- Получение логического состояния для элемента типа «Сухой контакт»
function get_dry_contact_value(raw, invert)
    if raw == 1 then
        if invert then
            return VALUE.OFF
        else
            return VALUE.ON
        end
    else
        if invert then
            return VALUE.ON
        else
            return VALUE.OFF
        end
    end
end
 
-- Получение логического состояния для элемента типа «Резистивный шлейф»
function get_rin_value(raw,invert)
	if raw <= 17 then -- эмпирический порог резистивного шлейфа
		if invert then
			return VALUE.OFF
		else
			return VALUE.ON
		end
	else
		if invert then
			return VALUE.ON
		else
			return VALUE.OFF
		end
	end
end
 
-- Получение логического состояния входов разного типа
-- Дополнительный аргумент invert позволяет обрабатывать настройку вида «нормально-открыт»
function get_input_value(raw, invert, type_)
    if (type_ == fec.TYPE.DRY_CONTACT) then
        return get_dry_contact_value(raw, invert)
    elseif (type_ == fec.TYPE.RADIAL_INPUT) then
        return get_rin_value(raw, invert)
    else
        log_error("invalid type: "..type_)
        return 0
    end
end
Управление точкой доступа

Для управления точкой доступа / транзакцией доступа по выбранной точке доступа предназначены следующие функции:

Функция Назначение Комментарии
pacs.authenticate(token, {...}) Выполнить проверку переданных идентификаторов и начать транзакцию доступа

Первый аргумент — токен точки доступа. Второй аргумент — Lua-таблица с идентификаторами (такая же, какая получена в функции-обработчике pacs_reader_input):

{
  "facility_code" = "123",
  "card_number" = "12345",
  "pincode" = "12345",
  "transaction_uuid" = "..."
}

В результате проверки будет вызвана функция обработчик pacs_granted (если доступ разрешён; при этом будет начата транзакция доступа, см. pacs_begin) или pacs_denied (если доступ запрещён).

Если передан transaction_uuid, то соответствующее значение будет использоваться в роли идентификатора транзакции и будет подставлено во все отправляемые извещения. Если значение не будет указано, то будет сгенерирован уникальный UUID транзакции.

ВАЖНО: если таблица во втором аргументе будет пуста, то проверка идентификаторов по базе данных проводиться не будет, автоматически будет выдано разрешение на доступ, будет вызвана функция-обработчик pacs_granted.

pacs_reset(token) Восстановить обычный режим работы точки доступа

Первый аргумент — токен точки доступа.

ВАЖНО: текущая транзакция прекращается, все связанные с транзакцией данные (пропуска и пр.) очищаются. Данную функцию обязательно надо вызвать при завершении транзакции доступа.

pacs_block(token) Перевести точку доступа в состояние «Заблокировано» Первый аргумент — токен точки доступа.
pacs_unlock(token) Перевести точку доступа в состояние «Разблокировано» Первый аргумент — токен точки доступа.
pacs_pause(token) Прекратить приём идентификаторов на точке доступа

Первый аргумент — токен точки доступа.

Транзакция доступа не прерывается. Обычно используется при переходе в состояния типа «Взлом двери» или «Удержание двери».

pacs_grant(token) Разрешить анонимный доступ и начать анонимную транзакцию доступа

Обычно применяется для начала транзакции по кнопке выхода.

Поведение отличается от pacs.authenticate + pacs_begin тем, что извещения о событиях доступа будут содержать тему «анонимного доступа».

pacs_notify(token) Отправить извещение с заданным кодом Доступный список кодов см. в документации на HTTP-API контроллера в части СКУД.
pacs_update_door_state(token, state) Изменить состояние точки доступа

Первый аргумент — токен точки доступа.

Второй аргумент — Lua-таблица со значением состояния по различным «осям»:

{
  "lock" = Unlocked,
  "door" = Open,
  "mode" = Accessed,
  "alarm" = Normal,
}

Во втором аргументе можно отправлять только те «оси» состояния, которые необходимы. Доступные значения состояния см. в разделе «Общие сведения».

Поиск в базе данных

Описание временно недоступно.

storage.lua

Модуль предоставляет функции для перманентного сохранения и последующего чтения конфигурационных параметров или параметров скрипта автоматизации.

В некоторых случаях может потребоваться сохранять состояние или параметры работы скрипта автоматизации при перезапуске продукта. Или, например, может возникнуть потребность, чтобы определённые параметры были сохранены в резервной копии и восстановлены в случае сбоя файловой системы на IP-контроллере (БОРЕЙ, ЯРС и пр.). Для работы с такими данными и предназначен модуль storage.lua.

Модуль позволяет сохранять в персистентное хранилище Lua-таблицы с данными под заданным именем, а впоследствии извлекать их из хранилища по имени. Таблица с данными может содержать только пары «ключ = значение», где «ключ» это всегда строка, а «значение» может быть строкового, числового или булевого типа.

Для помещения данных в хранилище предназначена функция storage.set(ключ, данные), для сохранения — storage.save(ключ), для извлечения — storage.get(ключ).

Вызов функции set(...) не приводит к сохранению данных, данные только помещаются в хранилище! Данные будут сохранены только после вызова функции save(...).

Пример использования модуля приведён ниже:

local storage = require("storage")
 
local my_options = storage.get("my_key")
my_options.param1 = "A"
my_options.param2 = 42
storage.save("my_key")
 
local another_options = {
  param1 = "B",
  param2 = 43
}
storage.set("my_key", another_options) -- my_options более не ссылается на объект в хранилище!
storage.save("my_key")

tenso.lua

Описание временно недоступно.

timer.lua

Данный модуль предоставляет для скрипта автоматизации две функции для выполнения отложенных во времени вычислений. Первая функция — это set_timeout. Она предназначена для разового выполнения некоторой Lua-функции спустя заданное количество времени. Вторая функция — set_interval. Она позволяет запланировать выполнение некоторой Lua-функции каждые N миллисекунд. Функция будет выполняться периодически до тех пор, пока задание на выполнение не будет явно отменено (см. clear_interval далее) или Lua-машина не будет перезапущена.

Также модуль предоставляет две функции для отмены запланированных ранее заданий: clear_timeout и clear_interval.

ЗАМЕЧАНИЕ

Для использования функций модуля не требуется ничего подключать с помощью require. Функции set_timeout, set_interval, clear_timeout, clear_interval доступны глобально в любом месте скрипта автоматизации.

set_timeout

Запланировать вызов указанной Lua-функции спустя заданное количество миллисекунд.

Полная сигнатура функции: set_timeout(имя-функции, длительность, ключ), где

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

При вызове set_timeout возвращает уникальный идентификатор созданного задания на отложенное выполнение. Это значение можно использовать в последующем вызове clear_timeout для отмены запланированного ранее задания.

Пример:

local log = require("log")
local logger = log.get_logger("script.lua")
 
local key1_id = set_timeout("my_timeout", 10000, "key1") -- выполнить my_timeout через 20 секунд с key1
local key2_id = set_timeout("my_timeout", 20000, "key2") -- выполнить my_timeout через 20 секунд с key2
 
function my_timeout(key)
  if key == "key1" then
    logger:debug("stopping timeout on key2")
    clear_timeout(key2_id) -- отменяем задание с key2
  elif key == "key2" then
    logger:error("this should be never invoked")
  else
    logger:error("unexpected key="..key)
  end
end
clear_timeout

Функция позволяет отменить ранее запланированное задание: clear_timeout(ID задания), где ID задания — результат выполнения функции set_timeout.

set_interval

Сигнатура налогична set_timeout: set_interval(имя-функции, длительность, ключ), где

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

ВНИМАНИЕ

Также как и в JavaScript, рекомендуется избегать использования set_interval, сделав выбор в пользу рекурсивного set_timeout.

clear_interval

Аналогично clear_timeout функция позволяет отменить запланированное ранее периодическое задание: clear_interval(ID задания), где ID задания — результат выполнения функции set_interval.

terminal.lua

Описание временно недоступно.

Написанный на Lua скрипт не имеет какой-либо специальной функции, с которой начиналось бы его выполнение. Скрипт можно рассматривать просто как набор команд (инструкций), который выполняется, начиная с первой инструкции.

Скрипт может быть как очень простым, состоящим всего из одной команды, так и весьма сложным, содержащим десятки, сотни и даже тысячи инструкций. Следующие друг за другом инструкции могут разделяться точкой с запятой (;). Однако это требование не является обязательным, поэтому весь приведённый ниже код является корректным с точки зрения синтаксиса:

Переменные используются для хранения значений в процессе выполнения скрипта.

Именами (идентификаторами) переменных в Lua могут быть любые последовательности из букв, цифр и символа подчеркивания, начинающиеся не с цифры.

Обратите внимание

Язык Lua различает регистр символов, поэтому abc, Abc, ABC являются различными именами.

В таблице ниже приведены слова, которые зарезервированы языком Lua и не могут использоваться в именах переменных:

and break do else elseif

end false for function if

in local nil not or

repeat return then true until

while

Кроме того, все имена, начинающиеся с символа подчеркивания, за которым идут заглавные буквы (например, _VERSION) также являются зарезервированными.

Какие переменные бывают в Lua?

Переменные в Lua могут быть глобальными и локальными. Если переменная не объявлена явно как локальная, она считается глобальной.

Глобальные переменные Lua

Глобальная переменная появляется в момент присваивания ей первого значения. До присваивания первого значения обращение к глобальной переменной даёт nil.

MsgBox(tostring (g))  —> nil

g = 1

MsgBox(tostring (g))  —> 1

Глобальная переменная существует до тех пор, пока существует среда исполнения скрипта и доступна любому Lua-коду, выполняемому в этой среде.

При необходимости удалить глобальную переменную можно явным образом, просто присвоив ей значение nil.

g = 1 — создаем глобальную переменную g со значением 1

g = nil — удаляем глобальную переменную g

MsgBox(tostring (g)) —> nil

Все глобальные переменные являются полями обычной таблицы, называемой глобальным окружением. Эта таблица доступна через глобальную переменную _G. Поскольку полями глобального окружения являются все глобальные переменные (включая саму _G), то _G._G == _G.

Локальные переменные Lua

Любые локальные переменные должны быть объявлены явно с использованием ключевого слова local. Объявить локальную переменную можно в любом месте скрипта. Объявление может включать в себя присваивание переменной начального значения. Если значение не присвоено, переменная содержит nil.

local a — объявляем локальную переменную a

local b = 1 — объявляем локальную переменную b, присваиваем ей значение 1

local c, d = 2, 3 — объявляем локальные переменные c и d, присваиваем им значения 2 и 3

Область видимости локальной переменной начинается после объявления и продолжается до конца блока.

Примечание

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

Под блоком понимается:

тело управляющей конструкции (if-then, else, for, while, repeat);

тело функции;

фрагмент кода, заключённый в ключевые слова do…end.

Если локальная переменная определена вне какого-либо блока, её область видимости распространяется до конца скрипта.

a = 5 — глобальная переменная a

local i = 1  — переменная i локальна в пределах скрипта

   while i <= a do — цикл от 1 до 5

   local a = i^2 — переменная а локальна внутри цикла while

   MsgBox(a) —> 1, 4, 9, 16, 25

   i = i + 1

end

MsgBox(a) —> 5 (здесь обращение к глобальной a)

if i > 5 then

   local a — переменная а локальна внутри then

   a = 10

   MsgBox(a) —> 10

else

   MsgBox(a) —> 5 (здесь обращение к глобальной a)

end

do

   local a = 20 — переменная а локальна внутри do-end

   MsgBox(a) —> 20

end

MsgBox(a) —> 5 (здесь обращение к глобальной a)

Обратите внимание

Когда возможно, рекомендуется использовать локальные переменные вместо глобальных. Это позволит избежать «засорения» глобального пространства имён и обеспечит лучшую производительность (поскольку доступ к локальным переменным в Lua выполняется несколько быстрее, чем к глобальным).

Типы данных Lua

Какие типы данных поддерживает язык Lua?

Lua поддерживает следующие типы данных:

1. Nil (ничего). Соответствует отсутствию у переменной значения. Этот тип представлен единственным значением — nil.

2. Boolean (логический). К данному типу относятся значения false (ложь) и true (истина).

При выполнении логических операций значение nil рассматривается как false. Все остальные значения, включая число 0 и пустую строку, рассматриваются как true.

3. Number (числовой). Служит для представления числовых значений.

В числовых константах можно указывать необязательную дробную часть и необязательный десятичный порядок, задаваемый символами «e» или «E». Целочисленные числовые константы можно задавать в шестнадцатеричной системе, используя префикс 0x.

Примеры допустимых числовых констант: 3, 3.0, 3.1415926, 314.16e-2, 0xff.

4. String (строковый). Служит для представления строк.

Строковые значения задаются в виде последовательности символов, заключённой в одинарные или двойные кавычки:

a = «это строка»

b = ‘это вторая строка’

Строки, заключённые в двойные кавычки, могут интерпретировать C-подобные управляющие последовательности (escape-последовательности), начинающиеся с символа «» (обратный слэш):

b (пробел),

n (перевод строки),

 r (возврат каретки);

t (горизонтальная табуляция),

 \ (обратный слеш);

» (двойная кавычка);

‘ (одинарная кавычка).

Обратите внимание

Символ в строке также может быть представлен своим кодом с помощью escape-последовательности:

ddd,

где ddd — последовательность из не более чем трёх цифр.

Кроме кавычек для определения строки могут также использоваться двойные квадратные скобки:

local a = [[Компания «Кронос»]]

Определение строки с помощью двойных квадратных скобок позволяет игнорировать все escape-последовательности, т. е. строка создаётся полностью так, как описана:

local a = [[string

string1

string2

   string3

]] — «string

       string1

       string2

          string3»

Примечание

При определении строки с помощью двойных квадратных скобок учитываются символы табуляции и переноса.

Двойные скобки могут быть вложенными. Для того чтобы их не перепутать, между скобками вставляется символ«равно» (=):

local a = [=[определение строки [[string]] в Lua]=]

— будет срока: «определение строки [[string]] в Lua»

5. Function (функция). Функции в Lua могут быть записаны в переменные, переданы как параметры в другие функции ивозвращены как результат выполнения функций.

6. Table (таблица). Таблица представляет собой набор пар «ключ» — «значение», которые называют полями илиэлементами таблицы. Как ключи, так и значения полей таблицы могут иметь любой тип, за исключением nil. Таблицы не имеют фиксированного размера: в любой момент времени в них можно добавить произвольное число элементов.

Подробнее — в статье «Создание таблиц в Lua»

7. Userdata (пользовательские данные). Является особым типом данных. Значения этого типа не могут быть созданы или изменены непосредственно в Lua-скрипте.

Userdata используется для представления новых типов, созданных в вызывающей скрипт программе или в библиотеках, написанных на языке С. Например, библиотеки расширений Lua для «CronosPRO» используют этот тип для представления таких объектов, как:

банки данных (класс Bank);

базы данных (класс Base);

записи (класс Record) и т. п.

8. Thread (поток). Соответствует потоку выполнения. Эти потоки никаким образом не связаны с операционной системой и поддерживаются исключительно средствами самого Lua.

Как в Lua задать тип переменной?

Lua не предусматривает явного задания типа переменной. Тип переменной устанавливается в момент присвоения переменной значения. Любой переменной может быть присвоено значение любого типа (вне зависимости от того, значение какого типа она содержала ранее).

a = 123 — переменная a имеет тип number

a = «123» — теперь переменная a имеет тип string

a = true — теперь переменная a имеет тип boolean

a = {} — теперь переменная a имеет тип table

Обратите внимание

Переменные типа table, function, thread и userdata не содержат самих данных, а хранят ссылки на соответствующие объекты. При присваивании, передачи в функцию в качестве аргумента и возвращении из функции в качестве результата копирования объектов не происходит, копируются только ссылки на них.

a = {} — создаем таблицу. В переменную a помещается ссылка на таблицу

b = a — переменная b ссылается на ту же таблицу, что и a

a[1] = 10 — элементу таблицы с индексом 1 присвоено значение 10

MsgBox(b[1]) —> ’10’

b[1] = 20

MsgBox(a[1]) —> ’20’

Остальные данные являются непосредственными значениями.

a = 10

b = a

a = 20

MsgBox(a) —> ’20’

MsgBox(b) —> ’10’

Как в Lua получить тип переменной?

Тип значения, сохранённого в переменной, можно выяснить при помощи стандартной функции type. Эта функция возвращает строку, содержащую название типа («nil», «number», «string», «boolean», «table», «function», «thread», «userdata»).

t = type («это строка») — t равно «string»

t = type (123) — t равно «number»

t = type (type) — t равно «function»

t = type (true) — t равно «boolean»

t = type (nil) — t равно «nil»

t = type (CroApp.GetBank()) — t равно «userdata»

Как в Lua преобразовать тип переменной?

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

a = «10» + 2 — a равно 12

a = «10» + 2 — a равно «10 + 2»

a = «-5.3e-10″*«2» — a равно -1.06e-09

a = «строка» + 2 — Ошибка! Невозможно преобразовать «строка» в число

Значение любого типа можно явным образом преобразовать в строку с помощью стандартной функции tostring.

a = tostring (10) — a равно «10»

a = tostring (true) — a равно «true»

a = tostring (nil) — a равно «nil»

a = tostring ({[1] = «это поле 1»}) — a равно «table: 06DB1058»

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

a = render (10) — a равно «10»

a = render (true) — a равно «true»

a = render (nil) — a равно «nil»

a = render ({[1] = «это поле 1»}) — a равно «{[1] = «это поле 1»}»

Для явного преобразования значения в число можно использовать стандартную функцию tonumber. Если значение является строкой, которую можно преобразовать в число (или уже является числом), функция возвращает результат преобразования, в противном случае возвращает nil.

a = tonumber («10») — a равно «10»

a = tonumber («10»..».5″) — a равно 10.5

a = tonumber (true) — a равно «nil»

a = tonumber (nil) — a равно «nil»

Расстановка комментариев в Lua

Комментарий в Lua начинается двумя знаками «минус» (—) и продолжается до конца строки.

local a = 1 — однострочный комментарий

Если непосредственно после символов «—» идут две открывающие квадратные скобки ([[), комментарий являетсямногострочным и продолжается до двух закрывающих квадратных скобок (]]).

local a = 1 — [[ многострочный

комментарий ]]

Двойные скобки в комментариях могут быть вложенными. Для того чтобы их не перепутать, между скобками вставляется знак равенства (=):

local a = [[Компания «Кронос»]] — [=[

local a = [[Компания «Кронос»]]

]=]

Количество символов «=» определяет вложенность:

local a = [=[определение некоторой строки [[string]] в языке Lua]=] —[==[

local a = [=[определение некоторой строки [[string]] в языке Lua]=]

]==]

Операции, применяемые в Lua

В выражениях, написанных на Lua, могут применяться следующие виды операций:

1. Арифметические операции.

Lua поддерживает следующие арифметические операции:

+ (сложение);

— (вычитание);

* (умножение);

/ (деление);

^ (возведение в степень);

% (остаток от деления).

Обратите внимание

Арифметические операции применимы как к числам, так и к строкам, которые в этом случае преобразуются в числа.

2. Операции сравнения.

В Lua допустимы следующие операции сравнения величин:

== (равно);

~= (не равно);

< (меньше);

> (больше);

<= (меньше или равно);

>= (больше или равно).

Обратите внимание

Операции сравнения всегда возвращают логическое значение true или false.

Правила преобразования чисел в строки (и наоборот) при сравнениях не работают, т. е. выражение «0» == 0 даёт в результате false.

3. Логические операции.

К логическим операциям относятся:

and (логическое И).

Операция and возвращает свой первый операнд, если он имеет значение false или nil. В противном случае, операция возвращает второй операнд (причём этот операнд может быть произвольного типа).

a = (nil and 5) — a равно nil

a == (false and 5) — a равно false

a == (4 and 5) — a равно 5

or (логическое ИЛИ).

Операция or возвращает первый операнд, если он не false и не nil, иначе он возвращает второй операнд.

a == (4 or 5) — a равно 4

a == (false or 5) — a равно 5

Обратите внимание

Логические операции and и or могут возвращать значения любых типов.

Логические операции and и or вычисляют значение второго операнда только в том случае, если его нужно вернуть. Если этого не требуется, второй операнд не вычисляется. Например:

a == (4 or f()) — вызова функции f() не произойдет

not (логическое НЕ).

Операция not всегда возвращает true или false.

4. Операция конкатенации.

Для конкатенации (объединения) строк служит операция… (две точки).

a = «Кронос»..»-«..«Информ» — переменная a получит значение «Кронос-Информ»

Обратите внимание

Если один или оба операнда являются числами, выполняется их преобразование в строки.

a = 0..1 — переменная a получит значение «01»

5. Операция получения длины.

В Lua определена операция длины #, которую можно использовать для получения длины строки.

a = «строка»

len = #a — len равно 6

len = #«ещё строка» — len равно 10

Обратите внимание

С помощью операции # можно также узнать максимальный индекс (или размер) массива. Подробнее — в статье «Работа с массивами в Lua» .

Приоритет операций в Lua

В языке Lua выполнение операций осуществляется в соответствии со следующим приоритетом (в порядке убывания):

1. ^

2. not # — (унарный)

3. * / %

4. + —

5. ..

6. < > <= >= ~= ==

7. and

8. or

 Вызов скриптов из форм

С каждой формой (включая вложенные формы) связан отдельный скрипт, который обычно содержит функции, выполняющие обработку событий формы и её элементов.

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

Необходимо отметить, что скрипт формы, хотя и не содержит вызова функции module, фактически является модулем. Это означает, что переменные, объявленные в скрипте формы без ключевого слова local, не выносятся в глобальное окружение и доступны только внутри этого скрипта. Если необходимо сделать какое-либо значение доступным для скриптов других форм, его следует явным образом определить в глобальной таблице _G:

_G.var = 123

Другой скрипт форм сможет прочитать это значение следующим образом:

local a = _G.var

Блоки операторов (инструкций)

К основным операторам Lua относятся:

присваивание;

условный оператор;

операторы для организации циклов.

Группа операторов может быть объединена в блок (составной оператор) при помощи конструкции do… end.

do — начало блока

   <оператор1> — тело блока

   <оператор2>

   …

   <операторN>

end — конец блока

Блок открывает новую область видимости, в которой можно определять локальные переменные.

a = 5 — глобальная переменная a

do

   local a = 20 — внутри do-end определяется локальная переменная а

   MsgBox(a) —> 20

end

MsgBox(a) —> 5 (здесь обращение уже к глобальной a)

Оператор присваивания в Lua

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

a = 1 — переменной a присвоено значение 1

a = b + c — переменной a присвоена сумма значений переменных b и с

a = f(x) — переменной a присвоено значение, возвращённое функцией f(x)

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

a, b = 1, 5*c — a равно 1; b равно 5*c

Если переменных больше чем значений, «лишним» переменным присваивается nil.

a, b, c = 1, 2 — a равно 1; b равно 2; c равно nil

Если значений больше чем переменных, «лишние» значения игнорируются.

a, b = 1, 2, 3 — a равно 1; b равно 2; значение 3 не использовано

Множественное присваивание можно использовать для обмена значениями между переменными:

a = 10; b = 20 — a равно 10, b равно 20

a, b = b, a — теперь a равно 20, b равно 10

Условный оператор (if) в Lua

Оператор if проверяет истинность заданного условия. Если условие является истинным, выполняется часть кода, следующая за ключевым словом then (секция then). В противном случае, выполняется код, следующий за ключевым словом else (секция else).

if a > b then

   return a — если a больше b, вернуть a

else

   return b — в противном случае — вернуть b

end

Секция else является необязательной.

if a < 0 then

   a = 0 — если a меньше 0, присвоить a значение 0

end

Вместо вложенных операторов if можно использовать конструкцию elseif. Например, приведенный код:

if a == 1 then

   return «Иван» — если a равно 1

else

   if a == 2 then

     return «Петр» — если a равно 2

   else

      if a == 3 then

         return «Сергей» — если a равно 3

      else

         return «Нет такого игрока» — если a — ни одно из перечисленных

      end

   end

end

будет проще для восприятия, если заменить его следующим:

if a == 1 then

   return «Иван» — если a равно 1

elseif a == 2 then

   return «Петр» — если a равно 2

elseif a == 3 then

   return «Сергей» — если a равно 3

else

   return «Нет такого игрока» — если a — ни одно из перечисленных

end

Цикл с предусловием (while) в Lua

Оператор while предназначен для организации циклов с предусловием и имеет следующий вид:

while <condition> do

   … — тело цикла

end

Перед каждой итерацией цикла проверяется условие <condition>:

если условие ложно, цикл завершается и управление передаётся первому оператору, следующему за оператором while;

если условие истинно, выполняется тело цикла, после чего все действия повторяются.

i = 10; t = {}

while i > 0 do — цикл от 10 до 1

   t[i] = «поле »..i

   i = i — 1

end

Для выхода из цикла до его завершения можно использовать оператор break.

a = {3, 5, 8, -6, 5}

i = #a

while i > 0 do — ищем в массиве отрицательное значение

   if a[i] < 0 then break end — если найдено, прерываем цикл

   i = i — 1 — иначе переходим к следующему элементу

end

if i > 0 then

   MsgBox («Индекс отрицательного значения: »..i)

else

   MsgBox («Массив не содержит отрицательных значений»)

end

Примечание

Подробнее об особенностях использования оператора break — в статье «Операторы break и return»

Цикл с постусловием (repeat) в Lua

Оператор repeat предназначен для организации циклов с постусловием и имеет следующий вид:

repeat

   … — тело цикла

until <condition>

Тело цикла выполняется до тех пор, пока условие <condition> не станет истинным. Проверка условия осуществляется после выполнения тела цикла, поэтому в любом случае тело цикла выполнится хотя бы один раз.

— суммируем значения массива a, пока сумма не превысит 10

a = {3, 2, 5, 7, 9}

i = 0; sum = 0

repeat

   i = i + 1

   sum = sum + a[i]

until sum > 10

MsgBox («Сложено »..i..» элементов. Сумма равна «..sum)

Для выхода из цикла до его завершения можно использовать оператор break.

Примечание

Подробнее об особенностях использования оператора break — в статье «Операторы break и return»

Циклы с оператором for в Lua

Оператор for предназначен для организации циклов и допускает две формы записи:

простую (числовой for);

расширенную (универсальный for).

Простая форма оператора for

Простая форма оператора for имеет следующий вид:

for var = exp1, exp2, exp3 do

   … — тело цикла

end

Тело цикла выполняется для каждого значения переменной цикла (счётчика) var в интервале от exp1 до exp2, с шагом exp3.

Примечание

Шаг может не задаваться. В этом случае он принимается равным 1.

for i = 1, 10 do — цикл от 1 до 10 с шагом 1

MsgBox («i равно »..i)

end

for i = 10, 1, -1 do — цикл от 10 до 1 с шагом -1

   MsgBox («i равно »..i)

end

Обратите внимание

Выражения exp1, exp2 и exp3 вычисляются всего один раз, перед началом цикла. Так, в примере ниже, функция f(x) будет вызвана для вычисления верхнего предела цикла только один раз:

for i = 1, f(x) do — цикл от 1 до значения, возвращенного функцией f()

MsgBox («i равно »..i)

end

Переменная цикла является локальной для оператора цикла и по его окончании не определена.

for i = 1, 10 do — цикл от 1 до значения, возвращенного функцией f()

   MsgBox («i равно »..i)

end

MsgBox («После выхода из цикла i равно »..i) — Неверно! i равно nil

Обратите внимание

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

Для выхода из цикла до его завершения используется оператор break.

a = {3, 5, 8, -6, 5}

for i = 1,#a do — ищем в массиве отрицательное значение

   if a[i] < 0 then — если найдено…

      index = i — сохраняем индекс найденного значения…

      break — и прерываем цикл

   end

end

MsgBox («Индекс отрицательного значения: »..index)

Примечание

Подробнее об особенностях использования оператора break — в статье «Операторы break и return»    )

нужен.

Хотя Lua-файлы можно изменять в любом текстовом редакторе, но специализированные редакторы Lua имеют ряд преимуществ.

См. также
  • ЧаВо по UI/Ресурсы для авторов аддонов

Бесплатные[]

WoWUIDesigner
Полноценная интегрированная среда разработки (IDE) для Lua-файлов и файлов XML UI, включая технологию IntelliSense для большинства API функций WoW – Windows XP/2000/2003/Vista.
Eclipse
Eclipse + плагин Lua Eclipse. Для Windows, Mac OS X и других платформ.
LuaEdit (открытый исходный код)
Полноценная профессиональная среда разработки Lua (IDE) — Windows 98/2000/XP.
PSPad
Подсветка синтаксиса Lua и XML-файлов, полнофункциональный редактор для программиста. Существуют настройки для разработчиков приложений для WoW, которые необходимо установить, чтобы выделялись все API функции WoW! Подробности по ссылке.
Komodo Edit (открытый исходный код)
Очень приятный редактор, построенный на базе Mozilla и Scintilla, с расширениями от Firefox, а также подсветкой синтаксиса от SciTE.
LuaIDE
Интегрированная среда разработки Lua для Windows.
SciTE (открытый исходный код)
Бесплатный редактор с гибкими возможностями расширения своего функционала. Имеется три предустанавливаемые версии разработки приложений для WoW с подсветкой синтаксиса Lua и XML, и многим другим:

SciTE-WoWUI на wowinterface.com
WoW SciTe на wowguru.com
SciTe-Ru на code.google.com
Версия с синтаксисом подсветки функций API WoW 3.0.
Notepad++ (открытый исходный код)
Бесплатный редактор исходного кода, который поддерживает несколько языков программирования, в том числе LUA и XML.
Proton
Неплохой бесплатный немецкий редактор, но, к сожалению, без поддержки UTF-8. Синтаксическая подсветка XML доступна в стандартной комплектации, а для Lua доступен специальный модуль [1].
Stub.png Эта незавершённая статья или раздел нуждается в переводе.

  • Эта статья полностью или частично на английском языке.
  • Замените английские игровые названия на их русский эквивалент, руководствуясь официальным переводом.
Emacs (Open Source)
An extensible, customizable text editor—and more. Complete built-in documentation, including a tutorial for new users. Use lua-mode to get syntax highlighting for .lua files.
gVIM (Open Source)
An extremely powerful, multi-platform editor. Supports syntax highlighting for Lua, XML, and hundreds of other file types, as well as automatic indentation/comment formatting, the ability to jump between matching tags (if then else, <open></close>, etc.), and much more.
Smultron
Free Cocoa-based text editor for the Mac written for Mac OS X 10.4 («Tiger»). Very good. Has LUA syntax coloring.
TextWrangler
Free general purpose text/code editor with Lua and XML syntax highlighting.
Eddie
Free programmer’s editor Mac OS X. Includes Lua syntax coloring and function popup plus many other features.
Crimson Editor
A Free professional Windows code editor, comes with Lua and XML syntax highlighting, along with many other file types.

WoWLua CE
A Crimson Editor Specification for color coding World of Warcraft API, Widget, and Event keywords.
B:Lua (Open Source)
Under development and will, in time, hopefully provide a useful IDE for WoW Lua script development.
Programmer’s Notepad
Легкий блокнот с подсветкой синтаксиса. Поддерживает много языков (текущая бета-версия поддерживает Lua).
AddOn Studio
Бесплатная версия Visual Studio предназначенная специально для создания дополнений для WoW.
luaTopping (Open Source)
(Under Development) luaTopping is a NetBeans plugin that adds WoW Addon «Project» support to the NetBeans IDE. Features include common addon file templates and deploy action to WoW folder. Accompaning luaSupport module provides lua language support (syntax highlighting and grammar verification). Desired features include code completition, WoW API hints/help, among others.

Условно бесплатные[]

DForD LuaCoding
A full graphical Lua IDE. It supports syntax highlighting, symbol browsing/searching, auto-completion, code snippet, debugging, building and more. If you know MSVC, you’ll be comfortable immediately (F5 to start debugging, F9 for breakpoints, etc). It’s supported by a fully Lua script written plugin framework.
QDE
Quotix Development Environment for Lua. It supports project management, autocomplete functionality, a multi-document interface, debugging and much more. Sadly doesn’t include a debug mode to test scripts with.
Zeus for Windows
IDE with Lua syntax highlighting, code folding, project management, integrated version control. The IDE is fully scriptable using Lua
TextPad
Not an official Lua IDE however, with an available syntax file available as an addon provides great syntax highlighting.
Edit+
Not an official Lua IDE however, with an available syntax file available as an addon provides great syntax highlighting. You can freely download and try it for 30 days. If you find it useful and decide to keep it over 30-day evaluation period, you should pay the registration fee. Nag window remains on startup if not registered.
EmEditor
Excellent text editor which won «Best Application» in the 2008 Shareware Industry Awards. Some notable new features are auto-completion ( all file types ) and Ctags support. The list of syntax files available shows Lua 5.1 is available.

Supported OS: Windows Vista/XP/2000/Server 2008/Server 2003/Windows 7 ( 32-bit & 64-bit ).
EditPad Pro
Great notepad replacement/enhancement with just about the best support of any editor for Regexes. Lua syntax hilight and code navigation with a Lua add-on located on this page. Free 30-day evaluation copy of EditPad Pro or download EditPad Lite, free for non-commercial use. EditPad Lite and Pro are available for Windows and Linux.
UltraEdit
Comprehensive programmer’s text editor with coloration, code folding, autoindentation, code projects, etc. You can freely download and try it for 30 days. Syntax definitions for WoW Lua and XML are maintained here: UltraEdit WoW wordfile.txt or a new complete lua.txt including WoW, WotLK, Ace2 & Ace3 API functions and XML is available at http://wowluatxt.googlecode.com
SubEthaEdit
Collaborative text editor with Lua syntax highlighting. For Mac OS X.
Sublime Text
Beautiful Windows text editor with inbuilt Lua syntax highlighting.
ScriptDev
ScriptDev is a powerful script language IDE, it can support some very popular script language, for example, Tcl, Python, Ruby, Lua, Perl and so on.

Коммерческие[]

Внешние ссылки[]

  • Lua Addons Большой ресурс, с огромный количеством IDE Lua и других инструментов этого языка программирования.

Главная » Основные форумы » Программирование на языке Lua

Страницы:
1

 

Сергей


Пользователь

Сообщений: 49
Регистрация: 19.10.2015

#1

02.01.2022 14:17:32

Здравствуйте!

Посоветуйте, пожалуйста, мощный редактор для LUA. Есть что-то типа PhpStorm, чтобы можно было работать  с проектом из нескольких файлов, с навигацией внутри проекта (например, переход к процедуре при нажатии на ее имя с Ctrl), с закладками и подсветкой кода? Идеально, если бы еще ошибки LUA подсвечивались.

Сейчас использую Notepad++ с плагином, но в нем нет никакой навигации.

 

Nikolay


Пользователь

Сообщений: 698
Регистрация: 27.01.2017

#2

02.01.2022 14:36:18

visual stidio code + plugins:

https://marketplace.visualstudio.com/items?itemName=keyring.Lua
https://marketplace.visualstudio.com/items?itemName=sumneko.lua
https://marketplace.visualstudio.com/items?itemName=actboy168.lua-debug

ну и для git  

https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens

Или IntelliJ IDEA + EmmyLua

Дело вкуса. Но idea тормоз, особенно при глобальном поиске.

https://nick-nh.github.io/
https://github.com/nick-nh/qlua

 

Сергей


Пользователь

Сообщений: 49
Регистрация: 19.10.2015

#3

02.01.2022 14:49:41

Цитата
Nikolay написал:
visual stidio code + plugins:

Огромное спасибо! То что нужно!

 

Вася


Пользователь

Сообщений: 50
Регистрация: 17.11.2021

#4

12.01.2022 20:16:59

А как сделать, чтобы в visual stidio code кириллица нормально отображалась? А то у меня ромбики вместо букв.

 

Евгений


Пользователь

Сообщений: 690
Регистрация: 07.12.2020

Трейдер

#5

12.01.2022 21:29:22

Цитата
Вася написал:
А как сделать, чтобы в visual stidio code кириллица нормально отображалась? А то у меня ромбики вместо букв.

Лучше используй Notepad

 

Nikolay


Пользователь

Сообщений: 698
Регистрация: 27.01.2017

#6

13.01.2022 09:34:13

Цитата
Вася написал:
А как сделать, чтобы в visual stidio code кириллица нормально отображалась? А то у меня ромбики вместо букв.

Установить в настройках кодировку по умолчанию win1251.
Можно только для рабочей зоны, можно доля всех файлов lua. По желанию.

Для примера:

Код
    "[lua]": {
        "files.encoding": "windows1251"
    },
    "[plaintext]": {
        "files.encoding": "windows1251"
    },
    "[log]": {
        "files.encoding": "windows1251"
    }

https://nick-nh.github.io/
https://github.com/nick-nh/qlua

 

Nikolay


Пользователь

Сообщений: 698
Регистрация: 27.01.2017

#7

13.01.2022 09:36:52

Цитата
Лучше используй Notepad

Очень спорное утверждение. Почему не Vim или Emacs?
Notepad++?, если речь про него, хорош если быстренько открыть водном файле, посмотреть, закрыть.

https://nick-nh.github.io/
https://github.com/nick-nh/qlua

 

Вася


Пользователь

Сообщений: 50
Регистрация: 17.11.2021

#8

13.01.2022 12:18:15

А ZeroBrane как? Норм редактор?

 

Nikolay


Пользователь

Сообщений: 698
Регистрация: 27.01.2017

#9

13.01.2022 13:45:02

Цитата
Вася написал:
А ZeroBrane как? Норм редактор?

Он не поддерживает кодировку Win1251. Квик же в 2022 только ее понимает…
Правда для ZeroBrane можно скрипт на том же lua для перекодировки при открытия файла настроить. Но это не лучший вариант. Часто файлы потом не открываются вообще.

https://nick-nh.github.io/
https://github.com/nick-nh/qlua

 

Евгений


Пользователь

Сообщений: 690
Регистрация: 07.12.2020

Трейдер

#10

13.01.2022 16:44:21

Цитата
Nikolay написал:

Цитата
Лучше используй Notepad

Очень спорное утверждение. Почему не Vim или Emacs?
Notepad++?, если речь про него, хорош если быстренько открыть водном файле, посмотреть, закрыть.

Это проверенная временем программа, полностью устраивает, есть дополнительные функции, просто удобно. Многие смотрел, для Lua самое то

 

Roffild


Пользователь

Сообщений: 87
Регистрация: 04.10.2021

#11

13.01.2022 20:32:47

Автоподстановка для QLua

Библиотека облегчает моральные и душевные страдания, получаемые от QUIK QLua.QUIK QLua подстановка с описанием для редакторов Lua.

 

Вася


Пользователь

Сообщений: 50
Регистрация: 17.11.2021

#12

13.01.2022 21:27:48

Я установил visual stidio code + plugins:

https://marketplace.visualstudio.com/items?itemName=keyring.Lua
https://marketplace.visualstudio.com/items?itemName=sumneko.lua
https://marketplace.visualstudio.com/items?itemName=actboy168.lua-debug

как советовал Nikolay выше.

Написал простой код, нажимаю F5 и вылезает ошибка: The ‘cwd’ can not be resolved in a multi folder workspace. Solution: «cwd»: «${workspaceFolder:name}»

Подскажите, плиз, как это исправить.

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#13

13.01.2022 22:33:49

Здесь уже советовали пользоваться блокнотом — его ещё не успели основательно изуродовать, хотя и он всё чаще норовит писать в юникоде. Лично я много лет пользуюсь встроенным редактором Far Manager и примерно столько же лет ничего лучшего просто не ищу. Он даже подсвечивает переменные, открывающие и закрывающие скобки (в т.ч. операторные), если файл имеет расширение .lua, но это мелочь. А вот то, что там макросы есть…

 

nikolz


Пользователь

Сообщений: 2521
Регистрация: 30.01.2015

#14

14.01.2022 06:55:27

SciTe — написан на луа, есть встроенный  компилятор и отладчик

 

Вася


Пользователь

Сообщений: 50
Регистрация: 17.11.2021

#15

14.01.2022 07:22:47

Цитата
nikolz написал:
SciTe — написан на луа, есть встроенный  компилятор и отладчик

От SciTe у меня лично глаза болят. Слишком контрастные цвета (я темную тему поставил). А в настройках я так и не смог найти как изменить цветовое оформление.

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#16

14.01.2022 09:35:05

nikolz,

Цитата
SciTe — написан на луа, есть встроенный  компилятор и отладчик

Убийственная характеристика редактору! Лучше помню только фразу Кернигана из статьи «Почему Паскаль не является моим любимым языком программирования»: «Три из четырёх известных мне компиляторов с Паскаля написаны на Си». :smile:

 

nikolz


Пользователь

Сообщений: 2521
Регистрация: 30.01.2015

#17

14.01.2022 11:17:44

Цитата
Владимир написал:
nikolz,

Цитата
SciTe — написан на луа, есть встроенный  компилятор и отладчик

Убийственная характеристика редактору! Лучше помню только фразу Кернигана из статьи «Почему Паскаль не является моим любимым языком программирования»:  «Три из четырёх известных мне компиляторов с Паскаля написаны на Си». ::  

Видно, что Вы не в теме.
У Вас получается типа — «кина не видел, но считаю , что говно»
—————————  
На луа написан не только редактор но и многие  игры а также системы управления нефтяным оборудованием и приборами (Собственно для этого его и создавали изначально).
——————
Так как SciTe написан на луа, то пользователь может легко добавить свои плюшки и быть до …. счастливым и радостным.

 

nikolz


Пользователь

Сообщений: 2521
Регистрация: 30.01.2015

#18

14.01.2022 11:21:44

Цитата
Владимир написал:
nikolz,

Цитата
SciTe — написан на луа, есть встроенный  компилятор и отладчик

Убийственная характеристика редактору! Лучше помню только фразу Кернигана из статьи «Почему Паскаль не является моим любимым языком программирования»:  «Три из четырёх известных мне компиляторов с Паскаля написаны на Си». ::  

специально для Вас из Вики:
———————————
По идеологии и реализации язык Lua ближе всего к

JavaScript

, в частности, он также реализует

прототипную

модель

ООП

, но отличается паскалеподобным синтаксисом и более мощными и гибкими конструкциями. Характерной особенностью Lua является реализация большого числа программных сущностей минимумом синтаксических средств. Так, все составные пользовательские типы данных (

массивы

,

структуры

,

множества

,

очереди

,

списки

) реализуются через механизм таблиц, а механизмы

объектно-ориентированного программирования

, включая

множественное наследование

— с использованием метатаблиц, которые также отвечают за

перегрузку операций

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

Adobe Lightroom

). Также получил известность как язык программирования уровней и расширений во многих играх (в том числе

Garry’s Mod

)

[10]

.

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#19

14.01.2022 12:10:55

nikolz, Да на кой мне Вики, если я сам на нём больше года программирую? И я уже несколько раз говорил, что я чуть ли не единственный на этом форуме, кто программирует на чистом Lua, так что это ВЫ «не в теме», это У ВАС получается типа — «кина не видел, но считаю, что конфетка». Мне плевать, что там «на луа написано» и для чего его и «создавали изначально», язык — ГОВНО! Редкостное говно! Динамическая типизация, убийство типа integer, кастрированный goto… ЧАВО?! Она по сравнению с JS «отличается более мощными и гибкими конструкциями»?! Это какими ж такими? Огласите весь список, пжалста! :smile:

Не «реализация большого числа программных сущностей минимумом синтаксических средств», а эмуляция этих сущностей через жо… через механизм key-value, который с какого-то бодуна регулярно обзывают «таблицами». Вот что «Lua предназначен для пользователей, не являющихся профессиональными программистами» — верю безоговорочно: ни один программист ТАКОГО говна написать не в состоянии! Ах, да — я ведь чуть ли не сразу после появления на этом форуме писал:

29.09.2020 10:31:16
Убрать тип integer из языка, на мой взгляд, есть самая большая дурость. Ладно, бог с ним, с никому не нужным boolean — пусть будет, если нравится, но с целочисленными переменными я за долгие годы программирования (а я уже пенсионер!) работал раз в 10 чаще, чем с вещественными! Если не во все сто.

Ну вот, по Вашей ссылке, первым же предложением: «Tables in Lua are not a data structure; they are the data structure. All structures that other languages offer—arrays, records, lists, queues, sets—are represented with tables in Lua». Иными словами, никаких структур данных просто НЕТ! Печально… А уж «обоснование» и вообще курам на смех: «Хотя мы МОЖЕМ (!) реализовать массивы и списки, таблицы мощнее. Многие алгоритмы упрощаются до тривиальности с использованием таблиц». И дальше вообще издевательство: «Например, вы редко пишете поиск в Lua, потому что таблицы предлагают прямой (!!!) доступ к любому типу». Ребятки, доступ по ключу — это не прямой, а как раз КРИВОЙ доступ к данным! Даже если обозвать ключи «индексами». Уши бы надрать этому «Роберто Иерусалимскому!

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

Или, скажем, 25.03.2021 12:28:31
Какие «индексируемые таблицы» — побойтесь Бога! Мне чуть ли не с первого дня стало очевидно, что тут постоянно путают индексы и имена, что является источником многочисленных глюков — в том числе, и в основном ПО Квика (таблица заявок, я об этом не раз писал). Язык отвратителен, и только за убийство типа integer и замену его на вонючий «тип number» создателей нельзя подпускать к компу ближе, чем на километр — об этом и о многом другом я тоже писал. Как и о том, что синтаксис, про который Вы здесь соловьём заливаетесь, вообще не имеет значения — профессионалу всё равно, на каком языке писать, была бы обеспечена требуемая функциональность.

Для справки: все эти «далеко ушедшие вперёд» неучи, которыми написана заметка в Вики, на которую здесь давалась ссылка, всё-таки в курсе, что элементы строки не обязательно байты, но, судя по всему, ВААПЩЕ без понятия, что строки могут быть НЕ ТОЛЬКО текстом, что это именно АЛГОРИТМИЧЕСКОЕ понятие (и пофиг какая у них конкретная реализация): строки событий или, скажем, мультиязычные строки для них тайна за семью печатями. Или что тривиальная буферизация файловых операций даже при работе с текстовыми файлами читает и пишет, с точки зрения прикладника, именно строками, а обмен с диском при этом происходит массивами (секторами или там кластерами).

Строки НЕЛЬЗЯ «индексировать как таблицы», какие бы не делать «финты ушами»: индекс — это НЕ имя, и об этом я тоже писал буквально в первых же своих постах (а Ваш убогий «финт ушами» эмулирует обращение по индексу как массива, а не «как таблицы», и абсолютно бесполезен — разве что для пущего оверхеда).

 

БорисД


Пользователь

Сообщений: 177
Регистрация: 14.10.2021

#20

15.01.2022 03:41:15

Цитата
Евгений написал:

Цитата
Вася написал:
А как сделать, чтобы в visual stidio code кириллица нормально отображалась? А то у меня ромбики вместо букв.

Лучше используй Notepad

это тот самый Notepad который каждый раз перед его использованием просит его снова переустановить ?     Ну тогда лучше остатья пользователем старенького и известного всем блокгнота — нервы целее будут чем при использовании вашего Notepad

 

nikolz


Пользователь

Сообщений: 2521
Регистрация: 30.01.2015

#21

15.01.2022 07:47:51

Цитата
Владимир написал:
И я уже несколько раз говорил, что я чуть ли не единственный на этом форуме, кто программирует на чистом Lua,

Не «реализация большого числа программных сущностей минимумом синтаксических средств», а эмуляция этих сущностей через жо… через механизм key-value, который с какого-то бодуна регулярно обзывают «таблицами».

29.09.2020 10:31:16
Убрать тип integer из языка, на мой взгляд, есть самая большая дурость. Ладно, бог с ним, с никому не нужным boolean — пусть будет, если нравится, но с целочисленными переменными я за долгие годы программирования (а я уже пенсионер!) работал раз в 10 чаще, чем с вещественными! Если не во все сто.

Ребятки, доступ по ключу — это не прямой, а как раз КРИВОЙ доступ к данным! Даже если обозвать ключи «индексами». Уши бы надрать этому «Роберто Иерусалимскому!

Какие «индексируемые таблицы» — побойтесь Бога! Мне чуть ли не с первого дня стало очевидно, что тут постоянно путают индексы и имена, что является источником многочисленных глюков — в том числе, и в основном ПО Квика (таблица заявок, я об этом не раз писал). Язык отвратителен, и только за убийство типа integer и замену его на вонючий «тип number» создателей нельзя подпускать к компу ближе, чем на километр — об этом и о многом другом я тоже писал. Как и о том, что синтаксис, про который Вы здесь соловьём заливаетесь, вообще не имеет значения — профессионалу всё равно, на каком языке писать, была бы обеспечена требуемая функциональность.

Строки НЕЛЬЗЯ «индексировать как таблицы», какие бы не делать «финты ушами»: индекс — это НЕ имя, и об этом я тоже писал буквально в первых же своих постах (а Ваш убогий «финт ушами» эмулирует обращение по индексу как массива, а не «как таблицы», и абсолютно бесполезен — разве что для пущего оверхеда).

Попробую объяснить Ваши заблуждения, но скорее не для Вас, а для начинающих.
——————————
1) Луа — это скриптовый язык и он имеет вполне определенною область применения.
Подобно микроскопу, который можно применять и в качестве молотка для забивания гвоздей, но не так эффективно.
—————————
Назначение чистого луа  — это быстрое  и простое тестирование идей и алгоритмов, создание диалоговых интерфейсов для устройств и программ.
Т е чистый луа -это инструмент для быстрой разработки программ взаимодействия компьютера и человека.
——————————
Все функции в библиотеках Луа написаны на чистом СИ, поэтому они работаю быстро.
——————————-
Для реализации более сложных и быстродействующих задач предназначен язык СИ и API C for Lua.
===================  
Создание торговых роботов в КВИК — это задача создания систем реального времени.
В реализации этой системы условно можно выделить три задачи.
———————-
1 задача, это интерфейс с человеком.  И эту задачу легко и эффективно решать на чистом Луа.
————————
2 задача, это задача взаимодействие робота с биржей , сервером брокера и терминалом QUIK.  
Эту задачу разработчики реализовали на СИ в виде библиотеки QLUA.  т е программ на чистом СИ взаимодействующие с VM Lua через API C for Lua.
————————
3 задача, это разработка и реализация алгоритма работы робота.
Не сложно понять, что наиболее эффективно этот алгоритм можно реализовать лишь на СИ, т е как задачу 2.
Но дело в том, что пользователи Луа не есть профессиональные программисты.
Но Луа позволяет им тоже заняться творчеством и написать собственные, пусть и не оптимально реализованные алгоритмы.
———————  
Поэтому ранее я Вам пытался объяснить, что на чистом луа  сложные алгоритмы  пишут,  либо профи для быстрой реализации идеи, чтобы ее протестить,
либо чайники  , которые горды собственным невежеством и не сомневаются в собственной гениальности.  
================  

Теперь объясню немного Ваши заблуждения относительно реализации Луа внутри.
Судя по Вашим гневным рассуждениям, Вы не разбирались в исходниках VM Lua.
——————————
Все переменные (кроме данных в таблицах)  имеют именно прямой доступ. Они представляют собой структуры
В этой структуре есть 32 бит (или 64 бит) слово, которое содержит целую, вещественную, булев. переменные. а также указатель на таблицу или функцию.
Если Вы используете API C for Lua, то Вы получаете прямой доступ к ним.    
Замечу, что указатель — это и есть любимое Вами целое.
—————  
Но для чайников эти возможности, по вполне понятным причинам, недоступны на чистом Луа.  Доступ чайникам к целому типу в версиях 5.3 создало  кучу  вопросов на этом форуме.
Так как чайник не читает документации — потому что он чайник .
———————-
Теперь про Выши гневные опусы о строках текста.
В луа строки текста заменяются изначально на их хеш — 32(64) любимое Вами целое число .
А далее, во всей вашей программе , где вам надо сравнивать сортировать строки, участвуют не строки, а эти числа. Т е обработка строк происходит также быстро как обработка целых чисел.
Ну и где Вы видели более компактное и эффективное решение?
————————
В итоге, если вы присвоите элементу таблицы имя , то луа сделает для него целое число- хэш и далее для извлечения этого элемента будет использовать это целое как индекс в массиве.
====================  
Не буду более рассказывать об интересных и эффективных решениях в VM Lua. Кому интересно, читайте исходники.
==========================  
В результате — Луа самый компактный и быстрый из скриптовых языков. Его  легко встраивать в любые системы, в том числе и на одном чипе.
Конечно, есть множество языков программирования и каждый из них создавался для определенных задач и имеет определенную область эффективного применения.
=========================
И в завершение моего ликбеза, замечу, что в КВИК встроили луа именно для расширения интерфейса для пользователя, а не для создания торговых роботов.
————————
Поэтому не стоит на зеркало пенять…

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#22

15.01.2022 09:56:45

БорисД, Notepad — это и есть блокнот.  :smile: Но редактор Far в 100500 раз лучше — ты видел, что он способен вытворять с объёмными логами, пока мы с тобой курили на балконе.

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#23

15.01.2022 10:58:27

nikolz, Ну, конечно, конечно — скрипт работает у меня, дерёт, как котов всех местных умников и по памяти, и по производительности, и по прибыли, и по количеству тикеров и таймфреймов, а заблуждения — у меня! :smile:  Естественно, Ваши «объяснения скорее не для меня, а для начинающих» — я же их просто размажу по стенке — даже не читая! Но ведь я сейчас Ваш опус и читать буду!..

1) Да неужели?! Во-первых, а что такое «скриптовый язык»? Тыкаем в первую попавшуюся ссылку в Гугле — там аж «Обзор скриптовых языков программирования», и первый же раздел называется «Понятие о скриптовых языках», и первая же фраза в нём гласит:
Что такое «скриптовый язык»? Это туманный вопрос, в котором содержатся два термина — «скриптовый» (scripting) и «язык» (language), произошедшие из областей, не имеющих отношения к компьютерам. Смысл, в котором эти термины используют многие люди, расплывчат. Даже такое простое слово, как «язык», легко можно использовать неверно.
То есть, как я и предполагал, никто из вас, умники хреновы, вообще не знает, что это такое.

Второй вопрос: а Луа-то с какого бодуна нарисовался? Неужто вашему стаду мало всего предыдущего зоопарка «скриптовых языков»? И что за такую «вполне определенною область применения» он окучивает? Почему ИМЕННО ЭТО говно вдруг понадобилось для этой «области»? Для меня ответ очевиден: а) полноценная биржевая торговля возможна только при помощи роботов б) самая популярная софтина для неё — это Квик и в) фактически единственный язык для написания скриптов и есть Луа. Так ведь я на нём и пишу! Ругаюсь, плююсь, но пишу, ибо больше тупо не на чем! А вы-то, распевающие тут хвалебные оды этому говну, какого хрена САМИ на нём не пишете? На кой ВАМ все эти бесконечные сборки, «тысячи строк кода и десятки библиотек»? Хвалите это убожество? ТАК ПОЛЬЗУЙТЕСЬ! Ещё раз все тот же вопрос: кто, кроме меня, пишет скрипты на чистом Луа — поднимите руки! Что же ни одной-то не видать, включая Вашу, «учитель» хренов?

Ха-ха-ха! А кто тут «быстро  и просто тестировал идеи и алгоритмы» — поднимите руки! Что, тоже ни одной? Правильно, я ведь тут же спрошу, что за идеи, что за алгоритмы, и почему их непременно на этом говне нужно тестировать. А уж про «создание диалоговых интерфейсов» лучше бы и не заикались: у меня за плечами ДЕСЯТКИ диалоговых программ, и это говнище В ПРИНЦИПЕ непригодно для написания диалога — всё, что можно выжать из диалоговых возможностей Луа, я выжал, выкрутил досуха, дважды пытался здесь рассказать, вплоть до кода, но оба раза нарывался на визги разных умников с гнутыми пальцами, которые, как теперь выясняется, даже со сраным курсором справиться не способны! А Вы, лично Вы ХОТЬ ЧТО-НИБУДЬ о диалоге знаете? Вот фрагмент из моей книги, из раздела, который так и называется: «Диалог»:

Честно говоря, мне жаль выбрасывать средства организации диалога в SINT – за долгие годы там накопилось немало интересных решений: горизонтальные, вертикальные, двумерные, трёхмерные, виртуальные (невидимые), неоднородные, редактируемые меню, управление курсором, горячие клавиши, виртуальные клавиши, клавиши «внутрь» и «наружу» для каскадных (Z-меню), трёхмерных или двумерных меню специального вида (XZ или YZ), организация контекстной помощи и диагностики на ошибки, автоопределение координат или палитры, работа мыши в активных и неактивных координатах меню, локальные меню блоков, синхронизация изменения данных в параллельных окнах, плавающий размер паспорта меню, возможность задания собственного «бланка» меню с указанием на нём координат элементов, переопределение объектов до прорисовки меню, до цикла ожидания события, во время ожидания, после обработки события, перед выходом из меню (одно это расширяет возможности программиста со страшной силой – можно, например, организовать меню из элементов базы данных с их подкачкой и редактированием), разгон при листании некоторых видов меню… да разве всё перечислишь!

Ладно, отсмеялся, отписался — пока есть другие дела, а у Вас там много чего ещё понаписано, и его чтение наверняка ещё доставит мне немало весёлых минут. Спасибо за пост! Продолжение следует…

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#24

15.01.2022 12:20:03

nikolz, Нет, дочитаю уж пост до конца… ну, про диалог я в прошлом сообщении всё сказал, а «задача взаимодействия робота с биржей, сервером брокера и терминалом QUIK» тоже реализована безобразно, начиная с позорнейшего факта прихода нескольких прерываний на одно событие (про свечи я просто молчу — это уже экспонат для Кунсткамеры). Буквально вчера закончил (надеюсь) отладку OnTrade в связи с изменившейся технологией торговли в новой версии скрипта, причём о таких ошибках наверняка даже не подозревает подавляющее большинство участников форума — думаю, включая лично Вас. Рассказываю:
а) Каждый таймфрейм может в любое время подать заявку на покупку или продажу.
б) Эти заявки могут быть отвергнуты скриптом (по разным причинам), исполнены путём переноса взяток между таймфреймами (если они сумеют договориться) либо попасть в стек заявок для реального исполнения. Стек организован потому, что тикеров под контролем много, таймфреймов ещё больше, почти все они почти всегда хотят поторговать (в ту или иную сторону) и при одновременной подаче нескольких заявок Квик просто захлебнётся.
в) В полусекундном обработчике одна из заявок изымается из стека и либо отвергается, либо отправляется в Квик.
г) При приходе первой сделки по этой заявке (ID заявки нам ещё не известен, контролируем по ID транзакции) мы её обрабатываем. Если заявка исполнена полностью, ставим счётчик на 15 секунд (чтобы гарантированно пришли все дубли прерывания), после чего свечной обработчик удалит паспорт заявки из стека. В противном случае продлеваем счётчик ещё на 3 минуты для последующих сделок по этой заявке.
д) При приходе прерывания с тем же ID заявки и ID сделки это дубль уже обработанного — игнорируем.
е)  При приходе прерывания с тем же ID заявки, но с другим ID сделки это новая сделка по той же заявке, заменяем ID сделки на новый и обрабатываем заявку по тому же алгоритму.
Уже само описание этой технологии говорит о том, что существующий программный интерфейс Квика сделан, мягко говоря, неудачно, но неприятности на этом только начинаются, ибо прерывания могут приходить вразнобой, хотя и очень редко, и только для тех заявок, которые реализуются в несколько сделок. Тогда, если уже после замены старого ID сделки на новый снова придёт прерывание со старым ID (одного из уже обработанных), скрипт уже не поймёт, что это именно дубль и учтёт это прерывание как новую сделку, что недопустимо. А потому приходится делать множественное поле для ID сделки, а контроль дублей производить по всем этим ID. Вчера же одна из моих заявок в 4 лота растянулась на все 4 сделки, и  прерывания по ним в количестве 12 штук пришли именно «крест-накрест собачьим шагом». Последняя версия OnTrade прекрасно расправилась с ними со всеми, и теперь я считаю эту процедуру отлаженной. А со всеми этими «программами на чистом СИ взаимодействующими с VM Lua через API C for Lua» что прикажете делать? Они же тоже практически НИЧЕГО не умеют!

КОМУ, простите, «не сложно понять, что наиболее эффективно этот алгоритм можно реализовать лишь на СИ»? Криворуким бездарям, вечно скулящим здесь про загрузку CPU? Задача организации торговли — это ПРОСТАЯ задача (за исключением алгоритмов принятия решений, которые здесь никогда не обсуждались), и она ПРЕКРАСНО может быть реализована даже на таком убожестве, как Луа. Просто программировать надо уметь. И что вообще может быть «сложного» в алгоритмах торговли? И насчёт «профи»: Вы будете смеяться, но я вначале поступал с точностью до наоборот: «для быстрой реализации идеи, чтобы ее протестить» писал именно на С, а потом уже переносил код на Луа! Повторяю: профессионалу ВСЁ РАВНО на чём писать!

Ладно, хватит для второй порции.

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#25

15.01.2022 12:54:55

nikolz, Продолжим…

Ха-ха-ха! А на кой мне «разбираться в исходниках (!!!) VM Lua»? Я же ПОЛЬЗОВАТЕЛЬ языка, а не РАЗРАБОТЧИК! Заняться больше нечем? К тому же, я прекрасно знаю, что при ЛЮБОЙ реализации доступ по ключу В ПРИНЦИПЕ не может быть прямым! Ибо прямой доступ есть доступ ПО УКАЗАТЕЛЮ (хотя даже такой способ адресации называется «косвенная»). Замечу, что любому дебилу понятно, что «указатель — это и есть любимое мною целое», как и то, что никаких целых в языке НЕТ. За что следует яйца пообрывать его создателям.

О, Господи! Если создатели И В САМОМ ДЕЛЕ «сортируют не строки, а их хеш», то они в очередной раз ДЕБИЛЫ! Это мой «сортир» сортирует массивы в миллионы, а иногда даже в миллиарды элементов, а здесь ЧТО Вы вообще собрались сортировать? Десяток-другой элементов пару раз в день? Да простой «пузырёк», который пишется в 5 секунд, справится с этой задачей, причём БЫСТРЕЕ, чем этот идиотизм, поскольку не требует накладных расходов. Именно им я сортирую взятки, и только после совершённых сделок по тикеру либо после переноса взяток между таймфреймами, и даже не ради самой сортировки (в 99 случаях из 100 массивы эти и так изначально отсортированы), а для объединения сделок с одинаковой ценой в одну. Кстати, вопрос: ЕСЛИ «луа сделает из имени целое число- хэш и далее для извлечения этого элемента будет использовать это целое как индекс», то КТО будет поддерживать эти индексы в актуальном состоянии? Пушкин? Так что действительно «не стоит на зеркало пенять». :wink:

 

nikolz


Пользователь

Сообщений: 2521
Регистрация: 30.01.2015

#26

16.01.2022 07:24:35

Цитата
Владимир написал:
nikolz, Ну, конечно, конечно — скрипт работает у меня, дерёт, как котов всех местных умников и по памяти, и по производительности, и по прибыли, и по количеству тикеров и таймфреймов, а заблуждения — у меня! ::  Естественно, Ваши «объяснения скорее не для меня, а для начинающих» — я же их просто размажу по стенке — даже не читая! Но ведь я сейчас Ваш опус и читать буду!..

1) Да неужели?! Во-первых, а что такое «скриптовый язык»? Тыкаем в первую попавшуюся ссылку в Гугле — там аж «Обзор скриптовых языков программирования», и первый же раздел называется «Понятие о скриптовых языках», и первая же фраза в нём гласит:

В любой дискуссии есть как минимум два способа высказать свое мнение.
В первом случае , высказывающий пытается унизить , обозвать и нахамить, полагая, что таким образом он доказывает свое превосходство.
Этот способ в человеке заложен природой на уровне подсознания.
Во втором способе, высказывающий пытается высказать свое понимание и свою логику по обсуждаемой , т е дать собеседнику новую информацию, не унижая его, а разъясняя ему.
——————————-
Сожалею, что Вы сторонник первого способа беседы.
=====================
Вы опять заблуждаетесь.
——————
Что такое скриптовый язык.
В моем понимании скрипт — это  программа , которая исполняется на виртуальной машине в  псевдокоде.  Как правило такую программу не надо явно компилировать и линковать.
Достоинство таких языков в том, что виртуальная машина может быть установлена на любом железе и нет надобности под это железо переписывать пользовательские программ.
Классический пример — это  джава.
———————
Теперь про множество скриптовых языков
Проблема в быстродействии и объеме требуемой памяти для развертывания виртуальной машины.
До луа не было ничего подобного, что можно было бы развернуть на микроконтроллерах.
Потом появился микро питон.
—————————
Относительно ваших рассуждений относительно того что и как у вас делают между собой скрипты, то тут Вы тоже ошибаетесь.
————————
Есть такая технология в разработке сложных систем, называемое — системным подходом.
Американцы использовали его в разработке программы космических полетов на Луну.
Его эффективно применять для создания любых систем и устройств.
————————
Если кратко , то основа его в том, что любую систему проектируют сверху вниз, а реализуют снизу вверх.
Применительно к  программированию — язык программирования не имеет никакого значения в начале создания системы.
Оптимальный язык выбирается на этапе реализации, а не на этапе проектирования.
———————-  
Поэтому при разработке алгоритма нет никаких скриптов, так как скрипт — это лишь программа на псевдокоде.
 

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#27

16.01.2022 10:19:25

nikolz,

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

Чем Вы и занимались всё это время: «Вы не в теме, кина не видел, специально для Вас из Вики, попробую объяснить Ваши заблуждения, мой ликбеза», не говоря уже про огромное количество просто дурацких тезисов, преподносимых в качестве постулатов. И что Вы хотели? Вполне закономерно получили щелчок по носу.

Так это ИМЕННО Я «пытался высказать свое понимание и свою логику», т е дать собеседнику новую информацию, не унижая его, а разъясняя ему — ВСЕ мои тезисы я обосновываю, Вы же практически ни один: «не сложно понять» — прелесть какое обоснование! Кстати, унизить человек может только сам себя — со стороны это невозможно.

А что же Вы ТОЛЬКО СЕЙЧАС выдаёте «своё понимание»? Да и зачем мне Ваше понимание? Вы для меня совершенно не авторитет, и моё понимание совершенно другое: интерпретируемым языком был ещё самый первый Бейсик, когда никто и слыхом не слыхивал ни о каких виртуальных машинах и даже о  псевдокоде. Луа, к тому же, компилируется, т.е. переводится на ДРУГОЙ язык, который и исполняется, так что Луа есть просто кусок текста, и не более того — разве что инфа для компилятора.

Да не надо мне лапшу вешать про «достоинство таких языков» — я просил ответить, с какого бодуна ИМЕННО ЭТО говно вдруг оказалось востребованным! И цель ВМ вовсе не в том, что «виртуальная машина может быть установлена на любом железе и нет надобности под это железо переписывать пользовательские программ» — вряд ли существует в природе машина, для которой не было бы компилятора с С. Интерпретатор — это возможность программирования данными, всё остальное по сравнению с этим просто мелочь пузатая.

Опять тезисы дурацкие косяком… Моя первая персоналка имела 640К ОЗУ, 5М винт и 4.7МГц частоту. И не было НИ ЕДИНОГО случая, чтобы она не успевала отреагировать на нажатие клавиш или движение мышкой! У нынешнего же стада просто вечные «проблемы в быстродействии и объеме требуемой памяти»! Как вы умудряетесь их огребать — уму непостижимо! А уж «на микроконтроллерах» чего только ни «разворачивали» — в т.ч. при моём непосредственном участии.

Ха-ха-ха! Значит, «относительно того что и как у меня делают между собой скрипты, то тут я ТОЖЕ ошибаюсь»? А что, было что-то ещё? Я пока что вижу, что ошибаетесь только Вы, причём буквально в любом Вашем тезисе.

Господи, да уймитесь Вы про «технологии в разработке сложных систем»! Где Вы, а где сложные системы? Кому какое дело, что там «американцы использовали в разработке программы космических полетов на Луну»? Организация торговли — ПРОСТАЯ задача! ТРИВИАЛЬНАЯ! Которая может быть реализована даже на таком говне, как Луа! И если ДАЖЕ С НЕЙ не можете справиться, забудьте Вы про Луну! Не доросли Вы ещё до неё.

Страницы:
1

Читают тему (гостей: 2)

Понравилась статья? Поделить с друзьями:

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

  • Как изменить лте на 3g на айфон
  • Как изменить лпх на садоводство
  • Как изменить лоток подачи бумаги kyocera
  • Как изменить локскрин на айфон
  • Как изменить локацию поиска гугл

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии