
Group Butler [beta]
05.02.2017
08:56:27
Добро пожаловать в чат pro.lua, Dmitry! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Tverd
05.02.2017
09:07:16

Group Butler [beta]
05.02.2017
10:46:50
Добро пожаловать в чат pro.lua, Denis! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.
Добро пожаловать в чат pro.lua, Alexandr! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Google

Mirocow
05.02.2017
17:38:28
всем привет

yegorf1
05.02.2017
17:38:31
Прив

Mirocow
05.02.2017
17:38:36
а есть такой канал по bash

yegorf1
05.02.2017
17:49:10
БашОргу или Башу?

Alex Фэils?︙
05.02.2017
17:59:45

Mirocow
05.02.2017
18:00:31
спасибо
bash
не bash.org
pro.linux - нет такого

yegorf1
05.02.2017
18:10:06
pro.linux
Операционная система Linux. Взамен старой-доброй группы pro.linux с которой и началась вся серия групп pro.*, т.к. создатель её покинул нас и новые участники не могут добавиться.
https://telegram.me/joinchat/Be4rsT7VI1LxrHaMR3pezQ
#linux #unix #nix #tux #os #arch #fedora #ubuntu #gentoo

Mirocow
05.02.2017
18:20:57
спс
добавил
а где каталоги этих чатов

Google

0x9d8e
05.02.2017
18:29:18
Народ. Я тут третий раз написал один и тот-же код:
for x, row in ipairs(map) do
for y, cell in ipairs(row) do
do_somethyng(x, y, cell)
end
end
И естественно захотел вынести это в хелпер, чтобы юзать так:
h.each2d(map, function(x, y, cell) {
....
})
Но задался вопросом: а каков в луа оверхед на замыкания? Можно ли считать за никакой?

Tverd
05.02.2017
18:39:05
Лично на мой взгляд, можно пренебречь, если цикл большой... Но можно и протестировать
Создание функции конечно занимает время, но мало

Snusmumriken
05.02.2017
18:39:55
На замыкания - оверхед как будто функцию лишнюю объявили и вызвали.

0x9d8e
05.02.2017
18:47:26
Спасибо
В крайнем случае на этапе оптимизации на хардкод заменю

Mirocow
05.02.2017
19:15:18
https://github.com/radiotail/lua_memleak/blob/master/memleak.lua

Group Butler [beta]
06.02.2017
06:21:12
Добро пожаловать в чат pro.lua, Евгений! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Tverd
06.02.2017
06:58:06
https://github.com/tverd/moonclass
это на всякий случай, если кому либо нужно

Snusmumriken
06.02.2017
07:04:57
Хех, штука забавная.
На практике, правда, я всю дорогу использовал две вещи.
1. http://pastebin.com/K1yRyE1T
2.
Class = {}
Class.__index = Class
setmetatable(Class, {
__call = function(self, ...)
local o = {}
o.foo = {...}
return setmetatable(o, {__index = self})
end,
__index = parent_class
})
function Class.bar()
return self.foo
end
obj = Class(x, y, z)
Причём второе - чаще, потому что в модуле чаще всего нужны один-два класса.
Хм. На самом деле, я бы не отказался от препроцессора lua, который добавлял бы, например, стрелочные функции с макросами и прочей мелкой мелочёвкой. Опционально типизированные аргументы функций, например, чтобы ошибки возвращали и принимали целый список возможных типов ибо полиморфизм.

Tverd
06.02.2017
07:08:24
Второе тоже использую часто, если на чистом луа. Нормальный стандартный подход )

Snusmumriken
06.02.2017
07:10:03
Первое - просто моя либа. У меня где-то болтался сокращённый вариант без всяких хаков типа __gc для таблиц в lua5.1, который помещается в функцию из десятка строк. Лень подключать модули для ООП, поэтому в корень проекта просто копируется функция.

Tverd
06.02.2017
07:10:30
Насчет препроцессора тоже сижу думаю, тут либо самому писать, либо заюзать luamacro все таки. Второй путь проще, но не все можно сделать.

Snusmumriken
06.02.2017
07:10:47
Metalua - можно почти всё сделать.

Tverd
06.02.2017
07:11:51
Да, согласен. Ты использовал его для какого-нить проекта?

