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

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

Результаты поиска по тегам '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


Город


Интересы

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

  1. У меня есть строка: local reguser = "1.10a4d55a8d778e5022fab701977c5d840bbc486d0,d8f4590320e1343a915b6394170650a8f35d6926,8888" мне надо всё ввести в переменные: versions = 1.1 login = '10a4d55a8d778e5022fab701977c5d840bbc486d0' pass = 'd8f4590320e1343a915b6394170650a8f35d6926' seed = 8888 Как обрезать это?
  2. Я пишу функцию в библиотеке программы, которая при нажатии на кнопку должна закрывать другие программы и сама закрываться Эта функция используется в event.listen("touch",func) Как я могу это сделать?
  3. Многие, кто играл в майн с древних времен, помнят, что был такой замечательный мод 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, слова краткое введение в синтаксис
  4. import socket server = ("localhost", 8888) #I don't remember the port soc = socket.socket() soc.connect(server) version = soc.recv(5) #Decode it soc.send(bytes("PING", encoding="utf8")) pong = soc.recv(8) #Decode it Как реалезовать это: bytes("PING", encoding="utf8")
  5. Да, мы все знаем, что OpenComputers гораздо более стабильный, безопасный и продвинутый, чем ComputerCraft (который к тому же перестал поддерживаться разработчиком). Однако я до сих пор считаю, что ComputerCraft *гораздо* лучше именно как мод для программирования. И вот почему: Я впервые начал программировать именно в майнкрафте. Смотрел те самые туториалы на ютубе от 1Ridav, даже конспектировал в блокноте. Научиться программировать тогда было очень просто. Посмотрел пару туториалов, зашел на сервер, скрафтил комп и вуаля - сидишь строчишь свою библиотеку создания графических кнопок или ещё что-нибудь. Здорово. А главное - другие игроки могут видеть и то, как ты программируешь, и работу твоей программы. Для начинающих это был действительно самый лучший способ научиться программировать. С эпохой OpenComputers всё изменилось. Теперь, чтобы добраться до рабочего терминала, надо изучить все про сборку компьютера, чуть ли не пройти игру наполовину, чтобы насобирать ресурсов, правильно всё собрать и узнать, что, вообще говоря, тебе нужно питание. И ты идёшь и трахаешься с каким-нибудь industrial craft 2 ещё несколько часов вместо того, чтобы уже писать код. Более того. Уже предвидя этот путь, ты можешь начать развиваться, насобирать ресурсов итп, а потом узнать, что на сервере усложненный крафт компьютеров и всего сопутствующего (основанно на личном опыте: на mcskill Hi-Tech 3 нет GregTech, зато стоит какой-то мод, усложняющий создание компьютера до боли). Честно говоря, после такого опускаются руки. ComputerCraft был хорош именно своей доступностью. Любой мог начать писать свою программу, создав компьютер из говна и палок за пару минут. А интерес новичка держится только тогда, когда он видит наглядный результат своей работы. Новичок не хочет потратить миллион часов на изучение сборки компьютера итп. Он хочет хоп и окрасить пиксели экрана в розовый. Сборка компьютера, ее усложнение, бОльшие требования - это достаточно интересный геймплей, но абсолютно бесполезный, запутанный и мешающий в плане обучения программированию. Я отнюдь не хочу принизить мод OpenComputers, это прекрасный мод. Но, заменив собой ComputerCraft, он убил поток свежей крови на этот форум да и вообще в сообщество программистов. К сожалению, программирование в майнкрафте превратилось из общедоступного обучающего инструмента в область для гиков, которые и так уже все знают и умеют.
  6. Remoute Control, ver. 0.1.1 (управление роботом удаленно по сети Wi-Fi с планшета в ручном режиме) многоцелевая программа для мода OpenComputers Программа позволяет Вам получить полный контроль над роботом, совершать множество действий удаленно, при этом видеть самого робота и его параметры. Например, можно пробраться роботом в труднодоступные места, выгрузить уран из реактора при этом не получив облучения, построить простую конструкцию там, куда вы сами не можете пока добраться или наоборот, привезти что-то. Робот под вашим полным контролем. Забавным применением программки является гриф чужого имущества, атаки на игроков. Роботы по настройкам конфига могут производить действия, связанные с использованием предметов, включения и выключения кнопок, рычагов и механизмов и инструментов в чужом привате, хоть приват и не рушат. Можно произвести атаку и снести все опреснители игрока, солярки и ветряки, ели он не в игре и не спрятал все с крыши, или не выставил охрану и не сенсорит атакеров. Можно прикрутить реакторную камеру к стене жертвы, запихать туда 4-х урановый стержень,в включить на роботе редстончик и подорвать стеночку в несколько блоков, если беспечный игрок-жертва заприватил дом тютелька в тютельку по краю стены, как это обычно делают игроки =). Реактор на ИТ в настройках рушит блоки в радиусе 2-4 блоков. Есть шанс, что вы проберетесь в домик жертвы, при этом вы в укрытии и вас не видно никак. Код программы (latest): ПЛАНШЕТ: скачать (pastebin get b8nz3PrH tabletRC.lua) РОБОТ: скачать (pastebin get 7V2fvm7L robotRC.lua) Старые версии (old): Скрины: Требования к комплектации робота и планшета (за основу взял связанную карту, она обязательна, в роботе также обязателен контроллер инвентаря, остальное опционально. Можно выкинуть таблички и запихать контроллер ведра, немного добавить строчку и тырить жидкости и прочее. ЧЛ пока в программе не используется. Для грифа крайне желательна красная плата, магнит, большой инвентарь):
  7. Почти с месяц назад я представил во флудилке пару скриншотов разрабатываемого мной браузера и приличному количеству людей оно тогда понравилось. Поэтому сегодня, спустя пол года кодинга, нескольких переходов с одного движка на другой и кучи потраченных нервов я могу наконец представить его вам. Знакомьтесь, 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 так и браузера для него.
  8. Мод Computronics существует уже более 5 лет. Однако почему-то и по сей день нет ни одной более-менее рабочей файловой системы для кассет из этого мода. Будем исправлять ситуацию))) На сей раз я и представляю вашему вниманию файловую систему для этих самых кассет. TapFAT (Tape File Allocation Table) является функционально полной ФС с возможностью фрагментированного хранения данных. Первые идеи о написании ФС для кассет меня посетили еще в октябре, но время появилось лишь к концу декабря, тогда же я начал обдумывать основу системы. К январю начал писать основную библиотеку, вспомогательные утилиты, отлавливал баги, оптимизировал и упорядочивал код. Наконец, к июню месяцу готова первая версия драйвера. ПРЕДУПРЕЖДАЮ! Файловая система - вещь сложная и довольно серьезная. Я постарался устранить все обнаруженные баги, но не исключено, что некоторые могли проскользнуть мимо глаз. Поэтому я не несу ответственности за порчу данных на кассете в следствии сбоя драйвера. Сохраняя данные на кассетах вы действуете на свой страх и риск! Скажу сразу, ФС довольно медленная (виной тому буферы в операционках, ибо запись на кассету больших и мелких кусков занимает, как ни странно, одинаковое количество времени), поэтому она больше подходит для архивации данных. Учитывая, что самая крутая кассета дает нам около 30МБ, туда можно заархивировать очень много информации (не знаю, нужно ли кому столько). Первые 8КБ кассеты зарезервированы под саму таблицу FAT. Она представляет собой обычную сериализоваyную таблицу Lua, которую при желании можно сжать двумя способами, поскольку она немного не экономична. Так при разных режимах в 8КБ таблицы может уместиться: Без сжатия - около 150 файлов Сжатие LZSS - около 580 файлов Сжатие Картой Данных - около 720 файлов Также можно сэкономить пространство таблицы, отключив хранение даты изменения файла, в таком случае все записанные файлы будут иметь дату изменения 0 (т.е. 00:00:00, 1 Января 1970 года). Краткое руководство: Загрузка ОС с кассет: Установка: pastebin run Tq3hbpaz Драйвер также доступен в MineOS App Market Репозиторий на GitHub Планы на будущее: Нормальное кодирование таблицы Шифрование таблицы. Сжатие и шифрование файлов. Ускорение работы файловой системы
  9. В этом посте, я попробую ответить максимально подробно на вопрос - "какие OS существуют в OpenComputers?". Короткий ответ, если вам лень читать весь пост: "юзабельная только одна - OpenOS". Итак, какие варианты у нас есть? Юзабельные OpenOS Это дефолтная операционная система мода. Она же самая распространённая (99.9(9) охвата компьютеров в OC). Написана хорошим чуваком из Германии, по имени Sangar, который разработал и сам мод OC. То что вы видите, собрав и запустив компьютер по гайду с вики - это она и есть. Небольшой motd ("совет дня") сверху, и консоль, готовая к выполнению команд. По стилю она напоминает Linux. Легко дописывается и модифицируется под свои нужды. Работает на компьютерах, серверах, планшетах и роботах. Гайд по теме от Fingercomp. MineOS Альтернативная операционная система (от @ECS) с мощной графической оболочкой и собственным "магазином" приложений. Приложения во многом совместимы с OpenOS, отличия в основном в комплекте стандартных библиотек. Ну и в части UI разумеется. Выглядит красиво, и чувствуется явное влияние macOS. Топик на форуме. Plan9k Аллюзия на реально существующую систему Plan 9. Поставляется вместе с модом, как и OpenOS, и может быть найдена на лутовых дискетах. Основные фичи системы: * Многозадачность * Поддержка нескольких видеокарт/дисплеев * Пользовательское пространство отделено от ядра системы * Продвинутая работа с сетью * Фоновое выполнение программ Система идет в комплекте с мультизагрузчиком OpenLoader, который позволяет выбрать операционную систему для загрузки при старте компьютера. Согласно отзывам пользователей - система работает на последнем OC, но глючит. Если вам интересно на неё взглянуть - ставьте на свой страх и риск и удачи. 😃 SecureOS Безопасная система от Shuudoushi. Последний апдейт в мае 2016. Всего около 400 коммитов - неплохо! Автор предлагает более "UNIX-like" и защищённую версию OpenOS. Заявляется как "официальная система" аддона OpenSecurity. Обладает повышенными системными требованиями (видеокарта Т2, две планки памяти Т2). Решайте сами, стоит ли ваша безопасность того 😃 В разработке (отечественные) LunaOS Многозадачная OS от NightFury. Исходный код недоступен, разработка свёрнута. Упор делался на особую реализацию многозадачности и набор программ, использующих этот механизм. Например - ssh клиент, удалённый рабочий стол, репозиторий программ, raid и некий "кластер". ExOS Попытка создать "универсальную" OS от Syabro. В чём будет заключена универсальность, автор не признался. Разработка дальше флуда не пошла. В разработке (от иностранных коллег) daeOS Система от ds84182. Подробности автор не раскрывает, исходники не обновляются с 2015 года. miniOS Небольшая система от skyem123. Последнее обновление - в 2014 году. Автор утверждает, что система очень похожа на ранние версии MS-DOS. Ключевым преимуществом системы является её малая ресурсоёмкость. (Что и отражено в названии.) В запущеном состоянии она занимает около 90Кб оперативной памяти. Библиотеки системы минималистичны и сразу загружаются в память, при старте системы. Поэтому оператор require для их использования не потребуется. chaos: Entropy Taking Effect Операционная система от Alissa. Заявлены: * полная совместимость с OpenOS * установка с GitHub репозитория * пользовательское пространство отделено от системных файлов * структурированный по секциям man (доки) * переменные окружения задаются файлом Разработка была начата в этом году, однако исходники почему-то потёрты с GitHub. skex-BIOS Операционная система для дронов (прошивка EEPROM) от ShadowKatStudios. Не обновлялась с 2014 года, и сайт с кодом больше не доступен. А также Red OS Графическая оболочка для компьютеров со слабым железом. Писалась товарищем @LexaDriver, но обновлений не было уже с 2018 года. Rome Shell Заготовка графической оболочки для OpenOS от MrConstructor303. Работа заглохла в самом начале, обновлений нет с мая 2016. VetaTech OS / AronusOS Неудачная попытка создать мультизадачную графическую оболочку к OpenOS. На данный момент переписывается с нуля, после потери исходников. Minejaro Аналогично. Недописанная графическая оболочка. Выглядит симпатично, но не обновлялась с 2014 года. Название - явная аллюзия на дистрибутив Manjaro Linux. Мультизагрузчики Cyan BIOS Мультизагрузчик от товарища @BrightYC со стильным минималистичным дизайном. Имеет встроенный интерпретатор Lua, поддержку OpenOS и MineOS и всякие другие штуки, вроде защиты паролем. (Хотя я бы на этот пароль сильно полагаться не стал =)). OpenLoader Стандартный мультизагрузчик, который ищет на файловых системах файлик init.lua, чтобы определить, является ли она загрузочной. Может быть найден на лутовых дискетах. Spirit Loader Позволяет при старте компьютера выбирать, с какой загрузочной системы вы хотите запуститься. Titan BIOS Небольшая прошивка для BIOS, которая облегчает разработку OS, позволяя загружать систему в компьютер по HTTP, и запускаться с неё. advancedLoader Симпатичный мультизагрузчик с графическим меню выбора файловой системы. Также поддерживает диски в unmanaged режиме. FreeLoader Проект, начатый как форк OpenLoader, но затем переписанный как самостоятельный мультизагрузчик, за авторством BleedingEyes. Доп. информация Страничка о разработке своей OS с официальной доки (англ.): http://ocdoc.cil.li/tutorial:custom_oses Гайд/размышления о разработке OS под OpenComputers (на англ.): https://oc.cil.li/index.php?/topic/807-operating-systems-under-opencomputers-lua-architecture/ ну и конечно же 5 ПРИЧИН, ПОЧЕМУ ВЫ НЕ ДОЛЖНЫ ПИСАТЬ СВОЮ ОС ДЛЯ OPENCOMPUTERS (от Fingercomp): http://computercraft.ru/topic/882-exos-for-opencomputers-by-syabro/?p=11709 Если вы нашли ошибку в описании, или знаете ещё какую-нибудь попытку создания OS под OpenComputers - смело пишите в эту тему, или мне в личку! P.S. Шмактус!
  10. Оказывается, Сангар на днях работал над новой версией ОС https://github.com/fnuecke/oc2 O_o
  11. Решил я как-то поискать методы оптимизации кода для ОпенКомпов, и Луа в целом. Но на форуме, вроде, я не нашел тему, где в одном месте сконцентрированы вещи, помогающие в оптимизации. Разве что нашел одну ветку, на заморском форуме, вот ее компиляция/перевод/адаптация/дополнение: (за помощь в переводе, спасибо 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, допустим, вообще о красоте кода не идет и речи Ну это в целом все, что я хотел рассказать, если есть исправления/уточнения/дополнения/свои_идеи, то милости прошу в комментарии
  12. Одного диска второро уровня не хватает и хочу управлять домом на расстоянии. Как можно такое сделать?
  13. Контроллер реактора 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 так что не обессудьте. Буду рад любым исправлениям и замечаниям.
  14. Помните мост Рида? Ну так вот. Я тут изучаю 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! 😃
  15. На форуме в последнее время начали появляться темы с сетевыми библиотеками и браузерами. Продолжу это движение (да, скоро и мой браузер будет). Итак, представляю вам 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 родительского компьютера
  16. Возможно ли исполнение команд из маинкрафт при помощи робота?
  17. Здравствуйте, не знаю в чём проблема, во мне, или в моде. Есть биг улей, подключил его к ОС через адаптер. Посадил туда в 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" Было бы смешно, если бы не было так грустно...) С другими ульями всё в порядке, эти, просто так, начали вот так меня дразнить. Подскажите, пожалуйста, в чём может быть причина?
  18. В моде 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
  19. Я вас категорически приветствую, товарищи форумчане и случайные посетители! Ваше внимания представляю свою реализацию 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. Скрины:
  20. Недавно возникла проблема с тем, что понадобилось быстро загружать репозитории с несколькими файлами + я хотел поиграться с реквестами. Решение воспроизвелось в виде 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)
  21. У меня есть функция, которая создаёт 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
  22. Очередная сеть на 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()
  23. Здрассьте, господа, у нас тут превесёлая вещь случилась: спустя полгода разработки (причём круглым числом; 28 мая стартанули) у нас отрелизился репозиторий! Обозвали мы его Hel. В репозитории мы собрали и воплотили в жизнь все хорошие идеи и концепции, которые обсуждались здесь, чтобы получился максимально кавайный способ дистрибуции пакетов. Пользоваться репозиторием не сложнее, чем ставить программы с Pastebin. Для этого нужно знать только название пакета. Одна команда: $ hpm install <нужный пакет> И вуаля! Он уже установлен в нужную папку, все нужные библиотеки загружены и распиханы по системе. Можно запускать и работать. Но по сравнению с OPPM или Pastebin, hel несравненно удобнее. Он легковесный. Простой. Не требует регистрации. И СМС. Чем мы гордимся, безусловно. Установка программ производится с помощью одного легкого клиента (как у Pastebin), но в то же самое время, вам не нужно волноваться о библиотеках или версиях программы. Вы всегда можете найти и установить самую свежую версию (и даже не самую свежую), зная только название пакета (как в OPPM). Кстати, раз уж мы заговорили про OPPM. У нас клиент получился настолько охренительным, что вы можете теперь выкинуть oppm в помойку, наконец-то! В стандартный комплект поставки включён oppm-модуль с кэшированием (иными словами, вам не нужно будет ждать пару минут, пока пробрутфорсятся репозитории, сразу всё качается). Всё быстро, чётко, ясно. Юзается оно так: $ hpm oppm:install <имя пакета> Об остальных фичах читайте уже в мануале hpm, там всё есть.
  24. У многих новичков возникает вопрос - где писать код для 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 Мб ОЗУ. Скриншот:
  25. Останавливает ли выполнение программы component.drone.move?
×
×
  • Создать...