Презентация для выступления на Владивостокском митапе https://moscowdjango.timepad.ru/event/1884275/
"Основной режим разработки приложений в Тарантуле — это написание скриптов и манипуляции данными на Lua (оставим пока за скобками режим SQL). Часто внедрению Тарантула в некую систему становится блокером использование Lua.
В экосистеме Lua мало тулинга, это касается как встроенного интерпретатора, так и JIT-транслятора LuaJIT.
Давайте оглядимся, как обстоят дела с тестированием, профилированием, статическим анализом и дебагом в Lua. И как это все может быть использовано при разработке сервисов, в архитектуре которых есть Tarantool."
My talk is about DSLs, their kinds and when it’s worth to be using them. I’ll also demonstrate different approaches to developing internal and external DSLs in Python and will try to give the comparative analysis of those.
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)Badoo Development
DevConf 2016
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
Lua — высокоуровневый язык, похожий на Python/JS, но существенно более простой. Он гибкий и при этом очень быстрый.
Возможно, вы слышали про OpenResty. Это решение для разработки Nginx модулей на Lua. Cloudflare, крупнейший CDN/anti-DDOS провайдер, как раз работает на OpenResty.
На скоростях 10/100Gb сетевой стек в ядре Linux становится “узким местом”. Есть ряд технологий для выноса обработки пакетов из ядра в userspace; например Snabb Switch. Последний написан целиком на Lua и справляется с потоком в 200+Gb.
Как на счет менее экзотических применений? На Lua есть свой Node.js (luvit.io). Lua есть в БД Tarantool. У нас была задача валидации данных на соответствие схеме; мы переписали валидацию с Си на Lua и получили ускорение в 4 раза (за счет JIT-компиляции).
Lua набирает популярность и он объективно хорош. Что будет в докладе:
1) Краткое введение в Lua: мы убедимся в том, что язык простой и там есть все необходимое на каждый день.
2) Секция Lua WAT (смешные контр-интуитивные особенности языка, 0 and 1 == 0)
3) Поговорим о том, почему Tarantool использует LuaJIT, а не V8.
4) Разберемся, почему именно Lua такой быстрый, и как работает трассирующий JIT-компилятор.
My talk is about DSLs, their kinds and when it’s worth to be using them. I’ll also demonstrate different approaches to developing internal and external DSLs in Python and will try to give the comparative analysis of those.
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)Badoo Development
DevConf 2016
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
Lua — высокоуровневый язык, похожий на Python/JS, но существенно более простой. Он гибкий и при этом очень быстрый.
Возможно, вы слышали про OpenResty. Это решение для разработки Nginx модулей на Lua. Cloudflare, крупнейший CDN/anti-DDOS провайдер, как раз работает на OpenResty.
На скоростях 10/100Gb сетевой стек в ядре Linux становится “узким местом”. Есть ряд технологий для выноса обработки пакетов из ядра в userspace; например Snabb Switch. Последний написан целиком на Lua и справляется с потоком в 200+Gb.
Как на счет менее экзотических применений? На Lua есть свой Node.js (luvit.io). Lua есть в БД Tarantool. У нас была задача валидации данных на соответствие схеме; мы переписали валидацию с Си на Lua и получили ускорение в 4 раза (за счет JIT-компиляции).
Lua набирает популярность и он объективно хорош. Что будет в докладе:
1) Краткое введение в Lua: мы убедимся в том, что язык простой и там есть все необходимое на каждый день.
2) Секция Lua WAT (смешные контр-интуитивные особенности языка, 0 and 1 == 0)
3) Поговорим о том, почему Tarantool использует LuaJIT, а не V8.
4) Разберемся, почему именно Lua такой быстрый, и как работает трассирующий JIT-компилятор.
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
Let's calculate an average of one column for each key, like the following query: SELECT key, avg(value) FROM table GROUP BY key. What can be more simple? But the question is: what is the most efficient way to do it? How to write code to achieve maximum performance on a variety of hardware?
В рамках данного выступления вас ждут:
* рассказ о полезных и интересных вещах из Boost
* новости с передовиц разработки Boost и о новинках ожидаемых в следующих версиях
* что из Boost готовится к переезду в новый стандарт С++
* как экспериментировать с Boost, имея под рукой только браузер
* что людям не нравится в Boost и как с этими людьми бороться (-:
«Парсим CSS», Роман Дворнов (Avito)
В ходе работы над CSSO мне пришлось погрузиться в процесс парсинга CSS. В результате парсер (тот, что в CSSO) был не раз переписан. Пришло время сделать его отдельным инструментом. Новый быстрый детальный парсер CSS, его AST, области применения и кое-что ещё.
Из презентации вы узнаете:
— как работает database/sql;
— интерфейс и реализации database/sql/driver;
— обзор популярных ORM и что с ними не так;
— как мы делали свой лучший ORM;
— и почему столько раз его переделывали.
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Михаил Рахманов рассказывает о паттерне Promise и его использовании в iOS разработке.
Краткие тезисы:
- Что такое promises?
- Использование promises в iOS разработке (существующие библиотеки и подходы)
- Реализация promises библиотекой PromiseKit (основные методы, цепочки promises, обработка ошибок)
- Какие задачи можно решить с помощью promises, а какие - нельзя
- Использование promises на примере приложения: драм-машины с возможностью сохранять аудио-дорожки
- Подведение итогов: преимущества и недостатки.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
Многие современные высоконагруженные системы построены с использованием очередей. Не является исключением и внутренний сервис обработки OAuth токенов, который создала наша команда. Исключением является то, что и в качестве основного хранилища, и в качестве всех очередей используется один и тот же продукт - Tarantool. Более того, мы поставили себе амбициозную цель по отказоустойчивости - полную доступность сервиса, когда уходят любые два из трёх датацентров, и успешно её достигли.
При решении мы столкнулись с массой интересных инженерных задач и в нашем докладе мы расскажем вам о том, какие технологии и подходы использовались. В частности, рассмотрим более детально такие вещи, как:
- создание deadline очереди и проблемы, с ней связанные;
- создание кольцевой очереди;
- интеграция между собой шардинга, Raft и очередей;
- как мы победили split brain ;)
Доклад рассматривает тонкости nodejs, а так же преимущества Evented I/O для серверных приложений. Будет предоставлен ряд рекоммендаций по правильному построению архитектуры, модульности, масштабированию, дизайну кода. Краткое введение в технологию программирования "волокнами" (fibers) и ряд других эффективных практик.
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
Let's calculate an average of one column for each key, like the following query: SELECT key, avg(value) FROM table GROUP BY key. What can be more simple? But the question is: what is the most efficient way to do it? How to write code to achieve maximum performance on a variety of hardware?
В рамках данного выступления вас ждут:
* рассказ о полезных и интересных вещах из Boost
* новости с передовиц разработки Boost и о новинках ожидаемых в следующих версиях
* что из Boost готовится к переезду в новый стандарт С++
* как экспериментировать с Boost, имея под рукой только браузер
* что людям не нравится в Boost и как с этими людьми бороться (-:
«Парсим CSS», Роман Дворнов (Avito)
В ходе работы над CSSO мне пришлось погрузиться в процесс парсинга CSS. В результате парсер (тот, что в CSSO) был не раз переписан. Пришло время сделать его отдельным инструментом. Новый быстрый детальный парсер CSS, его AST, области применения и кое-что ещё.
Из презентации вы узнаете:
— как работает database/sql;
— интерфейс и реализации database/sql/driver;
— обзор популярных ORM и что с ними не так;
— как мы делали свой лучший ORM;
— и почему столько раз его переделывали.
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
В своем докладе Олег расскажет о замене стандартных функций на более быстрые и об ускорении работы python. Также продемонстрирует несколько примеров быстрых конструкций python.
Михаил Рахманов рассказывает о паттерне Promise и его использовании в iOS разработке.
Краткие тезисы:
- Что такое promises?
- Использование promises в iOS разработке (существующие библиотеки и подходы)
- Реализация promises библиотекой PromiseKit (основные методы, цепочки promises, обработка ошибок)
- Какие задачи можно решить с помощью promises, а какие - нельзя
- Использование promises на примере приложения: драм-машины с возможностью сохранять аудио-дорожки
- Подведение итогов: преимущества и недостатки.
RDSDataSource - внутренние пятничные митапы iOS-команды RAMBLER&Co.
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
Многие современные высоконагруженные системы построены с использованием очередей. Не является исключением и внутренний сервис обработки OAuth токенов, который создала наша команда. Исключением является то, что и в качестве основного хранилища, и в качестве всех очередей используется один и тот же продукт - Tarantool. Более того, мы поставили себе амбициозную цель по отказоустойчивости - полную доступность сервиса, когда уходят любые два из трёх датацентров, и успешно её достигли.
При решении мы столкнулись с массой интересных инженерных задач и в нашем докладе мы расскажем вам о том, какие технологии и подходы использовались. В частности, рассмотрим более детально такие вещи, как:
- создание deadline очереди и проблемы, с ней связанные;
- создание кольцевой очереди;
- интеграция между собой шардинга, Raft и очередей;
- как мы победили split brain ;)
Доклад рассматривает тонкости nodejs, а так же преимущества Evented I/O для серверных приложений. Будет предоставлен ряд рекоммендаций по правильному построению архитектуры, модульности, масштабированию, дизайну кода. Краткое введение в технологию программирования "волокнами" (fibers) и ряд других эффективных практик.
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Ontico
Tarantool - отечественная Opensource NoSQL база данных.
В докладе мы обсудим:
- Какое место занимают NoSQL базы данных в highload проектах?
Почему и для чего вам стоит NoSQL решения?
Какие NoSQL решения вы можете использовать?
- Рассмотрим, что из себя представляет Tarantool 1.6 - база данных и сервер приложений в одном лице.
Какие основные особенности Tarantool как NoSQL базы данных?
Lua как встроенный язык сервера приложений.
- Посмотрим, как можно начать использовать Tarantool в своих проектах, и сделаем первые шаги.
Как установить Tarantool.
Первый запуск и основы конфигурирования.
Модель данных.
Как создавать и работать с хранилищем данных.
Как использовать пакеты tarantool.
- Узнаем об интересных модулях и фичах Tarantool
Чем полезен application server
Tarantool http
Tarantool queue
- Познакомимся с сообществом Tarantool opensource
Почему сообщество - это важно?
Чем полезны opensource проекты начинающему разработчику?
Практика совместного использования Lua и C в opensource спам-фильтре Rspamd /...Ontico
В данном докладе я расскажу о том, как Lua помогает расширять функционал Rspamd, позволяя людям без особых знаний С писать эффективные правила фильтрации спама. Также будут рассмотрены особенности внедрения Lua в C код и основные приемы, применяемые при написании API для Lua приложений. Отдельное внимание будет уделено документации к Lua API, которая является одним из необходимых компонентов для opensource приложения.
Кроме этого, отдельная часть доклада посвящена анализу производительности Lua: использованию LuaJIT, сравнению вызовов C функций через FFI с традиционным вызовом, оптимизации строковых операций и таблиц в Lua.
В заключение будут рассмотрены некоторые открытые вопросы: будущее языка, наличие нескольких диалектов, статический анализ Lua стека, а также вопросы безопасности при JIT компиляции.
В своей работе мы постоянно используем инструменты, призванные облегчить нам жизнь. Но как хорошо мы ими на самом деле владеем? И почему мы пренебрегаем их суперсилами? Например, Chrome DevTools — это не только отладчик и инспектор HTML. Но когда у нас в руках молоток, кругом мерещатся гвозди. Десятки мегабайт и процентов загрузки процессора на вкладку браузера — верный признак того, что пора учиться пользоваться микроскопом.
Роман предложит освоить что-то посложнее молотка и расскажет о том, какую реальную пользу можно получить от профилирования, как найти в огромном отчёте проблему с кодом и что лучше — написать в коде десяток console.log или async debug.
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
2 июля 2011, Я.Субботник в Екатеринбурге
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
О докладе:
Про Python и Django: зачем нужна красота и простота перфекционистам с дедлайнами, на примере Яндекс.Погоды.
Когда число сервисов, которые делаются в Яндексе, стало возрастать, дедлайны — поджимать, а от процесса разработки требовалось стать более гибким, возникла потребность в свежих решениях. В докладе на примере Яндекс.Погоды рассказывается, как в Яндексе делают сервисы с помощью языка Python и веб-фреймворка Django.
This document compares and contrasts various features of C++ and Go, including:
- Error handling approaches like exceptions in C++ vs explicit error checking in Go.
- Class/struct definitions and how they compare between the languages.
- Common data structures like vectors, maps, and how they are implemented in each language.
- Benchmark results that show Go outperforming C++ in some cases but C++ performing better in others, depending on optimizations and data structure choices.
- Interfacing Go with C via Cgo and the performance overhead of marshalling between the languages.
- Concurrency primitives available in each language like mutexes, channels, atomics.
Новый InterSystems: open-source, митапы, хакатоныTimur Safin
Presentation for the 1st InterSystems Meetup in the Minsk:
- New and better InterSystems changes their practice.
- open-source repositories, meetups, and hackathon;
- CPM (package manager) as a good example of open-source project
Implementation of community package managerTimur Safin
The document discusses plans and progress made in implementing a Community Package Manager (CPM) for InterSystems products. It covers decisions made around package formats (settling on ZIP and JSON initially), metadata (using package.json), dependencies, publishing packages to a CouchDB repository using npm, and example packages. Key points covered include:
- Packages will use the ZIP format and include a package.json metadata file initially
- Dependency information and other metadata will be stored in package.json
- npm will be used to publish packages to a CouchDB repository
- Example packages discussed as suitable for the initial release include iKnowSocial and WebTerminal
The document discusses the importance of package managers for programming languages and proposes creating a package manager called CPM for the Caché ObjectScript language. It outlines some key considerations for CPM such as using ZIP or XML containers, metadata formats like JSON or TOML, handling dependencies, cross-platform binary modules, unit testing, command line access, and mirroring/CDN strategies. The document invites contributors to help build out CPM on GitHub to create an ecosystem for easily installing and distributing Caché components and extensions.
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
1.
2.
3.
4. Мало и для
vanilla Lua
и для LuaJIT
Хорошо в
игростроении
Отсутствие
тулинга >
ограничивает
доступную
экспертизу
Мало тулинга в
экосистеме Луа
5. • Поддержка синтаксиса, навигации и рефакторинг в редакторе;
• Пакетный менеджер и живое сообщество вокруг него;
• Отладчик, желательно в интегрированной среде;
• Инструменты для анализа производительности, желательно -
доступные из редактора;
• Тестирование, желательно из редактора;
• Статический анализатор;
• Фаззинг.
8. • Очень быстрая NoSQL СУБД с сервером приложений
• Открытый код ядра, есть компоненты closed source (в
коммерческой версии)
• Способность обрабатывать огромное кол-во одновременных
подключений
• Соответствие ACID
• Отказоустойчивость и масштабируемость (репликация,
шардинг)
• Кооперативная многозадачность, неблокирующие операции
IO (включая работу с внешними сервисами и файловой
системой)
9.
10. Файбер (fiber) – он как сопрограмма
(coroutine) только файбер
• Файбер (fiber)
• Легковесная нить исполнения, реализующая
кооперативную многозадачность
• Кооперативная многозадачность
• Следующая задача выполняется после того, как
текущая объявит о передаче управления
25. describe('Busted unit testing framework', function()
describe('should be awesome', function()
it('should be easy to use', function()
assert.truthy('Yup.')
end)
it('should have lots of features', function()
-- deep check comparisons!
assert.same({ table = 'great'}, { table = 'great' })
-- or check by reference!
assert.is_not.equals({ table = 'great'}, { table = 'great'})
assert.falsy(nil)
assert.error(function() error('Wat') end)
end)
it('should provide some shortcuts to common functions', function()
assert.unique({{ thing = 1 }, { thing = 2 }, { thing = 3 }})
end)
it('should have mocks and spies for functional tests', function()
local thing = require('thing_module')
spy.spy_on(thing, 'greet')
thing.greet('Hi!')
http://olivinelabs.com/busted/
26. #!/usr/bin/tarantool
local tap = require('tap')
test = tap.test("my test name")
test:plan(2)
test:ok(2 * 2 == 4, "2 * 2 is 4")
test:test("some subtests for test2", function(test)
test:plan(2)
test:is(2 + 2, 4, "2 + 2 is 4")
test:isnt(2 + 3, 4, "2 + 3 is not 4")
end)
test:check()
Tarantool
https://www.tarantool.io/ru/d
oc/latest/reference/reference
_lua/tap/
27. -- test/feature_test.lua
local t = require('luatest')
local g = t.group('feature')
-- Tests. All properties with name staring with `test` are treated as
test cases.
g.test_example_1 = function() ... end
g.test_example_n = function() ... End
-- Define parametrized groups
local pg = t.group('pgroup', {{engine = 'memtx'}, {engine = 'vinyl'}})
pg.test_example_3 = function(cg)
-- Use cg.params here
box.schema.space.create('test', {
engine = cg.params.engine,
})
end
-- Hooks can be specified for one parameter
pg.before_all({engine = 'memtx'}, function() ... end)
pg.before_each({engine = 'memtx'}, function() ... end)
Tarantool
https://github.com/tarantool/l
uatest/
28.
29.
30. local function sum_up_to(n)
local sum = 0
for i = 1, n do
sum = sum + i
end
return sum
end
property 'sum of numbers is equal to (n + 1) * n / 2' {
generators = { int(100) },
check = function(n)
return sum_up_to(n) == (n + 1) * n / 2
end
}
https://github.com/luc-tielen/lua-quickcheck
31.
32. Lua ---@alias hookmask string
---|+'"c"' # Calls hook when Lua calls a function.
---|+'"r"' # Calls hook when Lua returns from a function.
---|+'"l"' # Calls hook when Lua enters a new line of
code.
---
---Sets the given function as a hook.
---
---[View documents](command:extension.lua.doc?["en-
us/51/manual.html/pdf-debug.sethook"])
---
---@overload fun(hook: function, mask: hookmask, count?:
integer)
---@param thread thread
---@param hook async fun()
---@param mask hookmask
---@param count? Integer
function debug.sethook(thread, hook, mask, count) end
33. Lua ---@param co? thread
---@return function hook
---@return string mask
---@return integer count
---@nodiscard
function debug.gethook(co) end
---@alias infowhat string
---|+'"n"' # `name` and `namewhat`
---|+'"S"' # `source`, `short_src`, `linedefined`,
`lastlinedefined`, and `what`
---|+'"l"' # `currentline`
---|+'"t"' # `istailcall`
---|+'"u"' # `nups`, `nparams`, and `isvararg`
---|+'"f"' # `func`
---|+'"L"' # `activelines`
34. Lua ---
---Returns a table with information about a function.
---
---[View documents](command:extension.lua.doc?["en-
us/51/manual.html/pdf-debug.getinfo"])
---
---@overload fun(f: integer|function, what?:
infowhat):debuginfo
---@param thread thread
---@param f integer|async fun()
---@param what? infowhat
---@return debuginfo
---@nodiscard
function debug.getinfo(thread, f, what) end
35. Lua ---
---Assigns the `value` to the local variable with index
`local` of the function at `level` of the stack.
---
---[View documents](command:extension.lua.doc?["en-
us/51/manual.html/pdf-debug.setlocal"])
---
---@overload fun(level: integer, index: integer, value:
any):string
---@param thread thread
---@param level integer
---@param index integer
---@param value any
---@return string name
function debug.setlocal(thread, level, index, value) end
36. Lua ---
---Returns the name and the value of the local variable
with index `local` of the function at level `f` of the
stack.
---
---[View documents](command:extension.lua.doc?["en-
us/51/manual.html/pdf-debug.getlocal"])
---
---@overload fun(f: integer|async fun(), index:
integer):string, any
---@param thread thread
---@param f integer|async fun()
---@param index integer
---@return string name
---@return any value
---@nodiscard
function debug.getlocal(thread, f, index) end
37. Lua
---
---Returns the name and the value of the upvalue with
index `up` of the function.
---
---[View documents](command:extension.lua.doc?["en-
us/51/manual.html/pdf-debug.getupvalue"])
---
---@param f async fun()
---@param up integer
---@return string name
---@return any value
---@nodiscard
function debug.getupvalue(f, up) end
38. Lua ---
---Returns a string with a traceback of the call stack.
The optional message string is appended at the beginning
of the traceback.
---
---[View documents](command:extension.lua.doc?["en-
us/51/manual.html/pdf-debug.traceback"])
---
---@overload fun(message?: any, level?: integer): string
---@param thread thread
---@param message? any
---@param level? integer
---@return string message
---@nodiscard
function debug.traceback(thread, message, level) end
39. Debug API:
local loadFunct = assert( loadfile(fileToExec) )
debug.sethook(covHandler, "l" )
-- Workaround: coroutines require us to sethook again.
local oldCreate = coroutine.create
coroutine.create = function( coFunct )
return oldCreate( function(...)
debug.sethook(covHandler, "l" )
return coFunct(unpack(arg))
end)
end
loadFunct() -- run the main program
M.stop()
function M.stop()
debug.sethook()
…
end
end
40. Debug API: function traceback ()
local level = 1
while true do
local info = debug.getinfo(level, "Sl")
if not info then break end
if info.what == "C" then -- is a C function?
print(level, "C function")
else -- a Lua function
print(string.format("[%s]:%d",
info.short_src,
info.currentline))
end
level = level + 1
end
end
`n´ selects fields name and namewhat
`f´ selects field func
`S´ selects fields source, short_src,
what, and linedefined
`l´ selects field currentline
`u´ selects field nup
41.
42. • gperftools, callgrind покажут граф
вызовов на уровне Си
• jit.p позволит собрать граф вызовов
в LuaJIT
• Но никто не соберёт всё вместе
43. • Строчный хук позволяет собрать профиль исполнения
• Тайминги будут неверные…
• … но счетчикам строк верить можно
• Luacov - https://github.com/keplerproject/luacov
45. • Luatrace - https://github.com/geoffleyland/luatrace
“luatrace is a Lua module that collects information about
what your code is doing and how long it takes, and can
analyse that information to generate profile and coverage
reports.
luatrace adds a layer on top of Lua's debug hooks to make
it easier to collect information for profiling and coverage
analysis. luatrace traces of every line executed, not just
calls.
luatrace can trace through coroutine resumes and yields,
and through xpcalls, pcalls and errors. On some platforms it
uses high resolution timers to collect times of the order of
nanoseconds.”
49. Lua – язык, с динамической типизацией
Нет проверок времени компиляции
Но можно использовать внешний линтер
для статического анализа кода
50. std = "luajit"
globals = {"box", "_TARANTOOL", "tonumber64"}
ignore = {
-- Accessing an undefined field of a global variable
<debug>.
"143/debug",
-- Accessing an undefined field of a global variable
<string>.
"143/string",
-- Accessing an undefined field of a global variable
<table>.
"143/table",
-- Unused argument <self>.
"212/self",
-- Redefining a local variable.
"411",
-- Redefining an argument.
"412",
-- line contains only whitespace
"611",
}
include_files = {
"**/*.lua",
}
exclude_files = {
"build*/**/*.lua",
-- Third-party source code.
"test-run/**/*.lua",
".rocks/**/*.lua",
".git/**/*.lua",
}
55. require('checks')
local function get_stat(uri, opts)
checks('string', {timeout =
'?number'})
end
get_stat()
-- error: bad argument #1 to get_stat
(string expected, got nil)
get_stat('localhost', {timeuot = 1})
-- error: unexpected argument opts.timeuot
to get_stat
13
get_stat('localhost', {timeuot = 1})
-- ^^ typo
-- No error, but does not work as expected
-- Still bad
https://github.com/tarantool/checks
57. Teal –
local ltn12 = require("ltn12")
local Sink = ltn12.Sink
local Source = ltn12.Source
local record socket
record TCP
-- master methods
bind: function(TCP, string, integer)
connect: function(TCP, string, integer): integer, string
listen: function(TCP, integer): integer, string
-- client methods
getpeername: function(TCP): string, integer
enum TCPReceivePattern
"*l"
"*a"
end
enum TCPReceiveError
"closed"
"timeout"
end
receive: function(TCP, TCPReceivePattern|integer, string):
string, TCPReceiveError
https://github.com/teal-language/teal-
types/blob/master/types/luasocket/socket.d.tl
58.
59. • Нет готового решения с удобным отладчиком
• Есть отладчик в Redis как артефакт поддержки в
ZeroBrane Studio Павла Ключенко
• Есть популярный модуль Mobdebug того же Павла
Ключенко
• Развитие RemDebug;
• Mobdebug можно поднять почти везде, где есть LuaSocket;
• Есть надежды зайти через VSCode Debug Adapter
API
66. Basically Vscode-debuggee.lua drops the speed of running Lua
programs because it implements the breakpoint mechanism
using debug.sethook.
This performance degradation can be overcome by applying a
simple patch to the Lua VM.
Download:
lua 5.1.5 : Patch, Code
lua 5.3.4 : Patch, Code
https://marketplace.visualstudio.com/items?itemName=devCAT.lua-debug