Snusmumriken
Чебуратор.
Возвращается в прошлое и убивает РКН в зародыше.
Mikhail
Черт. Звучит как сюжет для игры стрелялки с блекджеком и танками.
Mikhail
Для себя то что искать... Пришёл нуб ты в него ботом тыкаешь. Если он даже с ботом не справился, то все...
Lucky
Хо-хо, я сделал-обделал!
Lucky
Snusmumriken
Киберпанк такой ))
Lucky
блин, надо немного подпилить по краям
mva
какой фреймворк используешь? // или опять HR?
Tadeusz
Фреймворк 😊
mva
Фреймворк 😊
ну, это проверка на понимание темы. Ибо сюда периодически заходят боты-спамеры, собирающие базы, и hr'ы (которые, впринципе, делают то же самое), при этом притворяясь девушками (а мы все помним главное правило интернетов).
mva
я не имею ничего против девушек-программистов (даже более того). Но вот не очень люблю когда меня превращают в циферки или цель для очередной волны спама
Co(n)stantine👨🔬
mva
ну, так
ShadoWalkeR
Фотожопа много
mva
вот я и хочу это узнать
vitaly
какойто фетешизм вкупе с фетешизмом
vvzvlad
Такой вот вопрос:
У меня есть в системе пользовательские скрипты, которые лежат в отдельных файликах просто в папке на диске. При старте я пробегаюсь по ним, загружаю с помощью loadfile и исполняю через pcall. Теперь я хочу сделать так, чтобы перезагружать скрипты можно было в процессе работы системы. Юзер скрипт через веб-интерфейс поменял, сохранил, он взял и перезапустился, не трогая другие скрипты.
Каким образом мне это лучше сделать? Учитывая то, что юзеры могут ошибаться в скриптах, и любая ошибка не должна класть систему, а должна ловиться и выводиться юзеру.
На безопасность пока забьем, предположим, что юзеру не захочется посмотреть/изменить чужие скрипты/переменные или получить доступ к системным переменным.
vvzvlad
Я знаю про вариант удаления из таблицы файлов, загруженных через require, но как удалить загруженный другим способом файл, я не знаю. И правильно ли использовать pcall?
vvzvlad
да, это и надо оставить
Snusmumriken
Такой вот вопрос:
У меня есть в системе пользовательские скрипты, которые лежат в отдельных файликах просто в папке на диске. При старте я пробегаюсь по ним, загружаю с помощью loadfile и исполняю через pcall. Теперь я хочу сделать так, чтобы перезагружать скрипты можно было в процессе работы системы. Юзер скрипт через веб-интерфейс поменял, сохранил, он взял и перезапустился, не трогая другие скрипты.
Каким образом мне это лучше сделать? Учитывая то, что юзеры могут ошибаться в скриптах, и любая ошибка не должна класть систему, а должна ловиться и выводиться юзеру.
На безопасность пока забьем, предположим, что юзеру не захочется посмотреть/изменить чужие скрипты/переменные или получить доступ к системным переменным.
Карочи, можно воспользоваться какой-нибудь такой фигнёй:
local function trace(msg, layer)
return debug.traceback("Error: " .. tostring(msg), 1 + (layer or 1))
end
local function Call(scrname)
local succ, err = xpcall(require, trace, scrname)
if not succ then return nil, err
retrurn succ
end
vvzvlad
local current_func, error_msg = loadfile(path)
local status, err_msg = pcall(current_func)
current_func = nil
current_func, error_msg = loadfile(path2)
status, err_msg = pcall(current_func)
Так?
Snusmumriken
Xpcall даёт нормальный трейсбек. Ошибка для пользователя под названием: "На такой-то строке ошибка" - бесполезна, потому что нет трейсбека.
И да, loadstring не рейзит ошибки, но ошибки могут быть при вызове функции, которую возвращает loadstring, поэтому тут есть подводные камни падений сервера ))
То есть, оно просто проверяет синтаксис. С ним всё ок? Ну вот вам функция. А то что там в какой-то функции пытаются в из строки вытянуть ключи - это не волнует: пока функция не вызовется - не упадёт ))
Плюс у loadstring проблемы с определением местоположения скрипта, то есть, отчёт об ошибке будет кривой энивей.
Snusmumriken
В общем, делаем нормальные require и не выпендриваемся ))
Snusmumriken
Ну лады.
Snusmumriken
Во, кстати, полезняшка. Для нормального трейса от loadstring, нужно передать имя скрипта вторым аргументом.
Snusmumriken
local function trace(msg, layer)
return debug.traceback("Error: " .. tostring(msg), 1 + (layer or 1))
end
local root = 'c:/bin/user_scripts/'
local function Call(user, scr)
-- можно не писать тут формат .lua,
-- но тогда придётся в имени скрипта указывать
local path = root .. user .. '/' .. scr .. '.lua'
local file, err = io.open(path, 'rb')
if not file then return nil, 'Script not found' end
local code = file:read('*a'); file:close()
-- в трейсах будет отображаться:
-- [string "vasya@scr1"]:1: attempt to index 'yo'
-- можно ещё полный путь зафигачить,
-- чтобы знать где конкретно падает
local chunk, err = loadstring(code, user .. '@' .. scr)
if not chunk then return nil, err end
local succ, res = xpcall(chunk, trace)
if not succ then return nil, res
retrurn res
end
Snusmumriken
У самого в нгинксе схожая скриптовызывалка. В случае чего - возвращает json с ошибкой. misc.xpcall - автотрейс.
Sergey
Snusmumriken
*Энжинкс
Хоть розой назови.
Snusmumriken
Кстати, если так, то нужно энжэайэникс. Фил зе диффиренс.
И да, я в курсе что это потому что "энжин", но ты ещё много людей встретишь, которые "неправильно" произносят, и не будут поправляться после того как ты им указал единственную в их жизни великую истину. Вроде меня.
Snusmumriken
Когда я был маленький и читал гарри поттера, на третьей книжке мне попались дементоры, и я, пока читал, ставил ударение на последний слог. В дальнейшем, после того как мне тыкнули что это ни разу неправильно, и вообще, роулинг из англии а не франции, чтобы так ударение ставить, чёртовы дементоры каждый раз вводили меня в ступор на тему ударения: туда или туда. Эти засранцы умудрились частично поднасрать мне в детстве, то чувство, когда книжный персонаж влияет на твою жизнь больше чем следовало.
bebebe
Драматичненько
bebebe
Стругацкие себе такого не позволяли
vvzvlad
А как загрузить файл так, чтобы глобальные переменные в нем стали локальными в таблице, там где гружу? Т.е. в файле "test=1", гружу в script, и получаю script.test.
vvzvlad
Где-то читал, но потерял
Snusmumriken
Setfenv, во: https://www.lua.org/manual/5.1/manual.html#pdf-setfenv
Но вроде как не работает в более новых версиях (> 5.1)
vvzvlad
о!
vvzvlad
Да, у меня как раз 5.1
Snusmumriken
Не забудь протащить в новое окружение переменные из _G.
Можно через env = setmetatable({}, {__index = _G}).
А то портить _G мы не хотим, а проксировать его надо.
Ilya
Snusmumriken
Ilya
Ну или икс, если латынь ближе
Ilya
Я позавчера слушал доклад, где у чувака был дебиАн, юнИкс и... Ещё что-то, линУкс что ли.
Mark ☢️
https://github.com/luaposix/luaposix/issues/304
Mark ☢️
Я наступил в это
Snusmumriken
Жуть
Mark ☢️
https://github.com/luaposix/luaposix/issues/302
Mark ☢️
И в это
Snusmumriken
Ну небось скоро закроют.
До тех пор пользуйтесь вендой с winapi ))
Mark ☢️
Snusmumriken
Попрошу не ругаться
Snusmumriken
Только венда тебя спасёт от смерти от красноглазия.
Mark ☢️
Запилил себе враппер вокруг libnl3 на luaalien. Через боль, но работает на ура
Mark ☢️
Snusmumriken
Mark ☢️
Co(n)stantine👨🔬
Mark ☢️
Co(n)stantine👨🔬
@Snusmumriken
Snusmumriken
Я сталкивался с взрослыми людьми, которые пытались заставить меня полюбить венду, прекрасно представляю как это раздражает.
Но зато у меня появилось новое оружие.
Co(n)stantine👨🔬
Snusmumriken
У меня всё.
Co(n)stantine👨🔬
Я не видел линукса🙂
fgntfg
У @Snusmumriken мак с parallels
Snusmumriken
Рабоче-игровая машинка на шиндовсе, но это мало на что влияет : )
Snusmumriken
Ну дык кто будет делать скрины с рабоче-сервисных машинок?
Там и гуя-то нет.
fgntfg
Snusmumriken
И да, как гуи-терминал-средство разработки-игральня, имхо, венда удобнее всего.
Предпочитаю разделение обязанностей.
И да, я пишу луа-скриптики в том числе потому, что они гарантировано кроссплатформенны, и одно и то же можно будет дёрнуть везде, накалякав в случае чего, простенькую обёртку над платформоспецифичными вызовами.
Luajit работает даже на psp (приставка) и nodemcu, чего уж там.
Mark ☢️
Война админов.мммм. нямка
Mark ☢️
Co(n)stantine👨🔬
Co(n)stantine👨🔬
го
Mark ☢️
Snusmumriken
Дык это сытон, он там не один : )
Целый комплект разномастных виртуалок, и у каждой - своя манера модулей.
У луёв вполне можно накалякать либу, которая будет спокойно подключаться всеми версиями (5.1-5.3 + luajit).
Ещё раз о кроссплатформенности и универсальности.
Mark ☢️
Мне пришлось пересесть на луа с питона потому что опенврт и мелкая флешка
Co(n)stantine👨🔬
о ништяк http://www.opennet.ru/opennews/art.shtml?num=48823