Lucky
хочу соляризед дарк
Lucky
кстате, что лучше под формат тем - ини, хмл или жсон?
Snusmumriken
Пофигу, не?
Snusmumriken
Ини проще парсить, хмл сложнее, жсон посередине.
Snusmumriken
Я бы предпочёл ини, потому что там ещё нет мороки с лишними кавычками-запятыми как у жсона, и он не такой мороченный как хмл. Так-то можно хоть цсв.
Lucky
там парсить сильно не надо - регулярками в таблицу выдернул и щасте
Lucky
такшто ини, пожалуй, да
Snusmumriken
Ини рассчитан на простую key-value мапу "и не больше", а тебе больше и не нужно. Деревья нинужны.
Lucky
ага
Lucky
Заха́р
Привет мир! Когда подвязываешь на одну и ту же команду несколько клавиш, то в результате они друг друга перезаписывают и работает только последнее назначение. function add_keybinds() mp.add_forced_key_binding('k', 'moveup', moveup, "repeatable") mp.add_forced_key_binding('л', 'moveup', moveup, "repeatable") end Как привязать несколько клавиш? Здесь контекст кода: https://github.com/jonniek/mpv-playlistmanager/blob/master/playlistmanager.lua
Заха́р
реализовать свою функцию биндинга и привязать только её?
Нет, уже имеющуюся функцию из скрипта подвесить несколько раз на разные клавиши
🐅🤦‍♂️
Одно ядро. Много ядер за счёт запуска нескольких интерпретаторов(lua_state).
Snusmumriken
В чистых луях нет настоящей многопоточности и открытия нескольких вм.
Snusmumriken
Можно извратиться с открытием нескольких интерпретаторов (io.popen, передача только в одну сторону), перенаправляя io.stdin/stdout, но оно будет блокировать при попытке чтения, пока не скинут чего. Или пользоваться библиотеками http://lua-users.org/wiki/MultiTasking
Snusmumriken
Нет, это корутины.
Snusmumriken
"Многоядерность" подразумевает разные луа-стейты, каждое из которых условно на своём ядре. Корутины внутри одного луа-стейта.
Snusmumriken
А, пардон. Совсем забыл про луасокеты. Просто открываем те же несколько интерпретаторов и общаемся сокетами. Сокеты не стандартные, но очень распространённые. Зато многоядерно и неблокирующе!
Snusmumriken
Карочи, есть два основных типа "многопоточки": — Лёгкие треды (они же "зелёные"), это типа корутин. Хотя у разных ЯП бывают разные реализации, где-то кажется можно даже нарваться на "многопроцессорные" извращения, но не в луа. Их прекол в том, что это фактически другая организация кода. Как будто много-много наставленных goto (плюс свапы стеков и окружения). Их можно наплодить сто тыщ мильярдов, и они очень быстро свапаются, отлично заходит под асинхронный код, и его можно писать так как будто он нормальный и синхронный, правда если что-то заблокирует исполнение — оно будет заблокировано, и всё будет стоять: goto же, почти ничего больше. Луёвые корутины — именно такие. — Нормальные треды. Это когда язык требует у ОС, мол: "выдай мне тред, и загони в него вот это вот", например виртуальную машину скриптового языка вместе со скриптом. И операционная система уже им занимается: выделяет процессорное время на разных ядрах, помогает размечать память под каждый отдельный поток и так далее. Это полностью отдельный процесс, но если родительский грохнут, то детей через некоторое время вытрет ОС. Их не стоит плодить сто тыщ мильярдов, потому что свапы между потоками ОС проворачивает довольно медленно, плюс они начинают конкурировать за процессорное время и мешают друг другу, как правило, таких потоков (если они сильно нагружены) приложение создаёт не больше N - 1, где N — количество физических ядер цпу. Общение же между такими потоками обычно через пайпы ОС (пересылка строчек), сокеты (пересылка строчек) или шаред-мемори (общие участки памяти, как правило для хранения общих строчек, но иногда там хранят и структуры, вот извращенцы).
Snusmumriken
Андестенд? Это универсальная информация, относится к большинству языков и осей, то есть чиста технология.
Snusmumriken
vvzvlad
Андестенд? Это универсальная информация, относится к большинству языков и осей, то есть чиста технология.
Первое очень знакомо всяким железячникам под названием "кооперативная многозадачность". Когда у тебя куча задач, и у каждой свой стек и переменные, и все это жрет мало ресурсов, но ты должен явно возвращать управление таск-менеджеру, даже если крутишь какой-то сложный цикл, иначе остальные задачи выполняться не будут.
vvzvlad
А второе можно назвать вытесняющей многозадачностью(собственно, когда потоки управляются ос, так и есть)
Igor
Ты два раза одно и то же имя даёшь биндам
Igor
Привет мир! Когда подвязываешь на одну и ту же команду несколько клавиш, то в результате они друг друга перезаписывают и работает только последнее назначение. function add_keybinds() mp.add_forced_key_binding('k', 'moveup', moveup, "repeatable") mp.add_forced_key_binding('л', 'moveup', moveup, "repeatable") end Как привязать несколько клавиш? Здесь контекст кода: https://github.com/jonniek/mpv-playlistmanager/blob/master/playlistmanager.lua
Igor
реализовать свою функцию биндинга и привязать только её?
Igor
Нет, уже имеющуюся функцию из скрипта подвесить несколько раз на разные клавиши
Igor
Надо что-то типа этого сделать function add_keybinds() mp.add_forced_key_binding('k', 'moveup1', moveup, "repeatable") mp.add_forced_key_binding('л', 'moveup2', moveup, "repeatable") end
Igor
Лишние сообщения в ответе захватил, извиняюсь
Andrey
Утро! Подскажите фреймворки для юнит тестирования в луа. Задача следующая я сейчас делаю мвс для обработки графовой базы постоянно новые обьекты и изменения. Просто тупо писать проверку для каждого метода - тяжело да и заглушек нет. Взял бы что то готовое что бы запустить весь скоп и проверять не сломалось ли чего.
Заха́р
Надо что-то типа этого сделать function add_keybinds() mp.add_forced_key_binding('k', 'moveup1', moveup, "repeatable") mp.add_forced_key_binding('л', 'moveup2', moveup, "repeatable") end
Работает!!! Ай мил человек, спасибо тебе огромное! Намаялся я с этой задачей. Аж как праздник настоящий!
Serezha
Из обсуждения QuickJS >> It shows only 2~3% of V8 performance.
Serezha
что лишний раз показывает что джит для интерпретируемых языков - наше все
.
Добрый день!! Помогите алгоритмом! Проверяю строки ФИО и ДР из io.lines - string.check_symbol. Как при нахождении ошибки прервать скрипт, а в случае, если без ошибок, продолжить? (С lua на ВЫ)
Igor
Не сильно понял вопрос, но похоже тебе нужен защищённый вызов функции
Igor
pcall или xpcall
Pavel
прервать_) через return ?
Igor
pcall(function() //тут код, который может вернуть ошибку end)
Igor
первым аргументом pcall вернёт true/false в зависимости от успеха выполнения
Pavel
можно xpcall + error(‘errror!! ahtung’)
Igor
а последующие - это то, что функция вернула
Igor
xpcall насколько я помню медленнее работает, но при ошибке возвращает развёрнутый трейсбек
.
Как же плохо быть нубом, но я учусь, честно!! Суть задачи такова, что из csv файла беру Ф,И,О,ДР и расставляю их по полям в базе, но мне надо сделать проверку данных на корректность(ФИО не содержала цифр и спезсимволов, ДР не содержала букв). Идея в том, что сначала должна пройти проверка и если всё правильно, только после этого началась подгрузка, а в противном случае, скрипт не выполнялся бы, даже если в одном поле ошибка.
.
Все это я делаю в ИСУБД Cronos, а там lua урезанный(( И, в частности, xpcall нет.
.
А нет, есть!! Сейчас изучу!!!
Snusmumriken
Есть, есть там xpcall. Там проблемы с package.path и ещё кое в чем, но сама луа не урезана.
Snusmumriken
Как же плохо быть нубом, но я учусь, честно!! Суть задачи такова, что из csv файла беру Ф,И,О,ДР и расставляю их по полям в базе, но мне надо сделать проверку данных на корректность(ФИО не содержала цифр и спезсимволов, ДР не содержала букв). Идея в том, что сначала должна пройти проверка и если всё правильно, только после этого началась подгрузка, а в противном случае, скрипт не выполнялся бы, даже если в одном поле ошибка.
Карочи, у тебя там должно быть чот такое: local hasError = false local records, i = {}, 0 for line in io.lines(filepath) do i = i + 1 local data = csv.decode(line) -- это уже твоей либой local first, last, middle, bdate = csv[1], csv[2], csv[3], csv[4] if first:find("%d") or last:find("%d") or middle:find("%d") then -- ThisAction работает если запущено в планировщике -- и указана папка куда логировать ThisAction.WriteLog("Ашыпка! " .. i .. ":" .. line) hasError = true continue -- в кроносе есть continue end -- базу сам выберешь local rec = Record(base) rec:SetValue(2, first) rec:SetValue(3, last) rec:SetValue(4, middle) rec:SetValue(5, bdate) table.insert(records, rec) end if not hasError then local succ, err = base:AddRecordsBlock(records) -- render тут вместо сериализации ThisAction.WriteLog(render{succ = succ, error = err}) end Никакие pcall'ы не нужны, если написать нормальные проверки.
.
Офигеть!! Сейчас попробую!!
Snusmumriken
Ты главное найди чем csv расшифровывать, я там для примера указал "csv.decode".
Snusmumriken
Офигеть!! Сейчас попробую!!
А, стоп, пардон, тебе там нужно чтобы оно падало хотя бы на одной ошибке, и говорило где она?
.
Да!!
Snusmumriken
И подгрузка только если всё-всё-всё правильно?
Snusmumriken
Жуть какая, ща пофиксю.
.
😁 спасибо
Snusmumriken
Пофиксил. Тут как раз AddRecordsBlock и пригодится. Недобавленные записи существуют только в оперативке как заготовка, и добавятся только после прямого добавления.
Snusmumriken
Сяп
Snusmumriken
В конце библиотеки: if ... then -- если его реквайрили return M -- возвращаем класс/модуль end -- если запускали самостоятельно - тестим assert(M.foo(1, 2, 3) == blabla) assert(M.bar(3, 2, 1) == ablabl)
Pavel
я этой либой пользуюсь
Highly Likely
Коллеги, подскажите, а кто-нибудь бенчал string.find на больших строках/текстовых файлах? Можете поделиться результатами? :) Очень любопытно.
Snusmumriken
Большие — это сколько? В мегабайтах.
Highly Likely
Большие — это сколько? В мегабайтах.
Ну хотя бы на пару миллионов строк. А лучше пару десятков миллионов строк.
Snusmumriken
В одной сроке может быть сколько угодно символов, хоть 1 хоть сто тысяч миллиардов. Скорость будет разной. Я только что проверил на luajit: поиск %w+ на ~ста мегабайтах занимает 0.42 секунды. На пятистах — две секунды.
Snusmumriken
12.5сек/500мб
Highly Likely
Великолепно, спасибо :)
Snusmumriken
На скорость в любом случае влияют следующие фиговины: 1. Длина исходной строки 2. Сложность регулярного выражения, они сложные, всегда быстрее ищется отдельный символ чем какой-то класс, да ещё и с несколькими match-скобками.
Snusmumriken
Только что проверил без жыта, отдельный символ ищется 0.001сек в тех же пятистах метрах. Тут уже чисто скорость оперативки.
Max
А без жита?
string.find с "регулярками" не джитуется. А без регулярок мы экономим только на передаче аргументов и проверке, что в паттерне нет этих самых "регулярок", что на бесконечно больших строках даёт бесконечно малый оверхед. Tldr: должно быть без разницы
Max
Более того, string.find в luajit почти не отличается от lua 5.1 (отличается только проверкой паттерна на наличие "регулярок", что опять же на паттернах из нескольких символов должно быть незаметно)
Max
А ещё забавный кейс. Можно попробовать сравнить luajit и lua5.1 на таком коде (и удивиться): local s = "abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz"; for i = 1, 3e6 do string.find(s, i) end
Snusmumriken
Более того, string.find в luajit почти не отличается от lua 5.1 (отличается только проверкой паттерна на наличие "регулярок", что опять же на паттернах из нескольких символов должно быть незаметно)
Только что было экспериментально проверено, что жит с регуляркой в ~6 раз быстрее lua5.3 с той же регуляркой. То что я тестил на старте в обоих случаях - %w+, это класс с регуляркой.
Snusmumriken
На 5.1 тот же результат что у 5.3
Max
Тогда дело в том, как мерялось