Snusmumriken
Ммм. Думаю он победит уже тем, что там уже всё есть. На луях придётся сначала запилить асинхронный сокет, а потом добавить туда "веб"-протокол. В общем-то, ничего сложного, работы на пол часа-час. С lanes будет ещё и бешено быстрым/труЪ-асинхронным.
Snusmumriken
Есть вот эта штука: https://github.com/lipp/lua-websockets Но там куча ненужных внешних зависимостей, ирл достаточно было бы сделать две зависимости на почти стандартные штуки: lanes и socket, собственно.
fgntfg
Ну вот да. На самом деле взять коробку и развернуть её - не проблема. Проблемы начинаются когда коробку надо перепилить, поженить с базой и вот это вот всё.
Snusmumriken
Тогда сам смотри :P
Roman
Тогда сам смотри :P
есть такая штука как luvit
Snusmumriken
Ну дык. И она использует корутины от libuv, есть такое. Но тем не менее, смотри доки. Тут мало кто даст тебе более подробную информацию чем доки. Вот, кстати, и они: https://github.com/luvit/luv/blob/master/docs.md
Snusmumriken
Это тебе не любой чат, тут есть я.
Snusmumriken
fgntfg
Anonymous
Ivan
всем привет! Задача такая: играет фоновая музыка, хотелось бы, чтобы звук подбора монетки гармонировал с фоновой мелодией, для этого я выписал хронометраж трека и какой звук воспроизвести на текущей секунде. Как это сделать? На С++ я бы сделал это так: https://ideone.com/qxSoM6
mva
Я тебя наверное уже достаточно достал. Но если будет время попроси "Админа @pro.lua" меня разбанить. Буду хоть в режиме read only сидеть
Snusmumriken
Лол, он ещё тут : ) Ну лады, пущай читает.
Tverd
Всем привет! Кто-нить писал что нить на ecs? Как и где обрабатывали события от движка? Например клацнули мышью на спрайте или по сети пришел пакет?
Snusmumriken
Там, обычно, хендлеры-колбеки. ЕСЦ - концепция, а не конкретная технология.
Elias
И события можно обрабатывать в системах часто. Или в машинах состояний. Типа если у тебя выстрел стоит на клик, то на пушка подписывается на ивент и стреляет в GunIdleState. Тут ECS мало влияет на всё
Tverd
Ага, в общем система отлавливает события, гуд, спасиб
Tverd
нужно было развеять сомнения )))
Snusmumriken
Не факт, но обычно так и есть.
Tverd
ну пока будем отталкиваться от этого
Alxius
мне сказали в чате что отсутствие виндовс версии игры - это серьезная проблема для людей которые хотят посмотреть игру я наконец то это исправил вот страничка с релизом виндовс версии (Наконец то спустя 3 месяца) https://vk.com/feed?w=wall-134363102_74
Alxius
да да это тот самый проеkt на Love2D
mva
> отсутствие виндовс версии игры - это серьезная проблема для людей которые хотят посмотреть игру
mva
ну, как обычно. самые наглые юзеры - юзеры windows
Snusmumriken
И их примерно 95%, я смотрел статистику пользователей стима. А линукс-игруны пользуются стимом, потому что это самая большая база игр под линукс.
Aiwan \ (•◡•) / _bot
что за игра? где можно почитать о ней?
Snusmumriken
что за игра? где можно почитать о ней?
Написано же: mission 2000 на новом движке. Ищешь старую missions, читаешь.
Nick
подскажите, чем к тарантулу ходить из lapis ? https://github.com/hengestone/lapis-tarantool не работает
Snusmumriken
Привет посоны, чего хотите/расскажете? : )
Snusmumriken
подскажите, чем к тарантулу ходить из lapis ? https://github.com/hengestone/lapis-tarantool не работает
Можно через сокеты, возможно есть какая-то новая оболочка.
Snusmumriken
Самое забавное и одновременно стрёмное что можно придумать - луа-приложение на тарантуле, которое слушает сокет, принимает луа-код, исполняет через loadstring и возвращает ответ. Тут возможны запросы произвольной сложности, и вызывающая сторона сама думает, что и как ей надо.
Snusmumriken
Но вообще есть вот это: https://github.com/tarantool/tarantino
Snusmumriken
> Самое забавное и одновременно стрёмное
fgntfg
Можно сделать свой Rest-api a-la elastic
vvzvlad
А как на паттернах в луа захватить первое слово, если оно либо "set", либо "get"?
fgntfg
И назвать его тарантастик
vvzvlad
Ну, т.е. аналогично такому, но проще: local _, _, gpio_cmd = string.find(message, ^(%a%a%a)) if (gpio_cmd == "set" or gpio_cmd == "get") then ... Что-нибудь типа ^(get|set)
_AMD_
sub?
vvzvlad
что не работает?
fgntfg
Regex
vvzvlad
в том-то и дело, что нет. Поэтому и спрашиваю, можно ли, и как, если да
vvzvlad
А все равно паттерный два раза писать. Я хотел в один уместить
fgntfg
http://rrthomas.github.io/lrexlib/
Vsevolod
lpeg.re еще
Andrey
Ребят а как сгенерить xml ?
Andrey
А готового ничего нет,типа lxml ?
Andrey
Чтоб из table в xml как нить ?;)
Andrey
Там парсеры все ..
Snusmumriken
Чтоб из table в xml как нить ?;)
Прекол XML в том, что там есть куча дополнительного стаффа. Есть такой XML: <tag1> <tag2>bla-bla</tag2> </tag1> Есть такой XML: <tag1 property1=bla-bla, property2 = "prop"> <tag2></tag3>bla-bla</tag2> </tag1> Поэтому для нормальной конверсии, нужно делать таблички такого рода: xmltbl = { tag = "tag1", properties = { property1 = "bla-bla", property2 = "prop2" }, nodes = { { tag = "tag2", content = { "</tag3>", "tag2", .... } } } }
Snusmumriken
< 3
Vsevolod
а никто не занимался вопросами отладки стека lua, при написании сишных расширений: вроде вошли в функцию, имеем N аргументов на входе, M на выходе (скажем, из docstring'а), и для каждой функции lua API проверяем, чтобы N и M оставались инвариантными
Vsevolod
наверное, немного сумбурно, но стоит задача найти функцию-паразита, которая подсирает в стек
Vsevolod
я думал даже писать под это дело расширение к libclang, но руки пока не дошли
Vsevolod
наверняка у многих возникала такая проблема, не?
Snusmumriken
Ничего особо сложного. 1. lua_gettop(L); - получить количество фигни на стеке 2. lua_settop(L, n); - выставить значение стека т.е. // луа-функция имеет на входе только стейт int lua_cfunc(lua_state * L){ // если первые два значения в стеке - числа if (lua_isnumber(L, 1) && lua_isnumber(L, 2)){ // берём первое число int a = lua_checknumber(L, 1); // берём второе число int b = lua_checknumber(L, 2); int c = a + b; int d = a - b; // пихаем в конец стека фигню lua_pushnumber(L, c); lua_pushnumber(L, d); std::cout << lua_gettop(L); << std::endl; // 4: 1:a, 2:b, 3:c, 4:d // луа-си-функция должна возвращать // количество аргументов с конца, // которые функция возвращает в луа return 2; } // а если не числа - ничего не возвращает (( return 0; }
Vsevolod
эм, нет, это все понятно
Vsevolod
хотя да, можно эту вот обвязку через codegen вставлять в каждую функцию
Vsevolod
а потом перлом парсить, ага
Vsevolod
settop - это грубое решение
Vsevolod
можно с водой младенца выплеснуть
Vsevolod
не хочется такого
Snusmumriken
Мм. Воспользуйся функцией printstack, и увидишь её содержимое. void lua_printstack(lua_State *L) { for (int i = 1; i <= lua_gettop(L); i++) std::cout << i << " - " << luaL_typename(L, i) << std::endl; } Можно со всех сторон смотреть, кто где подсирает.
Vsevolod
ну это еще более усложнит задачу перлу. функций очень много
Vsevolod
и они зависят от контекста
Snusmumriken
А чому перл? Тут как бы сишка.
Vsevolod
парсить вывод всей этой простыни
Vsevolod
и это будет больше не сишка, а libclang, потому что инжектить это надо в 100500 мест
Vsevolod
а потом парсить
Snusmumriken
Ууу, слишком сложно. Попробуйте попроще : )
Vsevolod
а попроще никак
Vsevolod
api жырное и асинхронное
Vsevolod
проблему я локализовал достаточно точно, но поймать не могу
Snusmumriken
Ну, асинхронность - это получать id потока и писать в лог-файл, с именем соответствующий текущему потоку. Жырность - неудобно, да.
Vsevolod
потоков никаких нет, есть асинхронные события и event loop
Snusmumriken
Ммм. Тогда пускать некоторое время события по одному, последовательно. Там же какой-то процесс есть? Типа, сначала запускаем одно событие, когда оно отработается - полученные данные пихаем в следующее событие, и т.п. Не? Ну я к тому, что любую асинхронность можно свести к линейному процессу, для читабельности логов. А жирность - да, не очень круто, но вроде анализируется. Глобальную замену тоже никто не отменял. Типа, при вызове каждой луа-сишной функции, пихаем лог: "Вызвалась такая-то функция, содержимое стека - вот такое вот", и на выходе из луа-сишной функции - то же самое. Глобальные замены - регулярками типа: replace what: luafunc_(funcname)(\(\))\n{ to: luafunc_\0(\1)\n{ LOG("call \0 function, stack: %s", luax_printstack(L)); Ну типа чтобы у каждая функция, типа int luafunc_foo(lua_state * L){ .... return 1; } стала таким: int luafunc_foo(lua_state * L){ LOG("call foo function, stack: %s", luax_printstack(L)); .... return 1; } В самой регулярке не уверен, думаю ты на том же перле напишешь лучше.