Roman
Если готов потом контент делать, и есть знакомые, которые к луа с теплом относятся
Snusmumriken
Знаешь что очень стоит?
Большая справочная база по библиотекам, отсортированная по категориям, с возможностью загрузки библиотеки произвольной версии (5.1, 5.2, 5.3, jit) * (x32, x64, arm, arm64) * (linux, windows). Грубо говоря, 32 версии библиотеки, или 16 - там где не важно, есть jit или нет.
Roman
luarocks?
Roman
если спарсить луарокс, можно лучше сделать?
Roman
там нормально вполне
Roman
можно конечно несколько разных источников объединить, opm, но так у каждого есть поисковики
Roman
ещё можно свой пастебин с категориями и тегами
Snusmumriken
Луарокс очень краток. Гиты тоже. Больше мест применения.
По тем же луасокетам можно книгу написать.
По курлу можно почти что книгу написать.
Lpeg - очень краток и тоже мало просто читаемых мануалов.
модуль utf8, с моими надстройками (кстати, есть на пастбине), с описаниями "зачем вообще нужен этот ваш utf8".
lanes - мануалы есть, но не так много годных читаемых примеров кода.
luafilesystem - кроме справочника апишки ничего нет.
jit - очень мало примеров, можно показать всю мощь сишки, накатав клиент steamapi, например, цепляя steamapi.dll и прописывая хедеры. И генерировать структеры. А потом использовать их.
И так - с огромной кучей либ. С бенчмарками и рабочими примерами + каменты.
Парсинг луарокс - это хорошо, но потянет только на вводный пост о либе. Оно рассчитано на человека точно знающего, зачем ему это нужно, и достаточно пытливого чтобы долго экспериментировать.
Лан, всем приятных снов, вырубаюсь.
Roman
почему прогеры так хреново спят
Roman
я сплю когда утром, когда днем, когда вечером, почти никогда ночью
Roman
кто тут - как вы спите?
vvzvlad
Ложусь в два, просыпаюсь в два
Snusmumriken
Лёг сегодня в пол десятого, встал в пол девятого.
ㅤ
Снусмумрик?
Snusmumriken
Перехожу на ночной образ жизни по выходным, это нормально. Правда, понедельники тяжёлые.
B
годна, ночю самое оно,
правда сам последние пару дней с трудом могу поспать, сон какой то выходит вроди как и 6-8 часовой но промежутками часа по 2 с перерывами на непонятную возню или перекур
вот реально лег, вроде и уснул а часа через два рас и подорвался, и пока не расслабишься нормально хер уснешь
Snusmumriken
Ты это, того. Лучше проспать пять часов непрерывно, чем десять с перерывами каждые два часа. На полноценность отдыха влияет именно продолжительность.
B
я был бы рад, если б удавалось, просыпаюсь я самопроизвольно, причем никаких раздражителей в округе нет
Snusmumriken
Ой. В таких случаях некоторым помогает выдуть пива кружечку.
B
ну такое
а потом присядешь на него и без кружки уже хер уснешь
Snusmumriken
Ну что ты.
Когда-то пил кофе каждое утро, чтобы проснуться. В универе ещё. За пол года не подсел, слез и даже не заметил этого. Правда, поначалу сонливость была чуть повышенная.
А настолько плохой сон бывает слишком редко чтобы подсаживаться на что-то подобное. Не предлагаю же алкоголизироваться на каждый раз "не могу уснуть" :3
B
Ну может не в плане физической зависимости только психологической
Snusmumriken
Мол, вера в то что 'есть волшебная таблетка которая исправит любой косяк с моим организмом'?
B
Ну типа
B
Причем не то что бы исправит, скорее поможет преодолеть
B
Это как какие то подсознательно выполняемые ритуалы которые могут укорениться настолько глубоко что от них потом хрен избавишься
Snusmumriken
Ну, тем же маленьким детям ритуальность необходима. Снижает тревожность и всю фигню.
Когда всё движется так как ожидает мелкий ребёнок, ему как раз гораздо проще кушать/писать/засыпать/мыть грязные руки после улицы и всё такое. Просмотр спокойной ночи малыши и чистка зубов перед сном - туда же.
Если у тебя есть мелкий ритуал перед засыпанием, например, обойти квартиру и проверить все окна/конфорки/включённый свет, тебе будет проще уснуть. Другое дело что когда ты к этому привык, если нет возможности осуществить этот ритуал, засыпание будет "обычным", но за счёт того что ты привык к "быстрому" - оно будет казаться "медленным".
Snusmumriken
Те, кто замечает подобные фичи, могут приучить себя к простым и легко исполняемым ритуалам, чем облегчить себе жизнь в куче мелочей. Ещё один инструмент, который можно применять удачно и неудачно. Кувалдой, вон, тоже можно часы ремонтировать. Но шанс сломать в процессе - очень велик.
B
Было много такого, благо со всем в свое время справился, есть знакомый который не в состоянии успокоиться до тех пор пока не похрустит всем чем только можно
Snusmumriken
Да, это уже гипертрофированно.
Дзен в балансе и возможности использования альтернатив.
Приучивать себя только к чему-то одному - всё равно что качать в РПГ только силу: в большей части случаев это прокатит, но в тех которые остались - сила вообще ничем не поможет.
Snusmumriken
Томатом
Snusmumriken
Человеческие имена - оставь слабым людишкам :3
Шучу, Лёшкой звать.
vvzvlad
Снусмумрик проще запомнить
🦥Alex Fails
+
🦥Alex Fails
B
Snusmumriken
Мумрик же. Ну что же вы, бетмены :3
B
Беда что без опыта и вагона знаний не берут на работу
Snusmumriken
Смотря куда.
Меня в общем-то были готовы учить, если бы я чего не знал.
Учиться всё равно пришлось, но к внутренним системам есть документация, поэтому просто время от времени спрашивал, мол, нет ли фиговины для такого функционала.
Snusmumriken
С питоном и жаваскриптом - да, всё гораздо хуже.
Snusmumriken
Посмотрел я на этот ваш node.js, и подумал, что свою клиент-серверную либу ( без клиентов и серверов) я мутил примерно аналогично устройству node.js.
Snusmumriken
Примерно так. Код не очень чист но хорошо отлажен. Референсов нет и не будет, скорее всего, ибо для внутреннего использования. Особо кекнуть можно над channel:receive. Оно работает почти как эвент-луп.
https://bitbucket.org/16tomatons/galaxio/src/b77f625469920617f963fcec5c8e9a8cfc4b51ec/Libs/Network/channel.lua?at=develop&fileviewer=file-view-default
Roman
ну не надо ноду трогать
Roman
resty websocket на том же битбакете - устройство очень похоже
Roman
только в while true цикле соединение по вебсокету поддерживает
Roman
у этого ничего общего с нодой нет
Roman
кстати, для открытых есть гихаб
Snusmumriken
Хочу её потыкать чутка ))
В общем, суть в том, что мы открываем соединение с кем либо, отправляем ему произвольные данные (автоматически json-ятся и типизируются), и все сообщеньки на другой стороне принимаются этой фигнёй:
for data, ip, port in channel:receive() do ... end.
В data, ip и port этого итератора попадает только то, что не прошло через все внутренние и пользовательские колбеки. Просто тут, в отличии от node.js, не скрыт эвент-луп, и его надо вызывать в произвольном участке своего кода. И этот эвент-луп по совместимости - итератор сообщенек которые не прошли луп.
Roman
Ага, я понял, это реализация асинхронности через udp!
Roman
Да?
Snusmumriken
Имхо очень забавно.
Да, да. Асинхронность в сетевом взаимодействии.
При получении сообщеньки определённого типа, вызываем соответствующий колбек, с аргументами "данное соединение" и "декодированные данные сообщения".
Если нет сообщенек - передаём исполнение кода дальше. Эта штука тоже не блокирует, ежели чё, ибо её задача - встраиваться, например, в игру. Помимо приёма сетевых данных, игрушка должна ещё много что делать, например, рендерить графон.
Примеры использования есть на этом же гите, в state/client и state/server.
В функции client:load и server:init лежат всякие callback:connect или callback:wupdate какой-нибудь. Это оно самое.
B
как в луне можно реализовать некое подобие инкапсуляции, и можно ли?
а нужно ли?
B
и кстати если мы делаем в таблице дырки они же так и сохраняются? ну тобишь со временем ничего никуда не смещается и мы постоянно будем иметь таблицу с дырками?
вроде да, но вроде как если катаемся по таблице и копируем ее значения в другую, то дырки не учитываются и очередность не нарушается
то есть если у нас
1- nil | 2- 2 | 3 - 3 | 4 - nil | 5 - 5 | 6 - 6 | 7 - nil | 8 - 8 | 9 - 9
то получим
1 - 2 | 2 - 3 | 3 - 5 | 4 - 6 | 5 - 8 | 6 - 9
причем если копировать через pairs то так катает, через ipairs не работает почему то вообще, что интересно потому как через
#table
к примеру спокойно идет по таблице и выводит результаты не обращая никакого внимания на дырки и их количество
где ты Мумрик?
всегда поймет и обьяснит
B
как получить количество аргументов передаваемых функции?
ну если кидать в функцию просто таблицу с ними то одно, а так есть ли способ с обычными аргументами?
B
ну не получить как результат, а просто узнать
думал что то типа если
foo(table) - то там проще, просто считать таблицу,
а можно еще проще, просто через
foo(...)
Roman
select('#', ...) - количество
Roman
сначала погуглил, потом ещё погуглил, я это не знаю откуда знаю, вывод что в гугле довольно базовую вещь найти непросто
Roman
ок, и как это загуглить?
B
зачем? тут то мы вопросы задаем и ответы получаем, смысл чата тогда?
B
Roman
да я вот думаю портал о луа, надо, не надо, склоняюсь к тому что не надо, но блин а вдруг что-то хорошее получилось бы
Roman
Roman
вот уже название и шапочку придумал
Roman
если все гуглится
Snusmumriken
Ох :3
Таблицы с дырками - это проблема. Старайтесь не делать таблиц с дырками.
ipairs идёт по таблице пока не наткнётся на дырку, #tbl показывает предельное значение в таблице.
Для таблиц с дырками, по хорошему, стоит мутить отдельный класс, со своим итератором, и метаметодом __newindex, который затыкает дырки при добавлении новых значений.
А лучше - связный список.
B
какой вариант лучше?
такой :
tab[1] = function(arg1) --[[work with]] end
tab[2] = function(arg1,arg2) --[[work with]] end
tab[3] = function(arg1,arg2,arg3) --[[work with]] end
tab[N] = function(arg1,arg2,arg3,argN) --[[work with]] end
или такой :
function tab.func1(arg1) --[[work with]] end
function tab.func2(arg1,arg2) --[[work with]] end
function tab.func3(arg1,arg2,arg3) --[[work with]] end
function tab.funcN(arg1,arg2,arg3,argN) --[[work with]] end
хотя сам больше к первому
Snusmumriken
Такой:
function tab(...) local args = {...} [work with] end
Roman
Между прочим, {...} лишний раз - плохо, так как лишняя табличка - зло
Roman
select отлично справляется
Snusmumriken
Да, в таких случаях можно пользоваться селектом.
Хех, кстати забавная идея, сделать итератор для множества аргументов, без плодения таблиц.
B
ние ние, предположм тиаритишски что тут простые но в тоже время сложные потуги сделать перегрузку
я не делал много фукнций с разными переменными только потому что не хочу работать со всеми разом, просто от количества меняем поведение
а с селектом да
local num = select( "#", ... )
а потом просто тыкаем этим куда нужно
Snusmumriken
Хех, столкнулся с забавной ошибкой на итераторе:
function itouple(...)
local i = 0
return function()
i = i + 1
local v = select(i, ...)
if v then return i, v end
end
end
for i, v in itouple('a', 'b', 'c', 10, 20, 30) do
print(i, v)
end
Ошибка:
cannot use '...' outside a vararg function near '...'
Roman
> Между прочим, {...} лишний раз - плохо, так как лишняя табличка - зло
Roman
В этом случае {...} это не лишний раз
Roman
а необходимый
Snusmumriken
Если функция не так часто вызывается - то норм.
Или если памяти много и тебе пофиг на сборку мусора.
На работке, у серверов обычно гигов 32-128 памяти, там пофигу на мусор, лишь бы быстро отработало.
Roman
вероятно, ... это фича самого языка и он дергает переменные прямо из стека, вот и не может к ним обращаться потом когда-нибудь из колбека
Roman
все логично!
Snusmumriken
... - это скрытый тип данных, называется "кортеж".
Они же используются при присвоениях:
a, b, c = c, a, b
Фактически, тут создаются два кортежа, которые обмениваются значениями, и по указателям на переменные заполняются новые значения конечного кортежа. Поэтому это так работает.
Snusmumriken
И, возможно, кортежи не могут существовать в замыканиях, потому что тип данных рассчитан не на хранение а на моментальное использование. Возможно, как раз за счёт хранения на стеке.