
Snusmumriken
25.05.2017
19:54:54

TheRainwildsKeeper
25.05.2017
20:20:48
https://highlightjs.org
>174 languages
Это вроде там юзается

Google

Чай
26.05.2017
09:23:12
Да, Discord поддерживает Markdown, и можно сделать
```lua
......

The Dude
26.05.2017
12:46:11
https://hh.ru/analytics_source/vacancy/20275482?query=lua&position=1&requestId=1495802688129359105fb8b2e45e191e&totalVacancies=44&source=vacancies

Tverd
26.05.2017
12:54:53
"разработка визуальной web-части проекта: сам сайт, личный кабинет, различные api и т.п." - веб на луа? фронт? )

Snusmumriken
26.05.2017
14:09:54
Хех, они послушали мой совет : )
https://hh.ru/vacancy/20519107?query=lua

Tverd
26.05.2017
19:03:49
какой совет? они и искали человека... ))

Snusmumriken
26.05.2017
20:10:56
В этой группе

Vadim
27.05.2017
04:06:22
у меня, вот, j4f пару проектов на ngx_lua+ngx_postgres

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

Philipp
27.05.2017
19:00:23
Дружи. Вопрос. Как правильно забирать аргументы, передаваемые в скрипт из консоли?
И возможно ли такое?
Ну, типа:
script.lua arg1 30 2000

Google

Snusmumriken
27.05.2017
19:03:57
Ну типа при запуске типа такого:
lua c:/scripts/scr.lua -path "c:/filepath"
Аргументы находятся в таблице arg.
for k, v in pairs(arg) do print(k, v) end
> 0 c:/scripts/scr.lua
> 1 -path
> 2 "c:/filepath"
Оно может слегка отличаться, я не помню точно, нулевой ли аргумент - путь до самого скрипта. Но суть та же.

Philipp
27.05.2017
19:04:59
А, спасибки
Хочу сделать себе генератор атласов текстурных
А интерфейс делать не хочу
А они же обычно квадратные, да?

Snusmumriken
27.05.2017
19:06:57
А, да, легко. Я свой сжиматель файлов тоже с интерфейсом командной строки пилю.
Если будешь выводить результат программы в io.write - то сможешь с линуксом взаимодействовать, как с обычной юникс-тулзой, только запускаемой через lua:
cat lua /home/scr.lua /texture.png > dev/null

Philipp
27.05.2017
19:10:09
Так. Надо бы как-нибудь придумать рисование этого самого атласа без запуска окна лава
Есть какие-нибудь создавалки png'шек с нормальной рисовкой в канвас, но без рендера окна?

Snusmumriken
27.05.2017
19:13:37
Или что-то такое мб поможет: https://github.com/LuaDist/libpng

Philipp
27.05.2017
19:13:44
Ме. Если будет рисоваться окно, то тогда надо делать и интерфейс, и показывать то, что в итоге будет создано
Можно же сделать целую тулзу
С разными функциями
Аля собирание атласа из директории с картинками

Snusmumriken
27.05.2017
19:15:23
И обрезкой мышкой картинки, да.
Можно всё, но это будет долго. Урезай количество фич, оставляй необходимое.

Philipp
27.05.2017
19:15:33
Это ж клевая штука. Собрал нужные текстуры разного размера, запихнул в папку и дал адрес

Snusmumriken
27.05.2017
19:16:55
Тише, ты в общем чате. Не спамь узкоспециализированной фигнёй в тысячи сообщений. Давай или в ЛС переходи, или оформляй длинные законченные посты.

Philipp
27.05.2017
19:17:06
Ой. Прошу прощения
Всем доброй ночки

Рома
28.05.2017
00:18:56
Есть странная проблема: гружу модуль таким ненормальным образом:
f = io.open('path', 'r')
content = f:read('*a')
-- нахожу кое что в content и меняю связанную глобальную вариаблю
fn = loadstring content
и все неплохо, но ошибки, производящиеся этим файлом выглядят непригодно, не указывают на файл.
Что посоветуете?
можно читать файл и потом loadfile, но это значит, что файл 2 раза открывается, не оптимально


Snusmumriken
28.05.2017
02:54:22
Есть странная проблема: гружу модуль таким ненормальным образом:
f = io.open('path', 'r')
content = f:read('*a')
-- нахожу кое что в content и меняю связанную глобальную вариаблю
fn = loadstring content
и все неплохо, но ошибки, производящиеся этим файлом выглядят непригодно, не указывают на файл.
Что посоветуете?
можно читать файл и потом loadfile, но это значит, что файл 2 раза открывается, не оптимально
За счёт того что это loadstring, ошибки не будут указывать на файл. Там в debug.getinfo().source не путь до файла сидит, а сама строка, с которой грузили код. Сам ровно прошлой ночью с этим возился, но тут такое дело.
У тебя есть целых два варианта решения задачи, и оба - суть "сделаем программирование нормальным":
а) вытаскивать новую глобальную переменную из модуля через return var в конце модуля
newglobal = require'module'
б) Использовать минимум глобальных вариаблей. Модуль должен возвращать объект, не создавать и не модифицировать ничего глобального, и сам - реквайрить минимум другой фигни. В идеальных условиях, всё приложение - это всего лишь один глобальный объект, который является менеджером для всех остальных объектов. Ну, это идеальные условия.
В моих игрулях, таким объектом является объект gamestate, который суть конечный автомат с набором состояний: разные менюшки (тоже конечные автоматы, на каждое игровое меню), игровой процесс (который тоже конечный автомат но в квадрате: для "директора" игрового процесса и для всяких пауз/внутриигровых меню) и всякая такая лабуда.
В микросервисах, таким объектом является основной объект, с методами init/update, и общая схема проекта выглядит примерно так:
main_class = Class()
...
-- описываем основной класс
...
while true do
main_class:update()
sleep(n)
end
Ах да, если одна библиотека используется сразу кучей модулей, я обычно передаю её модулям из корневого объекта в процессе инициализации. Ну, чтобы только в одном месте заменять эту библиотеку, в случае чего (изменение либы/путей).

Google

Рома
28.05.2017
04:55:46
Суть в ленивой загрузке, рекурсивно обходятся вложенные папки и файлы по именам становятся глобальными классами, а потом при обращении к __index лениво загружаются. И родительские классы тоже грузятся лениво. И получается вынос мозга. Видимо, тут open и затем loadfile необходимое зло. А вдруг можно самому подписать loadstring'у его файл? Гуглить это бесполезно, вопрошаю гуру!

Snusmumriken
28.05.2017
06:20:44
Ты хочешь ленивости? Зачем тебе? Микрухи что ли, для экономии памяти?
Мб просто загрузчик всей фигни сделаешь?
Не надо извращений. Если у тебя есть батон хлеба и мамины спицы, ты конечно же можешь сделать троллейбус. Но подобные штуки имхо лучше делать по-человечески.
Например, тот же загрузчик, который через lfs получает список файлов/директорий, обходит их, ищет lua-файлы и реквайрит их типа:
require'folder1.folder2.script'
Это относительно человеческий способ.
Полагаю, в глобальной переменной хранится путь "текущей папки"?

Плюшка
28.05.2017
06:21:42
Юникод, сэр

Snusmumriken
28.05.2017
06:27:17
Да, кстати, ребят, хочу поздравить вас всех с одним замечательным событием!
Ровно двадцать три года назад, на свет появился один замечательный человек, которому мы все благодарны за его неоценимую помощь и восхитительные человеческие качества! В телеграме, этот человек известен как @Snusmumriken, прошу любить и жаловать!
Ехехехехе.

Плюшка
28.05.2017
06:27:35
Поздравляю :)

Snusmumriken
28.05.2017
06:27:57
О да, передам ему, будет рад : )

Чай
28.05.2017
06:29:03
И от меня передай себе поздравления.

Snusmumriken
28.05.2017
06:29:14
Письмо напишу, секунду

Рома
28.05.2017
06:29:24
Я тут хотел восхвалить ленивость и поведать о том, сколько у неё преимуществ, ладно, с днем рождения, великих свершений Ж)


Snusmumriken
28.05.2017
06:31:14
Я тут хотел восхвалить ленивость и поведать о том, сколько у неё преимуществ, ладно, с днем рождения, великих свершений Ж)
Ну, сама по себе ленивость - хороша при вычислениях.
x = fast_function() or slow_function() - это гораздо лучше чем
a, b = fast_function(), slow_function()
x = a or b
Но при require, не вижу особого смысла: вызывается один раз. Если что, require кеширует результат, поэтому если в нескольких модулях require'нуть один и тот же модуль, он будет загружен только один раз, а второй - подтянется из кеша. Плюс сложнее отслеживать ошибки: синтаксические оно выведет сразу, по крайней мере. А с loadstring - только когда модуль будет заюзан, то есть, возможно - никогда.
Тут может быть некоторый смысл в том случае, если у тебя очень мало памяти, и весь проект в ней не помещается. Например, если ты пишешь веб-сервер с загрузчиками/шаблонизаторами на ESP (микроконтроллер, довольно сомнительная затея, но некоторым нравится), то да, оказывается эффективнее загружать модули через dofile (ибо не кеширует), и выгружать модули когда те не нужны вот прямщас.
Ну, например, когда я определяю в коллайдере, касаются ли друг друга два объекта сложной формы, я сначала проверяю на AABB (это очень быстро, сравнить четыре точки описывающего прямоугольника объектов), а потом, если AABB прокатил - использую сложные коллизионные функции для уточнения. Это тоже образец оптимизирующей "ленивости".


Рома
28.05.2017
06:51:21
Ладно, восхвалю
речь о openresty, раз уже есть сайтец, приходится держать код в строжайшей крутости
1) Да, ощутимо лучше реагирует, когда за один запрос грузится 1 контроллер и пара моделей, а не все что есть
2) Можно натворить дел, например, с помощью гит конфликтов, когда реквайр будет валиться.
А с ленивой загрузкой исправляй себе по одному и оно будет работать.
3) Ключевое! Когда заведомо не знаешь, какой класс от какого наследуется, require не в том порядке - все, кранты. С ленивой - цепочка распутывается сама по себе
4) Когда при объвлении модели нужно делать запросы. Объявляешь класс User, и он давай у базы данных спрашивать колонки, типы колонок, первичный ключ, я даже до такого дошел, что из базы берутся кастомные ограничения для валидаций, вроде length(login) > 3 и length(password) > 5. Тогда при каждом запросе в базу пойдут несколько запросов на каждый файл, когда оно все сразу не надо.
Для тру модулей require конечно, для MVC'шных вещей - ленивость.
что такое шаблонизатор на ESP? не гуглится


Snusmumriken
28.05.2017
07:05:46
OpenResty кеширует прям байткод всей виртуальной машины на момент первого запуска, и гоняет его раз за разом. Получается сверхбыстро. Правда, всякие math.random перестают работать: застревают на моменте первого запуска, как и os.time(). Не парься с загрузкой, она будет мгновенна когда надо. Разрабатывай без кеширования, на прод выдавай с кешированием.
Когда не знаешь, какой класс от какого наследуется.. Вот это странно.
Модуль любого наследника начинается с require родителя. Не важно в каком порядке вызывать: родитель будет вызван до любого наследования.

Рома
28.05.2017
07:08:23
Разработчика волнует девелопмент, а прод с resty - молниеносен по дефолту
> Модуль любого наследника начинается с require родителя.
мне нравится такое:
class SubController extends ParentController
-- code
и никаких реквайров

Snusmumriken
28.05.2017
07:10:12
На жаве?

Рома
28.05.2017
07:10:17
на мунскрипте

Google

Admin
ERROR: S client not available

Рома
28.05.2017
07:10:37
ну правда долго очень эту одну строчку писать на луа

Snusmumriken
28.05.2017
07:10:49
Стопэ, все классы висят в глобальном пространстве?

Рома
28.05.2017
07:11:04
Ну да, потом откуда захочешь - оттуда и используй
Post\all! допустим будет в куче контроллеров, везде делать require 'models.post' чтоли?

Snusmumriken
28.05.2017
07:12:16
Ой мама. Вот поэтому я и не люблю такое.
Карочи, по-человечески это делается так:
local ParentContoller = require'PController'
local class SubController extends ParentController
... code ...
return SubController

Рома
28.05.2017
07:12:35
возвращается оно автоматом

Snusmumriken
28.05.2017
07:12:37
В мунскрипте можно делать pure-lua-вставки, насколько я знаю.
Но тем не менее, очень советую держать всё содержимое модулей внутри модулей, с одним возвратом содержимого модуля.
Если тебе оно понадобится в нескольких местах - сделаешь лишний require.
Так оказывается гораздо меньше зависимостей, в которых ты запутаешься, как только проект сколько-нибудь разрастётся.

Рома
28.05.2017
07:15:10
как можно путаться, если есть папка controllers и в ней в каждом файле по контроллеру, и models, uploaders и так далее?
это здорово

Snusmumriken
28.05.2017
07:16:05
А потом появится новая папка, и ещё одна, и ещё одна. И ты захочешь отправлять почту, роутить, подцеплять лишние модули и всё такое.
Не работай в глобале, тебе говорят ))
Это всё равно что в сишке перестали бы существовать неймспейсы.

Рома
28.05.2017
07:16:12
они существуют сами по себе и никому не мешают, но иногда наследуются от своих соседей, и тут лези лоад выручает

Snusmumriken
28.05.2017
07:16:40
Поздравляю, ты изобрёл троллейбус из буханки : )
Ну правда.
Глянь более-менее цельный проект с небольшим количеством зависимостей.
https://bitbucket.org/16tomatons/galaxio/src/87b99a8085db?at=develop
Тут сложно, но в модулях разобраться можно.
Наследования, правда, тут нет, но суть наследования -
class foo extends require'bar'
Хех, кстати, хорошо что вспомнил про проект. Надо влепить в сетевую либу свой RUDP-протокол, чтобы пересылать большие объёмы данных по UDP.
Ща будет визуализация работы крутого RUDP-протокола!

Рома
28.05.2017
07:33:34
Тю, я думал будет как аудио визуализируется, такие кружочки расходящиеся, буквы и так много где
сделаешь?

Snusmumriken
28.05.2017
07:36:04
А ещё, эта фигня не мешает обычным UDP-сообщениями приниматься в обход себя: сигнатура в заголовке, довольно точная. Шанс что попадётся что-то такое даже в бинарном файле очень мал.
Ну, все хотят кружочки, расходящиеся буквы и графон. Это проще описывать временной диаграммой.

Vlad
28.05.2017
15:05:37
А ведь UDP не гарантирует порядок

Google

Snusmumriken
28.05.2017
17:09:15
Да не важно. На один-два пакета больше передастся.

Vadim
29.05.2017
05:31:13

Group Butler [beta]
29.05.2017
14:17:24
Добро пожаловать в чат pro.lua, Ihor! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Snusmumriken
30.05.2017
12:30:06
И привет огромное количество фиговых библиотек от сообщества, как у js : )
Сейчас их мало, но зато качество более-менее нормальное.
А мы такие потом: 'Я начал писать на луа до того как это стало мейнстримом' и 'Раньше трава была зеленее'

The Dude
30.05.2017
12:39:14
Нет чтобы порадоваться.