Fingercomp
Гуру-
Публикации
1 629 -
Зарегистрирован
-
Посещение
-
Победитель дней
283
Тип публикации
Блоги
Профили
Форум
Багтрекер
Магазин
Все публикации пользователя Fingercomp
-
Ну, блин, по таким мелочам лучше в ирку стучись. Или в гугл. Всё равно туда пошлют. Читай тут: https://pastebin.com/api
-
$ edit /bin/pastebin.lua
-
А рычаг чем не угодил?
-
Да дайте Тоторе просто права, чтобы он писать мог, и пусть возрождает группу из могилы. А раз в неделю пост делать — это сложнее, на самом деле, чем кажется.
-
Смотри в сторону Dynamic Surroundings. Там для каждого звука можно в настройках задать громкость или потушить вовсе.
-
ComputerCraft - Черепаха и пульт управления.
Fingercomp ответил в вопрос ktoto21435 в Разные (отсортировать)
А у OC разве нет? Вон, в OpenOS даже уже встроили либу потоков. Про периферальные возможности вообще непонятно. Хочется так, что в одном блоке максимум один компонент мог быть? Или на две стороны или инструмент (бесконечный), или модем? -
@nailfor, хватит хамить, пожалуйста. Здесь никто вас не оскорблял, чтобы так выражаться.
-
[тут была цитата, но её уже исправили] Если функция вызывается с одним аргументом, представленным строковым литералом или табличным, то круглые скобки можно опустить при вызове. Короче: -- эти строки эквивалентны: func({"test"}) func {"test"} -- и эти: func("test") func "test" Ничего себе: "не нужно". Очень даже нужно было мне, например.
-
Дааа... Я вот тоже такой фигнёй маялся неделю назад — и вместо того, чтобы завести нормальные классы: с многоуровневым множественным наследованием, красивым синтаксисом, объявлением мета-методов прямо в классе без необходимости плясать с бубном, конструкторами/деструкторами, сеттерами/геттерами, супер-вызовами, геттерами/сеттерами и прочим — у меня классы делались похожим образом: создаватель классов возвращал функцию-конструктор. И довольно быстро упёрся в разные проблемы с этим: например, я хочу, не создавая инстанс класса, создать кастомный класс, чтобы заменить какую-то константу в исходном классе. Надо унаследоваться и заменить. У меня надо было таскать мета-таблицу, у тебя — прототип. А в той вкусной либе, которую я описывал, достаточно вот такого кода: local CustomClass = newClass(BaseClass) CustomClass.SOME_CONSTANT = 42 И затем можно юзать кастомный класс с переопределённым атрибутом. По поводу приватных методов: функцию создавать — это абсолютно лишний оверхэд. Scope в луа создаётся блоком do ... end. Например: local myObject do local secret = "abc" myObject = Class({ public = "hey" }) end Ну и буквы как-то великоваты будут. Вроде не настолько плоховидящие тут люди сидят.
-
Это не гайд. Даже в заголовке написано. FAQ. Оно и так по порядку написано — сначала ось, потом дискеты. Блог есть у Тоторы. В том числе и про копалку.
-
Да без проблем, я тут для этого и сижу. 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.
- 29 ответов
-
- 2
-
-
- TSR
- pullSignal
-
(и ещё 1 )
Теги:
-
Гм, может, "Войну и мир" в цитату ещё запихнуть, чтобы потом написать " "? Отрезайте ту часть цитаты, на которую отвечаете (а тут цитировать вообще не нужно было). По поводу вопроса самого. Прежнее значение computer.pullSignal должно быть сохранено в другую переменную. Заменой переопределённой функции на изначальную можно остановить выполнение программы. Из памяти затем программа будет потёрта при следующей сборке мусора, если на неё не осталось ссылок.
- 29 ответов
-
- TSR
- pullSignal
-
(и ещё 1 )
Теги:
-
До меня дошло. Подвело решение не просто запихнуть свою либу в папку /lib вместо /usr/lib, но ещё и под тем же именем, что и стандартная либа "robot". Нельзя допускать конфликтов либ со стандартными. Нельзя класть несистемные либы в папку /lib. Ни-ког-да. Чтобы починить, нужно: Перетащить свою либу в другое место. Переустановить системную библиотеку "robot". В программе использовать новое имя библиотеки.
-
F3+H нажми в кубаче и наведи на сервер в неи. P. S. Зачем надо было создавать три одинаковых топика с интервалом в 5 минут?
-
Хорошо, что проги пишутся. Я так прошерстил этот топик немного, есть непонятки. Какой костыльный костыль зафигачил. Почему нельзя перезаписать переменную с таблицей этих действий? Так же гораздо проще. Корпус третьего уровня нужен, да. Процессор? Там второго или даже первого уровня хватит. Ещё есть кнопка сверху для списков. Нумерованный и с маркерами. Не нужно выдумывать шедевры. Какой-то шрифт интересный тоже. Наконец, не понял, в чём заключается продвинутость майнера. Непродвинутый от Тоторика (рекурсивник который) как-то выглядит поинтереснее. Но, надеюсь, в целом программа заявленной цели - копать дыру - соответствует, поэтому в код лезть не буду.
-
Отправление команд на робота дистанционно
Fingercomp ответил в вопрос Darkar25 в Разные (отсортировать)
Отформатируйте текст. Список, вложенный список, да хотя бы абзацы можно было сделать? Это же нечитабельно совершенно. Если бы мне не сказали обратить внимание на этот топик, я бы проигнорил этот поток мыслей неструктурированный - мне есть чем заняться, кроме как читать такое. На что вам отвечать? Как передать команду Lua дистанционно? Или как нереальную жесть сделать с кнопочками, строчек на 4 тысячи? Не кажется, что жесть во второй части - это разу не вопрос для раздела "Вопросник по Lua и модам Opencomputers и ComputerCraft"? -
Всё работает. Через проксю какую-нибудь зайди.
- 25 ответов
-
- base64
- experiment
-
(и ещё 1 )
Теги:
-
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
-
Ну это, конечно, относилось не конкретно к этой либе, а к инсталлятору MineOS в целом - ребята ставили, а оказывалось, что либа сериализации затиралась. Я, как говорил, уверен, что это не было сделано специально, но иногда можно не заметить. Печально, что с репозиторием такое мнение. Посмотрю, как можно обойти установку одних и тех же файлов в миллионах мест. Либы заменить нечем, особенно буферизацию.
-
Каждую секунду урановые стержни генерируют так называемые импульсы на 4 соседние клетки (то есть на клетку вверх, вниз, влево и вправо). Если на этих клетках находится одинарный урановый стержень, то он выдаст 5 еу в дополнение к изначальным 5 еу, которые он выдаёт всегда. Если импульс попадает на отражатель, то он возвращается назад на урановый стержень, который этот нейтронный импульс послал, а сам отражатель теряет единицу прочности. Если стержни совмещены, то в каждую сторону они посылают количество импульсов, соответствующее числу совмещённых стержней. То есть двойной стержень в каждую сторону будет посылать по 2 импульса (получать два и генерировать дополнительные 10 EU), а счетверённый - по 4 импульса (и генерировать таким образом ещё 20 EU). Но и отражатели будут соответственно терять прочность: на 2 единицы с двойным стержнем и на 4 со счетверённым.
-
Любите музыку? А толку спрашивать. Конечно. До сего момента музыкальные возможности ограничивались кассетным проигрывателем с форматом 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 каналов. Какая-то песенка. Ё. Примечание На большом кол-ве каналов может начаться ад с сетью, если компьютер не только что с завода. Звук заедает, пакеты на сервер и с сервера не идут, кроме звуковых, жесть полная, в общем. Так что осторожнее.
-
Sound Card / спектр, преобразование Фурье, PCM и WAV
Fingercomp добавил запись в блоге в Fingercomp's Playground
В звуковой карточке есть дохрена функционала - поэтому она и крутая. В этой части попытаюсь объяснить достаточно сложные штуки, которые используют большие дяди. Надеюсь, что вы прочитали и поняли две предыдущие части цикла - это будет довольно важно для последующего повествования. [Раньше тут был полноценный пост с эмбедом, но после переезда оно всё, соответственно, сломалось. Текст доступен здесь.]
