Перейти к основному содержимому

12 записей с тегом "lua"

Посмотреть все теги

· 3 мин. чтения

Перенос информации с /docs

Пришлось столкнуться. Мои микрозаметки на этот счет.

TL;DR

Все, что описано ниже может быть полезным, но в моем случае полезнее всего оказалось сбилдить LuaJit от Tarantool и использовать встроенный в него memory profiler (memprof), который покажет где и сколько памяти не высвободилось в коде.

· 6 мин. чтения

banner

примечание

Этот пост – актуализация и перепись двух старых постов на эту тему.

poll.def.pm – это простейший open-source Long Polling сервер, который выступает в качестве своеобразного WebHook сервера и хранит в себе полученные updates.

🌈 Вы можете указать единый вебхук url на всех API сервисах, с которыми работаете, затем получать эти вебхуки со стольки своих сервисов, сколько создадите.

  • В любое время. Даже если ваш сервис был offline, данные не теряются
  • Мгновенно. Как только приходит новый апдейт, вы сразу его получаете. Без задержки
  • Без спама GET запросами. Соединение с long-polling не разрывается, пока не придет апдейт.
  • Получаете везде одновременно. Например телеграмовский getUpdates запрещает одновременно получать апдейты на нескольких серверах. Так ваш бот не сможет работать по частям на разных серверах.

· 6 мин. чтения

lua-express-white-banner

🌕 express.lua это самый детализированный порт оригинального express.js, написанный на Lua. Пока кто-то не докажет обратного.

По сути, lua-express это минималистичный web фреймворк с почти полной совместимостью API с express.js, позволяющий создавать веб приложения на чистом Lua.

Сравнение
const express = require("express")
const app = express()

app.get("/", function(req, res) {
res.send("Hello World")
})

app.listen(3000)

· 5 мин. чтения

debugger.lua

примечание

Пост создан в стиле заметок, а не руководства. Будет полезен тем, кто хочет удаленно дебажить свои Lua приложения, но еще подбирает инструмент.

Проблема в том, что вся информация на китайском. Каждый известный LuaDebug написал китаец и они не хотят переводить документацию на английский.

· 5 мин. чтения

coroutine-vs-function-line-view

Корутины это что-то вроде потоков, но при этом они все равно ими не являются. Поток, это когда (например) на отдельное ядро процессора можно повесить полностью отдельную задачу, а корутина это когда блоки кода работают по очереди и могут быть остановлены в любом моменте, чтобы продолжить исполнение другого кода.

Вот несколько наглядных практических примеров использования корутин:

· 1 мин. чтения

luarocks-logo-png

примечание

Инструкция предназначена для debian-based дистрибутивов, включая ubuntu

Необходимые зависимости

  • git для git clone
  • cmake, dpkg-dev, libc-dev и gcc для cmake ../luavela
  • g++ для make install в luavela
  • wget для скачивания luarocks
  • unzip для ./configure luarocks

Предварительно напишите LVPATH=/usr. Это будет путь установки luavela и с ним будет работать luarocks.

· 2 мин. чтения

🆘 UPD 2023.12.15

Этот пост немного устарел, но он уже переписан и актуализирован тут 👈 Рекомендую сразу читать статью по ссылке

  • Все упоминания poll.gmod.app в этом посте заменены на poll.def.pm (но оба домена рабочие в демо режиме)

Это простейший Long Polling микросервис, который выступает в качестве своеобразного WebHook сервера для POST запросов. Принятые данные можно получить с сервера по GET запросу.

· 7 мин. чтения

InGameShop (IGS) - внутриигровая менюшка для Garry's Mod серверов, через которую игроки донатят их владельцам с помощью gm-donate.net. До недавней поры установка происходила через Steam Workshop. Сейчас готова версия, которая 1 запросом скачивает и выполняет код. Внизу будет реализация

Разработка такой версии изначально казалась задачкой на вечерок под кофеек, но много раз откладывалась из-за каких-то нюансов. Было много идей, как все реализовать, но выжила только одна, о которой пост

· 8 мин. чтения

UPD 2022.06.19

В посте большая часть посвящена SublimeText и его плагинам, но спустя несколько лет его использования я с какой-то десятой попытки все-таки перешел на VSCode и жалею, что не сделал этого раньше.

Рекомендую прочесть статью, но вместо SublimeText устанавливать VSCode, потому что потом из-за привычек будет труднее перейти на него. Все плагины есть на оба редактора

UPD 2023.07.23
  • В посте упомянут плагин SFTP. Я заменил его на VSCode Remote – SSH. По ссылке отдельный пост про этот плагин. Очень крутой плагин.
  • Помимо него, советую замену плагина, который ниже упомянул в разделе "GLua синтаксис" на Lua Language Server. Когда установите, напишите команду в VSCode Lua: Open Addon Manager и установите оттуда поддержку glua (синтаксис, документация функций и т.д.). Так и называется – Garry's Mod

Я занимаюсь Garry's Mod'ом с 2015 года, начиная с администрирования чужого сервера и до создания своего проекта, где большинство разработок были самописны (не куплены), а сервера проекта в свое время были в топ-10 мира по рейтингу GameTracker.

Инструменты, которые я использую позволили мне ускорить разработку в сравнении с банальным редактированием файлов через FTP в десятки раз. То, что написано ниже требует немного времени на изучение, но это время уже за неделю окупится за счет гораздо большего скорости разработки и удобства в целом.

· 2 мин. чтения

Насчет __mode совсем недавно узнал как работает. Штука очень классная и полезная.

По-простому объясняя, нужно понимать, что сборщик мусора считает мусором те данные, на которые больше нигде не осталось ссылок.

Сами ссылки ты устанавливаешь, когда например добавляешь данные в таблицу. Пример:

local arr = {}
QWE[1] = arr

Теперь на таблицу arr установлена одна сильная ссылка. Если сделать QWE[1] = nil, то ссылок больше не останется и сборщик потом удалит эту табличку

__mode позволяет устанавливать таблицам инструкцию, что закрепленные за ней ключи или значения не будут создавать сильные ссылки (они называются слабыми)

Если мы сделаем setmetatable(QWE, {__mode = "v"}) (тем самым сказав, что значения таблицы QWE не считаются сильными ссылками) и повторим наш QWE[1] = arr, то сборщик мусора зачистит наш arr и при print(QWE[1]) после работы сборщика отпринтит nil

Слабыми можно делать и ключи, тогда нужно указать mode "v". Или и ключи и значения: "kv".

Реальное применение

Я узнал об этом совсем недавно, но успел применить так: в новой версии IGS полностью переписан API framework. Репитер упавших запросов сделан отдельным модулем. Так вот тот репитер повторяет запросы, которые по некоторым причинам провалились, но делает это не более 15 раз.

В качестве счетчика используется ключ-значение таблица, где ключом выступает сама функция, а значением число раз, которое я пытался ее выполнить. Напоминаю, что в Lua функции передаются ссылками. Так вот ключи этой таблицы я сделал слабыми ссылками и если функция удаляется сборщиком где-то из вне, то ее счетчик в таблице так же автоматически очищается и мне не приходится следить за этим "вручную".