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

Поиск по сайту

Результаты поиска по тегам 'OpenComputers'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Блоги

  • Робот Байт
  • Fingercomp's Playground
  • 1Ridav' - блог
  • Totoro Cookies
  • Блог cyber01
  • IncluderWorld
  • KelLiN' - блог
  • Крутой блог
  • eutomatic blog
  • Programist135 Soft
  • Сайт в сети OpenNet
  • PieLand
  • Очумелые ручки
  • Блог недоблоггера
  • В мире Майнкрафт
  • LaineBlog
  • Квантовый блог
  • Блог qwertyMAN'а
  • some blog name
  • Дача Игоря
  • Путешествия Xytabich'а
  • Рецепты программирования
  • Шкодим по крупному
  • 123

Форумы

  • Программирование
    • Программы
    • База знаний
    • Разработчикам
    • Вопросы
  • Игровой раздел
    • Игровые серверы
    • Моды и плагины
    • Жалобы
    • Ивенты и конкурсы
    • Файлы
  • Общение
    • Задать вопрос
    • Обратная связь
    • Беседка
    • Шкатулка
  • Технический раздел
    • Корзина

Группы продуктов

Нет результатов для отображения.


Искать результаты в...

Искать результаты, которые...


Дата создания

  • Начать

    Конец


Последнее обновление

  • Начать

    Конец


Фильтр по количеству...

Зарегистрирован

  • Начать

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


ВКонтакте


Gtalk


Facebook


Twitter


Город


Интересы

