Fingercomp
-
Публикации
1 629 -
Зарегистрирован
-
Посещение
-
Победитель дней
283
Сообщения, опубликованные пользователем Fingercomp
-
-
$ edit /bin/pastebin.lua -
А рычаг чем не угодил?
-
1
-
-
Да дайте Тоторе просто права, чтобы он писать мог, и пусть возрождает группу из могилы.
А раз в неделю пост делать — это сложнее, на самом деле, чем кажется.
-
2
-
-
Можешь скинуть все аддоны?
А то я посмотрел видео про этот мод и там много всего. Правда я не понял где аддон, а где нет.
Очень крутые штуки появились. Например в майне давно не хватало наушников, которые бы кастомно настраивались бы на то, какие звуки слышать и насколько громко. Вот реально мне надоело слушать эти звуки от машин в IC2, а тут такой сюрприз. В добавок они ещё с шапками легко крепятся. Вообще супер важная вещь.
Смотри в сторону Dynamic Surroundings. Там для каждого звука можно в настройках задать громкость или потушить вовсе.
-
Дать бы роботам те же возможности по работе с потоками и периферией, что были у черепашек, тогда можно было бы говорить про устаревание и про ничтожность мода.
А у OC разве нет? Вон, в OpenOS даже уже встроили либу потоков.
Про периферальные возможности вообще непонятно. Хочется так, что в одном блоке максимум один компонент мог быть? Или на две стороны или инструмент (бесконечный), или модем?
-
-
[тут была цитата, но её уже исправили]
Нельзя ли избавиться от двойной скобки, используя vararg?Если функция вызывается с одним аргументом, представленным строковым литералом или табличным, то круглые скобки можно опустить при вызове. Короче:
-- эти строки эквивалентны: func({"test"}) func {"test"} -- и эти: func("test") func "test"В Lua это не нужно.Ничего себе: "не нужно". Очень даже нужно было мне, например.
-
Дааа... Я вот тоже такой фигнёй маялся неделю назад — и вместо того, чтобы завести нормальные классы: с многоуровневым множественным наследованием, красивым синтаксисом, объявлением мета-методов прямо в классе без необходимости плясать с бубном, конструкторами/деструкторами, сеттерами/геттерами, супер-вызовами, геттерами/сеттерами и прочим — у меня классы делались похожим образом: создаватель классов возвращал функцию-конструктор.
И довольно быстро упёрся в разные проблемы с этим: например, я хочу, не создавая инстанс класса, создать кастомный класс, чтобы заменить какую-то константу в исходном классе. Надо унаследоваться и заменить. У меня надо было таскать мета-таблицу, у тебя — прототип. А в той вкусной либе, которую я описывал, достаточно вот такого кода:
local CustomClass = newClass(BaseClass) CustomClass.SOME_CONSTANT = 42
И затем можно юзать кастомный класс с переопределённым атрибутом.
По поводу приватных методов: функцию создавать — это абсолютно лишний оверхэд. Scope в луа создаётся блоком do ... end. Например:
local myObject do local secret = "abc" myObject = Class({ public = "hey" }) endНу и буквы как-то великоваты будут. Вроде не настолько плоховидящие тут люди сидят.
-
Может стоило писать гайд с начала, а не с конца?
Ну там,
моя первая мотыгакак собрать первый компьютер/дрон, что надо добавить, чего не надо. Пример на копателе-колупателе со ссылкой на пастебин? -
То есть? Можешь как для дебила объяснить,а то я не умней этого статуса :\
Да без проблем, я тут для этого и сижу.
computer.pullSignal — это low-level функция, то есть в обычных программах её напрямую нечасто используют (редко когда действительно необходимо). Всё, что она делает — получает события из некоторой копилки событий. Например, 100 раз тыкнул на клавишу — в копилке появилось 100 событий, и этой функцией они могут быть получены в коде.
Но пока напрямую используют немногие, косвенно — вызовом os.sleep и event.pull — почти во всех.
И появляется интересная мысль. Что если заменить функцию computer.pullSignal на свою? Она всё ещё будет делать изначальную работу, но при каждом запросе ивента заодно выполнит какой-то дополнительный код, как, например, отрисовку часиков, как в оригинальном посте.
Первое, что приходит на ум:
function computer.pullSignal(...) print("Hello, world!") return computer.pullSignal(...) endПереопределённая функция наша тогда возьмёт все переданные ей аргументы и скормит их изначальной, попутно написав "Hello, world!" В теории.
На практике получается так, что мы переопределили computer.pullSignal и для самой себя, поэтому потонем в бесконечной рекурсии. Прикольно, но вряд ли нам это нужно. Наверное.
Чтобы такого не было, надо сохранить прежнее значение computer.pullSignal в отдельную переменную и использовать уже её.
-- сохранились local pullSignal = computer.pullSignal function computer.pullSignal(...) print("Hello, world!") return pullSignal(...) endТа-дам: всё работает.
Теперь попробуем отключить переопределённую функцию. Тут всё очень просто. Например, вот как можно сделать так, чтобы отключаться при нажатии "Enter":
local kbd = require("keyboard") local pullSignal = computer.pullSignal function computer.pullSignal(...) local e = table.pack(pullSignal(...)) if e[1] == "key_down" and e[4] == kbd.keys.enter then computer.pullSignal = pullSignal end return table.unpack(e) endПо сравнению с предыдущим сниппетом кода, поменялось вот что:
- Мы получаем событие до выполнения своего кода и сохраняем в таблицу e.
- Выполняем свой код (при нажатии Enter снова подменяем computer.pullSignal, но на этот раз на стандартное значение).
- Возвращаем ивент.
У такого метода использования есть недостатки. Если два скрипта подменят одну и ту же функцию, проблематично будет отключить программы. Ещё функция запускается только при вызове computer.pullSignal, а не с каким-то интервалом. Система будет тормозить, если эту функцию заменить на какую-то, которая будет небыстро работать. И так далее.
Поэтому лучше для обработки ивентов использовать event.listen, для вызова функции по интервалу — event.listen, а для поочерёдной работы нескольких потов — стандартную в грядущей OpenOS 1.6.4 и выше библиотеку "thread" — или, пока OC не обновился, либу от @Zer0Galaxy.
-
2
-
А как убрать это из памяти?
Гм, может, "Войну и мир" в цитату ещё запихнуть, чтобы потом написать "
"? Отрезайте ту часть цитаты, на которую отвечаете (а тут цитировать вообще не нужно было).По поводу вопроса самого. Прежнее значение computer.pullSignal должно быть сохранено в другую переменную. Заменой переопределённой функции на изначальную можно остановить выполнение программы.
Из памяти затем программа будет потёрта при следующей сборке мусора, если на неё не осталось ссылок.
-
Если бы еще маленько дошло, то было бы понятно, что это копия системной либы и в ней все работает точно так же (кроме дополнительного функционала навигации).
О как. И правда.
Тогда остаётся вариант очепятки.
-
Возможно на сервере, на котором я играю и тестирую эту прожку, это не работает. Главное - робот копает неограниченное расстояние (из-за кругов по уже вырытым туннелям), а значит ресурсы станут практически бесконечными
До меня дошло.
Подвело решение не просто запихнуть свою либу в папку /lib вместо /usr/lib, но ещё и под тем же именем, что и стандартная либа "robot". Нельзя допускать конфликтов либ со стандартными. Нельзя класть несистемные либы в папку /lib. Ни-ког-да.
Чтобы починить, нужно:
- Перетащить свою либу в другое место.
- Переустановить системную библиотеку "robot".
- В программе использовать новое имя библиотеки.
-
1
-
Я проверял, не работает.
В десятках программ используется этот метод. С чего б ему не работать?
-
F3+H нажми в кубаче и наведи на сервер в неи.
P. S. Зачем надо было создавать три одинаковых топика с интервалом в 5 минут?
-
Хорошо, что проги пишутся. Я так прошерстил этот топик немного, есть непонятки.
Перезагрузка для освобождения переменной записи движений роботаКакой костыльный костыль зафигачил. Почему нельзя перезаписать переменную с таблицей этих действий? Так же гораздо проще.
Для установки чанклоадера нужен процессор 3го уровня, так что ставьте егоКорпус третьего уровня нужен, да. Процессор? Там второго или даже первого уровня хватит.
Ещё есть кнопка сверху для списков. Нумерованный и с маркерами. Не нужно выдумывать шедевры. Какой-то шрифт интересный тоже.
Наконец, не понял, в чём заключается продвинутость майнера. Непродвинутый от Тоторика (рекурсивник который) как-то выглядит поинтереснее. Но, надеюсь, в целом программа заявленной цели - копать дыру - соответствует, поэтому в код лезть не буду.
-
- Отформатируйте текст. Список, вложенный список, да хотя бы абзацы можно было сделать? Это же нечитабельно совершенно. Если бы мне не сказали обратить внимание на этот топик, я бы проигнорил этот поток мыслей неструктурированный - мне есть чем заняться, кроме как читать такое.
На что вам отвечать? Как передать команду Lua дистанционно? Или как нереальную жесть сделать с кнопочками, строчек на 4 тысячи?
Не кажется, что жесть во второй части - это разу не вопрос для раздела "Вопросник по Lua и модам Opencomputers и ComputerCraft"? -
ссылки на пикчи битые.
Всё работает. Через проксю какую-нибудь зайди.
-
local PATH = "/home/test.lua" local env = {} for k, v in pairs(_G) do env[k] = v end env.test = function() print("HELLO, world") end local chunk, reason = loadfile(PATH, "t", env) if not chunk then error("Couldn't load file: " .. tostring(reason)) end local value = chunk() print("Script returned: " .. tostring(value))Файл /home/test.lua
test() return 42
При запуске первого скрипта получим:
HELLO, world Script returned: 42
-
1
-
-
Теперь что касается либ: крайне странно, что каким-то образом у тебя затронулась либа сериализации: инсталлер ее не устанавливает и никаким косвенным образом не затрагивает, да и все устанавливаемые либы имеют названия, не пересекающиеся с системными, что вдвойне удивительно.
Ну это, конечно, относилось не конкретно к этой либе, а к инсталлятору MineOS в целом - ребята ставили, а оказывалось, что либа сериализации затиралась. Я, как говорил, уверен, что это не было сделано специально, но иногда можно не заметить.
Печально, что с репозиторием такое мнение. Посмотрю, как можно обойти установку одних и тех же файлов в миллионах мест. Либы заменить нечем, особенно буферизацию.
-
1
-
-
Каждую секунду урановые стержни генерируют так называемые импульсы на 4 соседние клетки (то есть на клетку вверх, вниз, влево и вправо). Если на этих клетках находится одинарный урановый стержень, то он выдаст 5 еу в дополнение к изначальным 5 еу, которые он выдаёт всегда. Если импульс попадает на отражатель, то он возвращается назад на урановый стержень, который этот нейтронный импульс послал, а сам отражатель теряет единицу прочности.
Если стержни совмещены, то в каждую сторону они посылают количество импульсов, соответствующее числу совмещённых стержней. То есть двойной стержень в каждую сторону будет посылать по 2 импульса (получать два и генерировать дополнительные 10 EU), а счетверённый - по 4 импульса (и генерировать таким образом ещё 20 EU). Но и отражатели будут соответственно терять прочность: на 2 единицы с двойным стержнем и на 4 со счетверённым.
-
1
-
-
Любите музыку? А толку спрашивать. Конечно. До сего момента музыкальные возможности ограничивались кассетным проигрывателем с форматом DFPWM. Он лёгок в использовании и обладает убойной фичей - шумом.
Для звуковой карты, естественно, плееры тоже пишут люди, вот только что-то с релизом они пугливо очень затягивают. Но они боятся - а мы не боимся.
Самое главное: фича, которой я горжусь, - плеер генерирует адское ушное месиво. Если не жалко своих ушей, то следуйте вперёд.
А. Где качать
$ hpm oppm:install ffp $ # или $ oppm install ffp
Б. Играть PCM-файл сходу
Качаем PCM файл на комп. Запускаем прогу:
$ ffp $path $depth $sample_rate $channels $window_size $window_step $duration
- $path - путь к PCM-файлу
- $depth - глубина дискретизации
- $sample_rate - частота дискретизации
- $channels - кол-во каналов (опционально, по умолчанию 8; если в конфиге увеличить число каналов, то тут тоже можно)
- $window_size - размер окна в сэмплах (если без понятия, что это за хрень, пропустите; 1024 по дефолту)
- $window_step - доля, на которую будет сдвигаться каждое последующее окно при конвертации (чёрт знает, на что это влияет, просто мне захотелось; по умолчанию 1)
- $duration - сколько секунд трека вам угодно (по умолчанию вот прям весь, если в память влезет)
В. Играть сконвертированный PCM-файл
Чистого процессорного времени ест в два раза меньше, чем встроенный конвертер для OC.
На своей линуксовой машинке использовать как в пункте Б, перенаправить выхлоп в выходной файл.
$ lua5.3 ./ffp.lua $path $depth $sample_rate $channels $window_size $window_step $duration > out.smp
Выходной файл скачать и проигрывать через ffp вот так:
$ ffp --load $path
Г. Играть сконвертированный через конвертер на сверхзвуковой скорости WAV-файл
Пять минут трека (44100 Гц / 16 бит / 1024 сэмпла окно) пункт В конвертит более 20 минут в процессорном времени (в реальности ещё больше). Конвертер на питоне, который также есть, юзает БПФ из NumPy и тот же трек обрабатывал чуть больше минуты реального времени.
Зависимости: numpy, scipy и питон 3.
Использование:
$ ./converter.py $path $window_size $channels > out.smp
Ссылка на конвертер: тык.
Д. Требования
Музяка: никаких стерео. Только моно, только один канал. Иначе варианты Б и В будут играть полную дичь, вариант Г выдаст недвусмысленную ошибку. Остальное в параметрах вариабельно.
Прога: требует собственно звуковую карту, дохрена рамы и процессор с архитектурой Lua 5.3. Так как у нас юзер-френдли интерфейсы, при отсутствии чего-либо прога крашнется.
Е. Пример?
Тык. 32768 Гц, 16 бит, 8 каналов. Какая-то песенка.Ё. Примечание
На большом кол-ве каналов может начаться ад с сетью, если компьютер не только что с завода. Звук заедает, пакеты на сервер и с сервера не идут, кроме звуковых, жесть полная, в общем. Так что осторожнее.
-
7
-
Полагаю, к реактору надо как раз поставить адаптер, а от него проводами к компу.
-
Совсем небольшой апдейтик, добавляющий ещё 12 килобайт кода.
1. Добавлена карточка LFSR шума
Я как-то про неё забыл, из-за чего она на меня обиделась. Но справедливость восторжествовала, и она стала доступна для установки. Я без понятия, как оно работает, автор мода тоже в неведении пребывает, такие дела. Поэтому играйтесь.
2. Улучшен плоттер
Во-первых, я разобрался, как надо уметь в зум, поэтому теперь можно отдельно прописывать сэмплрейт и зум. Кроме того, починил плоттеры шума (LFSR и белый шум), которые раньше эмулировали скорее мычащее стадо мух, чем шум для серьёзных дяденек.
Ну и в сетапах с модуляторами можно модуляторы на отдельный график теперь ставить (раньше тупо нуль рисовал).
3. Добавлена PCM-карточка
Теперь звук можно записывать путём попроще, чем редиректить его из кубача в файл. Подключите все нужные каналы, как и у звуковой карты, к PCM-карте и затем тыкните правой кнопой мышки.

