Igor
Ну да, я тоже
Igor
os.execute вообще не трогаю
Snusmumriken
Ща думаю на тему кроссплатформенного popen'а на read и write одновременно, на сишке.
Igor
Я что-то такое писал
Igor
Но давно
Snusmumriken
И желательно неблокирующего.
Igor
Snusmumriken
Вот ща буду думать как это писать.
Snusmumriken
Такая либа всяко нужна, у меня даже были таски под неё.
Andrey
но не в UI треде!
Andrey
(мне тоже уже походу надо)
Andrey
я не могу спать, не блокируя кровать.
Snusmumriken
А ты на краешке ложись ))
Snusmumriken
Если в треде с UI нет операций дольше 0.1с, то неблокирующие popen'ы смело можно и в тред с UI, никаких особых задержек не будет.
Если UI должен поддерживать 30-60fps, то уже 0.01-0.03с, это неблокирующие popen'ы тоже потянут.
Snusmumriken
Как это называется.. Работа посменно, во. В пятёрочке (или в другом круглосуточном сетевом магазине) её уже освоили. Зелёные треды, межпрочим. Только по зарплатам дорого.
Andrey
полифазный сон
Andrey
в пятерочке.
Snusmumriken
Хехе, "Галя, скажи диспетчеру процессов закрыть мой тред и открыть твой, я уже ухожу" (смена контекста == перелогин в кассе)
Andrey
недавно кстати получал пакет с алиэкспресса прямо на кассе пятерочки, так меня обматерили, что я поздно пришёл
Andrey
stackfull vs stackless кассы
Snusmumriken
И главная фича: бит отмены выполнения (пробития товара) в случае ошибки, но это делают только core-процессы (Галя, которая умеет отменять покупки).
Andrey
Нужны бенчмарки с замерами глубины пайплайна(длины ленты товаров) и цены смены контекста.
Andrey
что ж, хороший yield вышел с упоминания пятерочки.
Snusmumriken
Yield это "Сдачи нет, подождите, щас следующий человек пройдёт, у него наличные?"
Snusmumriken
Первое что приходит в голову — таблички.
Snusmumriken
local alt = targetAltitudeFn
local tgl = ag.toggle
local vert = {
-- x{min, max}, y{min, max}, act{fn, arg1}
{x = {72, 77}, y = {19, 27}, act = {tgl}},
{x = {30, 34}, y = {21, 32}, act = {alt, -10000}},
{x = {30, 34}, y = {34, 42}, act = {alt, -1000 }},
...
}
if screenId == screenVert then
for i = 1, #vert do
local v = vert[i]
local X, Y = v.x, v.y
if x > X[1] and x <= X[2]
and y > Y[1] and y <= Y[2] then
v.act[1](v.act[2])
end
end
end
Egor
О! кажется так лучше выглядит
Egor
Не напомните в Lua как было получить из таблицы первые несколько элементов?
Egor
В луа есть что-то подобие eval?
Есть таблицы a1, a2, a3 - но я не знаю их названия , но я знаю номер, и мне надо как-то обратиться к нему как aНомер
Egor
x = {1,2,3}
b = 2
a = load("print x["..b.."]")
a()
Вот хочу сделать что-то такое
Anatoliy
Anatoliy
Anatoliy
Вообще способов масса
Egor
Anatoliy
Ты мануал по луа вообще читал?
Anatoliy
В шапке ссылка на мануал закреплена, только незнаю на русском ли он, если нет то могу на русском скинуть, ты спрашиваешь о самых азах языка что говорит о том что мануала ты не читал, а там все есть причём все на пальцах обьяснено
Egor
Anonymous
@nengchak за eval я тебя по голове ebal. и ответственность с радостью возьму
перебор таблицы это - pairs/ipairs. перебирает всё, что есть в таблице
Egor
Anonymous
это как? пример по-подробней сможешь дать?
Alexey
если это глобальные переменные то _G/_ENV/getenv в зависимости от версии и того что такое глобальная
Для локалиных переменных - через debug. Есть пример
https://github.com/hishamhm/f-strings
Anatoliy
Anonymous
пропагандируем безопасный образ жизни :)
Anonymous
Anonymous
Anonymous
чет намудрил, с ; эскейпить \n не надо
Anatoliy
Ребята подскажите хорошие форумы в инете и группы в телеге по сисадминству на Windows Server
Egor
Snusmumriken
В общем, уже написали что в луа есть волшебная глобальная таблица _G. И это и есть твоё глобальное окружение, в ней хранится всё глобальное.
Snusmumriken
То есть ты такой:
a2 = {12345}
local var = 2
local tbl = _G["a" .. var] --< вытягиваем из глобального
print(tbl == a2) --> true
Snusmumriken
Что характерно, для того чтобы пользователь имел к ней доступ, внутри _G есть переменная _G, которая равна самой _G, хехе.
Alexey
local p = print a = 10 do local _ENV = {_G = _G} a = 20 p(a, _G.a) end
Alexey
Я это к тому что глобальная это не всегда _G.
И ее может не быть вообще
Snusmumriken
В 5.1 есть, в 5.3 тоже есть
Snusmumriken
Её может не быть если кто-то задавал глобальное окружение через setfenv или чем-то таким.
Alexey
Начиная с 5.2. _G приравнивается _ENV, но при загрузке чанка е окружение можно подменить
Snusmumriken
Единственное что страшно обидно — нельзя для подгружаемого чанка полностью перелопатить окружение: подставить для него (и только для него) определённый package.path (а если сделать копию в его окружении — require всё равно будет смотреть в первоначальную, там запоминается ссылка на таблицу). Разве что свой package.loader написать, и подменять его на момент использования чанка.
Alexey
Всегда можно переопределить require
Snusmumriken
Да, у меня на работе, на тестовом стенде, require цепляет скрипты из рабочей копии гита того, кто в данный момент работает в веб-системе. Но в случае с сепарацией окружений, нужна ещё более извращенская штука, потому что у нас есть фолбек на обычный require, а тут надо переделывать и работу с package.path/cpath (с генерацией путей до либ, хорошо хоть по package.config можно понять, dll или so, дёргать dofile и loadlib, вручную кешировать), и ваще. Ну, то есть в принципе сделать можно, но стрёмно и рассадник для багов.
Yuriy
Всем доброго дня. кто нить пользуется этой либой для openssl?
https://github.com/zhaozg/lua-openssl
ну могу понять как спользовать aes-256-gcm
точнее не могу найти пример, мб есть у кого завалялся
Yuriy
Yuriy
если я переключаю alg на aes-256-cbc например - то все норм
Yuriy
но это не тот метод который мне нуен
Yuriy
По идее лист чиперов должен быть везде одинаоквый
Yuriy
он же экспортится из openssl либы
Igor
Yuriy
Yuriy
Yuriy
Но спасибо за отзыв
Egor
Добрый день. Как сделать такое правильно: Есть экран, на экране можно ловить координаты кликов. Хочу написать функцию чтобы она умела рисовать на экране и были сразу предопределены координаты. (чтобы не высчитывать руками). Что родил:
function createBtn(x,y,w,h,txt)
html = [[<div style="position:absolute; top:]]..y..[[; left:]]..x..[[vw; width:]]..w..[[vw; height: ]]..h..[[vh">]]..text..[[</div>]]
screen.setHTML(x,y,html)
return {x=x,y=y,x1=w+x,y1=h+y}
end
btn1 = createBtn(1,1,2,2, "Hello")
btn2 = createBtn(5,4,2,2, "Hello")
----вызывается при нажатии
if x<btn1.x and x<btn1.x1 and y > btn1.y and btn1.y1 then
--do
end
--- и все другие функции вызывать на остальные кнопки
Но кажется это не очень оптимальный код.
🐅🤦♂️
local buttons = {}
function createBtn(x,y,w,h,txt, handler)
html = [[<div style="position:absolute; top:]]..y..[[; left:]]..x..[[vw; width:]]..w..[[vw; height: ]]..h..[[vh">]]..text..[[</div>]]
screen.setHTML(x,y,html)
buttons[buttons + 1] = {x=x,y=y,x1=w+x,y1=h+y, handler = handler}
end
createBtn(1,1,2,2, "Hello", function() end)
createBtn(5,4,2,2, "Hello", function() end)
for _, but in pairs(buttons) do
if x<but.x and x<but.x1 and y > but.y and but.y1 then
but.handler()
end
end
🐅🤦♂️
Если правильно понял что нужно
Egor
local buttons = {}
function createBtn(x,y,w,h,txt, handler)
html = [[<div style="position:absolute; top:]]..y..[[; left:]]..x..[[vw; width:]]..w..[[vw; height: ]]..h..[[vh">]]..text..[[</div>]]
screen.setHTML(x,y,html)
buttons[buttons + 1] = {x=x,y=y,x1=w+x,y1=h+y, handler = handler}
end
createBtn(1,1,2,2, "Hello", function() end)
createBtn(5,4,2,2, "Hello", function() end)
for _, but in pairs(buttons) do
if x<but.x and x<but.x1 and y > but.y and but.y1 then
but.handler()
end
end
О! красивее моего решения выглядит. А если как модуль использовать?