Найдено 270 результатов

  1. Оказывается, Сангар на днях работал над новой версией ОС https://github.com/fnuecke/oc2 O_o
  2. Решил я как-то поискать методы оптимизации кода для ОпенКомпов, и Луа в целом. Но на форуме, вроде, я не нашел тему, где в одном месте сконцентрированы вещи, помогающие в оптимизации. Разве что нашел одну ветку, на заморском форуме, вот ее компиляция/перевод/адаптация/дополнение: (за помощь в переводе, спасибо KoshakLol и Google Translate) # Место в памяти Вот таблица, где есть, сколько что занимает в памяти: boolean, number и string занимают 9 байт. Указатель на функцию, или на таблицу, тоже 9 байт. Пустая функция (function() end) занимает 93 байт, пустая функция с return (function() return true end) занимает 102 байт. Пустая таблица занимает 36 байт, плюс за каждую степень двойки (2^n) еще дополнительно: 9 байт для 0-1 элементов в таблице 18 байт для 2 элементов в таблице 36 байт для 3-4 элементов в таблице 71 байт для 5-8 элементов в таблице 142 байт для 9-16 элементов в таблице 284 байт для 17-32 элементов в таблице 569 байт для 33-64 элементов в таблице и т.д. И, кстати, таблицы не сжимаются, то есть если туда запихать 1000 элементов, а потом удалить их, то весить она будет, как будто в ней все еще 1000 элементов # Сборка мусора Автоматический сборщик мусора в опенкомпах вроде бы отключен, и вызывается только через os.sleep(0), и то не гарантированно, так что разработчик мода советует его вызывать 10 раз подряд, чтоб уж точно И еще, автоматический сборщик чистит ТОЛЬКО локальные переменные # Советы сомнительной эффективности (от них я не засек прироста) Убрать из кода деление, потому что оно, якобы, медленнее, чем умножение (условно:) local a = n / 4 --> local a = n * 0.25 Заменить все условные операторы, на логические тернарные операторы, где это возможно (условно:) if (a > b) then c = a else c = b end --> c = (a > b) and a or b (Если вы не поняли, что сейчас вообще было, то в этой теме все расписано) Менять переменные местами, без буфера (Lua 5.3+) local a = 174 local b = 3 a = a ~ b b = a ~ b a = a ~ b print(a) --> 3 print(b) --> 174 (Если вы не поняли, что сейчас вообще было, то ищите битовую операцию XOR) Этот совет дает хотя бы небольшой прирост, из-за того, что нет лишний переменной, но этот плюс нивелируется, если ее удалить # В итоге Не используйте рекурсию функций, а если совсем приспичило, то почаще вставляйте сбор мусора Не используйте замыкания (это когда функция возвращает другую функцию) Старайтесь не использовать таблицы, вместо них лучше делать так: local coords = {x = 10, y = 20, z = 370} -- (72 байта) --> local x = 10 local y = 20 local z = 370 -- (27 байт) -- или вообще local xyz = 010020370 -- (9 байт) print("z = ", xyz // 1000000, "\ny = " , xyz // 1000 % 1000, "\nz = ", xyz % 1000) -- (Если вы не поняли, что сейчас вообще было, то ищите деление с остатком) Старайтесь не использовать не-локальные переменные, так как они бьют по архитектуре программы, и их не собирает гарбадж коллектор # P.S В данной заметке рассматривалась только сторона оптимизации кода, определенный код может отвратительно выглядеть, но работать быстро, и наоборот, в реальных программах лучше соблюдать баланс, между красотой, и быстродействием, в какой-нибудь программе для EEPROM'a, допустим, вообще о красоте кода не идет и речи Ну это в целом все, что я хотел рассказать, если есть исправления/уточнения/дополнения/свои_идеи, то милости прошу в комментарии
  3. Одного диска второро уровня не хватает и хочу управлять домом на расстоянии. Как можно такое сделать?
  4. Контроллер реактора IC2 Принцип работы: При включении программа подаёт питания на реактор при помощи красного контроллера и с помощью адаптера считывает информацию с реакторной камеры затем выводит показания на экран и в случае перегрева отключает реактор. Когда температура теплоёмкость реактора вернётся к допустимым значениям он опять включится. Pastebin - https://pastebin.com/dqEmUsfx pastebin get dqEmUsfx your_name.lua Что требуется для роботы: Системный блок 3 лвл Видеокарта 3 лвл Процессор 1 лвл и выше Интернет карта (для загрузки программы через Pastebin) ОЗУ 256кб и выше Монитор 3 лвл Адаптер Красный контроллер Реактор из IC2 Реакторная камера из IC2 Преобразователь енергии (для питания пк от реактора) Рычаг (для первого запуска реактора, затем надо выключить или сломать) Схема подключения и робота: Планы на будущие: Оптимизация кода - на начальной стадии Добавить поддержку мониторов 2-го лвл Добавить автоотключение реактора при выходе из програмы Добавить кнопки управления (вкл/выкл реактора) Добавить статус стержней Улучшить интерфейс Что готово уже: Включение реактора при запуске программы Отключение во время перегрева Включение реактора после возврата теплоёмкости к допустимым значениям P. S. Это моя первая программа на lua под OC так что не обессудьте. Буду рад любым исправлениям и замечаниям.
  5. Помните мост Рида? Ну так вот. Я тут изучаю 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! 😃
  6. На форуме в последнее время начали появляться темы с сетевыми библиотеками и браузерами. Продолжу это движение (да, скоро и мой браузер будет). Итак, представляю вам ThunderNet! Кстати, анонс уже был: вот это сообщение как раз рассказывало про пришествие ThunderNet. ThunderNet - это сеть, позволяющая объединить множество компьютеров OC, даже на разных серверах. По топологии это (почти) дерево, при этом корнем может быть любой компьютер. Уровней может быть любое количество. Компьютеры взаимодействуют по некоторому каналу: сетевая/соединённая карта/красный камень/Stem/звёздные врата и т.д. Идентификация происходит при помощи MUID (Minecraft-Unique IDentifiers): кодов, уникальных для каждого запуска на каждом компьютере OC. Спецификация протокола: 1. Подключение к сети: — WTC <uid> (Want-To-Connect) Ближайшие компьютеры запоминают этого соседа и отвечают (или не отвечают) — CAC <uid> <level> (Can-Accept-Connection) (level - глубина дерева от корня до отвечающего компьютера); Подключаемый компьютер подтверждает соединение: — AC <uid> (Accept-Connection) Отвечающий компьютер ("родитель") отправляет сообщение до корня: — UCA <uid> (Underlying-Connection-Accepted) Все компьютеры от корня до отвечающего запоминают, в каком направлении посылать сообщение новому. 2. Пересылка сообщений: — RM <message> <target-uid> (Retranslate-Message) Компьютер, получивший такое сообщение, должен: 1) Если он знает путь до <target-uid>, переслать этот пакет по пути. 2) Если он не знает путь и не является корнем, отправить этот пакет родителю. 3) Если он не знает путь и является корнем, забыть это сообщение (потому что куда его отправить? некуда.) При получении сообщения с target-uid, равным uid текущего компьютера, библиотека вызывает событие: thunderlib_incoming <message> 3. Отключение от сети: — DC <disconnected-uid> Компьютеры выше по дереву забывают путь до указанного компьютера и его потомков. Моя реализация этого протокола: Библиотека сейчас состоит из трёх файлов: th_inform.lua, thlib.lua и th_interfaces.lua. Для работы их надо сложить в ту папку, откуда будет запускаться программа. Важное замечание: все методы Thunderlib являются синхронными, т.е. блокируют вызывающий поток! В некоторых функциях есть параметр is_timeout, который завершает выполнение, когда функция возвращает true. Документация по методам: thunderlib.connect([is_timeout]) - подключение к ThunderNet thunderlib.disconnect() - отключение Отключение после использования крайне рекомендовано! В противном случае у компьютеров выше в иерархии может кончиться память. thunderlib.send(<address>,<data>) - посылка сообщения заданному компьютеру по его MUID thunderlib.run_server([is_timeout[, allow_connections]]) - запуск сервера ThunderNet Сервер нужен для приёма входящих подключений и обнаружения соседних компьютеров. thunderlib.uid() - возвращает MUID текущего компьютера thunderlib.parent_node() - возвращает MUID родительского компьютера
  7. Возможно ли исполнение команд из маинкрафт при помощи робота?
  8. Здравствуйте, не знаю в чём проблема, во мне, или в моде. Есть биг улей, подключил его к ОС через адаптер. Посадил туда в 1 слот принцесску. Вызвал интерпретатор, пишу: =component.items.getAllStacks(0) Ответ: {} Думаю ладно, пойду иначе: =component.items.getStackInSlot(1) Ответ: nil "slot id (1) must be less than 1" Подумал вообще безумие, но как скажете, пишу: =component.items.getStackInSlot(0) Ответ: nil "slot id (0) must be at least 1" Было бы смешно, если бы не было так грустно...) С другими ульями всё в порядке, эти, просто так, начали вот так меня дразнить. Подскажите, пожалуйста, в чём может быть причина?
  9. В моде OpenComputers есть интересное устройство, которое позволяет определить плотность блока на расстоянии. Но вот беда, данные он выдает довольно шумные и чем больше расстояние, тем больше шума. Чтобы определить подлинную плотность блока, можно просканировать его несколько раз, а результат усреднить. Шум, мешающий сканированию, имеет вероятностную природу. И после нескольких сканирований можно статистически найти, какая вероятней всего плотность у блока. За один тик мы можем просканировать 64 блока. Чтобы проанализировать всю доступную область (65 x 65 x 64) сотней итераций, нам понадобится 422500 тиков, что равно 21125 секунд или 352 минуты, то есть без малого 6 часов. Но сколько раз надо сканировать? Сто? Тысячу? Нам открыто тайное знание и есть точный ответ. Один. Всего за одно сканирование мы можем найти руду среди любых других блоков. Если хочется абсолютной уверенности, придется сделать пару магических пассов и просканировать повторно. Начнем с теории. Для начала откроем код мода и найдем функцию geolyzer.scan, она располагается [здесь] src/main/scala/li/cil/oc/integration/vanilla/EventHandlerVanilla.scala и называется onGeolyzerScan() Просмотрев код, мы можем понять, что функция принимает параметры, по этим параметрам сканирует блоки в мире. Делает разные проверки вроде world.blockExists(x, y, z) && !world.isAirBlock(x, y, z), чтобы убедится, что блок есть. Потом получает информацию о блоке по координатам, делает еще несколько проверок (опять проверить, что блок все-таки есть block != null, проверяет дополнительные параметры: includeReplaceable, isFluid(block), block.isReplaceable(world, blockPos.x, blockPos.y, blockPos.z)) Потом происходит измерение расстояния до блока. И в конце берется плотность, смешивается с шумом и расстоянием. Результат добавляется к таблице блоков и отправляется игроку. Вроде-бы ничего необычного. Шум, расстояние, плотность. Нам и так известна зависимость силы шума от расстояния. И вот тут начинается волшебство. Рассмотрим поподробнее код вычисления итоговой плотности блока. e.data(index) = e.data(index) * distance * Settings.get.geolyzerNoise + block.getBlockHardness(world, x, y, z) Коротко можно это записать в виде формулы: R = G * D * N + H G - это сгенерированный шум. D - расстояние до блока. N - множитель шума из конфига (стандартно - 2). H - настоящая плотность. R - результат работы геосканера. Если мы попробуем в качестве эксперимента отнять от результата предполагаемую плотность, то ничего нового не узнаем. Если обратим все операции с известными значениями, то получим только шум. А можем ли мы так же разобрать формулу шума? Давайте попробуем. Несколькими строками выше [ссылка]. Можно наблюдать получение массива случайных байт. val noise = new Array[Byte](e.data.length) world.rand.nextBytes(noise) Далее следует нормализация значений. noise.map(_ / 128f / 33f).copyToArray(e.data) Хм. Так-так-так. Если мы это все обьеденим с предыдущей формулой, то получится что-то вроде такого: R = G(RANDOM_BYTE / 128 / 33) * D * N + H И что это нам дает? А то, что исходное псевдослучайное число имеет жесткую дискретность. ГПСЧ дает случайные числа типа byte, а это только 256 значений (-128, +127). Нам известны все значения, кроме H и RANDOM_BYTE, что нам это дает? Мы можем предположить значение H и обратить всю формулу. (R - H) / D / N * 128 * 33 Для стандартного конфига можно сократить до: 2112 * (R - H) / D А теперь тайное знание для тех, кто не понял самостоятельно. Мы взяли желаемую плотность блока (например 3 для руды). Подставили вместо H. Получили случайное значение. Можем легко определить, угадали ли плотность или нет. Из-за дискретности случайных значений генератора, распределение вероятностей для блоков с разной плотностью не одинаковое. Перейдем к практике. Вот код простого скрипта, который в заданном радиусе ищет блоки с нужной плотностью. Результат выводится на голопроектор. local sqrt = math.sqrt local component = require('component') local geolyzer = component.geolyzer local hologram = component.hologram local function distance(x, y, z) return sqrt(x^2 + y^2 + z^2) end local function magic(R, H, D) return 2112 * (R - H) / D % 1 end local function visualize(hardness, elevation, size) hologram.clear() hologram.setScale(9) local blocks, result for x = -size, size do for z = -size, size do blocks = geolyzer.scan(x, z, elevation, 1, 1, 32) for i_y = 1, 32 do result = magic(blocks[i_y], hardness, distance(x, i_y+elevation-1, z)) if blocks[i_y] ~= 0 and (result > 0.9998 or result < 0.00005) then hologram.set(x+24, i_y, z+24, true) end end end end end local hrd, ele, siz = table.unpack({...}) hrd = hrd or 3 ele = ele or -32 siz = siz or 16 visualize(hrd, ele, siz) А вот результат: При сканировании заметны артефакты. Когда разные плотности близки на целочисленных расстояниях, позникают коллизии. Это можно частично компенсировать, если есть блок кандидат на ошибку. На любом расстоянии можно рассчитать абсолютный минимальный и максимальный уровень шума. С расстоянием, у близких плотностей пересечение значений увеличивается, но если плотность блока не в области пересечений, то можно точно определить к какой области он относится. Пересечение плотностей руды (3) и камня (1.5), точками обозначены три сканирования блока руды. Результаты обратного вычисления для разных плотностей хорошо это демонстрируют. Для компенсации артефактов надо ввести дополнительное условие: полученный RANDOM_BYTE должен быть в диапазоне -128:127. Вот финальный скрипт и результат. local sqrt = math.sqrt local component = require('component') local geolyzer = component.geolyzer local hologram = component.hologram local function distance(x, y, z) return sqrt(x^2 + y^2 + z^2) end local function magic(R, H, D) return 2112 * (R - H) / D end local function visualize(hardness, elevation, size) hologram.clear() hologram.setScale(9) local blocks, result for x = -size, size do for z = -size, size do blocks = geolyzer.scan(x, z, elevation, 1, 1, 32) for i_y = 1, 32 do result = magic(blocks[i_y], hardness, distance(x, i_y+elevation-1, z)) if blocks[i_y] ~= 0 and result > -128 and result < 127 and (result%1 > 0.9998 or result%1 < 0.0002) then hologram.set(x+24, i_y, z+24, true) end end end end end local hrd, ele, siz = table.unpack({...}) hrd = hrd or 3 ele = ele or -32 siz = siz or 16 visualize(hrd, ele, siz) Для более точного определения плотности можно сделать два сканирования. Одно сместить относительно другого так, чтобы расстояния с артефактами не совпадали. Чтобы не выполнять тяжелую операцию sqrt, можно создать словарь, где [x^2 + y^2 + z^2] = sqrt(x^2 + y^2 + z^2), всего понадобится 1742 уникальных значений. P.S. Пост является компиляцией знаний из [этой] темы. Собрал, чтобы перевести и опубликовать на официальном форуме. Автор идеи хакнуть геосканер - @eu_tomat
  10. Я вас категорически приветствую, товарищи форумчане и случайные посетители! Ваше внимания представляю свою реализацию UNIX программы diff, а именно 1 из ее использований: diff -u file_old file_new > file.diff Моя программа выдает такие же валидные диффы, которые может спокойно использовать UNIX'овый patch. (Я проверял ). Единственное, я из универсального формата выкинул общие строки, поскольку они не мешают работе patch. Собственно сам код находится тут. Скачать: pastebin get VAJeuBBQ diff.lua Запускать программу можно таким образом: diff file1 file2 file.diff (расширение .diff можно как указывать явно, так и опускать его, программа сама добавит, если будет нужно). В планах следующее: Написать свою версию patch, поскольку то решение, которое я нашел не очень то работает. Его сырцы тут. После написания patch - начать пилить свой git с блэкджеком и шлюхами =) Т.к все для этого уже будет готово (patch и diff). Отдельную благодарность хочу выразить @PandaDoddo за то, что помог в написании кода! Оставляю программу на ваша обсуждение, здоровая критика приветствуются. Если возникнут вопросы, задавайте их в этой теме, или же меня можно найти в нашем чате в IRC или же в нашей группе в Discord. В Discord так же есть мост в IRC. Скрины:
  11. Недавно возникла проблема с тем, что понадобилось быстро загружать репозитории с несколькими файлами + я хотел поиграться с реквестами. Решение воспроизвелось в виде Ziphyr (или зефира) - работающий на апи гитхаба (сори юзеры гитлаба) аналог git. Утилита нужна для обновления и скачивания целого репозитория, так как для остального уже существуют OPPM или wget сырых файлов с гитхаба. При клоне рекурсивная функция проверяет весь репозиторий и скачивает по очереди файлы, сохраняя их хэши. А при нужде пулла прога сверяет хэши и загружает последние версии файла. Работает с пробелами, так что люди, ставящие пробелы в названии .app тоже не помеха. # Текущие функции 1. Клонирование репозиториев по веткам/тегам/коммитам 2. Пулл репозиториев # Будущие функции (расположены по возрастанию даты реализации) 1. Пуш репозиториев 2. Диффы между версиями файла 3. Мультитрединг 4. Поддержка гитлаба # Установка: pastebin run 1BNSnN2X В бандле идет скрипт env, который упрощает создание переменных среды, а также библиотеки json и sha1 # Использование: ziphyr clone KoshakLoL/Ziphyr - клон репозитория в [ТЕКУЩАЯ_ПАПКА]/[НАЗВАНИЕ_РЕПОЗИТОРИЯ] ziphyr clone -d KoshakLoL/Ziphyr - клон реопозитория в [ТЕКУЩАЯ_ПАПКА] ziphyr clone --dir=[КАКАЯ-ТО ПАПКА] KoshakLoL/Ziphyr - клон реопозитория в [КАКАЯ-ТО ПАПКА] ziphyr clone --ver=[ТЭГ/РЕЛИЗ/КОММИТ] KoshakLoL/Ziphyr - клон репозитория в [ТЕКУЩАЯ_ПАПКА]/[НАЗВАНИЕ_РЕПОЗИТОРИЯ] с какой-либо версией ziphyr pull [КАКАЯ-ТО ПАПКА] - для пулла репозитория, содержащегося в [КАКАЯ-ТО ПАПКА] Все остальное (включая лицензию) можно найти на соответствующем репозитории (программа находится в еще очень ранней версии, с говнокодером в размере одного человека, так что... не судите строго) (за частичную реализацию директорий спасибо MrAbad)
  12. У меня есть функция, которая создаёт progressbar: function progressbar(value, x, y, text, update) Если использовать один progressbar, то всё работает. Но если создать два progressbar'a, то новые значения объявляются только на втором progressbar'e в цикле. Без цикла вроде всё нормально работает. Почему так происходит? Кусок кода: local p_energy = progressbar(value_energy, 15, 25, energy_reactor, 0) local p_heat = progressbar(value_heat, 15, 50, heat_reactor, 0) while i < 1 do //... p_energy = progressbar(value_energy, 15, 25, energy_reactor, 1) p_heat = progressbar(value_heat, 15, 50, heat_reactor, 1) //... end
  13. Почти с месяц назад я представил во флудилке пару скриншотов разрабатываемого мной браузера и приличному количеству людей оно тогда понравилось. Поэтому сегодня, спустя пол года кодинга, нескольких переходов с одного движка на другой и кучи потраченных нервов я могу наконец представить его вам. Знакомьтесь, Memphisto. Примите во внимание, что браузер находится в тестовой стадии, еще предстоит сделать много всего, поэтому возможно наличие неприятных багов (два глаза все не отловят). Основные характеристики: Используется движок NyaDraw, который является портом движка Screen из MineOS. Поэтому браузер весьма быстро (для таких ПК) отрисовывает и прокручивает страницы. Для страниц используется язык NFPL, специально разработанный с учетом особенностей OpenComputers. Поддержка гиперссылок, загрузочных ссылок, рисование векторной графикой и многое другое. Поддержка картинок формата OCIF5 и OCIF6. А так же их использование в качестве графических ссылок. Возможность просматривать страницы оффлайн, то есть с жесткого диска (полезно при написании страниц). Для поднятия своего сайта достаточно обычного HTTP(S) сервера. Системные требования: Минимальные: Процессор: Уровень 1. Видеокарта: Уровень 2. ОЗУ: 768Кб. Жесткий диск: не меньше 42Кб свободного места. Интернет карта Рекомендуемые: Процессор: Уровень 3. Видеокарта: Уровень 3. ОЗУ: 1Мб или больше. Жесткий диск: не меньше 42Кб свободного места. Интернет карта Скачать: pastebin run EUZQRkwF Репозиторий на GitHub Полезное: Руководство по языку NFPL (Network Formatted Page Language). Первый NFPL сайт - bs0dd.github.io (запущен в тестовом режиме). Руководство по графическому движку NyaDraw. Увы, одного человека слишком мало для реализации задуманного, поэтому ищутся люди, хорошо понимающие в Lua, которые смогут помочь в устранении багов и расширении функционала как языка NFPL так и браузера для него.
  14. Очередная сеть на OpenComputers модемах. Децентрализованная, одноранговая, как Zn, только лучше. Каждый узел сети видит все остальные и может отправить/принять сообщение на любом расстоянии. Отличия от сети Zn: Динамическая маршрутизация. Zn затапливает все узлы каждым сообщением. Moonlink же передает сообщение по самому короткому пути и никто, кроме промежуточных узлов, сообщение не видит. При изменении топологии сети, маршруты перестраиваются. Можно передавать больше одной строки за раз. Установка: wget https://raw.githubusercontent.com/OpenPrograms/zgyr-Programs/master/moonlink/moonlink.lua /usr/lib/moonlink.lua или через oppm oppm register OpenPrograms/zgyr-Programs oppm install moonlink Функции: connect([порт: number]) подключиться к сети, стандартный порт 8431, можно задать свой. disconnect() отключиться от сети. send(адрес: string, ...) послать сообщение узлу с указанным адресом. ping() принудительный пинг соседей (запрос маршрутов у соседних узлов). list():table получить список доступных узлов в сети. Событие только одно: moonlink_message(receiver_addr: string, ...) адрес получателя и сообщение. Пример использования: local event = require('event') local moonlink = require('moonlink') moonlink.connect() while true do local _, address, message = event.pull('moonlink_message') if message == 'bye' then break else print(message) end end moonlink.disconnect()
  15. Здрассьте, господа, у нас тут превесёлая вещь случилась: спустя полгода разработки (причём круглым числом; 28 мая стартанули) у нас отрелизился репозиторий! Обозвали мы его Hel. В репозитории мы собрали и воплотили в жизнь все хорошие идеи и концепции, которые обсуждались здесь, чтобы получился максимально кавайный способ дистрибуции пакетов. Пользоваться репозиторием не сложнее, чем ставить программы с Pastebin. Для этого нужно знать только название пакета. Одна команда: $ hpm install <нужный пакет> И вуаля! Он уже установлен в нужную папку, все нужные библиотеки загружены и распиханы по системе. Можно запускать и работать. Но по сравнению с OPPM или Pastebin, hel несравненно удобнее. Он легковесный. Простой. Не требует регистрации. И СМС. Чем мы гордимся, безусловно. Установка программ производится с помощью одного легкого клиента (как у Pastebin), но в то же самое время, вам не нужно волноваться о библиотеках или версиях программы. Вы всегда можете найти и установить самую свежую версию (и даже не самую свежую), зная только название пакета (как в OPPM). Кстати, раз уж мы заговорили про OPPM. У нас клиент получился настолько охренительным, что вы можете теперь выкинуть oppm в помойку, наконец-то! В стандартный комплект поставки включён oppm-модуль с кэшированием (иными словами, вам не нужно будет ждать пару минут, пока пробрутфорсятся репозитории, сразу всё качается). Всё быстро, чётко, ясно. Юзается оно так: $ hpm oppm:install <имя пакета> Об остальных фичах читайте уже в мануале hpm, там всё есть.
  16. Приветствую всех физиков-ядершиков и просто тех, кто мимо проходил! Наверняка многие из вас ставили в подвале дома несколько ядерных реакторов из мода IC2. И конечно-же на своей шкуре ощущали какого находиться в комнате с ними. Вечные пожары, радиация так и лезет из всех щелей, провода кусаются от перегрузок... Короче жуть да и только, хочется забетонировать их и забыть. Но возникает вопрос, а как-же управлять ими? Вот тут-то вам и пригодится моя программа по мультиконтролю. Для начала разберем что нам надо для её работы. Компьютер/сервер любой конфигурации (2 шт), с предустановленной OpenOS, беспроводной платой (Т2), и интернет платой для установки Реактор/ы (от 1 до 20) Адаптер и Контроллер красного камня (по 1 шт на реактор) Индикатор, лампа, что угодно, что умеет по редстоуну светиться Приступаем к установке оборудования на реактор. Ставить адаптеры можете как хотите, 1 адаптер на 1 реактор или 1 адаптер на 2 реактора, это неважно. Главное устанавливайте адаптеры так, чтоб он присоединялся к реактору только 1 стороной. Контроллер ставить можно как угодно, главное сами при настройке со сторонами не запутайтесь. Ну а где спрятать компьютер, сами думаю решите. Примеры расположения на картинке. Самые внимательные наверняка заметили лампы. Они нужны только для настройки порядкового номера реактора и не более. После настройки можно спокойно их демонтировать. Сделано так, чтоб не лазить по куче реакторов и не прислушиваться, какой же запустился. Переходим теперь к компьютеру - контроллеру, это тот который стоит у реактров и отслеживает их показатели. Запускаем и скачиваем следующие файлы: pastebin get iSSt1T59 setting_reactor.lua pastebin get Db76AbMg reactor_control.lua Естественно настройка реакторов начнется с файла setting_reactor. Запускаем его, и проходим все этапы настройки, там ничего сложного нет. Вырубаем все реакторы, указываем с какой стороны контроллеру подавать редстоун сигнал, и далее просто глядя на индикаторы выставляете порядковый номер реакторов. В конце укажите номер диапазона, чтоб программа могла связаться с управляющей программой. По окончании настройки запускаем программу reactor_control и бежим быстренько ко второму компьютеру. Тут все аналогично, но качать меньше: pastebin get FTgh6qRb reactor_desk.lua Запускаем, вас попросят при первом запуске указать номер диапазона для связи, надеюсь вы его помните. И на этом установка программы завершена. Экран автоматически подстроится под то количество реакторов, которое у вас есть. Как подгоняется экран можете видеть на gif Управлять реакторами просто, нажмите на тот, который вы хотите включить/выключить и через секунду он запустится/отключится. На кнопках показывается основная информация, номер реактора, его нагрев, и выход энергии. Надеюсь данная программа будет для вас полезна, а с вами был Asior. И большое спасибо за идею программы @Flays Для игроков minecraft 1.12.2 (Mihis) Убедитесь, что до выполнения setting_reactor реактор полностью охлажден (Heat: 0%). А так же при подаче редстоун сигнала реактор должен нагреваться или вырабатывать энергию. # Версия на minecraft 1.7.10 + OpenPeripheral pastebin get iSSt1T59 setting_reactor.lua pastebin get Db76AbMg reactor_control.lua # Версия на minecraft 1.12.2 pastebin get eXrfVEX9 setting_reactor.lua pastebin get QX1QXCYK reactor_control.lua P.S. Говорят если долго сидеть на реакторе, вырастет интересная мутация.
  17. У многих новичков возникает вопрос - где писать код для OpenComputers? Кто-то советует VS, кто-то сторонник IDEA, кому-то по душе Atom, а кто-то вообще пишет код сразу в игре. Я решил пополнить этот список вариантов собственным решением. Вашему вниманию представляется интегрированная среда разработки (ИСР) под OpenComputers - OCLIDE. Проект находится на стадии публичного альфа-тестирования, поэтому критика приветствуется. На данный момент в ИСР присутствуют: - Подсветка Lua-синтаксиса - Система проектов - Интеграция с OCEmu (OpenOS 1.7.5) - Поддержка Windows 10 и Ubuntu 20.04 В планах на будущее: - Автодополнение кода - Добавление эмулятора на базе Ocelot Brain - Адаптация кода для работы на Mac - Опции настройки цветовой палитры редактора и используемого стандарта Lua - Поддержка сторонних переводов приложения Ссылка на проект: https://github.com/Vladg24YT/Oclide/ (ветка master - стабильная, ветка oclide-rc1 - indev сборки) Прога весит ~25 Мб, потребляет 167 Мб ОЗУ. Скриншот:
  18. Останавливает ли выполнение программы component.drone.move?
  19. Хочу зделать запрос через консоль как так зделать?
  20. Я хочу сделать чтобы "Hello World" писалось красным. Как сделать?
  21. Для тех, кто спешит: Потестировать онлайн: https://ocelot.fomalhaut.me/ Скачать на комп и потестировать: Ocelot Desktop На форуме давно мелькают упоминания 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. Стандартная комбинация юзается браузером для закрытия вкладок - и переопределить её нельзя по соображениям безопасности. * Вместо OpenOS EEPROM используется Advanced Loader. Это сделано для удобства и наглядности. * Не работает лок на пользователя - по понятным причинам. Ocelot Online должен так же работать на смартфонах. Однако возможно придется отключить T9 - он портит эвенты клавиатуры. В разработке находится более сложная версия, где все получат возможность зарегистрировать аккаунт и создавать личные проекты любой конфигурации. Но это дело будущего. Ocelot Desktop Это классический вариант эмулятора Ocelot в виде программы, которую можно скачать и запустить на любой операционной системе, где есть Java. Построен на Ocelot Brain и библиотеке LWJGL (как и сам майнкрафт). Разработкой занимается товарищ @LeshaInc. Протестировать проект, сообщить о багах и поддержать разработчиков можно в топике Ocelot Desktop: Альфа-тест Итак, дорогие пользователи, пишите ваши хотелки, сообщайте о багах, обо всем что работает не так как должно, и как в оригинальном OC. Я, со своей стороны, постараюсь проект не забрасывать, развивать и своевременно (или не очень) обновлять. Благодарности Над проектом также работали: @LeshaInc, @Laine_prikol, @Fingercomp и @MeXaN1cK. За что им огромное спасибо и респект. Не забудем также всех, кто помогал с альфа-тестированием, Сангара - за чудесный мод, и мейнтейнеров OpenComputers за то что его не забросили. Enjoy!
  22. Привт, есть проблема нужно загрузить файл "base.txt" на (сайт). Вопрос как загрузить файл?
  23. OpenFTP Иногда нужно скачать большое количество файлов с FTP сервера. Это затруднительно, когда дело доходит до OpenComputers, потому что FTP клиента попросту нет. Приходится изощряться, заливать файлы на HTTP сервер, pastebin или вовсе вставлять их из буфера обмена. И все было бы хорошо, если бы были эти способы удобными. Потому написал я FTP клиент для OpenComputers. Название ему — OpenFTP. Он поддерживает большинство функций, как и старшие братья OpenFTP, такие как FileZilla и bsd FTP. Интерфейс схож с таковым из bsd FTP. Приятная командная строка, команды похожи на *NIX команды, например rm, ls, rename, mkdir. Скорость для OpenComputers бомбезная. Почти 50 кб в секунду на чтение, и в 10 раз больше на запись. Учитывая вместимость дисков, это очень хорошие показатели. Скачать: pastebin get UPcwLA9ep /bin/ftp.lua Для подключения к серверу набираем ftp <хост сервера> [порт сервера (по умолчанию 21)]. После этого OpenFTP попросит имя пользователя и пароль. Увидели ftp> — соединение успешно налажено. Теперь мы можем писать команды для общения с сервером. Команды cd <путь> — перейти в директорию по указанному пути. Работает аналогично таковой в OpenOS оболочке. .. — перейти в директорию-родитель. Результат будет таким же, как в cd ... Например, если мы были в директории /home/peter/programs, после применения команды мы окажемся в директории /home/peter. pwd — указывает директорию в которой мы находимся. ls [-s] [путь] — указывает список файлов в указанной директории (по умолчанию — текущая директория). Флаг -s применяется в том случае, если мы хотим неполный вывод, без полезной информации вроде даты изменения и автора. rm [-d] <путь> — удаляет файл или папку. Если мы хотим удалить папку, добавляем ключик -d. mkdir <путь> — создать новую директорию по указанному пути. rename <было> <стало> — переименовать файл или директорию. После выполнения команды, если все пройдет успешно, было сменится на стало. Алиас: rn. ascii — переходит в ASCII режим передачи файлов. Использовать не рекомендуется, т.к. возможны последующие искажения файлов. binary — переходит в бинарный режим передачи файлов. Рекомендуется использовать именно его, таким образом абсолютно все символы передадутся без потерь. По умолчанию, к слову, используется именно он. Ох, и самое главное: get <путь до файла на сервере> [путь до файла на клиенте] — скачивает указанный файл с сервера. put <путь до файла на клиенте> [путь до файла на сервере] — загружает указанный файл на сервер. nop — команда которая ничего не сделает. (не шучу, в FTP протоколе правда есть команда такая, правда называется она NOOP = No Operation) У каждой команды есть также флаг --help, который показывает помощь (на английском) Хочу также сказать спасибо @Fingercomp за предоставленный прогресс-бар. Без него жизнь малиной не казалась бы =). Также спасибо ему за доступ на свой FTP сервер, где я мог спокойно тестировать программу. Enjoy! PS:
  24. Решил я написать майнер, тот что с лазером из IC2, который много раз видел. Но столкнулся с проблемой: моя программа по-разному выполняется на сервере и в одиночном мире. Команда выстрела (вниз) local robot = require("component").robot robot.use(0) На сервере (OpenComputers 1.7.5.192) при выстреле робот самоуничтожается (точнее он ломает себя, как блок) В одиночном мире (OpenComputers 1.7.5.192, но так же тестировалось 1.7.5.213) при выполнении летят несколько лучей в разные стороны, но ни один из них не ломает блок P.S. А в каком режиме дожен быть лазезр? Я тестировал на Mining и Long-Range
  25. Многие, кто играл в майн с древних времен, помнят, что был такой замечательный мод RedPower2. Помимо всяких крутых механизмов там были компьютеры, работающие на forth-системе. Функционал, правда не богатый, можно было только мигать цветными кабелями. Мод развития не получил, автор пропал. Потом был мод NedoComputers, но он тоже не долго прожил и особого распространения не получил. Есть идея, написать виртуальную машину для OpenComputers. Язык Forth невероятно примитивен, синтаксис простой и лаконичный, базовая система легко уместится на EEPROM. Но есть пара вопросов в реализации. Так как придется писать интерпретатор/компилятор на языке высокого уровня, надо чем-то пожертвовать или отойти от стандарта. Язык плотно работает со стеком. Есть стек данных и стек возвратов (второй пока не трогаем). Адресация 16 бит, следовательно, диапазон памяти = 64КБ. Отсюда имеем первую проблему, придется дробить float64 и имитировать 16 битные числа. Можно не дробить, памяти у нас более чем достаточно. Хотя, в более новых стандартах, реализована работа с 32 и 64 битными числами, написанная на самом Форте. Можно это обыграть, используя стандартный функционал Lua. Еще из-за особенностей выравнивания памяти, у чисел с плавающей точкой отдельный стек и отдельная адресация. Это можно тоже игнорировать и запихнуть float'ы в стек данных (а может и нельзя, тут пока не понятно). Вообще, все это описывается самим Фортом, но имея уже готовый интерфейс к математическому сопроцессору, было бы глупо писать всякие sqrt/sin/tanh жонглированием на стеке. Еще стандарт ANS94 требует много лишнего, вроде доступа к ассемблеру, своеобразной работы с железом и мусорных функций. Поэтому, лучше видится стандарт FORTH-83, он описывает язык очень обобщенно. Только немного расширить его до реалий опенкомпов. Ссылки: стандарт 83 года FORTH-83, слова стандарт 94 года ANS94, слова краткое введение в синтаксис
×
×
  • Создать...