Работа с Genie в Engee
Engee предоставляет возможность разрабатывать собственные приложения непосредственно в своей среде с помощью фреймворка Genie. Это позволяет пользователям создавать собственные приложения, веб-интерфейсы и различные интеграционные решения не выходя из в рабочего пространства Engee.
| Engee — это готовое и настроенное окружение для запуска приложений, созданных с использованием фреймворка Genie. Engee также предоставляет базовый функционал для их модификации. Далее в статье показаны основные принципы работы с Genie, зная которые, вы сможете адаптировать готовые приложения под свои нужды. |
Genie — это фреймворк для разработки веб-приложений для Julia. Подробнее о фреймворке читайте на официальном сайте.
На Genie уже написаны и полностью функционируют Редактор цифровых фильтров, Расчёт уравнения радиолокации и Расчет режимов электросетей.
| Среда Engee оптимизирована под работу с фреймворком Genie и, несмотря полноценную поддержку ядер Julia и Python, не рекомендуется использовать любые другие фрейморки. |
Использование Genie
Чтобы создать собственное приложение в Engee, следуйте следующим инструкциям. Приложение может быть представлено в виде .jl-скрипта или директории с файлом app.jl. Размещение таких приложений выполняется в пределах директории /user. Ниже описаны основные шаги для запуска, управления и работы с приложениями на основе Genie.
-
Размещение приложения — созданное приложение необходимо поместить в директорию
/user. Если приложение представляет собой директорию, то убедитесь, что в ней есть файлapp.jl. Пример размещения:/user/apps/MyGenieApp/ app.jl public/ src/ -
Запуск приложения — для запуска приложения выполните следующую команду:
engee.genie.start("/user/apps/MyGenieApp", devel=true, log_file="/user/apps/MyGenieApp")здесь:
-
devel: опциональный параметр, включает режим разработки, что позволяет видеть изменения без перезапуска. -
log_file: путь для сохранения логов приложения. Указывать необязательно.Если указан относительный путь, то команда ищет приложение относительно текущей директории.
-
-
Остановка приложения — для остановки запущенного приложения выполните:
engee.genie.stop("/user/apps/MyGenieApp")Путь может быть задан относительным или абсолютным.
-
Список запущенных приложений — чтобы проверить, какие приложения работают в данный момент, выполните команду:
engee.genie.list() -
Передача данных из приложения в сессию — функция
engee.genie.send(wsVarName, value)используется для передачи значения из приложения на Genie в рабочее пространство Engee. Первый аргументwsVarNameзадает имя переменной в виде строки. Второй аргументvalue— значение, которое сохраняется в переменной. Если переменная с таким именем отсутствует, то она создается автоматически. Используйте эту функцию для сохранения промежуточных результатов и пользовательских данных в целом. Например:engee.genie.send("a", 42) engee.genie.send("message", "Hello") -
Получение данных из сессии в приложение — функция
engee.genie.recv(wsVarName; context=…)позволяет получить значение переменной из окружения Engee во время выполнения приложения на Genie. АргументwsVarNameзадает имя переменной. Если переменная определена в другом модуле, то используется параметрcontext, указывающий, в каком пространстве имён ее искать. Это необходимо в случае, если переменная предварительно определена вне области основного модуля приложения. Например:engee.genie.recv("a") engee.genie.recv("message") engee.genie.recv("value"; context=MyModule) -
Выполнение кода в рабочем пространстве — функция
engee.genie.eval(code::AbstractString)позволяет выполнить произвольный код на Julia в рабочем пространстве Engee напрямую из приложения Genie. Используется для запуска отдельных выражений, отладки или динамического выполнения кода без необходимости перезапуска приложения.engee.genie.eval("x = 10") engee.genie.eval("println(\"Значение x: \$x\")")Передаваемая строка
code::AbstractStringисполняется в глобальной области текущей сессии Engee. Таким образом можно управлять переменными или логикой извне, передавая команды из приложения Genie внутрь сессии Engee. -
Просмотр логов приложения — для получения логов работающего приложения используйте команду:
engee.genie.logs("/user/apps/MyGenieApp")Если при запуске приложения параметр
log_fileне был указан, то команда все равно выведет текущие логи.
Использование сторонних пакетов в приложении
В приложении можно использовать сторонние пакеты.
Для этого необходимо загрузить файл Project.toml и выполнить команду:
engee.genie.pkg_instantiate("/path/to/app")
При этом:
-
Файлы
app.jlиProject.tomlдолжны находиться в директории/path/to/app. -
Project.tomlне должен содержать пакеты Engee, но они все равно будут доступны для Genie.
Дополнительные команды для работы с пакетами:
- Просмотр списка установленных пакетов
-
Чтобы вывести список всех пакетов, используемых в приложении, выполните команду:
engee.genie.pkg_status("/path/to/app") - Установка новых пакетов
-
Для установки одного или нескольких пакетов используйте:
engee.genie.pkg_add("/path/to/app", "SomePackage")или
engee.genie.pkg_add("/path/to/app", ["SomePackage1", "SomePackage2"]) - Удаление пакетов
-
Чтобы удалить один или несколько пакетов, выполните:
engee.genie.pkg_rm("/path/to/app", "SomePackage")или
engee.genie.pkg_rm("/path/to/app", ["SomePackage1", "SomePackage2"])
Ограничения и особенности использования
| В Genie массивы индексируются с нуля, в отличие от Julia, где индексация начинается с единицы. |
-
Невозможна установка новых пакетов, не включенных в сборку Engee. Однако с помощью следующей команды можно посмотреть доступные пакеты:
print(read("/usr/local/genie/environments/v1.10/Project.toml",String)) -
Приложение, представленное в виде директории с файлом
app.jl, считается стандартным. Это рекомендуемый способ организации проекта.
Подробное описание публичных методов программного управления genie представлено в статье Публичные методы программного управления Genie.
Пример создания приложения
Создайте файл app.jl в директории /user файлового браузера
:
→ 
В файле app.jl добавьте код приложения, написанного с помощью фреймворка Genie:
module App
using GenieFramework
@genietools
@app begin
@in N = 0
@out squared = 0
@onchange N begin
squared = N^2
end
end
function ui()
[
cell([
p("Enter a number to calculate its square:")
]),
cell([
textfield("N", :N)
]),
cell([
bignumber("The square of the number is:", :squared)
])
]
end
@page("/", ui)
end
Подробное описание кода приложения
-
Создание модуля:
module AppЭто начало модуля
App. В Julia модули используются для организации кода и его изоляции. Весь код приложения будет находиться внутри этого модуля. -
Подключение библиотеки
GenieFramework:using GenieFramework @genietoolsздесь:
-
using GenieFramework: Подключение библиотеки для работы с веб-приложениями; -
@genietools: Макрос, который подготавливает окружение для работы приложения, включая подключение необходимых ресурсов (таких как иконки и стили).
-
-
Объявление реактивного приложения:
@app begin @in N = 0 @out squared = 0здесь:
-
@app: Начало блока реактивного кода приложения; -
@in N = 0: Объявление реактивной переменнойN, которая будет хранить пользовательское значение; -
@out squared = 0: Объявление реактивной переменнойsquared, которая будет содержать квадрат числа. Эта переменная доступна только для чтения.
-
-
Реактивная логика:
@onchange N begin squared = N^2 endздесь:
-
@onchange N: Указывает, что при изменении значения переменной N выполняется следующий блок кода; -
squared = N^2: Обновление значения переменнойsquared(возводится в квадрат введенное число).
-
-
Определение пользовательского интерфейса:
function ui() [ cell([ p("Enter a number to calculate its square:") ]), cell([ textfield("N", :N) ]), cell([ bignumber("The square of the number is:", :squared) ]) ] endздесь:
-
function ui(): Определение функции, которая создает интерфейс приложения; -
cell([…]): Упаковка элементов интерфейса в структурный блок:-
Первый блок
cell([]): Отображение текст с инструкцией:"Enter a number to calculate its square"; -
Второй блок
cell([]): Поле ввода числа(textfield("N", :N));-
"N": Подпись поля ввода; -
:N:Связь поля с переменнойN;
-
-
Третий блок
cell([]): Отображение результата (квадрата числа) с помощьюbignumber;-
"The square of the number is:": Подпись; -
:squared:Связь с переменнойsquared.
-
-
-
-
Создание маршрута и закрытие модуля
@page("/", ui) endздесь:
-
@page("/"): Определяет маршрут для главной страницы приложения(/); -
ui: Указывает, что содержимое страницы будет сгенерировано функциейui; -
end: Конец модуляApp.
-
Далее сохраните файл приложения app.jl с внесенными изменениями:

И запустите приложение командой:
engee.genie.start("/user/app.jl")
Это приложение позволяет возводить введенное число в квадрат, демонстрируя, как можно создавать собственные приложения прямо в рабочем пространстве Engee.

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