finsight / QUIKSharp

QUIK# (QUIK Sharp) is the QUIK Lua interface ported to .NET.
Other
232 stars 135 forks source link

Поддержка работы нескольких Квиков из одной папки lua #254

Closed avently closed 4 years ago

avently commented 4 years ago

Довольно подробно описал в коммите все новшества. Если по-русски:

Для того, чтобы запустить несколько инстансов надо запускать файлы QuikSharp.lua (в одном Квике), Quik_2.lua (в другом Квике) или скопировать под другим именем (вообще любым именем) Quik_2.lua и запускать в других Квиках. То есть можно иметь файлы VTB.lua, PSB.lua (переименованные из Quik_2.lua), в которых будет содержаться код из файла Quik_2.lua. Связка инстанса и настроек для него осуществляется по имени файла без расширения. Т.е. на данный момент в файле config.json есть упоминание двух инстансов: QuikSharp, Quik_2. При добавлении другого файла инстанса нужно добавить запись о нем в config,json. Об этом будет сообщено в уведомлении Квика, если кто забудет. Если файл поврежден или неправильно оформлен, будет уведомление с ошибкой. Если файла нет, то QuikSharp.lua продолжит работать с дефолтными настройками, а остальные инстансы не будут работать.

Сделал за вчера, проверял в бою только вчера и сегодня на двух инстансах. Знаю, что @Pr0phet1c использует как раз несколько инстансов и было бы полезно, чтобы он высказался по поводу минусов/плюсов подобного подхода. Ну и вообще работает ли все хорошо или нет. Пока что мерджить не предлагаю, а предлагаю обсудить реализацию. Если что, внесу какие-нибудь изменения

Pr0phet1c commented 4 years ago

Вот тут надо будет точно сначала все досконально проверить. Я действительно запускаю несколько инстансов, но не так как Вы себе это представляете. Обрисую свой текущий подход. Есть два квика, каждый из которых работает со своим брокером. В одном квике запускаются два экземпляра lua-части библиотеки, с разными настройками портов. все запускается из разных папок, которые в общем-то совпадают по содержанию, за исключением файла, в котором прописаны порты. Во втором квике запускается ЧЕТЫРЕ lua-части, по тому же принципу, что и в первом квике. Я пока не изучал Ваш код, и поэтому не возьмусь сразу определить степень влияния на мою среду. Но обязательно займусь этим, когда смогу. Правда, я скоро на пару недель "выпаду", так что скорее всего вернуться к этому вопросу смогу не раньше июля. Возможно, что-то успею глянуть сегодня.

avently commented 4 years ago

@Pr0phet1c

В одном квике запускаются два экземпляра lua-части библиотеки

Во втором квике запускается ЧЕТЫРЕ lua-части, по тому же принципу

"Наш клиент"! Если луа часть одинаковая, то код из этого PR поможет запускать их в удобном варианте из одной папки. Единственное, наверное, будет удобнее, если логи будут писаться в разные файлы. Это не сложно сделать, достаточно в названии файла лога добавить название инстанса и все. Я это не делал, но могу потом сделать.

Pr0phet1c commented 4 years ago

Так, бегло пробежался по коду. на первый взгляд вроде бы нормально, только путано получается (без 100 грамм хрен разберешься). Хочу уточнить, правильно ли я понял алгоритм действий для "моей" задачи. Базовые данные: Квик №1. В нем нужно запускать 4 инстанса со следующими портами (указывать буду первый из пары): 34130, 34134, 34136, 34138. Квик №2. В нем нужно запускать 2 инстанса с портами: 34140, 34142.

Мои действия: Делаем ОДНУ папку с lua-частью. в ней, кроме стандартного набора файлов, дополнительно создаем еще 5 файлов, с именами (например): QS_34134.lua, QS_34136.lua, QS_34138.lua, QS_34140.lua, QS_34124.lua. которые по содержанию представляют из себя 100%-копии файла Quik_2.lua. Файл config.json, при этом будет выглядеть так:

