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

Лидеры


Популярный контент

Показан контент с высокой репутацией за 10.09.2019 во всех областях

  1. 14 баллов
    Для тех, кто спешит: https://ocelot.fomalhaut.me/ На форуме давно мелькают упоминания Ocelot. Это эмулятор OpenComputers, который находится в разработке примерно с 2015 года, был несколько раз переписан и наконец увидел свет в закрытом альфа-тесте зимой 2018. Я немного отвлекся на другие проекты (привет Stem), но теперь возвращаюсь к разработке Ocelot, и с гордостью предствляю вам тизер-анонс и, по совместительству, открытый альфа-тест Ocelot. Ещё один эмулятор? Да. Будем честны. Нормального эмулятора OpenComputers не существует. Те что есть - полны костылей, не совсем соответствуют реальному моду, сложны в установке, заброшены... и так далее. Ocelot - это решение всех этих проблем. Основная идея Ocelot - взять уже существующий код мода OpenComputers, тщательно отделить всё не нужное (Майнкрафт), затем осторожно переписать то что получилось с поправкой на реалии эмулятора. Благодаря этому, Ocelot эмулирует OpenComputers с ранее невиданной точностью. Вплоть до того, что в эмуляторе могут встречаться те же самые баги, что и в моде. Что он умеет? Практически всё. В перспективе. Ocelot позволяет воссоздать схему любой сложности из любого количества блоков - мониторов, компьютеров (любой конфигурации), проводов, модемов и прочих компонентов. Он позволяет управлять скоростью работы компьютеров, позволяет изменять "игровое" время, ставить его на паузу, сохранять состояние работы компьютеров и потом возобновлять работу с любого сохранения. Сейчас доступен базовый набор компонентов и блоков. Это кабель, корпус компьютера, APU/CPU, плашки памяти, видеокарты, дата-карты, EEPROM, дискеты, жесткие диски (managed и unmanaged режимов), интернет-карта, линкед-карта, сетевая карта (проводная и безпроводная), редстоун-карта / блок и монитор. Список будет расширяться. В перспективе будет эмуляция всех блоков и компонентов стандартного OC, роботов, дронов, микроконтроллеров, серверных стоек, плюс эмуляция адаптера и интеграции с ванильными блоками и блоками других модов. Что можно потрогать? Ocelot задуман как модульный проект. А именно: Ocelot Brain Основа эмулятора - это библиотека Ocelot Brain. Она написана на Scala и может быть подключена к любому другому проекта на Scala (и, может быть, Java). Ocelot Brain - это как раз переработанный код OpenComputers в компактной и удобной форме. Отвечает за всю эмуляцию кода и компонентов, а также сохранение / загрузку проектов. Вы можете использовать его для своих проектов, можете помочь с разработкой и патчами. Проект открыт и доступен по адресу: https://gitlab.com/cc-ru/ocelot/ocelot-brain На данный момент Ocelot Brain актуален версии OpenComputers 1.7.4. Ocelot Online На основе проекта Ocelot Brain, в качестве демонстрации его возможностей, создается проект Ocelot Online. Ocelot Online это эмулятор OpenComputers в виде сайта. Да. Всё что вам нужно для его запуска - это открыть сайт. Ссылка: https://ocelot.fomalhaut.me/ Исходный код тоже доступен: https://gitlab.com/cc-ru/ocelot/ocelot-online Поскольку проект пока находится в альфа-релизе, большая часть возможностей закрыта. Доступен только один монитор на всех, который позволяет взаимодействовать с уже настроенным демо-проектом. Конфигурация проекта: Креативный корпус, CPU T3, видеокарта T3, две планки памяти T3.5, managed жесткий диск T3, unmanaged жёсткий T3, интернет карта, редстоун карта T2, дисковод с дискетой Open OS, монитор T2, клавиатура и EEPROM с Advanced Loader от товарища Luca_S. Отличия от стандартного OpenComputers: * В OpenOS уже установлен HPM. Благодаря этому можно быстро ставить разные программы через hpm install. * Вставка текста заменена с Insert на Ctrl + V. Браузер не дает изменить этот хоткей. * В редакторе edit кнопка выхода заменена на Ctrl + E. Стандартная комбинация юзается браузером для закрытия вкладок - и переопределить её нельзя по соображениям безопасности. * Иногда не печатаются стек-трейсы. Это последствия одного фикса против одного вредного эксплойта. Проблема уже сообщена разработчикам OC. Как только нормальный патч появится в OpenComputers - я пропатчу и Ocelot. * Вместо OpenOS EEPROM используется Advanced Loader. Это сделано для удобства и наглядности. * Не работает лок на пользователя - по понятным причинам. Ocelot Online должен так же работать на смартфонах. Однако возможно придется отключить T9 - он портит эвенты клавиатуры. В разработке находится более сложная версия, где все получат возможность зарегистрировать аккаунт и создавать личные проекты любой конфигурации. Но это дело будущего. Ocelot Desktop Это классический вариант эмулятора Ocelot в виде программы, которую можно скачать и запустить на любой операционной системе, где есть Java. Построен на Ocelot Brain и библиотеке LWJGL (как и сам майнкрафт). Разработкой занимается товарищ @LeshaInc. Я не буду спойлерить и рассказывать про его проект - если он захочет, сам расскажет. Альфа-тест Итак, дорогие пользователи, пишите ваши хотелки, сообщайте о багах, обо всем что работает не так как должно, и как в оригинальном OC. Я, со своей стороны, постараюсь проект не забрасывать, развивать и своевременно (или не очень) обновлять. Благодарности Над проектом также работали: @LeshaInc, @Laine_prikol, @Fingercomp и @MeXaN1cK. За что им огромное спасибо и респект. Не забудем также всех, кто помогал с альфа-тестированием, Сангара - за чудесный мод, и мейнтейнеров OpenComputers за то что его не забросили (всё ещё ждем от них фикс). Enjoy!
  2. 8 баллов
    Иногда, особенно когда вы занимаетесь строительством реакторов, необходимо очень много укрепленного камня. Можно конечно и вручную залить нужную территорию, но согласитесь, лучше когда за вас это все сделает кто-то еще. Итак представляю вашему вниманию небольшую автоматическую систему по производству укрепленного камня. Вам всего то надо обеспечить эту ферму (генератор укрепленного камня) железными лесами, песком и энергией. Перейдем к постройке: Главным центром всей постройки является робот. Его устройство рассмотрим позднее. Справа от робота необходимо установить любую зарядку для бура/ваджары. Ну или если вы совсем бедные, и планируется что робот будет работать киркой, то установите сундук. Слева от робота устанавливайте Жидкостный/Твердотельный наполняющий механизм. Он заправляет распылитель сразу, за 1 прогон. Это будет наполнитель для зарядки распылителя. Рядом с зарядником распылителя рекомендую установить еще один Жидкостный/Твердотельный наполняющий механизм, который будет генерировать сжатую пену. В слоты улучшения обязательно установите "Выталкиватель жидкости". С подачей воды и смеси думаю разберетесь сами. Не забываем выставить настройки в механизмах как показано на скрине: За роботом нужна зарядка, чтоб он мог работать вечно! И не забываем её стукнуть ключиком, чтоб не заморачиваться с рычагами. Конвертор энергии не забудьте подключить к энергобуферу (или можете не устанавливать его, провода из ИС2 с ОС коннектятся) Над роботом установите сундук, и желательно побольше. В него необходимо засыпать железные леса и песок. Учтите, на 1 блок укрепленного камня необходимо 1 железные леса и 1 песок. Автоматизация засыпания расходников, уже на вас. Под роботом распологается сундук в который будет ссыпаться укрепленный камень. Так как наш робот будет нереально дешевым, не забываем сделать подставку на которой будет готовиться ваш камушек. Рекомендую вообще оградить это место, чтоб ни курица ни игрок не залезли перед роботом (иначе распылитель запенит все в округе). Собственно это все что необходимо вам знать при постройке этой фермы. Переходим к роботу. Программу я сделал для двух типов роботов, простейший Т1 и супердешевый на eeprom. Простой робот-генератор укрепленного камня: Супердешевый робот-генератор укрепленного камня: Настоятельно не рекомендуется лезть перед роботом иначе рискуете получить такое Не лезте своими шаловливыми ручками в слоты к работающему роботу. Можете забрать готовый камень, но расходники не трогайте, так как скорость смены инструмента огромная, и если робот что-то не найдет, вам грозит быть залитым в пену. (смотри скрин выше) Одной заправки распылителя хватает на 80 применений, потом робот автоматически перезаряжает инструмент и распылитель. А в остальном данная ферма работает довольно стабильно и исправно. А рассказал вам о ферме Asior, фармите укрепленный камень, гоняйте кур от фермы и удачи в тяжком труде реактостроителя! P.S. Укрепленный камень выдерживает ядерный взрыв, но радиацию сдержать увы не сможет. Осторожнее.
  3. 3 балла
    Я тоже проверю свои телепатические способности. Речь, скорее всего, идёт об этой программе: https://github.com/ATastyPeanut/OpenComputers-Minecraft-Lua/blob/master/Ticks-Second-Tools/TPS-Holo-Display.lua Картинка тоже нашлась.
  4. 3 балла
    Минификатор занимается тем, что из кода делает эквивалентный, но короче в записи. Инлайнинг переменных — круто, но код будет не эквивалентный. С помощью debug.getlocal/debug.setlocal если попытаться прочесть эту переменную, можно очень удивиться, что её нет. То, что описывается, есть работа оптимизатора. Одного синтаксического дерева недостаточно. Нужно провести хотя бы data-flow analysis, чтобы сначала заинлайнить константу, а потом удалить мёртвый код.
  5. 2 балла
  6. 2 балла
    file:///C:/Users/User/Downloads/Безымянный.png кто нибудь подскажет как он это сделал?
  7. 2 балла
    Нашёл древний код, не помню откуда: local c, fs = require("component"), require("filesystem") local gpu = c.gpu local TC, RO, RN, RD, TPS = 2, 0, 0, 0 gpu.setForeground(0x99b2f2) gpu.set(1, 2, "TPS Сервера:") local function time() local f = io.open("/tmp/TF", "w") f:write("test") f:close() return(fs.lastModified("/tmp/TF")) end while true do RO = time() os.sleep(TC) RN = time() RD = RN - RO TPS = 20000 * TC / RD TPS = string.sub(TPS, 1, 5) nTPS = tonumber(TPS) gpu.set(13, 2, " ") if nTPS <= 10 then gpu.setForeground(0xcc4c4c) elseif nTPS <= 15 then gpu.setForeground(0xf2b233) elseif nTPS > 15 then gpu.setForeground(0x7fcc19) end gpu.set(13, 2, TPS) end Надеюсь поможет
  8. 2 балла
    Немного пошаманив сделал stand-alone версию. https://pastebin.com/q3KJFv7i Можно встроить в голый биос, или голый ЖД. Единственное - немного упала простота использования. Порт можно сменить лишь изменив код(Рядом с портом есть комментарий --port) и адрес сервера так же меняется в начале программы. В остальном - почти тот же стем, за исключением того, что функции вызываются без stem.connect(), а напрямую - например connect(), subscribe, unSubscribe(), disconnect() и т.д. (Учтите, что писать connect надо лишь один раз, так как connect подменяет pullSignal, для подключения в дальнейшем нужно использовать reconnect)
  9. 2 балла
    Потоки — очень полезные штуки, позволяющие исполнять несколько кусков кода. Раньше для их использования приходилось скачивать отдельную библиотеку, работающую через костыли. Начиная с OpenOS 1.6.4, они есть в стандартной поставке ОС — в модуле thread. Давайте посмотрим, из чего она состоит — и в чём её преимущество перед любыми другим библиотеками. Начнём с версий. OpenOS 1.6.4 — версия, включённая в OpenComputers 1.7.0. Если не хотите возиться с обновлением системы вручную, требуется иметь версию выше или равную 1.7.0. Сразу обращаю внимание на самую важную вещь: потоки не могут исполняться одновременно. В один момент времени только один поток может работать. В чём тогда красота тредов? Они автономны, то есть: Начинают исполнение сразу же после создания. Передают исполнение в другие потоки в местах, указанных использователем, — при том или ином вызове computer.pullSignal (os.sleep, event.pull и т. д.). Автоматически продолжают своё исполнение без необходимости самостоятельно их стартовать. Потоки можно убить и приостановить. Они неблокирующие: Вызов computer.pullSignal не блокирует исполнение других потоков. Они отцепляемые: Процесс, в котором был создан поток, называется родительским. При завершении родительского процесса все потоки останавливаются. Поток может отсоединиться от родительского процесса и работать полностью автономно — например, как слушатели событий. Поток может сменить родителя на другого. Поток сам является процессом и потому может создавать дочерние потоки. Работающий поток не даёт завершиться своему родителю. Они независимы при обработке событий: Потоки не наследуют и не передают дочерним свой набор слушателей событий. Все слушатели событий и таймеры принадлежат только конкретному потоку. Как следствие, поток не может изменять их набор в другом. Слушатели и таймеры автоматически удаляются при завершении потока, даже если завершение вызвано ошибкой. Приостановленные потоки игнорирует события. Если несколько потоков вызвали event.pull на одно и то же событие, они оба его получат. Этот набор фич в таком объёме присутствует только в этой библиотеке, и ни одна другая и не даёт столько простоты в работе с ними. Пожалуй, приступим к использованию. Потоки создаются функцией thread.create: первым аргументом передаётся функция, дальше идут аргументы к ней. local thread = require("thread") local t = thread.create(function(a, b) print("В потоке получены аргументы:", a, b) end, 21, 42) Функция возвращает объект потока. Его же может получить сам поток вызовом thread.current() — однако если вызвана не в потоке, то возвращает nil. На всякий случай, основной процесс не является потоком. Объект потока позволяет чудить различные вещи с потоком. t:suspend() приостанавливает поток. Как уже сказано, такой поток не будет получать события и обрабатывать тики таймера. Забавно, что если приостановить поток, когда он ждёт события, то неизвестно, что он получит после его возобновления. t:resume() возобновляет работу ранее приостановленного потока. Так как созданные потоки сразу начинают работу, то обычно этот метод вызывать не придётся. t:kill() убивает поток, то есть завершает его, удаляя всех слушателей и таймеры. Возобновить работу потока после того, как он убит, нельзя. t:status() возвращает строку со статусом потока: "running" — поток работает или блокирован другим. Такой поток не даёт завершиться своему родителю. "suspended" — поток приостановлен. Его дочерние потоки также будут приостановлены. Когда родительский процесс завершается, такой поток автоматически убивается. "dead" — поток мёртв. t:attach() позволяет сменить родителя у потока. Без аргумента поток будет присоединён к текущему процессу. Переданное как аргумент число позволяет указать, к кому присоединить: 0 — текущий процесс, 1 — родитель текущего и т. д. t:detach() отцепляет поток от родителя. Такой поток будет работать до его остановки или перезагрузки компьютера. t:join() останавливает процесс, в котором была вызвана это функция, до завершения потока t. local thread = require("thread") local t = thread.create(function() os.sleep(10) end) t:join() -- остановится на 10 секунд Можно передать первым аргументом этой функции число, которое будет служит таймаутом (в секундах). Тогда, если не успеет завершиться поток за это время, join завершится досрочно. t:join ждёт только одного потока. Для групп потоков есть функции thread.waitForAny и thread.waitForAll — обратите внимание, что это функции библиотеки, а не методы объекта потока. Обе функции первым аргументом требуют таблицу с потоками, а вторым опционально можно задать таймаут. thread.waitForAll ждёт, пока завершатся все потоки из списка. local thread = require("thread") local t1 = thread.create(function() os.sleep(10) end) local t2 = thread.create(function() os.sleep(15) end) thread.waitForAll({t1, t2}) print("Это сообщение будет написано через 15 секунд") thread.waitForAny ждёт, пока завершится хотя бы один поток из списка. local thread = require("thread") local t1 = thread.create(function() os.sleep(10) end) local t2 = thread.create(function() os.sleep(15) end) thread.waitForAny({t1, t2}) print("Это сообщение будет написано через 10 секунд") Что будет, если поток бросает ошибку? При ошибке в потоке она не будет проброшена в родительский процесс. Как и со слушателями, она будет записана в файл /tmp/event.log, но родитель не сможет узнать причину ошибки — и, вообще, успешно ли завершился поток. local thread = require("thread") local t = thread.create(function() os.sleep(3) error("test") end) print(t:status()) --> running t:join() print(t:status()) --> dead Кроме того, событие жёстокого прерывания (Ctrl+Alt+C) не передаётся всем процессам — только одному; причём неизвестно, какому именно: родителю или одному из его потоков. Если вы используете потоки, первым делом сделайте один, который будет ждать события interrupted и подчищать ресурсы. local thread = require("thread") local cleanupThread = thread.create(function() event.pull("interrupted") print("Принял ^C, чищу всякие ресурсы") end) local mainThread = thread.create(function() while true do local input = io.read() if input == "exit" then break end end end) thread.waitForAny({cleanupThread, mainThread}) os.exit(0) Обратите внимание, что в конце программы стоит os.exit. Я уже упоминал не раз, что родительский процесс, достигнув конца программы, не завершится до тех пор, пока работает хотя бы один из его дочерних потоков. Вызов os.exit() позволяет выйти из программы, закрыв все дочерние потоки. Что, безусловно, достаточно удобно. Есть ещё один момент. Допустим, данная программа запускается в роботе: local robot = require("robot") local thread = require("thread") local moveThread = thread.create(function() while true do robot.forward() end end) local inputThread = thread.create(function() while true do local input = io.read() if input == "exit" then break end end end) thread.waitForAny({inputThread, moveThread}) os.exit(0) Если вы запустите эту программу, то должны заметить, что вы ничего не сможете написать в роботе, хотя работает io.read. Дело в том, что функция robot.forward вызывает метод компонента, который блокирует исполнение компьютера. Пока робот двигается, на компьютере не может выполняться ни одна команда. Чтобы хоть что-то можно было вставить в строку, то поставьте после robot.forward какой-нибудь os.sleep(0) — он позволит соседнему потоку принять и обработать события. Тем не менее, строка ввода всё равно будет работать с тормозами. В подобном случае задумайтесь над тем, чтобы использовать вместо строки ввода иное средство коммуникации: редстоун, сеть, интернет-сокет. Несмотря на всё, библиотека действительно облегчает работу с потоками в OpenOS. Кроме того, очень удобно поместить все слушатели событий в один поток, чтобы они все автоматически были удалены после убийства потока. local event = require("event") thread = require("thread") local mainThread = thread.create(function() event.listen("key_down", function(evt, addr, key, code, user) print("A key has been pressed!") end) while true do print("do something") os.sleep(0.5) end end) -- событие interrupted не ловится обработчиками local intThread = thread.create(function() event.pull("interrupted") end) thread.waitForAny({mainThread, intThread}) os.exit(0) Не нужно функции сохранять в переменные и помнить, что нужно ставить event.ignore в конце программы; не требуется ребутать компьютер, если программа завершилась с ошибкой, а до отключения слушателей дело не дошло. В общем, красота.
  10. 1 балл
    Пытаюсь реализовать следующую идею: запуск OpenOS на устройстве без локального жесткого диска. Сделать это хочу так(псевдокод): Программа на EEPROM, клиент [ Связывается по связанной плате с другим компом, у которого есть жесткий диск Просит адрес компонента filesystem сообщением "component.primary" При помощи vcomponent добавляет виртуальный компонент filesystem, который является отражением удаленного hdd Каждое обращение к функциям этого компонента отправляет сообщения "component.invoke" по сети и ждет ответа Дальше обычный lua_bios ] Программа на сервере для обычной OpenOS [ Ждем сообщений Реагируем соответствующим образом component.primary=>send(адрес компонента) component.invoke=>send(результат вызова функции компонента) ] Также стоит отметить, что при работе с filesystem header файла является userdata, его нельзя сериализовать(насколько я понял), поэтому вместо передачи его по сети передается объект, который можно однозначно сопоставить хедеру на сервере: таблица вида {special = <id>} Сделал, но в результате OpenOS не грузится дальше загрузочного экрана, консоль не появляется. Подскажите, где я ошибся? Исходники: Client Server Тестировал при помощи bibi
  11. 1 балл
    Ввиду отсутствия адекватных хранилищ для жидкости на сборке эвила, чей-то вопрос о способах хранения больших объемов жидкости привел к такой весьма странной идее. Предлагаемое - цистерна емкостью до 65536 ведер жидкости, что достигается связкой цистерны из мода EnderStorage с компом. Но у оной связки есть одна существенная проблема, о которой напишу в конце поста. Концепт - цистерна настроена на некий цвет, хранит некую жидкость; если в цистерне кончается жидкость, она переключается на другой цвет, в цистерне с которым жидкость есть; если же цистерна заполняется - переключается на "пустой" цвет. Вот простая реализация, которая работает (не проверял, но должна) как на ОпенОС, так и на чистой прошивке: https://pastebin.com/2V1qY4LH В начале проги три параметра, первые два задают области частот (на каких цветах цистерна может хранить жидкость), третий - задержку меж обновлениями цистерны (проверкой и переключением на цвета). Для работы нужен комп с подключенным к нему адаптером, стоящим вплотную к цистерне. Работает согласно описаному концепту. Защиты от дурака особо не содержит, разве что ограничение диапазона частот (нижняя граница взята "с потолка", но наверняка верная, верхнюю искал бинпоиском (последняя не рантаймящая)(да, мне лень было считать кол-во цветов и возводить в куб)) Преимущества: 1. Весьма дешевая 4-блоковая цистерна емкостью в 65536 ведра (можно меньше). 2. Неужто вам первого пункта не хватило? Оная цистерна может находиться в нескольких местах сразу, а также легко перемещаема, что существенно, например, при осушении незера. Недостатки: 1. Задержка меж обновлениями. Если у вас нечто, что люто быстро забирает или заливает жидкость, скорость оного будет ограничена скоростью компа. 2. "Дребезжание" на границах. Если цистерна заполнена, она будет переключаться меж эти "заполненным" цветом и следующим "пустым", что может немного задержать доступ к жидкости (когда надо выкачать, а оно "прыгнуло" в "пустой" цвет, например). Я не придумал умного способа это отлавливать, но можно придумать внешнее средство контроля (которое в этом неопределенном случае определяет состояние), или захардкодить определенный выбор. Но текущий вариант позволяет без вспомогательных конструкций и забирать, и доливать жидкость, пусть и с небольшой задержкой. 3. Возможные приколы при использовании нескольких таких канистр на пересекающихся диапазонах (например, когда из состояния неопределенности из-за небольшого рассинхрона одна канистра ушла на следующий цвет и в нее долили, а из другой в то же время забрали, и они рассинхронизировались меж собой). Проблема: Комп не может менять частоту цистерны с алмазным замком, что делает идею неприменимой на сервере (ибо с замком оно не работает, а без замка использование приравнивается к раздаче, и вас скорее всего переедет фемидой). Однако, если вдруг подобное ограничение уберут, система наверняка будет востребованной. К синглу эта проблема по очевидным причинам не относится.
  12. 1 балл
    j это длина экспоненты в битах, i индексирует биты. ej - это очередной бит экспоненты. В Си-подобных языках нумерация выполняется в диапазоне [0..n-1] в отличие от [1..n] в Луа. Единицу на r умножать не надо, такая запись применена для наглядности: сначала получаем n-остаток исходного числа и n-остаток единицы, затем выполняем серию умножений по Монтгомери, а на последнем шаге выполняем обратное преобразование результирующего n-остатка через фиктивное умножение Монтгомери.
  13. 1 балл
    Гениальная ссылка. Предлагаю залить картинку на Imgur или куда угодно.
  14. 1 балл
    В общем писать вирусы на OC намного интересней чем на CC т.к. такой вирус может работаь на уровне EEPROM! Таких вирусов я еще не видел и не слышал про такие т.к. их не легко вычислить но я уже подумываю об написании антивируса на уровне OS и EEPROM на OpenComputers. Прошу подключиться!
  15. 1 балл
    Помните мост Рида? Ну так вот. Я тут изучаю Rust на досуге, и пишу мини проекты. Так и получился у меня... Stem Это интернет мост для OpenComputers. Что такое мост Для тех кто не знает что такое мост, и для чего он нужен: мост дает примерно такие же возможности как и linked карта. Он позволяет связать между собой компьютеры OpenComputers, где бы они не находились. Только мост реализует это через интернет карту. Однако по сравнению с linked картой есть один очень крутой плюс. Вы можете подключиться к своему OpenComputers компу не только с другого OpenComputers компа из Майнкрафта, но и из реального мира. Например с телефона. Или с вашего домашнего компьютера. Отличие от моста Рида Я немного по другому подошел к архитектуре проекта. Вместо попарного соединения, Stem реализует систему каналов. Работает это очень просто. Вы можете: 1) послать сообщение в канал X 2) подписаться на сообщения из канала X Количество подписчиков не ограничено. Количество клиентов которые могут посылать сообщения в канал тоже не ограничено. ID канала (по которому происходит подписка и отправка сообщений) служит заодно и паролем к нему. Поэтому если вы хотите создать публично доступный канал - просто опубликуйте его ID. А если хотите создать свой, приватный, канал - просто возьмите ID подлиннее и никому его не открывайте. ID - это последовательность любых байт длиной до 256. Число комбинаций (256 в степени 256) это огромное число, так что уникальных ключей хватит надолго. Пример local event = require('event') -- подключаем STEM local stem = require('stem') -- присоединяемся к серверу STEM local server = stem.connect('stem.fomalhaut.me') -- просим сервер присылать нам сообщения с канала 'my-channel-id' server:subscribe('my-channel-id') -- слушаем эвент 'stem_message' в цикле while true do local name, channel_id, message = event.pull('stem_message') if name ~= nil then print(channel_id, message) end end -- ...или регистрируем листенер event.listen('stem_message', function(_, channel_id, message) print(channel_id, message) end) -- мы можем посылать сообщение в канал -- (причем не обязательно быть подписанным на этот канал -- достаточно просто его ID) server:send('my-channel-id', 'hello there') -- просим сервер перестать присылать сообщение с канала server:unsubscribe('my-channel-id') -- полностью отключаемся от сервера STEM server:disconnect() Одновременно можно работать с несколькими серверами Stem и с любым количеством каналов. Библиотека stem.lua Библиотечку можно скачать напрямую по этой ссылке: https://gitlab.com/UnicornFreedom/stem/raw/master/stem.lua Либо установить через HPM: hpm install stem Подробная документация по командам библиотеки находится здесь. Сервер STEM Дефолтный сервер STEM запущен у меня на VPS по адресу: https://stem.fomalhaut.me/ Можете смело его использовать. Единственное, что это тестовый сервер пока. Может пропадать или менять протокол. Новости постараюсь писать сюда. Исходный код проекта находится тут: https://gitlab.com/UnicornFreedom/stem Вы можете скомпилировать его под свою систему и запустить где угодно. Настраивается сервер файлом stem.toml в корневой папке. Дефолтный конфиг может выглядеть так: [tcp] host = '127.0.0.1' port = 5733 [web] host = '127.0.0.1' port = 5780 [general] ping_interval = 60 Чтобы получить полностью свой отдельный и независимый сервер STEM, достаточно будет просто запустить бинарник, получившийся после компиляции. Не забудьте также положить в папку с бинарником папки static и templates. Они нужны для веб-интерфейса. Сервер мультипоточный, и очень производительный. Должен тянуть довольно большие объемы трафика. Но точных бенчмарков я не проводил. Если есть желающие - пишите в IRC, скооперируемся и померяем. 😃 Для того чтобы видеть логи сервера, используйте переменную окружения RUST_LOG. Например чтобы включить полное отображение всех логов: $ RUST_LOG=stem ./stem Веб-интерфейс Если перейти по ссылке на сервер STEM то вы увидите... веб-интерфейс. Веб интерфейс показывает счетчик активных каналов и сессий (клиентских подключений). Кроме того, он дает возможность подключиться к любому каналу STEM и поучаствовать в приеме-передаче сообщений прямо через сайт. Единственное ограничение - как ID канала, так и контент сообщений ограничивается тем, что можно закодировать в UTF-8. Ну вот и все Мост в принципе уже полностью работоспособен. Все идеи, пожелания, отчеты о багах пишите сюда, либо на issue трекер в репозитории. Если кто-нибудь хочет помочь с написанием клиента STEM на своём любимом языке программирования - обращайтесь ко мне в ЛС, IRC или пишите в этой теме. Написать клиент несложно - для примера можно глянуть на код библиотеки для OpenComputers. Она состоит всего из 150 строк кода. Enjoy! 😃
  16. 1 балл
    Алгоритмом умножения Монтгомери, насколько я понимаю. Прошу сразу уточнять такие детали. А то до этого мы говорили об алгоритмах выбора оптимального размера блока, и вдруг внезапно появляется "Алгоритм". Повторюсь: В твоём же коде print(mon_pro(a_n, b)). Во-первых, вторым аргументом нужно подавать не b, а также его n-остаток. Во-вторых, результат умножения требует обратного преобразования.
  17. 1 балл
    Всем привет. Это снова я - Артур представится надо обязательно!!! Я тут подумал. Можно же вить взять какой нибудь микро контроллер (не в Майне!) запустить на нём lua и сделать в этом луа как бы эмуляцию API OC. Чтобы можно было присоединить экран и другие вещи, закодить прошивку от бога и OpenOS у тебя в кармане. Это же вить гениально. Как думаете? Идея от бога или херня?
  18. 1 балл
  19. 1 балл
  20. 1 балл
    В качестве личного развлекательно-образовательно-норкоманского проекта покатит. А практической пользы ноль. Если нужен "OpenOS в кармане" - куда перспективнее сделать эмулятор для Android.
  21. 1 балл
    Угарная тема. Автор, если бы ты выбрал Java / Scala - я бы тебе помог с интеграцией эмулятора )
  22. 1 балл
    Упал, отжался, отозвался. Да, человечество уже давно мечтает о программе, которая позволит легко создавать lua скрипты. Но дальше разговоров дело не продвинулось до сих пор. Создавать lua скрипты стало даже сложнее, чем 20 лет назад. Обязательно! Но только если создавать lua скрипты в такой программе и вправду будет легко. В идеале нужно максимально упростить интерфейс. Если можно, оставить лишь две кнопки: "создать lua скрипт" и "создать графический интерфейс", а всё остальное программа должна сделать сама. Это очень бы упростило бы процесс создания lua скриптов и графических интерфейсов. Взаимно)
  23. 1 балл
    Давненько не было автокрафтеров тут. Может, кому-то пригодится моя версия. Предназначена в первую очередь для крафта всяких часто необходимых мелочей со сложными крафтами (например, компоненты OpenComputers) из примитивных исходных ресурсов (например, процессор из слитков золота и железа, тростника и редстоуна), которые у пользователя отнимают кучу времени на поиск всех транзисторов и крафт недостающих. Рассчитана на использовании робота и двух сундуков, один из которых - основное хранилище (может быть покрупнее), а другой предназначен для резервирования компонентов при крафте. Ссылка: https://pastebin.com/1gqtWLub Необходимая конфигурация робота: Проверялась работа на компонентах (корпус, память, процессор, жёсткий диск) второго уровня. Screen, Keyboard Crafting Upgrade Inventory Upgrade и Inventory Controller Видеокарта и экран первого уровня Для дальнейших потенциальных расширений: Беспроводная карта Upgrade Container Конфигурация установки: Перед роботом - контейнер ресурсов (любой из возможных инвентарей достаточного размера) Под роботом - контейнер-буфер (можно обычный сундук) Рядом желательно поставить зарядник Возможности: Рекурсивный крафт сложных рецептов. Ресурсов расходуется, по результатам практических испытаний, ровно столько, сколько необходимо. Каталог рецептов для крафта, разбитый на страницы по 10 предметов для более удобного пролистывания на маленьком экране робота. Портативность - требуется только робот, два сундука и исходные ресурсы. Желателен также источник энергии Сообщения о том, каких конкретно исходных ресурсов не хватает для крафта (исходные ресурсы - те, для которых не найдено рецепта) Процесс крафта подробно отображается на экране, чтоб за ним было не так скучно и одиноко следить (см. недостатки) Об окончании крафта робот сообщит приветливым писком. Равно как и о неудаче. Недостатки и известные недочёты: Скорость..... Крафт занимает значительное время. Например, изготовление процессора 3го уровня из примитивных ресурсов (тростник, красный камень, алмазы, дерево для резаков, слитки золота, железа) занимает около 5 минут. Стоит отметить что количество изготавливаемых предметов не сильно влияет на время (2 процессора, скорее всего, будут делаться те же примерно 5 минут). Не умеет работать с альтернативными ресурсами. Возможно, когда-нибудь исправлю. Не умеет работать с инструментами (имеются ввиду многоразовые, как молот ИК2). Возможно, так же когда-нибудь исправлю. Не умеет работать с количествами предметов более стака, а также не гарантируется корректная работа с предметами, не складывающимися в стак. Постараюсь исправить в ближайшее время. Нет поиска по именам компонентов (то есть, либо задаёте название компонента целиком, либо задаёте крафт через каталог). Когда-нибудь поправлю Проверок на наличие контейнеров не делается, так как программа писалась "для себя" и находится в разработке. В дальнейшем будут введены. Также не везде гарантируется наличие защиты от "Количество предметов: Привет". Особенности: Шаблоны содержатся в одном файле, что облегчает переносимость, но приносит определённые неудобства всвязи с размерами файла (12 строк на предмет). Буду думать, как лучше сделать (разбить на разные файлы?). Файл имеющихся шаблонов могу выложить при необходимости (на разных сборках эти шаблоны могут отличаться) Дальнейшее развитие (no promises!): Исправление имеющихся недочётов Поддержка работы по сети (заказ компонентов, сообщение о готовности - дистанционно). Работа с более сложными инвентарями - сборщики, и т.д. Работа с машинами-обработчиками ресурсов - когда-нибудь в отдалённом будущем, скорее всего. Управление: Интерфейс текстовый. Посмотреть команды главного меню можно, нажав "Enter" (оставив поле ввода пустым).
  24. 1 балл
    Не так давно решил я немного нафармить обсидиана, но прыгать по озерам лавы, тушить её водой, а потом долго и нудно собирать как-то не то. Хотелось автоматизировать этот процесс. Да есть специальные генераторы обсидиана, но там требуются расходники в виде красной пыли или другого горючего материала, что для меня было неприемлимо. Поэтому был собран первый прототип генератора обсидиана. Портатип генератора обсидианта Version 1.0 Довольно сложная но красивая конструкция. Время генерации 1 стака ~ 2 минуты 30 сек. Внешний вид: Инструкции по сборке: По времени работы меня такой результат вполне устраивал, но потом @Romanok2805 показал свою версию похожего генератора. Описывать его я не буду, поясню что смысл работы того генератора, он черпает ведром лаву из бочки, выливает её рядом с источником воды, меняет ведро на бур и разрушает обсидиан. И так по кругу. Обмозговав алгоритм его работы, был придуман улучшенный генератор обсидиана. Генератор обсидианта Version 2.0 Довольно легкая конструкция, дешевый робот. Время генерации 1 стака ~ 15 сек. Внешний вид: Инструкции по сборке: Генератор обсидиана Version 2.1 Довольно легкая конструкция, дорогой робот. Внешняя бочка не требуется. Время генерации 1 стака ~ 15 сек. Внешний вид: Инструкции по сборке: Генератор обсидиана промышленный Version 3.0 Дорогая конструкция, дорогой робот. Навешано чуть больше расчетов, в связи с чем время генерации обсидиана увеличено, но зато данный генератор может обновлять расходники. Время генерации 1 стака ~ 17 сек. Внешний вид: Инструкции по сборке: Собственно такие вот получились варианты сборки фермы обсидиана, я конечно хз зачем вам столько его потребуется, но, коль уж есть программа почему бы ею не воспользоваться. Всем удачи, копайте обсидиан быстрее, чем вам сосед P.S. Большое спасибо за демонстрацию и помощь в написании программы @Romanok2805, за информацию по багам @M_O_R_F_I_K
  25. 1 балл
    Новые солнечные апгрейды(аддон к Opencomputers) выведут роботов на совершенно новый качественный уровень. Роботы станут почти автономными и смогут работать практически неограниченное время (если, конечно, робот будет проверять время суток, видимость неба и текущий заряд и вовремя всплывать на поверхность для подзарядки) Продвинутая, гибридная, ультимейт и квантовая панели обеспечат роботов и дронов неисчерпаемой энергией. Также аддон добавляет потрясающую и невиданную до сегодняшнего дня новую фичу - зарядку своих инструментов при необходимости прямо внутри инвентаря. Позитронный мозг робота/дрона программно уже сам сможет решить, по каким электрическим цепям ему в данный момент необходимо перенаправить могучие потоки энергии - в бур, в электро-краник для гевеи или в любой другой инструмент, который у него в инвентаре, или же в Главный аккумулятор, а при необходимости и направить всю свою мощь и энергию в миллионы ГВт для колоссального удара Теслой и разрушения на кварки всей живой материи в радиусе при опасности и при обнаружении врага на радаре. "Живучесть" и автономность роботов увеличивается на порядки. Также вы можете использовать своего робота в дальних путешествиях и просто дать ему подзарядить джетпак и свои квантовые или нано трусы, если они вдруг внезапно разрядились. Некоторые солнечные апгрейды, конечно же, не дешевые в крафте, но они того стоят. Роботы, наконец-то, шагнули в квантовую эру благодаря новым источникам энергии и новому аддону. Прощайте, архаичные ванильные угольные апгрейд-чайники. Вы хорошо послужили нам, но прогресс идет вперед. Уже приближается звук ударов иридиевых буров из шахт и слышится жужжание квантовых роботов и свист дронов. Замысел, геймдизайн: Alex Java кодинг: Neo
  26. 1 балл
    Очень забавно поднимать тему 3-летней давности. Так вот, написал на обычном модеме или туннельная карта. Сервер - Клиент - Управление почти тоже самое: Тильда(Ё) - выход из программы на локальном компьютере F1 - выход из программы на удалённом компьютере F5 - обновление экрана. У сервера и клиента есть 2 параметра - tunnelMode и port. Первый параметр отвечает за использование туннельной карты(если она есть) или использование модема. (true - использовать туннельную карту/false - не использовать) Второй сам за себя говорит - за порт. (Картинка чёрно-белая, само собой) Очень важные картинки:
  27. 1 балл
    Ни для кого не секрет, что существует множество занятных софтин для работы с геосканером и вывода результата на голопроектор, очки из OpenGlasses или просто в виде сечения на экран. Мне захотелось пополнить их коллекцию программой для просмотра результата сканирования от первого лица в трехмерном пространстве. Работает детище по принципу рейкастинга и на данный момент имеет следующие фичи: Сканирование местности по указанному радиусу (до 32 блоков), сохранение и загрузка результата Примитивная мини-карта для упрощения ориентации в пространстве Кастомизация дистанции прорисовки, полей зрения игрока и уровня детализации Выбор палитры (оттенки серого или спектральная) Изменение размеров окна курсором Разумеется, оперативку оно жрет быстрее, чем репликаторы поглощали флот Гоа'Улдов, а также требует топовый ПК для работы, т.к. хранит безумное количество данных о результатах сканирования. Изначально я хотел замутить софтину для управления дроном-грифером, делающего снимки местности для упрощения воровства картошки с полей, однако по факту получилась просто занятная игрушка без какого-либо практически полезного с точки зрения выживания функционала. Поэтому хотелось бы услышать предложения по использованию подобных технологий именно в сурве. Команда для установки, чтобы пощупать ручками: pastebin run Gm8t26kd
  28. 1 балл
    Программа позволяет рисовать блоками в воздухе при помощи командного блока подключённого через адаптер или дебаг-карты. В программе есть 8 блоков которыми можно рисовать. Также при выходе все блоки удаляются. Чтобы программа работала, надо включить поддержку командного блока в конфиге мода на 543 строке: # Whether to enable the command block driver. Enabling this allows # computers to set and execute commands via command blocks next to # adapter blocks. The commands are run using OC's general fake player. enableCommandBlockDriver=true Загрузка и использование: pastebin get 060LXELq blockpaint.lua Поставьте командный блок и адаптер вот в таком положении: или просто вставьте debug-карту в ваш компьютер Запускаете программу и рисуете! Обновление Добавлена поддержка debug-карты
  29. 1 балл
    Почему сразу вещи? Может, у него режимное предприятие, и роботы будут забрасывать зараженного игрока целебными зельями до полного выздоровления.
  30. 1 балл
    Из того,что я прочитал - такой демон может отвечать,к примеру,на автоматическое монтирование дисков(ивент peripheralAdded, на сколько я помню), автоматически прогружать в глобал АПИ компонентов(что бы каждый раз не писать modem=component.modem), работать корзиной и т.п. Вобщем - может быть не только вирусом. Часики swg тоже демон,в винде его бы назвали "служба гаджета часов"
  31. 1 балл
    Ребята, давайте жить дружно! Пусть у swg2you Луа компилируется, а у NEO - интерпретируется.
  32. 1 балл
    Последняя версия программы (0.70 beta): Editor (редактор): http://pastebin.com/tdxECas7 Viewer (просмотрщик): http://pastebin.com/3TE1QGMf Изменения: Старые версии:
  33. 1 балл
  34. 0 баллов
    Здраствуйте. Я, Кирилл. Хотел бы чтобы вы сделали игру, 3Д-экшон суть такова... Пользователь может играть лесными эльфами, охраной дворца и злодеем. И если пользователь играет эльфами то эльфы в лесу, домики деревяные набигают солдаты дворца и злодеи. Можно грабить корованы... И эльфу раз лесные то сделать так что там густой лес... А движок можно поставить так что вдали деревья картинкой, когда подходиш они преобразовываются в 3-хмерные деревья. Можно покупать и т.п. возможности как в Daggerfall. И враги 3-хмерные тоже, и труп тоже 3д. Можно прыгать и т.п. Если играть за охрану дворца то надо слушаться командира, и защищать дворец от злого (имя я не придумал) и шпионов, партизанов эльфов, и ходит на набеги на когото из этих (эльфов, злого...). Ну а если за злого... то значит шпионы или партизаны эльфов иногда нападают, пользователь сам себе командир может делать что сам захочет прикажет своим войскам с ним самим напасть на дворец и пойдет в атаку. Всего в игре 4 зоны. Т.е. карта и на ней есть 4 зоны, 1 - зона людей (нейтрал), 2- зона императора (где дворец), 3-зона эльфов, 4 - зона злого... (в горах, там есть старый форт...) Так же чтобы в игре могли не только убить но и отрубить руку и если пользователя не вылечат то он умрет, так же выколоть глаз но пользователь может не умереть а просто пол экрана не видеть, или достать или купить протез, если ногу тоже либо умреш либо будеш ползать либо на коляске котаться, или самое хорошее... поставить протез. Сохранятся можно... P.S. Я джва года хочу такую игру.
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...