Snusmumriken
Берешь типичный мейкфайл, копипастишь себе и редактируешь под свои нужды ))
Hauve
Отчасти. В любом случае, настроить проект или создать makefile - вещи всё-таки довольно разные. Быстрее настроить, чем makefile писать
Vim for love
Для Vim нет (полноценного) Magit (не то, что бы он там был сильно нужен, но это очень удобная фишка Emacs), и в нём тормозит подсветка. А так да, лучший редактор.
Snusmumriken
Лады, хех. А я вот у luapower углядел ядро scite, и думаю не сделать ли на луях луёвый редактор с плагинами и прочими причитающимися.
Snusmumriken
На Хабре недавно было нечто познавательное https://m.habr.com/ru/post/474036/
Snusmumriken
Я сам что-то подобное делал, но однострочное, с выделением мышкой на лове2д. Было весело.
Igor
Видел я как-то редактор кода на love2d, когда по официальному форуму бегал. Не сказал бы, что он был сильно удобный.
Igor
Но сам факт существования редактора кода, написанного на lua под love2d забавляет
Leon174
Лады, хех. А я вот у luapower углядел ядро scite, и думаю не сделать ли на луях луёвый редактор с плагинами и прочими причитающимися.
А этот никто не пробовал? Плагины на луа, конфигурится на луа. https://micro-editor.github.io/index.html
Sergey
Сколько уровней наследования ООП у вас обычно бывает в проектах?
Andrey
0
Lämppi
0
Snusmumriken
0-1, от халявного наследования в единичном случае не отказываемся, типа entity (coord props, collision) => enemy, player, bullet, wall, или connection (bind/connect, send, receive, shutdown) => client, server. А больше — уже абстракции могут потечь, особенно если кто-то ещё работает над тем же, плюс искать по десяти файлам вызывающийся кусочек кода не очень приятно.
Snusmumriken
(а ещё есть мемы)
RE
камрады, как в скрипте lua сделать перенос строки в длинной команде os.execute, чтобы на две строчки разместилась она. а то длинная очень)
RE
обычно через слеш как-то делается..
RE
os.execute( "[ ! -f /www/data/"..filename_total_csv.." ] && { head -n 1 /www/data/"..filename_trn_csv.." | sed '1s/^/date:/' > /www/data/"..filename_total_csv.."; }" ) например тут
Anonymous
обратная черта экранирует символ переноса строки
Anonymous
следовательно, чтобы это прописать в луа надо две косых черты: (как бы .мд не зажевал) exec([[bla \\ blue]])
Anonymous
а твоя команда выше будет быстрее исполнена в луа кстати. смысла лезть в шелл нет
Snusmumriken
следовательно, чтобы это прописать в луа надо две косых черты: (как бы .мд не зажевал) exec([[bla \\ blue]])
Не уверен что это сработает. Квадратные скобки таки сохраняют все переносы, от них не избавишься. И в этом прекол квадратных скобок: текст оказывается без единого спецсимвола, всё в точности передано как в скобках указано.
Snusmumriken
os.execute( "[ ! -f /www/data/"..filename_total_csv.." ] && { head -n 1 /www/data/"..filename_trn_csv.." | sed '1s/^/date:/' > /www/data/"..filename_total_csv.."; }" ) например тут
Я такое обычно проделываю через: local command = { "[ ! -f /www/data/", filename_total_csv, " ] ", "&& { head -n 1 /www/data/", filename_trn_csv, " | sed '1s/^/date:/' > /www/data/", filename_total_csv, "; }" } -- объединяем всё в строку command = table.concat(command) print('Execute: ', command) os.execute(command) В чём прекол: ты можешь легко составлять команду как конструктор, вставляя в нужные позиции всякие флаги и аргументы, а потом объединяя в одну длинную фигню.
RE
о это норм ага спасибо!
RE
а еще вопрос - как сделать проверку на выполнение скрипта? чтобы при запуске проверялось - не запущен ли он УЖЕ и если уже ктото запустил его - то чтобы скрипт выходил и не мешал первому инстансу
Snusmumriken
Обращение к таск-манагеру. Ты под вендой али под линексами?
RE
openwrt
RE
линукс
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
how to enter lua command code in the apk
Snusmumriken
Линексы.
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
please help
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
No way
Why ?
Snusmumriken
Because the APK needs an lua interpreter and execution point to lua code.
RE
типа ps | grep script_name и далее от ситуации.. я думал можно как-то директивами самого луа, если это обычная задача и многие ее решали уже
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
Snusmumriken
линукс
https://ru.wikipedia.org/wiki/Ps Смотришь список запущенных процессов, в раздел с CMD: там то, как оно запускалось. Если это луёвый скрипт в интерпретаторе — проверяешь, не запускалась ли таска луа на текущий файл.
Snusmumriken
can lua be combined in c ++
Lua can't "inject itself" into java app.
RE
я думал сам луа умеет такое делать
Snusmumriken
я думал сам луа умеет такое делать
Дык просто local result = os.execute(...) и простенький парсинг того что на выходе. Нет, луа не умеет в операции с ОС кроме: 1. Создания/чтения/удаления файлов; 2. Удаления папок; 3. Получения времени; 4. Выполнения shell-команды. 5. Ещё парочки по мелочи.
Snusmumriken
Луа вообще почти ничего не умеет, и это основная фишка языка.
RE
ок понял а как тогда ВЫЙТИ из программы - сгенерить exit code 0 или как там это правильно
Snusmumriken
return 0
RE
о как) прям с++ проверю спасибо!
ᴠɪᴋᴀʀɪ ʜᴏɴᴇsᴛ
whether txt code can be entered into the apk
Snusmumriken
Как в С. Кароч, в конце скрипта в том или ином виде должен быть ретурн для "сигнала завершения". Если его не указать, то по умолчанию там сигнал типа "всё ок и успешно завершилось". Допустим, ты организовал функцию main: *script.lua* -- точка входа и главная функция - это весь скрипт, -- но мы организуем свою Главную Функцию local function main() bla-bla return 0 end -- точка выхода - в конце, -- поэтому мы вызываем функцию нашей точки входа -- и возвращаем то что она вернула return main() Сам скрипт это и есть аналог main-функции в С-подобных языках, поэтому ретурн в конце скрипта. Внутри самого скрипта на нулевом уровне вложенности можно тоже сделать ретурн, типа: if not something then return 1 end
RE
Как в С. Кароч, в конце скрипта в том или ином виде должен быть ретурн для "сигнала завершения". Если его не указать, то по умолчанию там сигнал типа "всё ок и успешно завершилось". Допустим, ты организовал функцию main: *script.lua* -- точка входа и главная функция - это весь скрипт, -- но мы организуем свою Главную Функцию local function main() bla-bla return 0 end -- точка выхода - в конце, -- поэтому мы вызываем функцию нашей точки входа -- и возвращаем то что она вернула return main() Сам скрипт это и есть аналог main-функции в С-подобных языках, поэтому ретурн в конце скрипта. Внутри самого скрипта на нулевом уровне вложенности можно тоже сделать ретурн, типа: if not something then return 1 end
да у меня нет функций. просто набор инструкций. значит я просто в начале делаю проверку на другой PID этого скрипта (!= моему ) или даже просто считаю кол-во скриптов в PS и если их 2 - то просто return 0 и все - оно ж по идее дальнейшие инструкции не будет выполнять
Snusmumriken
А, если хочешь просто прервать скрипт и сразу выйти — всегда есть os.exit(), его можно вызывать где угодно. Оно, правда, ещё и завершает родительское приложение, если есть. Не советую вызывать это в redis или аналогах, крашнешь )) (хотя там, помнится, это вообще запрещённая функция и её не вызовешь, надо проверить)
RE
а то у меня скрипт этот из web дергается - а на страничке не видно - может ктто уже запустил его
Snusmumriken
Фактически, тупой вызов io.popen (это почти то же что os.execute, только чуть сложнее) с командой, и чтение того что оно выдаёт в stdout. Без табличного конструктора, ибо упор на скорость (вызов миллиарда команд в секунду), так что M.command работает просто со множественными аргументами а не с таблицей.
Snusmumriken
То есть, в случае list'а — парсинг вот этого.
Snusmumriken
да у меня нет функций. просто набор инструкций. значит я просто в начале делаю проверку на другой PID этого скрипта (!= моему ) или даже просто считаю кол-во скриптов в PS и если их 2 - то просто return 0 и все - оно ж по идее дальнейшие инструкции не будет выполнять
Дык смотри, тебе ps возвращает список процессов, и, что самое важное — список команд, которыми эти процессы были запущены. Если там скрипт в интерпретаторе — его команда выглядит примерно как lua /path/to/script.lua Проверяешь процессы на подобный путь, или на имя скрипта в конце команды его запуска.
RE
>Проверяешь процессы на подобный путь, или на имя скрипта в конце команды его запуска при запуске моего скрипта с такой вот проверкой внутри - он должен найти как минимум один такой путь в списке процессов - собственный)
Snusmumriken
Во, даже под вендой такое есть. Я, правда, написал скрипт-запускатель скриптов (он там окружение разворачивает вокруг запускаемого, xpcall'ит запускаемое и ставит debug.debug, чтобы консоль не закрывалась сразу по исполнению скрипта), поэтому путь чуть длиннее. Но да, если в списке процессов найдено более одного процесса с именем текущего скрипта в команде запуска — срочно прерываем всё и заканчиваем существовать.
RE
вот. значит я правильно рассуждаю. спасибо)
Snusmumriken
Имя/путь текущего скрипта можно получить через arg
Snusmumriken
Это стандартная табличка, и там нулевым элементом обычно расположен путь до текущего скрипта. Минус первым — путь до интерпретатора. Некоторые умники в минус второй запихивают всякую дичь, связанную с родительским приложением (которое стартует луа-скрипт), например версию сборки. Фактически, это argv из сишки. С первого по последующие — пользовательские аргументы запуска.
Snusmumriken
То есть, по грубым прикидкам, самое короткое решение примерно следующее: function checkInstanceCount() -- gsub возвращает кол-во замен -- вторым аргументом local s, n = os.execute("ps all"):gsub(arg[0], '') return n end if checkInstanceCount() > 1 then os.exit() end
Snusmumriken
RE
а зачем local s?
Snusmumriken
Потому что тут новая строка, возвращённая gsub'ом, она не нужна, нам нужно только количество замен, то есть сколько инстансов найдено.
Snusmumriken
Это не самое оптимальное, но короткое решение.
Snusmumriken
local a, b = ("banana"):gsub("a", "n") print(a) --> bnnnnn print(b) --> 3
Snusmumriken
Можно, но лишние сложности с пониманием селекта, Злокоту пока рано.
RE
!/usr/bin/lua local s, n = os.execute("ps"):gsub(arg[0], '') print(s) print(n) /usr/bin/lua: ./test:3: attempt to index a number value stack traceback: ./test:3: in main chunk [C]: ?
RE
выводит полный списко процессов, среди которых есть и мой, текущий: 17465 root 1116 S {test} /usr/bin/lua ./test но в итоге, под списком этим пишет ошибку
Snusmumriken
Таки нужен io.popen function checkInstanceCount() local s, n = io.popen("ps all") s = s:read('*all'), s:close() local path = arg[0]:gsub("[-.%%]", "%%%1") s, n = s:gsub(path, '') return n end Ещё влепил экранирование, на случай эксцессов (дефисы и точки в пути — это спецсимволы в регулярках)
RE
root@gate1:~# ./test table: 0x855c50 1
RE
пашид
Snusmumriken
Хорошо что у меня линекс под боком. Под вендой, помнится, os.execute таки возвращает то что вывели в stdout, и popen не нужен.
Snusmumriken
А я такой осваиваю stateless-итераторы. Они странные но ничо так, и не плодят лишних функций. Хотя итераторы которые создают функции гибче: в замыкании можно много чего хранить, например доп-аргументы, на манер string.lines(str, delmitter), в stateless разделитель не запихнёшь.
Igor
Хорошо что у меня линекс под боком. Под вендой, помнится, os.execute таки возвращает то что вывели в stdout, и popen не нужен.
os.execute всегда статус-код возвращала, независимо от оси (ну если только ось поддерживает os.execute, естественно). От неё stdout'a можно добиться только перенаправив вывод в какой-то файл на диске, но это ненужные извращения, проще использовать io.popen
Snusmumriken
Тогда это мой глюк, да.
Snusmumriken
Я прост в 90% случаев дёргаю popen, ибо выгружается неизвестное количество фигни, и может кончится оперативка при чтении полной строки ))