Tverd
Стыдно, товарищ Снус, не юзать тарантул )
Snusmumriken
Стыдно, товарищ Снус, не юзать тарантул )
Можно и тарантул но чуть позже.
Snusmumriken
Знаешь как его ставить на raspberry pi?
Tverd
В портах нет?
Alexey
https://github.com/moteus/lua-lluv-redis имеет парсер протокола
Alexey
https://github.com/moteus/lua-lluv-redis/blob/master/examples/stream.lua
Snusmumriken
https://github.com/moteus/lua-lluv-redis/blob/master/examples/stream.lua
Слишком сложно, плюс юзается сразу тонна либ. А ещё, для сетевой передачи - исключительно юникс-сокеты. Я предпочёл бы исключительно луасокет.
Snusmumriken
Это действительно похоже на "промышленный код", но зачем же так запутывать. Проще можно ))
Alexey
только lluv.utils для простого класса и может ыекштп ыздш
Snusmumriken
только lluv.utils для простого класса и может ыекштп ыздш
Ты понимаешь, что это автоматически привязывает тебя к конкретной среде?
Alexey
*string split
Snusmumriken
function string:split(self, delm) local temp, delm = {}, delm or ' ' for c in (self..delm):gmatch('(.-)'..delm) do temp[#temp + 1] = c end return temp end Ну как бы это всё. Только что написал, если что : )
Alexey
там реально используется примертш строк 30-60 Lua кода. Но копировать их во все библиотеки не охота, так же как и выносить в отдельную
Alexey
так же как class
Alexey
там еще Fifo и Buffer
Alexey
lluv.utils по хорошему нужно вынести в отдельную библиотеку
Alexey
для growl библиотеки я просто скопировал ее
Snusmumriken
Ох. Тогда require'utils.string', которая расширяет строковую либу нужными вещами. Карочи, меня бесит подход, когда для какой-то простой вещи нужен огромный комплект всякой фигни. Для класса - class = require'utils.class' Для буфера/стека/очередей - buffer = require'types.buffer', stack = require'types.stack' и queue = require'types.queue'. Пока пишешь прописываешь в LUA_PATH путь до всех своих либ. Когда экспортируешь кому-то - копируешь скрипты в директорию с модулем.
Snusmumriken
Карочи, я за чистоту библиотек. Если библиотека подключает что-то внешнее - это говняная библиотека. Исключение - многофайловые библиотеки, где есть папка со скриптом init.lua и абсолютно всеми необходимыми вещами. Ах да, пути до этих скриптов она вычисляет самостоятельно. Подключайте что-то внешнее в проектах, но не в либах.
Alexey
У меня нет желания делать copy-past одних и тех же функций
Alexey
тот же split. или StringBuffer
Snusmumriken
У меня нет желания делать copy-past одних и тех же функций
Если ты делаешь свой проект (цельную фиговину) - за милую душу. Если ты так делаешь библиотеку, которой пользуются другие люди - ты пидор )))
Snusmumriken
Ничось ответ через три года : )
Alxius
да просто надоедать не хотел, наберусь вот сил и хорошего камбоджийского кофе снова засяду за что нибудь или доделаю свой проект
Snusmumriken
да просто надоедать не хотел, наберусь вот сил и хорошего камбоджийского кофе снова засяду за что нибудь или доделаю свой проект
Смотри как риальные поцоны делают проекты. https://bitbucket.org/MainTomato/tank-o-box/src/67a4bc1def45708424f9facc09b8b04102c36433?at=develop И тебе стоит освоить ООП, а то поцоны не поймут.
Snusmumriken
Хе, кстати, с последнего коммита - довольно сильно перелопатил всё. Например, функция world:spawn() принимает первым аргументом имя (тип) объекта на спавн, а ещё есть фича world:loadResources(resourcedir), которая проходит по папке, ищет там папки со скриптами у которых совпадают имена (tank/tank.lua, wall/wall.lua) и загружает в себя классы оттуда, как раз для спавна.
Snusmumriken
А, блин, не тот чат.
Alxius
Мне последние 2 месяца вообще ничего не хотелось делаться и я не делал. Были другие дела. Заказали сделать несколько загрущочных Исо линукс под разные задачи и я делал. К луа это никак
Snusmumriken
Поцоны, кому луёвую вакансию? Мой персональный ассистент ))) Шучу, не только мой. > https://career.ru/vacancy/22290082
Snusmumriken
Ну таки не стажёр, типа полноценный разработчик, хоть и "младший".
Roman
> Уверенный пользователь Windows Эх, вырванные линупсовые годы мои...
Всё та же самая?
Snusmumriken
Ну типа сейчас не фриланс а тк рф, плюс тут далеко не только парсеры а ещё куча всего.
Roman
Ребят, у кого-нибудь есть оптимальный алгоритм для вставки с учетом сортировки? Есть visits = таблица (массив) таблиц с полем visited_at - number Надо сместить всех, что больше, на 1 позицию и вставить в нужное место новый элемент
Roman
https://pastebin.com/CpU9T2kV вот такое получилось, работает
Roman
возникает вопрос: таблица ведь разрывается перед тем как вставить, и только потом вставляет, это не будет фейлом скорости для луа?
Roman
len = #vs i = 1 while i < len current = vs[i] if current.visited_at > visited_at vs[i] = item for j = len, i + 1, -1 vs[j + 1] = vs[j] vs[i + 1] = current break i += 1 пока такое оставлю
Roman
ну доработать надо, да, если таблица пуста или если нет больших
Snusmumriken
Бинарный поиск же. Бинарным поиском ищем точку вставки, вставляем. Да, таблица частично разрывается, это фейл на очень больших таблицах, если надо много раз вставлять в начало, но тут уже ничто не поможет, разве что использование связных списков.
Roman
Что такое бинарный поиск?
Roman
здорово, что надо
Roman
А что за связные списки?
Roman
local l = list while l do l = l.next end это из книги Роберто, что-то совсем не верю, что это может быть быстрее обычной итерации по таблице-массиву
Snusmumriken
Это быстрее множества сдвигов в 100500 раз.
Roman
Пусть решает бенчмарк!
Roman
classic itetation 1.6867098808289 iterate linked list 6.1418981552124 в массиве было 100 элементов, 10000000 раз по ним итерировалось, код скинуть?
Roman
ну да, понятно, не спорю, но итерация важнее вставки обычно
Roman
вставка - вставил и забыл, а использоваться сколько раз оно будет - не известно, но наверняка больше раз
Roman
а вам интересно чтобы я на вставку бенчмарк запилил? это чуть сложнее
Roman
classic shift 1.2798800468445 linked list shift 0.0014700889587402 ну как-то так в 100к элементов вначало вставлять новый 10000 раз
Roman
t = {} first, arr.first = arr.first, t first.prev = t t.next = first
Roman
но вы понимаете, листы это круто, это по-сишному, но в луа с ними неудобно совсем может есть что из сишных модулей или расширений луаджита, что может максимально быстро сдвигать?
Roman
а, ну да, сейчас перебенчмарчу
Snusmumriken
а, ну да, сейчас перебенчмарчу
Да, цикл итерации по классическому массиву for i = 1, #arr do local v = arr[i] ... end В полтора-два раза быстрее чем for i, v in ipairs(arr) do ... end
Roman
я не о том, сейчас проверю
Snusmumriken
У кого в тесте? Я тут сравниваю цикл и ipairs.
Snusmumriken
Не про разницу между связными списками, а между обычными массивами. На код глянь )))
Roman
table.insert в два раза медленнее оказался, чем поэлементные сдвиги!
Roman
втф?
Snusmumriken
Напиши свой table.insert ))
Roman
В си-модуле руки очень связаны луа апёй, если бы можно было бы глубже опуститься
Roman
пока не придумал
Roman
бинарное древо: https://pastebin.com/RMMrSZuX если значение кладется рядом с такими же, то в конец, чтобы меньше элементов сдвигать потом
Roman
написал в саппорт пастебина, чтобы добавили
Roman
Мне ещё идея пришла насчет ускорения вставки в начало: если разбить 100к массив на 100 массивов с .min .max полями, то и вставлять будет быстро, и итерировать!
Roman
Согласен, это время суток позднее
Snusmumriken
Кстати как ни странно даст. Блочная индексация, все дела. Правда, эту хуйню нужно балансировать, ибо если будет много вставок одного и того же числа - массив с ним будет сильно больше остальных.
Roman
тогда у нас есть 100к массив, в нем 100 массивов по 1000, и можно было бы при каждой вставке чекать, что если длина теперь > 1100 - пора лишнее перенести в следующий, и так итерациями весь 100к массив от места вставки передвинуть. Тогда, это в 100 раз быстрее минус накладные расходы
Roman
да, но не на 5 порядков
Snusmumriken
Ненене, много хуйни. Проще один раз в N итераций перебалансировать полностью. Вставили N * 0.5 значений - перебалансировали полностью. Перебалансировка - вычисление количества необходимых ячеек, проход по имеющимся, добавление имеющихся в новые, старыми - кормим мусорщика.
🦥Alex Fails
/ban
Kirill
/help@FailsBot
FailsBot
/help@FailsBot
USAGE: /help - prints this message; /vzhuh [message] - do vzhuh; /start - info about bot.
FailsBot
∧_∧ ( ・ω・。)つ━☆・*。 ⊂  ノ    ・゜+. しーJ   °。+ *´¨)          .· ´¸.·*´¨) ¸.·*¨)           (¸.·´ (¸.·'* ☆
Roman
Мб потому что суть та же, но ipairs это функция, возращающая функцию-итератор, при каждом проходе надо вызывать эту функцию, конечно, луе это добавляет трудностей, функции они же достаточно сложные структуры, которым нужно помнить переменные, обладать разными свойствами, записываться в трейс
Roman
А ещё, я точно не знаю, но может ipairs проверяет наличие n свойства