Igor
Ну да, я тоже
Igor
os.execute вообще не трогаю
Snusmumriken
Ща думаю на тему кроссплатформенного popen'а на read и write одновременно, на сишке.
Igor
Я что-то такое писал
Igor
Но давно
Snusmumriken
И желательно неблокирующего.
Igor
И желательно неблокирующего.
А вот такого не писал
Snusmumriken
Вот ща буду думать как это писать.
Snusmumriken
Такая либа всяко нужна, у меня даже были таски под неё.
Andrey
но не в UI треде!
Andrey
(мне тоже уже походу надо)
Snusmumriken
но не в UI треде!
Поэтому неблокирующую, чтобы можно было и в UI.
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 это "Сдачи нет, подождите, щас следующий человек пройдёт, у него наличные?"
Egor
Доброе утро. Есть ли как-то это Г получше написать? if screenId == screenVert then if x > 72 and x < 77 and y > 19 and y < 27 then ag.toggle() end ----- if x > 30 and x < 34 and y > 21 and y < 31 then targetAltitudeFn(-10000) end if x > 30 and x < 34 and y > 34 and y < 42 then targetAltitudeFn(-1000) end if x > 30 and x < 34 and y > 46 and y < 54 then targetAltitudeFn(-100) end if x > 30 and x < 34 and y > 57 and y < 66 then targetAltitudeFn(-10) end if x > 30 and x < 34 and y > 70 and y < 78 then targetAltitudeFn(-1) end ----- if x > 48 and x < 52 and y > 21 and y < 30 then targetAltitudeFn(10000) end if x > 48 and x < 52 and y > 34 and y < 42 then targetAltitudeFn(1000) end if x > 48 and x < 52 and y > 46 and y < 54 then targetAltitudeFn(100) end if x > 48 and x < 52 and y > 58 and y < 66 then targetAltitudeFn(10) end if x > 48 and x < 52 and y > 70 and y < 79 then targetAltitudeFn(1) end end if screenId == screenHor then if x > 9 and x < 14 and y > 34 and y < 42 then ag.toggle() end ----- if x > 57 and x < 62 and y > 29 and y < 34 then targetAltitudeFn(-10000) end if x > 65 and x < 70 and y > 29 and y < 34 then targetAltitudeFn(-1000) end if x > 72 and x < 78 and y > 29 and y < 34 then targetAltitudeFn(-100) end if x > 80 and x < 85 and y > 29 and y < 34 then targetAltitudeFn(-10) end if x > 87 and x < 92 and y > 29 and y < 34 then targetAltitudeFn(-1) end ----- if x > 57 and x < 62 and y > 62 and y < 67 then targetAltitudeFn(10000) end if x > 65 and x < 70 and y > 62 and y < 67 then targetAltitudeFn(1000) end if x > 73 and x < 78 and y > 62 and y < 67 then targetAltitudeFn(100) end if x > 81 and x < 86 and y > 62 and y < 67 then targetAltitudeFn(10) end if x > 89 and y > 94 and y < 67 then targetAltitudeFn(1) end end
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
Вообще способов масса
Anatoliy
т.е. что-то типа: {1=1,2=2...} ? а не.. глупость
Нет, x1={1,2,3} x2={2,4,6} и т.д. a={x1,x2, ...}
Anatoliy
Ты мануал по луа вообще читал?
Anatoliy
В шапке ссылка на мануал закреплена, только незнаю на русском ли он, если нет то могу на русском скинуть, ты спрашиваешь о самых азах языка что говорит о том что мануала ты не читал, а там все есть причём все на пальцах обьяснено
Anonymous
@nengchak за eval я тебя по голове ebal. и ответственность с радостью возьму перебор таблицы это - pairs/ipairs. перебирает всё, что есть в таблице
Anonymous
это как? пример по-подробней сможешь дать?
Alexey
если это глобальные переменные то _G/_ENV/getenv в зависимости от версии и того что такое глобальная Для локалиных переменных - через debug. Есть пример https://github.com/hishamhm/f-strings
Anatoliy
если это глобальные переменные то _G/_ENV/getenv в зависимости от версии и того что такое глобальная Для локалиных переменных - через debug. Есть пример https://github.com/hishamhm/f-strings
Да что вы человека ругаете - он луа вообще незнает и неизучал, питонщик он или ктото из этих вдруг зачем то за луа взялся даже мануал нечитав 😁😁😁
Anonymous
пропагандируем безопасный образ жизни :)
Anonymous
Anonymous
чет намудрил, с ; эскейпить \n не надо
Anatoliy
Ребята подскажите хорошие форумы в инете и группы в телеге по сисадминству на Windows Server
Snusmumriken
x = {1,2,3} b = 2 a = load("print x["..b.."]") a() Вот хочу сделать что-то такое
Тут же вроде как бы твой код, ты должен знать полные названия всех табличек и всё остальное. Или нет? Потому что eval (loadstring) тут имеется, но он совсем не для этих целей.
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 точнее не могу найти пример, мб есть у кого завалялся
Igor
Всем доброго дня. кто нить пользуется этой либой для openssl? https://github.com/zhaozg/lua-openssl ну могу понять как спользовать aes-256-gcm точнее не могу найти пример, мб есть у кого завалялся
Создаёшь объект через cipher.new("aes-256-gcm") инициализируешь объект функцией encrypt/decrypt и дальше дёргаешь шифрофункции, которые нужны update/final/... Если что-то не понятно, в любой момент можно заглянуть в исходники lua-openssl, в гугле найти пример работы с этим алгоритмом на Си и адаптировать код под Lua. Это не сложно, но я заниматься этим не сильно то и горю желанием, моё дело направить по верной дорожке. При самом говёном раскладе потратишь на это всё около часа, если не знаком с Lua C API и самим OpenSSL.
Yuriy
если я переключаю alg на aes-256-cbc например - то все норм
Yuriy
но это не тот метод который мне нуен
Yuriy
По идее лист чиперов должен быть везде одинаоквый
Yuriy
он же экспортится из openssl либы
Igor
да в том то и дело что я так и сделал. адаптировал Cишный encode local C = cipher.get(key.as_rs_alg) local evp_cipher_ctx = C:encrypt_new() evp_cipher_ctx:init(mac, key_realm) local str = assert(evp_cipher_ctx:update(key.realm,true)) -- it fails here with UNKNOWN error local str = assert(evp_cipher_ctx:update(key.ikm_key)) str = str..evp_cipher_ctx:final()
Я с OpenSSL знаком только поверхностно, а с aes-256-gcm тем более. В чём может быть проблема я не знаю, могу только предложить поставить брейкпоинт в модуле lua-openssl на EVP_CipherUpdate и другие, посмотреть, что идёт в аргументы при вызовах. Так уж точно ошибка всплывёт.
Igor
Да понятно. Я просто спрашиваю - думал мб кто уже поел этого за меня )
Тут по openssl вообще мало отвечают, если отвечают вообще. Так что проще самому в обнимку с дебаггером посидеть
Anatoliy
Всем доброго дня. кто нить пользуется этой либой для openssl? https://github.com/zhaozg/lua-openssl ну могу понять как спользовать aes-256-gcm точнее не могу найти пример, мб есть у кого завалялся
Если там в описании к lua-openssl автор непривел такого примера, а там много примеров есть, то самый верный вариант - открыть issue там его репе и написать об этом, я ему уже так писал и автор отзывался
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
🐅🤦‍♂️
Если правильно понял что нужно