Snusmumriken
06.02.2017
07:12:48
Не а :)
Не нужно. У меня задачи простые, расширять семантику особо не требуется.
Примеры типичных моих задач - на том же пастбине, у того же пользователя. Там есть очень-очень хитрые хаки, но всё таки расширение семантики лишнее.

Tverd
06.02.2017
07:13:48
Окай, глянем. Кстати знаешь хак для gc в 5.1 луа?
А то я смотрю в объекте его нет
А нет, сорь ))) есть

Snusmumriken
06.02.2017
07:14:37

Google

Tverd
06.02.2017
07:15:09
Уже увидел, гуд

Snusmumriken
06.02.2017
07:16:36
Читы, читы. Ещё был вариант с множественным наследованием, перебиравшим ключи родителей, но мне стало страшно от скорости работы и чудовищности самой концепции. Плюс многие классы требуют вызова собственной инициализации, и одними методами тут не расширишь. И метаметоды не подцепишь.

Tverd
06.02.2017
07:18:02
Делал то же самое но для магических методов. А так обычные методы спокойно наследуются.
Но конечно только для одного
Тут наверно проще делать через mixin

Snusmumriken
06.02.2017
07:18:40
Где в lua есть mixin?
Или ты про отдельную реализацию?

Tverd
06.02.2017
07:19:02
Отдельную, к сожалению этого нет в чистом луа

Snusmumriken
06.02.2017
07:19:49
Хех, кстати забавно то, что миксины, технически, делаются просто присваиванием одному классу методов другого. Это симпатишно, но отладка превращается во что-то страшное.
На моей практике, быстрая отладка оказывается доминирующим фактором против множественного наследования и подобных расширений.
Лучше уж наследоваться один раз.

Tverd
06.02.2017
07:21:28
Пока сильно не отлаживал ) а миксины делал максимум по 3 фукции в одной таблице, даже без инициализации пока, думаю что поэтоваться придется.

Snusmumriken
06.02.2017
07:22:49
Хм. Кстати, без наследования, миксины делаются экстремально просто.
В моём "втором" варианте - вместо __index-ссылки на parent - ссылка на миксин как сет функций/констант, использующихся в разных классах. Ох уж эти __index'ы.

Tverd
06.02.2017
07:23:36
А есть поподробнее глянуть, на слух не пойму...
Кстати вот для этого миксины делал

Tverd
06.02.2017
07:23:59
http://www.codingcookies.com/2013/04/01/building-a-roguelike-in-javascript-part-1/

Плюшка
06.02.2017
07:27:24
Хех, штука забавная.
На практике, правда, я всю дорогу использовал две вещи.
1. http://pastebin.com/K1yRyE1T
2.
Class = {}
Class.__index = Class
setmetatable(Class, {
__call = function(self, ...)
local o = {}
o.foo = {...}
return setmetatable(o, {__index = self})
end,
__index = parent_class
})
function Class.bar()
return self.foo
end
obj = Class(x, y, z)
Причём второе - чаще, потому что в модуле чаще всего нужны один-два класса.
Хм. На самом деле, я бы не отказался от препроцессора lua, который добавлял бы, например, стрелочные функции с макросами и прочей мелкой мелочёвкой. Опционально типизированные аргументы функций, например, чтобы ошибки возвращали и принимали целый список возможных типов ибо полиморфизм.
#fav надо бы дома поглядеть


Snusmumriken
06.02.2017
07:29:20
mixin = {}
function mixin:foo() print(self.x, self.y) end
ClassFoo = {}
ClassFoo.__index = Class
setmetatable(Class, {
__call = function(self, x, y) return setmetatable({x = x, y = y}, {__index = self}) end,
__index = mixin
})
function ClassFoo.bar() return self.x - self.y end
ClassBar = {}
ClassBar.__index = Class
setmetatable(Class, {
__call = function(self, x, y, w, h) return setmetatable({x = x, y = y, w = w, h = h}, {__index = self}) end,
__index = mixin
})
function ClassBar.bar() return self.x + self.y + self.w + self.h end
obj1 = ClassFoo(x, y, z)
obj1:bar() --> self.x - self.y -- из класса
obj2 = ClassBar(x, y, z) -- из класса
obj2:bar() --> self.x + self.y + self.w + self.h
obj1:foo() --> print(self.x, self.y) -- из миксина
obj2:foo() --> print(self.x, self.y) -- тоже из миксина
Хм, надо бы скопировать куда, чтобы не было проблем с длиной строк и отображением на телефонах, но лень.


