Snusmumriken
И даже без try-catch.
Snusmumriken
Когда я был маленький, я писал такое рекурсивно :<
Anatoliy
Ребята а подскажите, можно ли средствами луа, или средствами Zerobrane studio, или средствами и того и того, выполнить отладку скрипта следующим образом: в одном месте у меня в скрипте выскакивает ошибка - там переменная получает значение, но иногда оно по какому то недоразумению в ходе вычислений получается nil, и потом при действиях с этой переменной выскакивает ошибка всвязи с тем что она nil а не какое либо значение, вот возможно ли чтобы в этот момент, если переменная nil, скрипт остановился для отладки, т.е. как если бы он был запущен для отладки в режиме пошагового выполнения, может это как то можно через функции debug? я их еще не изучал
Snusmumriken
debug.debug()
Snusmumriken
Потом вобьёшь в консоль cont, и скрипт продолжится.
Snusmumriken
Получить строку стактрейса — str = debug.traceback(). В любом месте.
Anatoliy
debug.debug()
Спасибо, а так чтобы средствами ZB в режим пошаговой отладки перейти, незнаешь возможно ли такое?
Alexey
В zbs используется mobdebug В нем есть метод старт который подключяется к серверу в zbs просто сделать if и в нем вызвать эту функцию
Anatoliy
В zbs используется mobdebug В нем есть метод старт который подключяется к серверу в zbs просто сделать if и в нем вызвать эту функцию
А можно чуть подробнее - как это оформить - надо написать условие перехода в режим отладки в скрипте? if not x then mobdebug end - ? Так чтоли?
Snusmumriken
Хе, кстати забавная тема, надо накатать такой дебаггер, который выгружает инфу и все upvalue в браузер через функцию.
Anatoliy
А подскажите еще, какая то странная вещь случается - вообщем пишется у меня текстовый файл, вообщем как обычно - открывается - file1=io.open(file, "w") , если файла нет, если уже есть то открывается в режиме file1 = io.open(file, "r+") потом в него по ходу работы скрипта выгружается некая однообразная инфа, строки одинаковой длины заканчивающиеся .."\n" file1:write(somestring.."\n") Потом при повторном запуске скрипта вся эта инфа из файла читается по строкам: for w in file1:lines() do, в таблицу - каждая строчка - новый элемент таблицы и продолжается в него записыватся в конец, в режиме "r+" Ну и при повторном перезапуске скрипта все по новой, и тут вдруг я обнаружил что при каждом перезапуске не все строчки из файла есть в таблице, то есть не все строчки прочитываются for w in file1:lines() do, стал разбираться - оказывается у меня в файле не все символы перевода строки CR LF которрые соответствуют \n ( 0D 0A в шестнадцатиричн.) а некоторые символы перевода строки - CR ! который соответствует \13 ( т.е. только OD в шестнадцатиричн.) и вот эти строки for w in file1:lines() do и нечитает! причем он нечитает строку следующую после строки после которой строит \13 даже если и заканчивается на \n т.е. \n строка \13 - читает а \13 строка \n - нечитает Глюк какой то, ведь ничто кроме скрипта в файл больше ничего не пишет, почему же тогда там то \n то \13 как символ перевода строки?
Snusmumriken
Ты совершенно зря открываешь файл не в бинарном режиме.
Snusmumriken
wb, rb, rb+
Snusmumriken
Если не пользоваться бинаркой, файлы будут предобрабатываться при записи и чтении, приводя к странным результатам.
Snusmumriken
Потом напишу итератор, который ориентируется на "\r?\n", хе.
Anatoliy
Ты совершенно зря открываешь файл не в бинарном режиме.
То есть ты рекомендуешь открывать только в бинарных режимах wb, rb, rb+ и тогда всё должно быть ОК?
Snusmumriken
И изначально формировать файлы таким образом.
Lucky
Тем временем начат перевод второй части книги "Lua Game Development Cookbook"
Lucky
Lucky
Эх, отпуск заканчивается. Успеть бы до нг перетолмачить.
Andrey
Решил всё-таки накатать свой lua-format, потому что существующие аналоги либо не поддерживают кастомизацию стиля, либо неотделимы от IDE. Накидайте плз свои хотелки для твика стилей, можно вдохновляться вот этим - https://zed0.co.uk/clang-format-configurator/
Anatoliy
Ты совершенно зря открываешь файл не в бинарном режиме.
Весело, сделал запись в бинарном режиме - wb, теперь символ переноса строки стал - LF т.е. 0A шестнадцатиричн.
Snusmumriken
Используй всегда \n. \r — это яблочный рудимент, помнится. И ms-notepad хочет \r\n вместе, забей на него, блокнот для додиков.
Anatoliy
Используй всегда \n. \r — это яблочный рудимент, помнится. И ms-notepad хочет \r\n вместе, забей на него, блокнот для додиков.
дык я этот файл нотепадом для редактирования и не открываю, но все норм проверил - 0A норм распознается луа как \n
Snusmumriken
Весело, сделал запись в бинарном режиме - wb, теперь символ переноса строки стал - LF т.е. 0A шестнадцатиричн.
Бинарный режим всегда показывает файл в неискажённом виде. Пользуйся этим.
Igor
Мне его хватало
Snusmumriken
Да, он крут, но НЕДОСТАТОЧНО хехехе
Igor
Несовсем полный дебаггер, но мне его хватало вполне
Igor
Были бы в lovebird ещё брейкпоинты с принтом стактрейса была бы вообще конфетка
Snusmumriken
Оно разрабатывалось для love2d, там брейкпоинты обычно останавливают мир что не круто
Igor
Для этих целей приходилось подключать mobdebug
Igor
Ну да, это я знаю, но всё равно, при дебаге тех же игр это помогло бы
Anatoliy
Для этих целей приходилось подключать mobdebug
Так как он подключается то? Обьясни пожалуйста
Igor
в отдельном окне запускаешь сервер mobdebug выполнением функции require('mobdebug').listen()
Igor
а в скрипте, который хочешь отладить require('mobdebug').start() в самом начале
Igor
и запускаешь его
Igor
как там mobdebug с ZBS интегрируется я не в курсе, я эту IDE не трогал почти
Igor
но скорее всего там где-то в настройках есть запуск mobdebug сервера
Igor
Как-то так
Igor
Внутри скрипта обычная функция генерации псевдо-случайной строки
Igor
И я поставил брейкпоинт на конкатенации строки и сгенерированного символа
Igor
Igor
У mobdebug вообще дофига команд и все они описаны в help команде, так что проблем с общением у тебя с ним не будет. Был бы у этого всего добра ещё удобный веб-интерфейс, подобный lovebird было бы очень классно. Без него в принципе тоже обойтись можно, но с интерфейсом было бы всё таки удобнее
Alexey
В zbs есть пункт меню Start debug server
Alexey
Ну и опция чтобы не переходить в режим отладки сразу после вызова метода старт. я обычно просто делаю условный вызов старт
Alexey
Ну и если есть короутины надо еще один метод вызвать
Lucky
Про Lua https://habr.com/ru/post/476644/
Alexey
Не верно ответ 10 :)
Egor
Как лучше в lua сделать такое: local r = {1,2,3} 1. Найти максимальное значение 2. Проверить данная цифра входит ли в какой-то промежуток данных. 3. Маловероятно, но может быть в элементне массива не только int/float но и nil, string или вообще пустота. ? Как вариант я бы мог сделать: math.max(unpack(r)) но он падает если там не инт
Igor
Ну вообще с такими специфичными условиями только перебором массива циклом: max = 0 for i = 1, #r do local v = r[i] if type(v) == "number"and v > max then max = v end end ну или что-то подобное, для таких действий у Lua нет стандартной функции
Egor
Забыл выделить сообщение для ответа
ладно, спасибо, буду надеяться что не будет там что-то кроме цифр )
🐅🤦‍♂️
Захотел померить скорость, набросал скрипт. Не знаю, конечно, что я измерил, решение math.max(unpack(r)) красиво, но имеет ограничение по количеству элементов, что кстати уже не раз обсуждалось. На 8000 уже падает, придется пересобирать lua что-бы поменять константу http://paste.ubuntu.com/p/XkKRFNtN6n/
🐅🤦‍♂️
тогда без разницы что использовать, если конечно не искать макс к примеру из миллиона таблиц по три элемента в каждой
Артём
Кто нибудь пробовал эту либу для создания бота: https://github.com/wrxck/telegram-bot-lua
Артём
загвоздка в том, что она не поддерживает прокси, а покупать vps не очень хочется :)
Артём
а без прокси телеграмовское апи блочится РКН
Andrey
а без прокси телеграмовское апи блочится РКН
она http запросы делает через luasec, а в её документации https://github.com/brunoos/luasec/wiki/LuaSec-0.6: > However, the current implementation does not support proxy nor URL redirection, so the fields redirect and proxy are not supported in url. Also, setting http.PROXY is not permitted
Andrey
но для телеграма странно, конечно, не поддерживать апи для задания прокси
Артём
ага, не хочется городить огород
Andrey
а без прокси телеграмовское апи блочится РКН
но учитывая, что там только 1 место, где эта http либа юзается https://github.com/wrxck/telegram-bot-lua/blob/master/src/core.lua#L64, то можно наверное форкнуть и заменить вот этим https://github.com/daurnimator/lua-http
Andrey
или даже PR в мастер сделать, если автор жив
Артём
попробуемс
mva
Кто нибудь пробовал эту либу для создания бота: https://github.com/wrxck/telegram-bot-lua
я, кстати, пробовал, потом плюнул и сделал на tdbot-lua
mva
1) https://github.com/rizaumami/tdbot.lua/blob/master/extra/tdbot_commented.lua -> tg/tdbot-wrapper.lua 2) https://github.com/giuseppeM99/tdlua/blob/b54cd0c29c7bc89b2c3792d7333f42f98eaad725/examples/tdbot.lua -> tg/tdlua-tdbot.lua 3) https://gist.github.com/raw/17cb1881157b4564c218ec9a9346fa27 // должна стоять либа tdlua
mva
да
mva
оно как зависимость tdlua притянется, по идее
Snusmumriken
она http запросы делает через luasec, а в её документации https://github.com/brunoos/luasec/wiki/LuaSec-0.6: > However, the current implementation does not support proxy nor URL redirection, so the fields redirect and proxy are not supported in url. Also, setting http.PROXY is not permitted
Глянь как выглядит прокси. Во-первых, можно использовать соединение к прокси по HTTP (luasocket, ssl будет между проксей и телегой), во-вторых можно чуть модифицировать luasec: прокси-соединение отличается от нормального только точкой подключения (там прокси-сервер вместо цели), и наличием заголовка Host, в котором указана точка куда ты хочешь подключиться. В luasec не так уж сложно впихнуть поддержку проксей.
Egor
Доброе утро. Как лучше сделать такое: В скрипте main.lua есть некая переменная, которая выводится на экран. Есть модули, которые подключаются к main.lua и можно ли как-то сделать так: чтобы некая переменная из модулей аппендилась к переменной из main.lua? Или как-то сделать по другому. Задача: не редактировать каждый раз main.lua а что-то сделать на модуле и она добавилась
Snusmumriken
Можно и без передачи, но тогда имя конфига глобально резервируется, что не есть хорошо.