{ "servers": [ { "scriptName": "QuikSharp", "responseHostname": "127.0.0.1", "responsePort": 34130, "callbackHostname": "127.0.0.1", "callbackPort": 34131 }, { "scriptName": "QS_34134", "responseHostname": "127.0.0.1", "responsePort": 34134, "callbackHostname": "127.0.0.1", "callbackPort": 34135 }, { "scriptName": "QS_34136", "responseHostname": "127.0.0.1", "responsePort": 34136, "callbackHostname": "127.0.0.1", "callbackPort": 34137 }, { "scriptName": "QS_34138", "responseHostname": "127.0.0.1", "responsePort": 34138, "callbackHostname": "127.0.0.1", "callbackPort": 34139 }, { "scriptName": "QS_34140", "responseHostname": "127.0.0.1", "responsePort": 34140, "callbackHostname": "127.0.0.1", "callbackPort": 34141 }, { "scriptName": "QS_34142", "responseHostname": "127.0.0.1", "responsePort": 34142, "callbackHostname": "127.0.0.1", "callbackPort": 34143 } ] }

Далее, в Квике №1 запускаем файлы: QuikSharp.lua, QS_34134.lua, QS_34136.lua, QS_34138.lua В Квике №2 запускаем файлы: QS_34140.lua, QS_34124.lua И все должно работать как раньше.

Все так? Я ничего не напутал?

avently commented 4 years ago

Да, все верно! Должно работать в таком виде

только путано получается (без 100 грамм хрен разберешься)

Путано в каком плане? Сам код или для юзера? Если для юзера, то на текущий момент я лучше не придумал. А если код, то по-другому запускать скрипт с двумя main() функциями никак не выйдет. Ну и еще была задача сделать Quik_2 настолько малословным, насколько возможно.

В Quik_2 импортируется весь код из QuikSharp.lua. При этом main функция QuikSharp'a перезаписывается main() от Quik_2, Ну а дальше надо лишь подсунуть нужные порты для сокетов. Они раньше были в глобальном namespace'е, а теперь передаются в виде аргументов. В общем, не сказал бы, что сильно путано вышло;)

Pr0phet1c commented 4 years ago

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

avently commented 4 years ago

https://github.com/avently/QUIKSharp/archive/multiple-instances.zip

Либо перейти в мой репозиторий, выбрать branch multiple-instances, потом нажаться Clone or download, а потом Download ZIP

Pr0phet1c commented 4 years ago

Работает! Думаю, можно мержить, но инструкцию в ридми внести не помешало бы. Да, и разделение логов тоже лишним не будет.

avently commented 4 years ago

Это ж, наверное, надо какой-нибудь USAGE.RU.md сделать по пути src/QuikSharp/lua, да? Так будет логичнее, чем писать в обычный README.RU.md Напишу инструкцию. И логи перенаправлю в отдельные файлы. А для QuikSharp инстанса будет тогда файл лога точно такой же, как сейчас. Или лучше в название добавить QuikSharp тоже? Просто хотелось бы не ломать привычную логику.

P.s. для чего кому-то нужно запускать скрипт вне Квика? Я такой режим работы не тестировал.

Pr0phet1c commented 4 years ago

Похоже, я поторопился с выводами. с версией 8.5 какие-то траблы. При запуске скрипта выдает ошибку: error loading module qsutils from file .\qsutils.lua: .\qsutils.lua:34: invalid escape sequence near "^.*\\(.*)\.

Пытаюсь разобраться.

Pr0phet1c commented 4 years ago

P.s. для чего кому-то нужно запускать скрипт вне Квика? Я такой режим работы не тестировал.

Я вроде про такое и не писал нигде

avently commented 4 years ago

А если на той строчке поменять запись на такую?

return string.gsub(full_path, "^.*\\(.*)[.]lua[c]*", "%1")

Я вроде про такое и не писал нигде

Этот вопрос не относится к разговору, а к PR относится

Pr0phet1c commented 4 years ago

А если на той строчке поменять запись на такую?

return string.gsub(full_path, "^.*\\(.*)[.]lua[c]*", "%1")

Не помогло

Pr0phet1c commented 4 years ago

Нашел решение:

return string.gsub(full_path, "^.\(.).lua[c]*", "%1")