Tverd
06.02.2017
07:32:20
я с компа, уже скопировал. Я так понимаю что один миксин в двух классах. А если несколько миксинов? Или я опять чего-то не доглядел...
Ну думаю что вариант такой, тупо в каждый миксин вставлять индекс на предыдущий, но это надо копировать таблицу что бы не засорять миксин

Snusmumriken
06.02.2017
07:35:42
Несколько миксинов - сложнее.
Или у каждого миксина в __index ссылка на следующий, тогда объект будет наследовать кусок цепочки миксинов.
Ну там,
mixinA -> mixinB -> mixinC.
Класс с mixinA получит и A и B и C,
а класс с mixinB - получит B и C. То есть, тут только цепочка.
Или, как вариант, в __index сидит функция, которая выбирает миксин из списка, если не находит ключа в одном. Как ты понимаешь, порядком обхода функции задаётся приоритеты миксинов, на случай одинаковых ключей. Множественное наследование делается аналогично.
Пример:
__index = function(obj, key)
for i, v in ipairs(self.parents) do
if v[key] then return v[key] end
end
end

Google

Tverd
06.02.2017
07:37:42
Ну да, в общем так и делал... Брал миксин на этапе создания объекта вставлял из него методы и переменные в нужный класс... Твой вариант более медленный, понятно что постоянный прогон при поиске будет не фонтан.

Snusmumriken
06.02.2017
07:38:25
Для объектов с часто вызывающимися методами не приоритетных родителей - не фонтан.

Tverd
06.02.2017
07:38:40
Вот, в фабрике делал проще - на этапе описания объекта уже вставлял миксин )))) это было очень быстро.

Snusmumriken
06.02.2017
07:39:26
Но объекты создаются медленнее. Впрочем, для всяких синглтонов это не так важно.

Tverd
06.02.2017
07:40:01
Ну да, если мы не создаем, не убиваем по 100к объектов в секунду )

Snusmumriken
06.02.2017
07:41:54
В играх, довольно часто создаются и убиваются 100к объектов в секунду :3
Особенно если это пули, и у тебя есть механика синергии эффектов на пулях.
Ну там, подобрал один предмет - пули изменили тип на взрывающиеся ракеты,
подобрал другой - и взрывающиеся ракеты ещё и стали лететь по синусоиде.

Alexander
06.02.2017
07:42:02
В какой-то момент прочёл "токсин"

Snusmumriken
06.02.2017
07:42:26
Да, токсин убивающий возможность сопровождения :3

Admin
ERROR: S client not available

Tverd
06.02.2017
07:42:53

Snusmumriken
06.02.2017
07:43:27
Можно пул. Я вообще избалован FFI а луях, и использую его где ни попадя.
Считай что сишка в луа. Кусок магии с компиляцией C-кода и возможностью цепляния ООП к сишным структурам.

Tverd
06.02.2017
07:44:00
В общем частная фабрика хранит уже готовый класс, с вставленными методами из миксина...
Это да, в короне этого сильно не хватает

Snusmumriken
06.02.2017
07:44:59
Это ещё и даёт +200 к скорости, особенно математики и длинных циклов без сложных ветвлений.
Имхо, лучше таки два раза переписать, но шоб понятно было (+копипастить в любой другой модуль), чем миксины пихать. Стрёмное дело.

Tverd
06.02.2017
07:46:28
Ну стараюсь использовать больше компонентное программирование, чем наследование с 10 родителями. Я-то вспомню что там и как, а если другому человеку давать и править базовые классы, то можно все сломать.
Кстати я так понимаю ты с love2d дружишь. С рекламными сетями там как? Ручками прикручивать?

