Leon174
о господи! не, это для меня слишком (мне бы как тайпскрипт для js, но на луа)
Я вот тоже от лиспов шарахался. Ну, так бывает, если когда-то препод по инженерной графике, фанат новых на тот момент технологий, слегка объясняет (крайне херово, на самом деле) про лисп, а потом дает задание в автокадовской убогой консольке за пару написать программу для икосаэдра. Тогда да, начинаешь от этих скобочек терять сознание. А сейчас ничего, зашло. Очень даже неплохая штука, вывод чистый. Мне нравится.
Leon174
https://emmylua.github.io/annotation.html
æxsfɨxꙮ
1
æxsfɨxꙮ
Привет
æxsfɨxꙮ
так тук
Snusmumriken
Привет
Дарова
Snusmumriken
так тук
Чё-каво?
Yaroslav
Всем привет. Какой библиотекой пользоваться, чтобы находить вхождение IP в подсети?
Yaroslav
Ухуху, какой хороший вопрос. Подозреваю что bit.
т.е. рекомендуешь написать самому ip калькулятор?
Snusmumriken
Да, потому что схема калькулятора в общем-то несложная.
Yaroslav
уметь бы еще программировать))
Snusmumriken
Я в своё время уже катал что-то такое, года три-четыре назад, когда развлекался с port-forwarding средствами луасокета, определением маски текущей подсети и вычислениями широковещательных адресов для ssdp (поиск и идентификация устройств в локальной сети) и последующго upnp.
Yaroslav
серьезное дело
Alexey
Для ipv6 там еще библиотека для работы с большими числами может пригодится, да и распарсить все возможные форматы строк для ipv6 тоже не так чтобы просто
Snusmumriken
Для ipv6 там еще библиотека для работы с большими числами может пригодится, да и распарсить все возможные форматы строк для ipv6 тоже не так чтобы просто
Не, не, оно по блокам отлично работает. Преобразовывать айпишник в одно большое число обычно не нужно.
Микита
уметь бы еще программировать))
особенный акцент на битовых операциях, при работе с айпи адресами, та ещё боль
Микита
(побитовая операция И между значением IP-адреса и значением маски подсети используется для определения принадлежности данного адреса к подсети)
Микита
если я правильно понял цель
Yaroslav
особенный акцент на битовых операциях, при работе с айпи адресами, та ещё боль
у меня конечно костыли, т.к. я гуманитарий походу))) но вроде написал скрипт который делает, то что мне надо. А именно говорит попадает ли заданный ip в формате a.b.c.d, в подсеть a.b.c.d/net
Yaroslav
ну как-то так, не претендую на звание код года))
Eduard I. Titkov
Парни, с кого начать изучение LUA?
Eduard I. Titkov
🖐
Lämppi
Начни с себя🌝
Arslan
Парни, с кого начать изучение LUA?
Была фиговина, называлась "луа за 15 минут"
Eduard I. Titkov
Проводником в этот мир кого брать?
Arslan
Проводником в этот мир кого брать?
Изучай по книжкам, а потом дергай нас
Eduard I. Titkov
Arslan
Держи: http://tylerneylon.com/a/learn-lua/
Eduard I. Titkov
А чо-нить более цельное, книг нету?
Eduard I. Titkov
на рузком %)
Arslan
Так там изучать нечего. Зачем писать книги про маленький скриптовый язык?
Arslan
Eduard I. Titkov
Так там изучать нечего. Зачем писать книги про маленький скриптовый язык?
Чтобы делать на нем большие вещи.. хотя я у тебя услышал, да.
🐅🤦‍♂️
Книжка на русском
Lämppi
Eduard I. Titkov
Anonymous
есть две таблицы(t1,t2), мне нужно их сравнить и заменить nil на значение из t2
Anonymous
local function tab_name(tbl) local t1 = {1,nil,3} local t2 = {1,2,3} local t = {} for k, v in pairs(t1) do if t2[k] == nil then t[k] = v end for k, v in pairs(t2) do if t1[k] == nil then t[k] = v end end end return t[k] end print(tab_name(tbl)
Snusmumriken
Тут скорее достаточно function merge(a, b) for k, v in pairs(b) do if a[k] == nil then a[k] = v end end return a end Это если нам надо изменять первую таблицу. Если нам нужно просто новое дополненное множество — сначала делаем копию первой, а потом дополняем второй.
Snusmumriken
Или тебе нужно пересечение множеств?
Anonymous
мне нужно дополнить, неправильно описал вопрос
Snusmumriken
Потому что есть некоторое количество операций над множествами, выбирай любое. Таблица как некоторое множество ключей. Выбор конкретных значений для ключей как приоритеты множеств (кто-то обрабатывается раньше, и доминирует своими значениями для общих ключей).
Anonymous
есть определённая база данных, мне нужно сравнить ее с данными из файла если значение нету в базе надо вставить значения из файла
Snusmumriken
Содержимое базы и файла помещаются в оперативную память?
Snusmumriken
Их можно тупо выдрать и перебирать луями?
Anonymous
да
Snusmumriken
Шикос. 1. Выгружаешь базу и файл в две таблички, с ключами-интересующими значениями, получив на выходе что-то типа: base = { user001 = {password = "300traktoristov"}, user025 = {password = "301traktorist"}, } file = { user001 = {password = "300traktoristov"}, user022 = {password = "301spartanets"}, } 2. Потом такой: out = {} for k, v in pairs(file) do if not base[k] then out[k] = v end end И догоняешь базу данных содержимым out.
Anonymous
спасибо, попробую
æxsfɨxꙮ
Воу
æxsfɨxꙮ
Кто знает как с io.open() работать.Скажите пожалуйста.
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
æxsfɨxꙮ
Aiwan \ (•◡•) / _bot
https://t.me/ProLua/73706 пожалуста
Snusmumriken
Кароч. Файлы открываются через io.open: local file = io.open("path/to/file.fmt", "rb") Второй аргумент — режим открытия файла. Тебя интересуют в основном три режима: — r — режим чтения, курсор в начале файла — w — режим записи, содержимое файла очищается в момент открытия в этом режиме — a — режим дополнения, содержимое файла сохраняется, курсор установлен в конец файла Если к режиму добавить "b" ("wb/rb/ab") — оно начнёт читать/писать в бинарном формате, без дополнительной пред/постобработки файлов. Крайне советую использовать его ВСЕГДА, потому что пред-постобработка может сильно мешать парсингу файла. Если к режиму добавить "+" — текущий режим открытия начинает работать и на чтение, и на запись. То есть можно одновременно считывать и записывать этот файл, а режим "ab+" позволяет дополнять файл, считывать его содержимое и дописывать. Когда ты открываешь файл, он представляет собой некоторую фиговину с текущим курсором. local file = io.open("bla.txt", "rb") local block1 = file:read(30) -- считываем первые 30 байт local block2 = file:read(20) -- считываем следующие 20 байт Курсор — текущее положение в файле, буквально как будто ты открыл его в блокноте и двигаешь кнопками-стрелками курсор, при чтении и записи — курсор перемещается на новую позицию. Для перемещения курсора используется file:seek("mode", bytes). Им можно перемещать курсор на конкретную позицию в байтах seek:("set", 100500), в начало ("set", 0) и в конец ("end") файла. Лайфхак: оно возвращает позицию курсора при смещениях, поэтому если мы переместили seek'ом в конец — оно вернёт объём файла в байтах: function fsize (file) local current = file:seek() -- get current position local size = file:seek("end") -- get file size file:seek("set", current) -- restore position return size end Соответственно, в режиме записи, можно передвинуть курсор на нужную позицию и вписать в середину файла кусочек данных. Но так как файл может расширяться только с конца, оно перетрёт то что было на тех байтах, в которые встало то что ты записал (как ввод текста с включённым insert на клавиатуре). Когда файл тебе больше не нужен — крайне желательно завершить его работу с file:close(), потому что хендлер файла останется жив пока его не соберёт сборка мусора хрен знает когда.
æxsfɨxꙮ
Кароч. Файлы открываются через io.open: local file = io.open("path/to/file.fmt", "rb") Второй аргумент — режим открытия файла. Тебя интересуют в основном три режима: — r — режим чтения, курсор в начале файла — w — режим записи, содержимое файла очищается в момент открытия в этом режиме — a — режим дополнения, содержимое файла сохраняется, курсор установлен в конец файла Если к режиму добавить "b" ("wb/rb/ab") — оно начнёт читать/писать в бинарном формате, без дополнительной пред/постобработки файлов. Крайне советую использовать его ВСЕГДА, потому что пред-постобработка может сильно мешать парсингу файла. Если к режиму добавить "+" — текущий режим открытия начинает работать и на чтение, и на запись. То есть можно одновременно считывать и записывать этот файл, а режим "ab+" позволяет дополнять файл, считывать его содержимое и дописывать. Когда ты открываешь файл, он представляет собой некоторую фиговину с текущим курсором. local file = io.open("bla.txt", "rb") local block1 = file:read(30) -- считываем первые 30 байт local block2 = file:read(20) -- считываем следующие 20 байт Курсор — текущее положение в файле, буквально как будто ты открыл его в блокноте и двигаешь кнопками-стрелками курсор, при чтении и записи — курсор перемещается на новую позицию. Для перемещения курсора используется file:seek("mode", bytes). Им можно перемещать курсор на конкретную позицию в байтах seek:("set", 100500), в начало ("set", 0) и в конец ("end") файла. Лайфхак: оно возвращает позицию курсора при смещениях, поэтому если мы переместили seek'ом в конец — оно вернёт объём файла в байтах: function fsize (file) local current = file:seek() -- get current position local size = file:seek("end") -- get file size file:seek("set", current) -- restore position return size end Соответственно, в режиме записи, можно передвинуть курсор на нужную позицию и вписать в середину файла кусочек данных. Но так как файл может расширяться только с конца, оно перетрёт то что было на тех байтах, в которые встало то что ты записал (как ввод текста с включённым insert на клавиатуре). Когда файл тебе больше не нужен — крайне желательно завершить его работу с file:close(), потому что хендлер файла останется жив пока его не соберёт сборка мусора хрен знает когда.
воу спасибо сейчас сохраню
Snusmumriken
воу спасибо сейчас сохраню
Ну типо вот, дополнил и пофиксил. По сути, это практически всё что нужно знать о файлах. Мне самому надо самому сохранить ссылку на сообщеньку, чтобы кидать дальше.
æxsfɨxꙮ
ну записать в переменную или просто скопировать хотябы
Luсky
луа, ини, жсон?
æxsfɨxꙮ
но тпм онли цифры могу изменить
Luсky
формат записи пример?
æxsfɨxꙮ
48293
æxsfɨxꙮ
Просто цифры
Luсky
то есть типа цифры, разделённые пробелами?
æxsfɨxꙮ
нет просто цифры
æxsfɨxꙮ
без пробелов без ничего
æxsfɨxꙮ
Snusmumriken
local var = file:read("*n")
æxsfɨxꙮ
я пошел читать документацию
Luсky
прикольно
Snusmumriken
Или ещё конкретнее: local var = tonumber(file:read("*a")) — считываем всё содержимое файла и преобразуем его в число.