Перейти к содержимому

Fingercomp

Гуру
  • Публикации

    1 629
  • Зарегистрирован

  • Посещение

  • Победитель дней

    283

Все публикации пользователя Fingercomp

  1. Ну, блин, по таким мелочам лучше в ирку стучись. Или в гугл. Всё равно туда пошлют. Читай тут: https://pastebin.com/api
  2. Да дайте Тоторе просто права, чтобы он писать мог, и пусть возрождает группу из могилы. А раз в неделю пост делать — это сложнее, на самом деле, чем кажется.
  3. Смотри в сторону Dynamic Surroundings. Там для каждого звука можно в настройках задать громкость или потушить вовсе.
  4. А у OC разве нет? Вон, в OpenOS даже уже встроили либу потоков. Про периферальные возможности вообще непонятно. Хочется так, что в одном блоке максимум один компонент мог быть? Или на две стороны или инструмент (бесконечный), или модем?
  5. @nailfor, хватит хамить, пожалуйста. Здесь никто вас не оскорблял, чтобы так выражаться.
  6. [тут была цитата, но её уже исправили] Если функция вызывается с одним аргументом, представленным строковым литералом или табличным, то круглые скобки можно опустить при вызове. Короче: -- эти строки эквивалентны: func({"test"}) func {"test"} -- и эти: func("test") func "test" Ничего себе: "не нужно". Очень даже нужно было мне, например.
  7. Дааа... Я вот тоже такой фигнёй маялся неделю назад — и вместо того, чтобы завести нормальные классы: с многоуровневым множественным наследованием, красивым синтаксисом, объявлением мета-методов прямо в классе без необходимости плясать с бубном, конструкторами/деструкторами, сеттерами/геттерами, супер-вызовами, геттерами/сеттерами и прочим — у меня классы делались похожим образом: создаватель классов возвращал функцию-конструктор. И довольно быстро упёрся в разные проблемы с этим: например, я хочу, не создавая инстанс класса, создать кастомный класс, чтобы заменить какую-то константу в исходном классе. Надо унаследоваться и заменить. У меня надо было таскать мета-таблицу, у тебя — прототип. А в той вкусной либе, которую я описывал, достаточно вот такого кода: local CustomClass = newClass(BaseClass) CustomClass.SOME_CONSTANT = 42 И затем можно юзать кастомный класс с переопределённым атрибутом. По поводу приватных методов: функцию создавать — это абсолютно лишний оверхэд. Scope в луа создаётся блоком do ... end. Например: local myObject do local secret = "abc" myObject = Class({ public = "hey" }) end Ну и буквы как-то великоваты будут. Вроде не настолько плоховидящие тут люди сидят.
  8. Это не гайд. Даже в заголовке написано. FAQ. Оно и так по порядку написано — сначала ось, потом дискеты. Блог есть у Тоторы. В том числе и про копалку.
  9. Да без проблем, я тут для этого и сижу. 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.
  10. Гм, может, "Войну и мир" в цитату ещё запихнуть, чтобы потом написать " "? Отрезайте ту часть цитаты, на которую отвечаете (а тут цитировать вообще не нужно было). По поводу вопроса самого. Прежнее значение computer.pullSignal должно быть сохранено в другую переменную. Заменой переопределённой функции на изначальную можно остановить выполнение программы. Из памяти затем программа будет потёрта при следующей сборке мусора, если на неё не осталось ссылок.
  11. До меня дошло. Подвело решение не просто запихнуть свою либу в папку /lib вместо /usr/lib, но ещё и под тем же именем, что и стандартная либа "robot". Нельзя допускать конфликтов либ со стандартными. Нельзя класть несистемные либы в папку /lib. Ни-ког-да. Чтобы починить, нужно: Перетащить свою либу в другое место. Переустановить системную библиотеку "robot". В программе использовать новое имя библиотеки.
  12. В десятках программ используется этот метод. С чего б ему не работать?
  13. F3+H нажми в кубаче и наведи на сервер в неи. P. S. Зачем надо было создавать три одинаковых топика с интервалом в 5 минут?
  14. Хорошо, что проги пишутся. Я так прошерстил этот топик немного, есть непонятки. Какой костыльный костыль зафигачил. Почему нельзя перезаписать переменную с таблицей этих действий? Так же гораздо проще. Корпус третьего уровня нужен, да. Процессор? Там второго или даже первого уровня хватит. Ещё есть кнопка сверху для списков. Нумерованный и с маркерами. Не нужно выдумывать шедевры. Какой-то шрифт интересный тоже. Наконец, не понял, в чём заключается продвинутость майнера. Непродвинутый от Тоторика (рекурсивник который) как-то выглядит поинтереснее. Но, надеюсь, в целом программа заявленной цели - копать дыру - соответствует, поэтому в код лезть не буду.
  15. Отформатируйте текст. Список, вложенный список, да хотя бы абзацы можно было сделать? Это же нечитабельно совершенно. Если бы мне не сказали обратить внимание на этот топик, я бы проигнорил этот поток мыслей неструктурированный - мне есть чем заняться, кроме как читать такое. На что вам отвечать? Как передать команду Lua дистанционно? Или как нереальную жесть сделать с кнопочками, строчек на 4 тысячи? Не кажется, что жесть во второй части - это разу не вопрос для раздела "Вопросник по Lua и модам Opencomputers и ComputerCraft"?
  16. Всё работает. Через проксю какую-нибудь зайди.
  17. 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
  18. Ну это, конечно, относилось не конкретно к этой либе, а к инсталлятору MineOS в целом - ребята ставили, а оказывалось, что либа сериализации затиралась. Я, как говорил, уверен, что это не было сделано специально, но иногда можно не заметить. Печально, что с репозиторием такое мнение. Посмотрю, как можно обойти установку одних и тех же файлов в миллионах мест. Либы заменить нечем, особенно буферизацию.
  19. Каждую секунду урановые стержни генерируют так называемые импульсы на 4 соседние клетки (то есть на клетку вверх, вниз, влево и вправо). Если на этих клетках находится одинарный урановый стержень, то он выдаст 5 еу в дополнение к изначальным 5 еу, которые он выдаёт всегда. Если импульс попадает на отражатель, то он возвращается назад на урановый стержень, который этот нейтронный импульс послал, а сам отражатель теряет единицу прочности. Если стержни совмещены, то в каждую сторону они посылают количество импульсов, соответствующее числу совмещённых стержней. То есть двойной стержень в каждую сторону будет посылать по 2 импульса (получать два и генерировать дополнительные 10 EU), а счетверённый - по 4 импульса (и генерировать таким образом ещё 20 EU). Но и отражатели будут соответственно терять прочность: на 2 единицы с двойным стержнем и на 4 со счетверённым.
  20. Любите музыку? А толку спрашивать. Конечно. До сего момента музыкальные возможности ограничивались кассетным проигрывателем с форматом 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 каналов. Какая-то песенка. Ё. Примечание На большом кол-ве каналов может начаться ад с сетью, если компьютер не только что с завода. Звук заедает, пакеты на сервер и с сервера не идут, кроме звуковых, жесть полная, в общем. Так что осторожнее.
  21. В звуковой карточке есть дохрена функционала - поэтому она и крутая. В этой части попытаюсь объяснить достаточно сложные штуки, которые используют большие дяди. Надеюсь, что вы прочитали и поняли две предыдущие части цикла - это будет довольно важно для последующего повествования. [Раньше тут был полноценный пост с эмбедом, но после переезда оно всё, соответственно, сломалось. Текст доступен здесь.]
×
×
  • Создать...