Snusmumriken
06.02.2017
07:49:46
Угу)))
На андроиде можно извращаться: накатать на сишке либу которая грузит и высвечивает рекламу поверх экрана, с трансляцией в luaState набора методов, или FFI-биндинг стандартных ведро-либ для тех же целей.
Хотя можно и совсем ручками: лишнее игровое состояние "показ рекламы", который грузит вебгетом или чем-то ещё ролик/картинку из сети, конвертит в читаемый для love2d вариант и рисует на экранчике с таймером и кнопкой "закрыть".

Tverd
06.02.2017
07:50:56
Эх... ) Тогда почему не кокос? Или реклама не сильно пока нужна?

Snusmumriken
06.02.2017
07:51:10
Потому что кокос - движок, а love2d - фреймворк.
И есть JIT с огромной кучей плюх. Сахарную луа со скоростью сишки я ни на что не променяю, простите.

Tverd
06.02.2017
07:52:22
Ну тут ты кокос не удивишь джитом. А вот что фреймворк, да... Хотя по мне так кокос тоже не шибко прям движок. До юнити в плане удобства не дотягивает

Google

Tverd
06.02.2017
07:53:23
Даже урхо3д уже с джитом идет
Только корона без оного.

Snusmumriken
06.02.2017
07:54:03
Движок - среда для наполнения контентом. Всякие менеджеры сущностей с анимациями/коллизиями/игровыми состояниями и прочей лабудой. В ловке этого нема, но тут есть полная свободка действий.
Я - тот самый извращенец который делает на ловке микросервисы, тулзы и прочую нагруженную фигню. Далеко не только игры.

Tverd
06.02.2017
07:54:32
Даже так? там графика не обязательна?

Snusmumriken
06.02.2017
07:55:21
Где-то графика не нужна, а где-то требуется.
Ну там, микросервис который не только отвечает на запросы мониторинга, но и рисует графички загруженности. Что-то такое. Звук и физон тут не нужен, конечно.

Tverd
06.02.2017
07:56:09
Ну я имею ввиду, что можно ли юзать love2d в консоли... Если там есть таймеры, сеть и все это можно запустить без графики, то очень прикольно

Snusmumriken
06.02.2017
07:56:46
Конечно можно использовать в консоли. В конфигурационном файле отрубаешь окно и графику, получая чисто консольную ловку. Даже консольный музыкальный проигрыватель можно сделать. И клиент ВК, рисующий фотачки друганов в ASCII и с музычкой )))
Но это для особых мсье.

Tverd
06.02.2017
07:57:05
Заинтриговал )))) Посмотрю внимально на эту штуку.

Snusmumriken
06.02.2017
08:00:25
#conf.lua
function love.conf(t)
t.window = false
t.graphics = false
t.console = true
end
Прекол ещё в том, что ловка работает проигрывателем для кода.
Имея дистр, можно легко и непринуждённо открывать им разные .love-файлы, которые суть zip-архивы с кодом и ресурсами типа картинок.

Tverd
06.02.2017
08:02:05
это да, я видел. Исходники марио ковырял.

Snusmumriken
06.02.2017
08:03:03
Ну, двиглы типа кокоса добавляют слишком много лишнего, жрут дофига места, памяти (в т.ч. оперативной, из-за неотключаемых штук) и ваще не выполняют суть linux-way: одна маленькая программа, которая делает только одну задачу, но делает это очень хорошо.
Ещё веселее: отключаем и окно и консоль. Получаем аналог сервиса, который, правда, виден в диспетчере задач, но это и к лучшему.

Tverd
06.02.2017
08:06:16
Насчет движков тут понятно. Для этого он и движок, что бы все делать )

Snusmumriken
06.02.2017
08:06:41
Слишком вумный для меня. Предпочту работать с либами и иметь полный контроль над происходящим.

Tverd
06.02.2017
08:07:48
Не знаешь как его компилять? cmake . - ругается

Snusmumriken
06.02.2017
08:08:07
Visual studio. Я ещё mingw компилил.

Tverd
06.02.2017
08:08:20
под линух ) точнее под фряху

Snusmumriken
06.02.2017
08:08:38
Смотри чем он ругается :3

Плюшка
06.02.2017
08:08:40
Хочу написать графический движок на crystal, прикрутить ode и интерпретатор lua
Рейт замысел

Snusmumriken
06.02.2017
08:08:56
Для чего? : )