Задайте параметры вывода:
- Sample rate - частота дискретизации. Количество измерений в секунду. Должно быть минимум в два с небольшим раза больше максимальной частоты в выхлопе (напомню, что боковые частоты у модуляторов могут быть выше частоты несущего сигнала). 44100 заявлено как качество CD и является дефолтным сэмплрейтом звуковой карточки, 48000 - качество DVD.
- Depth - глубина дискретизации. Размер одного сэмпла в битах. Чем больше глубина, тем точнее кодируется амплитуда, но реально разница между 16 битами, например, и 32 не особо заметная для игрушечных выводах в этой проге.
- Length (in secs) - длина [аудио-файла] (в секундах), внезапно.
- Format - формат файла. На самом деле, один фиг будет генерироваться LPCM, только если выставить формат в WAV, то за счёт 44 байт можно будет проигрывать полученный файл в любом плеере без шаманских плясок.
- Path - путь. Туда побежит звук. Очевидно, что файл будет перезаписан (и вас об этом не спросят, потому что это же суровая прога для суровых ребят, а не мягкая комната).
- Total file size - размер файла, кто бы мог подумать. В кибибайтах - ну там и так написано, так-то. Размер = частота дискретизации × (глубина дискретизации / 8) × длина + (формат == WAV ? 44 : 0).
- Generate - это кнопка, по которой люди тыкают, чтобы скормить звук в файл. Справа от кнопки прогресс бар, показывающий прогресс.
Как-то так. WAV сразу в плеер посылать можно, а для PCM надо указывать формат. Пример для ffplay:
$ ffplay -f s${DEPTH}le -ar $SAMPLERATE -ac 1 -i out.pcmНе переиграйтесь с размером: диски в OC не резиновые.
4. Пофикшены баги
Самые разные, в основном довольно тупые.
Обновить
$ oppm update $ # или $ hpm oppm:install -r synth
-
3

internet API и pastebin
в Разные (отсортировать)
Опубликовано:
Ну, блин, по таким мелочам лучше в ирку стучись. Или в гугл. Всё равно туда пошлют. Читай тут: https://pastebin.com/api