avently commented 4 years ago

Что-то не выглядит как решение. Да и не работает. Может, Github код исказил? Надо ставить три обратных кавычки чтобы код был идентичен написанному.

avently commented 4 years ago

Странно то, что в интерпретаторе луа мой код работает:

Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
> return string.gsub("Z:\\apps\\QUIKSharp\\src\\QuikSharp\\lua\\QuikSharp_2.lua", "^.*\\(.*)[.]lua[c]*", "%1")
QuikSharp_2 1
> return string.gsub("Z:\\apps\\QUIKSharp\\src\\QuikSharp\\lua\\QuikSharp asdas asd asd.lua", "^.*\\(.*)[.]lua[c]*", "%1")
QuikSharp asdas asd asd 1
> 

(не знаю, что за единицу пишет интерпретатор)

Pr0phet1c commented 4 years ago

Может, Github код исказил?

Да, так и есть (не заметил сразу). Суть исправления (относительно первоначального варианта) в том, чтобы просто убрать "\" перед ".lua"

avently commented 4 years ago

В исправленном варианте именно это я и сделал, только внес точку в []. Просто оставлять точку нельзя, потому как она интерпретируется как любой символ, что может навредить, если в навзвании скрипта будет что-то там lua.lua.

А точно-точно исправленная версия не работает? Потому как первоначальная версия действительно в lua5.3 не работает, а вот исправленная - работает.

Pr0phet1c commented 4 years ago

Блин. Теперь другая проблема нарисовалась. Почему-то не срабатывает автозапуск дополнительных скриптов. Ругается, что не может найти QuikSharp, при обработке строки "require("QuikSharp")". Приходится удалять, заново добавлять и запускать эти же скрипты.

Pr0phet1c commented 4 years ago

Попробую еще раз написать. У меня работает вот такая строка:

return string.gsub(full_path, "^.*\\(.*).lua[c]*", "%1")

проверял в трех версиях терминала (8.4.1.6, 8.5.2.11 и 7.27.2.1) Пока проблема только в автозапуске дополнительных скриптов (QuikSharp.lua запускается автоматически без проблем).

avently commented 4 years ago

Установил 8.5 себе отдельно. Запустил там два скрипта с такими именами: QuikSharp.lua Quik a.2.lua (ну чтоб совсем странно выглядело) В место regex кода указано:

return string.gsub(full_path, "^.*\\(.*)[.]lua[c]*", "%1")

В 8.3, 8.2, 8.5 работает сразу с двумя ок. Что мне сделать, чтобы сломалось? Как воспроизвести проблему?

Pr0phet1c commented 4 years ago

Что мне сделать, чтобы сломалось? Как воспроизвести проблему?

Не знаю. Максимум что могу сделать, это вернуть все взад и сделать скриншот проблемы у меня.

Pr0phet1c commented 4 years ago

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

script_path = getScriptPath() package.path = package.path .. ";" .. script_path .. "\\?.lua;" .. script_path .. "\\?.luac"..";"..".\\?.lua;"..".\\?.luac"

avently commented 4 years ago

Закоммитил исправление Regex'а. К сожалению, проверить код с package.path я не могу, так как проблему не знаю, как воспроизвести. Если у вас работает с таким вариантом без проблем, то добавим в код после ваших тестов. Спасибо, что проверили на 8.5 и нашли мой баг! Теперь буду и там проверять.

Pr0phet1c commented 4 years ago

Странно. Сейчас вариант строки без слэша, но с квадратными скобками вокруг точки - работает во всех трех версиях. То ли глюк какой-то был, то ли облачное хранилище не успело обновиться когда в первый раз проверял. Если считаете такой вариант написания более правильным - используйте его. Дополнительные две строки (которые я указывал) в Quik_2 надо добавить. С ними реально проблема ушла. Видимо, в каких-то обстоятельствах квик или луа не могут корректно определить текущий каталог. и из-за этого не находят файл.

avently commented 4 years ago

Закоммитил ваши предложения. Тогда в таком режиме потестим пока что. Если все хорошо будет, то одобрить PR - не долгий процесс.