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

Лидеры


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

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

  1. 8 баллов
    Небольшое обновление: добавлен автоматический скейлинг. Работает "на лету".
  2. 6 баллов
  3. 5 баллов
    Да уж не на днях. Судя по датам он давно над ней работает))). Кстати есть идейка - я немного разобрался с модом и собрал для него пару программок, поэтому хочу как-нибудь позднее написать пару RAW-статеек по программированию для мода. Думаю процесс создания программ под OC2 к финальной версии не сильно изменится. Если кому интересно - все лежит на ГитХабе)).
  4. 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. 3 балла
    @LeshaInc, о чём так загрустил, что отметился под каждым постом этой темы?
  6. 3 балла
    Добавлена поддержка нескольких загрузочных файлов (если на одном физическом диске, например, майнось и опенось)
  7. 3 балла
    Патч безопасности WL04934-b: *Да здравствует Шифр цезаря!(Временно, так и не понял как генерировать AES ключи) *Приветствуйте: Команды!(Бета версия, о всех ошибках сообщайте мне) *Начало реализации системы "пинга"(Чем дальше - тем дольше) *Установщик чата *Хватит унылой чёрно-белой консоли, теперь оформление цветами!(Темы НЕ поддерживаются) Обновление загружено.
  8. 3 балла
    Изначально я не хотел комментировать этот «урок», т.к. объём комментариев в несколько раз превысил бы изначальный текст. Главная претензия к нему в отсутствии конкретики и каких-либо примеров, позволяющих читателю прийти к тем же выводам. @Taruu , приведя конкретный пример, спасает этот урок. Если кто-то хочет продолжить это начинание, я прошу не скидывать все замеры в одну программу, или хотя бы в коде одной программы дробить код на блоки и добавлять короткое описание, что именно там измеряется. Например, так: Демонстрация: локальная функция sin работает в два раза быстрее, чем функция math.sin. Замедление происходит два раза: при извлечении поля math из таблицы глобальных переменных и при извлечении поля sin из таблицы math. кусочек кода Также можно привести ещё пример, демонстрирующий, что работа с глобальной переменной равносильна работе с полем таблицы. А ещё важно продемонстрировать, начиная с какого числа использований становится выгодным копировать функцию math.sin в локальную переменную. Потому что если бездумно повторять советы из этого «урока», то вместо оптимизации может получиться пессимизация. Также я советую для записи чисел с большим количеством нулей использовать научную форму. Чтобы понять, сколько нулей содержит число 100000, мне приходится задерживать взгляд на этом числе, а запись 1e5 считывается мгновенно.
  9. 3 балла
    Испанский стыд, так вон оно как реализовано... чувствую себя дикарём, шарахавшемся от каждого звука и спешно заменявшего очки на шлем хд
  10. 3 балла
    Патч безопасности WL04932: *Теперь можно одновременно отправлять сообщения(Спасибо serafim за ссылку на его чат) *Вход в чат по коду - код = порт модема Планируется: *Шифрование чата Для скачивания нужно ввести следующую команду pastebin get qxAVqS89 chat.lua Запуск через команду "chat"
  11. 2 балла
    Я когда-то давно пытался исследовать этот вопрос, но абсолютно непробиваемой и при этом удобной защиты у меня не получилось. Есть неудобный, но надёжный параноидальный вариант: не хранить ничего ценного в постоянной памяти робота, а любого перезагруженного робота считать скомпрометированным. Скомпрометированных роботов следует выводить на нейтральную территорию и проверять содержимое EEPROM аппаратным способом. А при обнаружении опасных изменений следует поменять открытые порты во всей системе, а сетевые карты как робота, так и общавшегося с ним планшета разобрать на запчасти. Определить же факт модификации EEPROM не всегда возможно. Возможно, я не прав, но мне кажется, полностью публичное существование такой системы невозможно. Да, на начальном этапе можно и нужно вести публичное обсуждение. Но в конечном итоге каждая система должна будет заиметь свои уникальные секретные особенности, неожиданные для взломщика. Мотивированный взломщик может обойти каждый конкретный известный ему вариант, но вряд ли сможет написать универсальный анализатор кода. Предлагаю сыграть в игру. Накидывайте возможные варианты защиты, а я скажу как им противодействовать. А можно и наоборот. Главное, сохранить состязательность. Это позволит по-новому взглянуть на старые идеи. Итак, идея: запрашивать по сети не контрольную сумму EEPROM, а полное содержимое. Чем ответит взломщик?
  12. 2 балла
    Копать не могет, а вот взрывать динамитом пожалуйста, даже может собирать все взорванное через притягивающий луч. Просто динамит и красный факел. Дрону вроде как пофиг на урон, он бессмертный, только воды боится
  13. 2 балла
    После долгого перерыва я наконец смог вернуться к своему моду OCTechnics! Решил сначала добавить в мод команду для проверки, всё ли работает правильно. В этот раз, чтобы узнать, как добавляются свои команды, полинтернета не хватило. Пришлось смотреть уже не гайды, а чистый код OpenComputers. Там нашёлся замечательный пример: .../common/command/SimpleCommand.scala. Сама реализация команды получила отдельный файл: org/octechnics/octechnics/OCTTestCommand.java: Чтобы команда /oct работала на сервере, нужно дописать ещё несколько строк кода в основной файл OCTechnics.java: Мод OCTechnics загружается и работает! В этом можно убедиться, вызвав команду /oct: мод ответит "OK, OCTechnics works." В следующей части уже будет добавление новых блоков, крафтов и блок-сущностей (на самом деле всё это готово, осталось только статью написать). Команда пригодится для отладки (я не планирую добавлять к своим блокам GUI, т.е. инвентарь без компьютера просмотреть будет невозможно!) Для тех, кому интересна разработка мода в реальном времени, рекомендую взглянуть сюда: https://github.com/ProgramCrafter/OCTechnics/.
  14. 2 балла
    Поменяй лаунчер
  15. 2 балла
    Небольшое обновление WL04935: *Теперь то что вы набирали - сохраняется как в чате игры. По стрелочкам вверх-вниз осуществляется выбор Обновление загружено
  16. 2 балла
    Тут ошибочка получается. У тебя print в памяти остается ?:/ Так что каждый раз нужно в переменную записывать. local a,b = 23,76 local computer = require("computer") local mem0 = computer.freeMemory() for i=1,1e7 do a,b=b,a end print(mem0 - computer.freeMemory()) -- Результат: 0 mem0 = computer.freeMemory() for i=1,1e7 do a=a~b b=a~b a=a~b end print(mem0 - computer.freeMemory()) print() mem0 = computer.freeMemory() print("test") print(mem0 - computer.freeMemory()) И вот что мне вывело:
  17. 2 балла
    Нужно нажать "MineOS" в верхнем левом углу -> Выйти Помню, раньше эта кнопка выходила в консоль, но сейчас почему-то этот вариант не работает, похоже, дело в том, что теперь MineOS является Standalone системой, и из нее такой функционал просто выпилили. Надеюсь, @ECS объяснит подробнее
  18. 2 балла
    Итак делаю более структурированный пост чем был до этого... Для показания производительности используются: os.clock() - дает приблизительное время работы CPU во время исполнения программы. computer.freeMemory() - дает нам узнать сколько памяти есть у компа. Локализация функций: Делайте функции в программе локальными. Это работает как и с локализацией существующих функций. Пример с функцией math.sin и ее локальной версией: local computer = require("computer") local unicode = require("unicode") local x = 0 local sin = math.sin local start = os.clock() local memory_start = 0 for i=1,1e5 do x = math.sin(i) end print("1e5 math.sin",os.clock()-start) start = os.clock() for i=1,1e5 do x = sin(i) end print("1e5 local.sin",os.clock()-start) --Замер для редкого вызова start = os.clock() x = math.sin(3) x = math.sin(10) x = math.sin(16) x = math.sin(42) print("rare math.sin",os.clock()-start) start = os.clock() x = sin(3) x = sin(10) x = sin(16) x = sin(42) print("rare local.sin",os.clock()-start) --Замер для одиночного вызова memory_start = computer.freeMemory() -- проверка на кушание памяти start = os.clock() x = math.sin(42) print("one math.sin",os.clock()-start, "memory take", memory_start-computer.freeMemory()) x = 0 memory_start = computer.freeMemory() local sin2 = math.sin start = os.clock() x = sin2(42) print("one local.sin2",os.clock()-start, "memory take",memory_start-computer.freeMemory()) Из данных тестов видно что локализация функций имеет смысл при частом обращении, но в случае же одиночного вызова функции смысла это не придает и на ход поршней особо сильно не влияет... Так же я решил проверить данный метод на openOS библиотеке unicode local computer = require("computer") local unicode = require("unicode") local x = 0 local start = os.clock() local memory_start = 0 local un_len = unicode.len for i=1,1e5 do x = unicode.len(tostring(i)) end print("1e5 unicode.len",os.clock()-start) start = os.clock() for i=1,1e5 do x = un_len(i) end print("1e5 local.len",os.clock()-start) --Замер для редкого вызова start = os.clock() x = unicode.len("Арбуз") x = unicode.len("Помидор") x = unicode.len("Капитализм") x = unicode.len("Ракета") print("rare unicode.len",os.clock()-start) start = os.clock() x = un_len("Арбуз") x = un_len("Помидор") x = un_len("Капитализм") x = un_len("Ракета") print("rare local.len",os.clock()-start) --Замер для одиночного вызова memory_start = computer.freeMemory() -- проверка на кушание памяти start = os.clock() x = unicode.len("Hello world!") print("one unicode.len",os.clock()-start, "memory take", memory_start-computer.freeMemory()) x = 0 memory_start = computer.freeMemory() local un_len2 = unicode.len start = os.clock() x = un_len2("Hello world!") print("one local.len",os.clock()-start, "memory take",memory_start-computer.freeMemory()) Тут же прирост в производительности не особо заметен. Так что стоит отдельно проверять библиотеку или функцию на эффективность такой локализации. Так же можно локализовать и свои функции: local computer = require("computer") local x = 0 local start = 0 local memory_start = 0 memory_start = computer.freeMemory() function func1(a,b) return a + b end start = os.clock() x = func1(9,0.3) print("norm func",os.clock()-start, "memory take",memory_start-computer.freeMemory()) memory_start = computer.freeMemory() local func2 = function(a,b) return a + b end start = os.clock() x = func2(9,0.3) print("local func",os.clock()-start, "memory take",memory_start-computer.freeMemory()) start = os.clock() for i=1,1e5 do local x = func1(i,i) end print("func1 \t",os.clock()-start) start = os.clock() local sin = math.sin for i=1,1e5 do local x = func2(i,i) end print("func2 \t",os.clock()-start) Так же стоит понимать что все зависит от вашей функции, но все же можно лишний раз локализовать... Вроде на ход поршней не влияет.... Главное не локализовывать функции в программе которые вызываются один раз. Это вообще не даст ничего и даже наоборот может замедлить работу (если таких функций много). Локальные переменные Используйте локальные переменные в зависимости от своей задачи. Если вам нужно сэкономить память то создавайте локальные переменные в функциях а если вам нужна переменная которая нужна множеству функций то лучше ее объявить глобально. Локальные переменные в функциях удаляются после завершения работы функции что позволяет сэкономить место в памяти. --var_global local computer = require("computer") local memory_start = computer.freeMemory() local test_table = {1,2,3,4,5,6,7,8,9,10} function work_on_test_table() --Что то делаем с test_table end print("memory take", memory_start - computer.freeMemory()) --var_local local computer = require("computer") local memory_start = computer.freeMemory() function work_on_test_table() local test_table = {1,2,3,4,5,6,7,8,9,10} --Что то делаем с test_table end print("memory take", memory_start - computer.freeMemory()) Подготовка объектов (таблиц) Лучше подготовить таблицу с частью необходимых значений и их уже дополнять. print("create obj") start = os.clock() local t = {} for i = 1970, 2000 do t[i] = os.time({year = i, month = 6, day = 14}) end print("direct insertion time", os.clock()-start) start = os.clock() t = {} local aux = {year = nil, month = 6, day = 14} for i = 1970, 2000 do aux.year = i t[i] = os.time(aux) end print("prepared insert time", os.clock()-start) start = os.clock() for i = 1, 1e5 do local a = {} a[1]=1; a[2] = 2; a[3] = 3 end print("num insert", os.clock()-start) start = os.clock() for i = 1, 1e5 do local a = {true,true,true} a[1]=1; a[2] = 2; a[3] = 3 end print("prepared insert", os.clock()-start) X*X вместо X^2 Если нам нужна 2 степень числа то быстрее это будет умножить чем возводить в степень, Но если у нас уже 3 степень или больше то данный финт бесполезен. local start = os.clock() for i=1,1e7 do local x = i * i end print("*",os.clock()-start) start = os.clock() for i=1,1e7 do local x = i ^ 2 end print("^",os.clock()-start) start = os.clock() for i=1,1e7 do local x = i * i * i * i * i end print("* X5",os.clock()-start) start = os.clock() for i=1,1e7 do local x = i ^ 5 end print("^ 5",os.clock()-start) Swap переменных Самый быстрый способ это использовать временную переменную, красивый и почти такой же эффективный метод перестановки переменных будет a,b = b,a Так же стоит отметить что не один из перечисленных способов не требует выделения памяти. Вот все что смог более менее конкретное накопать и проверить. Прошу кинуть в лицо ошибки или вопросы. Вместе подумаем.... Теперь поправили.
  19. 2 балла
    Если кратко у любителей факторки поймал вот эту книжку. Написал вот этот код: И вот какой результат: Как видно некоторые моменты реально спасают а некоторые не очень. Там еще есть совет о корутинах но я не проверял.
  20. 2 балла
    В шлем вставляются очки. Это введено с самого появления мода. Просто в верстаке соедини свой шлем с очками и готово. Ну и на очки выводить безопаснее чат, так как видят его только те кто подключен, лишним можно устроить на экране "приступ эпилепсии"
  21. 2 балла
    Есть еще вот такой "фреймворк" ,позволяющий писать модульные приложения https://computercraft.ru/topic/4099-umfal-avtomaticheskiy-zagruzchik-moduley-dlya-slozhnyh-prilozheniy/
  22. 2 балла
    У робота есть слот для инструментов, только через него происходит работа (не знаю как сейчас, но раньше не каждый инструмент и не каждый блок обрабатывался адекватно). У дронов такого слота нет, поэтому они могут имитировать только пустую руку.
  23. 2 балла
    Мяу, это не шифрование, а кодирование. Любой человек, перехвативший сообщение, сможет его декодировать и прочесть, т.к. Base64 не подразумевает наличие какого-либо ключа для дешифровки, обеспечивающего секретность данных. Кроме того, размер закодированных сообщений в среднем на 35% больше оригинала, т.к. это избыточный алгоритм Если тебе требуется именно шифрование, причем такое, чтобы сообщения мог декодировать лишь ограниченный круг лиц, знающих кодовое слово, то потребуется как минимум симметричный алгоритм типа Salsa/RC/AES. А в идеале - с поддержкой "соли" или ассиметричный с парой ключей. Тут уж самописные велосипеды, дата карта или сторонние либы в помощь
  24. 1 балл
    Я нашёл чуть более производительный вариант схемы реактора: Алгоритм поиска оптимальной схемы я описал ранее: это заполнение плоскости "крестиком", перебор возможных вариантов сдвига и отбрасывание симметричных вариантов. Затем во всех вариантах я заполнял оставшиеся свободными слоты какими-то полезными компонентами и выбирал наиболее производительный вариант. В итоге я получил схему с производительностью 4280 eu/t. @whiskas поступил чуть умнее. Взяв за основу симметричный моему сдвиг сетки, он немного сместил некоторые компоненты в уже занятых слотах, благодаря чему улучшил производительность реакторной схемы до 4340 eu/t. В очередной раз погрузившись в тему реакторов, я повторил поиск лучшего варианта сдвига сетки, но теперь не просто заполняя свободные слоты, как делал это в первый раз, а более тщательно, пробуя немного сдвигать компоненты. В результате я смог немного увеличить производительность: до 4360 eu/t на уране и до 21798 eu/t на MOX-топливе. Дополнительным бонусом схемы стало отсутствие в ней отражателей, теперь используются лишь два типа компонентов. А перфекционистов может порадовать центральная симметрия схемы.
  25. 1 балл
    Осталось только терминал запилить, который будет кушать алмазики. А в остальном все готово.
  26. 1 балл
    @ECS D: Моё чувство перфекционизма: (там прогрессбар не до конца отрисовывается...)
  27. 1 балл
    Предисловие: Недавно, по накурке, мне пришла идея написать браузер для OC. Браузер это конечно хорошо, но для его работы нужна сеть. Первое, что вспомнилось, это OpenNet. Но у него нашлось некоторое некоторое количество серьёзных недостатков(про них позже). Не найдя альтернативы, я пришёл к выводу, что нужно сделать новую сеть, которая будет похожа на OpenNet, но в которой не будет таких недостатков, какие есть в OpenNet. Собственно, о каких недостатках я говорю: 1) Ограниченность в рамках одного сервера. Для того что бы от сети был хоть какой то минимум пользы, ей нужны пользователи. Тяжело найти сервер, где хотя бы пяти людям будет интересна тематика OC. 2) Требования к структуре сети. Три уровня, не больше, не меньше. Первые два - роутеры, третий - клиенты. Роутеры первого уровня соединены с роутерами второго посредством спаренных карт, и с клиентами только через модемы. 3) Низкая надёжность. Стоит из роутера второго уровня вынуть спаренную карту, он сразу превратится в кирпич. 4) Сложность в развёртывании. Два вида роутеров, три вида библиотек. Отсутствие документации. Захотел сеть на даче - нужно участие владельца "коренных" роутеров. Ключевые особенности: Собственно сеть должна обладать такими свойствами: 1) Возможность бесшовно соединять несколько игровых серверов. 2) Иметь максимально простую структуру. 3) При разрыве связи между двумя частями сети, сеть должна "раскалываться" на две, а не ломаться. 4) Сеть должна иметь максимально простую структуру, и иметь хорошую документацию Процесс разработки: Обозначив основные моменты, я потихоньку начал писать сеть. За основу брал OpenNet. С кодом можно ознакомится на складе грязи(тут сама сеть, и ещё несколько программ, которые я использую при разработке). Что сделано: Собственно, сама библиотека, реализующая связь между узлами. Роутер. Библиотека, позволяющая работать в сети программам, заточенным под OpenNet. Браузер и HTTP-сервер, из за которого собственно, всё и началось. Вернее первая его версия. Теоретически(на практике мост, который я хочу использовать, себя странно ведёт) есть возможность устанавливать соединения между игровыми серверами. Инсталлер Что нужно сделать: DNS Интернет-сервер, и клиент под него Чат (клиент, сервер) Нормальный интерфейс. Шифрование пакетов Как это всё безобразие выглядит: И так, допустим, мне очень нужно развернуть сеть. Что мне для этого нужно: Ставим три компьютера. Один будет роутером, и два клиента. Пусть один клиент подключается к роутеру через модем, а второй через спаренную карту. Начинка роутера: И клиентов: Теперь ставим на все компьютеры OpenOS и файлы с репозитория. Можно воспользоваться инсталятором: wget https://raw.githubusercontent.com/AlexCatze/RacoonNet/master/installer.lua installer Начнём с настройки роутера. Запускаем "routconf", и первым делом конфигуратор попросит указать, через какую карту роутер будет подключатся к сети. Так как сети у нас пока нет, пропускаем этот момент. Теперь у нас спрашивают, какие карты будут использоваться для подключения клиентов к роутеру. Отвечаем: Теперь можно и запустить роутер. Пишем "router", и видим картину: Роутер ругнулся, что не имеет выхода в сеть, ну оно и понятно. Теперь настраиваем клиентов, вводим "rnconfig" на каждом из них: Сеть настроена, но что теперь с ней делать? Запускаем на одном компьютере "chat_server", на другом "chat <ip сервера>" . И можем поговорить сами с собой. Или можно посмотреть на браузер. Поднимаем сервер, "webserver", браузер "wr" и наслаждаемся. К стати, сеть называться RacoonNet(над названием я не заморачивался). Собственно, зачем эта тема: Т.к. изначально я собирался сделать только браузер, и вообще, это мой первый проект на Lua, я сам долго не выдержу. Понимаю что сеть сейчас практически является копией OpenNet`а. Я ищу людей, которые захотят помочь мне. Как то так.
  28. 1 балл
    Была у меня похожая разработка (месяца 3 назад делал) Умела сама регистрировать пользователей, роутеры, была встроенная система DNS, если интересно - могу скинуть
  29. 1 балл
    Люди!? Тема умирает!!! Поднимаем АКТИВ!!! Встали-Сели Раз-Два-Раз-Два-Раз-Два-Раз-Два-Раз-Два-Раз-Два-Раз-Два-Раз! Уфф. . . Автор как там разработка?
  30. 1 балл
    Представляю вам опять программу для робота, которая позволяет добывать руду, не лазая по пещерам. Робот, используя геолизер, может самостоятельно находить и добывать руду. Реализованы еще не все возможности, поэтому прошу тестировать и сообщать мне о багах. Требования: Корпус компьютера (уровень II или III) Апгрейд инвентарь (больше - лучше) Апгрейд контроллер инвентаря Жесткий диск EEPROM с прошитым Lua BIOS Геосканер Память (уровень I или выше) Процессор (любой) Апгрейд полета (I уровень) Алмазная кирка или аналогичный инструмент. Опционально: Апгрейд верстак Беспроводная сетевая карта Апгрейд батарея Апгрейд опыта Апгрейд чанклоадер Апгрейд генератор Апгрейд солнечная панель Эндерсундук из мода EnderStorage Установка: Скачать и сохранить файл как init.lua wget https://raw.githubusercontent.com/DOOBW/geominer/master/miner.lua init.lua Закинуть этот файл в корень диска. Добавить диск при сборке робота. Установить робота на платформу из твердых блоков. Дать роботу кирку. Поставить возле робота контейнер и зарядник. Нажать кнопку питания и наслаждаться процессом.
  31. 1 балл
  32. 1 балл
    Привет читатель! Играя с друзьями у меня появилась необходимость обмениваться сообщениями ТОЛЬКО по компьютерам(самодельный приват) Жили мы в разных домах, у каждого замок на двери. В интернете ничего годного я не нашёл, так что решил написать свой чат. Плюсы: Обмена сообщениями без чата Не требует много ресурсов и почти ничего не весит Хватит друзьям Команды Создатель чата - !( Del )! (или если хотите - Деф) Специальное спасибо serafim за предоставление своей версии чата. Код был нагло скомунижжен позаимствован оттуда и немного переработан. Ах,да... Ссылка на сообщение Так же была использована немного переработанная библиотека для шифрования цезарем. Ссылка на гитхаб предоставлена Установка: pastebin run 1Y1KnTen Кому интересно порыться в библиотеке, ссылка будет тут всегда
  33. 1 балл
    это решил я достаточно кардинально
  34. 1 балл
  35. 1 балл
    Нет, т.к. оська уже установлена. Тут полная аналогия с реальными компами: ставишь несколько осей на несколько загрузочных томов, а потом через биос выбираешь приоритетный том для загрузки. А биос можно использовать либо штатный, либо сторонний - в зависимости от предпочтений
  36. 1 балл
    Для сбавления нагрузки на сервер некоторые проекты уменьшают число тиков для прогруженных, но без игрока чанков. Лично я сталкивался с убавлением тиков пополам на 2 чанке от игрока и полной заморозкой на 3 чанке.
  37. 1 балл
    Пффф.. Ну, раз я влез в эту тему, то продолжу обсуждение. Не совсем. Как долго работает компьютер, скажет computer.uptime(), а os.clock() скажет, сколько из этого времени компьютер потратил на, собственно, вычисления. Конечно, с некоторыми оговорками, но в целом именно os.clock() позволяет оценить нагрузку, создаваемую тем или иным кодом на игровой сервер. Это грязный эксперимент с неправильной интерпретацией результата. В нём извлечение поля из таблицы выполняется два раза, о чём не упомянуто в описании. Также эксперимент не сообщает о том, имеет ли смысл создавать локальную переменную для функции math.sin, если её планируется использовать всего два раза. Или пять, например. Во всех экспериментах маловаты измеряемые интервалы времени. Но в этом они слишком малы. Шум легко может оказаться выше реальной разницы во времени. А шум есть всегда, даже при выполнении кода на оборудовании с избыточной мощностью. А здесь как раз именно шум не позволяет увидеть, что a,b = b,a имеет ровно ту же эффективность. Вообще, при интерпретации результатов следует сравнивать полученную разницу с шумовой, чтобы не делать преждевременных выводов. В этом месте я всё-таки ожидал увидеть экспериментальное подтверждение «эффективности» этого трюка. Но именно это заблуждение надо развеять в первую очередь. Эксперимент: local a,b = 23,76 local computer = require("computer") local mem0 = computer.freeMemory() for i=1,1e7 do a,b=b,a end print(mem0 - computer.freeMemory()) -- Результат: 0 for i=1,1e7 do a=a~b b=a~b a=a~b end print(mem0 - computer.freeMemory()) -- Результат: 6631 Результат: Обмен значений переменных через a,b=b,a потребляет ровно 0 дополнительной памяти и быстро работает. Зато обмен посредством XOR и память потребляет, и работает медленно, да ещё и код загромождает. Я не знаю, почему этот вредный совет транслируют на форумах программистов. Вне сомнений, в арсенале программиста должен быть трюк обмена переменных через исключающее или. Но зачем его тулить к месту и не к месту? Урок же вроде как про оптимизацию кода. И даже если бы этот трюк оказался эффективным, почему нет упоминания о том, что xor работает не для всех типов переменных? И раз пошёл такой разговор, разберу предыдущее обсуждение: Эффективнее со всех точек зрения. Lua для любых операций создаёт буферные переменные для хранения временных результатов. Но, в случае a,b=b,a они уничтожаются незамедлительно в отличие от xor. Операция a,b=b,aтребует на выполнение столько же времени, как три отдельных операции присваивания, но потребления памяти не увеличивает.
  38. 1 балл
    У меня тоже всегда соблюдалось, но документация не даёт гарантии, что так будет всегда. Условие n==6 никогда не выполнится.
  39. 1 балл
    Первым делом хорошо бы добавить автоотключение реактора при аварийном отключении компьютера, что на перегруженных серверах случается часто. При использовании красного контроллера это невозможно, т.к. он сохраняет своё состояние независимо от состояния компьютера. Другое дело, красная плата, вставленная в компьютер: сигнал на её выходе автоматически пропадает при отключении компьютера (не программы), благодаря чему отключается и реактор. Но для реализации такой схемы потребуется установить компьютер вплотную к реактору. А рычаг-то зачем, если уже есть красный контроллер или красная плата, которые смогут осуществить не только все последующие запуски, но и первый тоже? И зачем в коде везде используется string.format, даже там, где отсутствуют переменные, вывод которых требуется форматировать? Чем больше лишних действий делает программа, тем вероятнее этот компьютер отключится на перегруженном сервере. А если он не успеет к этому моменту отключить красный контроллер, то можно потерять и реактор и свой домик.
  40. 1 балл
    Вышла версия "0.0.1.5"! Из нового - добавлена поддержка Stem (т.е. теперь компьютеры могут подключаться через интернет). Для работы нужна библиотека stem, установленная в системе. P.S. Все ссылки остались прежними.
  41. 1 балл
    Проблема: мы с друзьями живём в различных измерениях или на огромном расстоянии друг от друга, из-за чего беспроводные модемы использовать невозможно. При этом нам нужна система, позволяющая отправлять приватные сообщения конкретному человеку, зная адрес получателя. Очевидным решением будет использование связанных плат, но что если нужно работать более чем с 1 получателем? Связанные платы, увы, лимитированы. Что если мы играем с GalactiCraft, имеем базу на Земле, и кровь из носу хочется контролировать добычу камня на Луне, реакторы на Марсе и ферму урана на Венере с одного компьютера? Решение: объединить множество связанных плат в кластер! Принцип работы системы проще пареной репы: каждый новый клиент, подключаемый к сети, должен предоставить 1 из 2 скрафченных связанных плат. Первую мы вставляем в кластер, а вторую - в компьютер клиента. Чтобы отослать сообщение другому клиенту кластера, нужно знать имя канала его связанной платы. Далее - дело техники: если сервер получает сообщение от связанной платы, то осуществляется поиск платы-получателя в нём же. Если плата-получатель не найдена, то сообщение перенаправляется через широковещательный пакет проводного модема всем серверам кластера, чтобы те в свою очередь попытались найти получателя. Если получатель найден - ему отсылается имя канала отправителя и само сообщение. Теперь подумаем, как лучше объединить связанные платы. Каждая плата может быть вставлена только в Tier 3 слот компьютера или сервера. Оптимальным решением для экономии пространства будет использование серверных стоек, т.к. каждый Tier 3 сервер имеет целых 2 Tier 3 слота. Поэтому каждый сервер сможет обслуживать максимум 2 клиента сети. В итоге схема расположения стоек и конфигурация серверов должна быть примерно такой: Процессор не важен, память не важна, и требования если не нулевые, то минимальные. Разумеется, каждый сервер будет работать на микропрограмме EEPROM, ибо крафтить для этого жёсткие диски было бы нецелесообразно. Берем код и прошиваем столько EEPPROM'ов, сколько требуется: https://pastebin.com/2gFankBQ После включения сервер будет доступен для взаимодействия. Как же отправить сообщение получателю? Используем функцию tunnel.send(), и первым аргументом указываем имя канала получателя. Его можно получить через tunnel.getChannel(): local tunnel = require("component").tunnel local receiver = "867a85de-ae4c-4359-b06f-0d30c5dad6f1" tunnel.send(receiver, "Привет") Это всё замечательно - но где же практический пример? Давайте запустим чат! Да простят меня боги, старые и новые, но я буду использовать MineOS, т.к. общаться через GUI мне банально удобнее. Во всех компьютерах сети создаем новое приложение, открываем файл Main.lua для редактирования: Берём исходник чата: https://pastebin.com/6aF7qYCX Вставляем его содержимое вместо имеющегося в Main.lua и запускаем приложение. Для отсылки сообщения необходимо ввести канал связанной платы получателя, а также отправляемый текст. Вот пример интеллектуальной беседы двух величайших умов современности: Кроме того, каждый сервер кластера поддерживает протокол для обновления прошивки по сети, а также удаленного отключения и запуска всех серверов. Для этого вам потребуется отдельный компьютер, находящийся в локальной сети с кластером. Для удобства я также накатал мини-приложение: https://pastebin.com/cvJkd4Uj Подытоживая, хотелось бы отметить, что этот софт находится в разделе "программы новичков", он не преследует никаких глобальных целей и не реализует "киллер-фич", ориентируясь больше на прикладное использование. Разумеется, серверную часть можно улучшить по своему вкусу, добавив поддержку широковещательных пакетов, PING-систему и системные события по типу дисконнекта/доступности серверов, а для клинетского чата можно реализовать систему контактов и отсылку медиа-файлов. Было бы время и желание... Однако в своё время даже такой функционал неплохо сохранил нам нервы во время войн с серверной цензурой, а также экономил время, которое потребовалось для длительных полётов на разбросанные по уголкам вселенной базы. Надеюсь, для кого-нибудь эта схема будет так же полезна, как и для нас c:
  42. 1 балл
    Я уже понял, что основной смысл использования таких чатиков заключается в отыгрывании определённых ролей. Для меня этот вопрос исчерпан. Спасибо за объяснение.
  43. 1 балл
    Ты абсолютно прав: профита никакого, кроме "пацаны красауцы эжжи, четкий вещ накодили". У нас стимулом был скорее спортивный интерес по обходу серверных ограничений, и дискорды/скайпы отходили на второй план. Хотя на RP серверах подобный "первобытный" подход скорее приветствуется и считается некой изюминкой. А в глобальной перспективе да, любая текстовая коммуникация через самописные чаты или общеизвестные IRC/ICQ/Jabber морально устарела и в разы менее эффективна
  44. 1 балл
    Всем привет! Решил немного позабавиться и написать отрисовщик bmp, вот что из этого вышло: Использование: bmp24 --path=<путь до файла> Ссылки на гитхаб и пастебин: https://pastebin.com/7spSwqPG https://github.com/ov3rwrite/bmp24/tree/main Прикольно, но существует ряд ограничений которые потом (возможно) буду допиливать: только 24-разрядные bmp максимальный размер загружаемого изображения 160 на 49 100 пикселей растянуто в 2 раза из-за прямоугольного разрешения 1 символа пофикшено Bs0Dd медленно выводит Немногословно, но и сказать больше нечего. Спасибо за внимание!
  45. 1 балл
    Не знаю, как у вас, а у меня есть один пунктик - весь код должен быть аккуратненько разложен по маленьким файликам. Ну, или не очень аккуратненько... Но в любом случае, файлы размером более ста строк для меня уже становятся сложночитаемыми, и я предпочитаю их разбивать на два и более. Но встает вопрос - эти два файла надо как-то, скажем так, совместить. Думаю, эта проблема возникала не только у меня, а учитывая повышенный интерес к многофайловым установщикам, я таки решился адаптировать свою достаточно старую разработку и вывести ее в свет. Короче говоря, встречайте Unified Multi-File Application Loader, сокращенно UMFAL И что же он позволяет делать? UMFAL предоставляет возможность подгружать модули, находящиеся в произвольных подпапках вашего приложения, причем считает путь до них автоматически, вне зависимости от того, где именно ваше приложение установлено в системе пользователя. Модули в UMFAL имеют ту же самую структуру, что и модули в обычном Lua (те самые, которые подгружаются с помощью require) : local module = {} -- Заполнение модуля полезными плюхами return module Конечно, как и в обычном Lua, никто не ограничивает вам тип возвращаемого значения - только ради всего святого, не возвращайте nil, иначе UMFAL будет ругаться! Использование UMFAL на примере Предположим, у нас есть небольшая программа, имеющая следующую структуру: В этом примере run.lua - файл, который и будет запускать наше приложение - лежит в корне папки myApp, а остальные файлы (модули) - в подпапках. Инициализация приложения Поскольку run.lua является точкой входа, то есть скриптом, с выполнения которого начинается исполнение всей программы, именно в нем нам нужно инициализировать объект нашего приложения: local myApp = require("umfal").initAppFromRelative("myApplication") В данном случае используется относительная инициализация - с помощью белой (и немножко черной) магии UMFAL узнает путь до выполняемого скрипта и создает объект приложения относительно папки, в которой этот скрипт лежит. Загрузка модулей После создания мы можем использовать этот объект в собственных корыстных интересах, загружая с его помощью наши модули: local utilites = myApp.subfolder.utilities local usefullStuff = myApp.subfolder.anotherFolder.usefullStuff В результате в в переменных utilities и usefullStuff будет лежать результат исполнения метода dofile над файлами utilities.lua и usefullStuff.lua соответственно Загрузка несуществующего модуля Также важно отметить, что произойдет, когда мы попытаемся загрузить несуществующий модуль: local notUsefullStuff = myApp.subfolder.anotherFolder.notUsefullStuff В этом случае код просто бросит ошибку Получение ранее инициализированного приложения Хорошо, в скрипте точки входа мы можем загружать библиотеки, но что если нам нужно загрузить одну библиотеку из другой? В данном случае, дабы не напрягать зря воображаемые ресурсы воображаемых компьютеров, можно получить ссылку на созданное ранее приложение: local myApp = require("umfal")("myApplication") Где "myApplication" это идентификатор, который ранее был задан в качестве аргумента функции инициализации - рекомендуется устанавливать в его качестве название вашего приложения. Команда для загрузки (Pastebin) pastebin get 2q6zhL05 -f /lib/umfal.lua
  46. 1 балл
    Я вас категорически приветствую, товарищи форумчане и случайные посетители! Ваше внимания представляю свою реализацию 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. Скрины:
  47. 1 балл
    Недавно возникла проблема с тем, что понадобилось быстро загружать репозитории с несколькими файлами + я хотел поиграться с реквестами. Решение воспроизвелось в виде 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)
  48. 1 балл
    А свинка повреждается при любом приземлении, или только при быстром?
  49. 1 балл
    Банк сейчас вживую не пощупать, хотя его и можно построить по этому гайду Одной из уникальной фитч был прогресс бар для покупки энергии созданный @Totoro Тут и тонкие линии за счёт юникода + фон и тень на прогрессе, также мышкой можно менять значение позиции Хочу поделится прогресс баром @Totoro отдельно от банка https://pastebin.com/DzJvr7xF Добавил скролл мышкой и стрелками клавиатуры + мелкие правки при отрисовке мин и макс значениях Также можно указать шаг заполнения линии за одно нажатие стрелки или поворот колёсика мыши
  50. 1 балл
    Немного о установке modem версии))
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...