Anon
-
Публикации
49 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные пользователем Anon
-
-
-
Truecolor
-
2
-
-
У меня давно была идея реализовать на опенкомпах клиент для какого-нибудь протокола, позволяющего подключиться к полноценному удалённому шеллу. В голову сразу приходит SSH, но я даже не стал разбираться, как он работает, ведь, он, наверное, работает очень сложно.
Поэтому мой взгляд пал на древний протокол - telnet, впервые разработанный аж в 1969 году. Сейчас его практически никто не использует, ведь все данные, включая логины и пароли, он передаёт в незашифрованном текстовом виде. Хотя и существуют расширения протокола, реализующие шифрование, мой клиент их не поддерживает
.
Репозиторий программы можно найти тут.
Установить можно в OpenOS с помощью командыwget -f https://raw.githubusercontent.com/Smok1e/oc-openos-telnet/master/installer.lua /tmp/installer.lua && /tmp/installer.lua
Синтаксис очень простой, достаточно ввести telnet <адрес> [<порт>]. По умолчанию используется порт 23.Учтите, что если вы подключаетесь к серверу по локальной сети, в конфиге мода необходимо поменять "deny private" на "allow private" в 675 строке (ну или где-то рядом).
В данный момент единственная проблема - escape последовательности. OpenOS обрабатывает некоторые из них сама, но далеко не все, из-за чего можно наблюдать различные текстовые артефакты в более-менее графонистых программах.
-
3
-
1
-
-
-
1 час назад, eu_tomat сказал:И это относится практически ко всем языкам программирования
Если сравнивать операторы и функции в моём родном с++, то, например, использование переопределённого оператора будет совершенно идентично вызову функции. Например, a + b в результате компиляции будет эквивалентно вызову operator+(a, b). Мне не удалось вспомнить ни одной операции над литеральными типами, которая в c/c++ дублировалась бы функцией, наподобие с bit32.lshift и << в луа, но, думаю, если бы я её нашёл, разницы в производительности бы не было. Сделаю предположение, что аналогичной ситуации подвергнуты почти любые компилируемые языки, и лишь скриптовые имеют подобную проблему. Например, оператор возведения в степень ** в питоне, как утверждает гугл, аж в пять раз быстрее аналогичной ему math.pow.
-
В 08.08.2022 в 18:16, VBerezin сказал:данный форк не поддерживает Lua 5.2, исключительно версию 5.3, так как используются некоторые функции, которые не поддерживаются в версии 5.2
Если это так, значит форк уже имеет минусы относительно оригинальной MineOS, которая запустится и на lua 5.2
. Если вы действительно так серьезно подошли к делу, то вы не могли не заметить старания @ECS для поддержки обеих архитектур: в зависимости от используемой в данный момент архитектуры, например, при загрузки библиотеки Color, исполняется разные версии кода. Хочу заметить, что архитектура lua 5.3 в MineOS используется вовсе не ради удобства разработчика, а в целях улучшения производительности. Битовые операторы хороши не только своим удобством, но и тем, что не требуют вызова функции, ведь в OC вызов каждой функции, в отличие от оператора, намеренно вызывает задержку.
-
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [268220; 270335] число c максимальной суммой делителей, имеющее не более четырех делителей. Для найденного числа выведите сумму делителей и количество делителей.
-
3
-
-
11 час назад, WheatComp сказал:Не совсем понял эту фразу. Во время игры пользоваться внеигровыми символьными ссылками? Чтобы программа робота обращалась к папке вне корневой папки Майнкрафта? Так мне это и требовалось. И как можно это реализовать?
Очень интересная идея. Да, из опенкомпов можно использовать симлинки, но простого ярлыка будет недостаточно - в игре он окажется обычным файлом с расширением .lnk.
Чтобы (на windows) засунуть в игровой хдд симлинк директории, нужно в cmd.exe (именно в cmd.exe, PowerShell, почему-то, такой команды не знает) прописать:
mklink /D <название ссылки> <путь к целевой директории>Например, засунем в папки /home двух компов ссылку на директорию "C:\Test". Вуяля:
-
2
-
-
Цитата-- Получаем компонент модема, вставленный в робота local modem = component.proxy(component.list("modem")())
Цитата-- Получаем компонент модема, вставленный в робота, и -- открываем любой порт по вкусу local modem = component.modem
@ECS, не опечатка ли это? В предложенном тобою коде дважды получается инстанс модема, причём, в первом случае это работать будет, а во втором, поскольку голый апи компонента не умеет возвращать прокси через точку, нет. Скорее всего, в modem запишется nil
-
Цитатау меня windows 10 pro 2019
Не надо недоговаривать. У тебя сломанная windows 10 pro 2019, из которой, насколько я знаю, удалены некоторые системные компоненты. Учитывая эти обстоятельства, разбираться в проблеме практически становится бесполезно. Переустанавливай винду или неси в сервис.
-
2
-
1
-
-
В 22.08.2022 в 13:49, eu_tomat сказал:OpenOS не навязывает структуру каталогов ни пользователям, ни программистам, что добавляет ей очков популярности. Программисты могут писать код "на коленке", концентрируясь на том, что им интересно в данный момент. Что непростительно во взрослых системах, может быть допустимым в детской OpenOS. Следование канонам здесь опционально, а не обязательно.
Если следовать канонам иерархии файловой системы здесь опционально, то стоит ли вообще следовать каким-либо канонам, называть файлы paint.lua вместо testadasfa.lua, и вообще использовать каталог /home для их хранения? Где проходит граница между "неканоничной" файловой структурой и просто безответственным распоряжением пространства диска?
Действительно, продумывать как файлы программы будут располагаться в системе - не первостепенная задача. Но когда дело доходит до распространения, уделить этому должное внимание всё же стоит. И раз уж речь зашла о канонах, думаю, очевидно, что касательно иерархии файловой системы OpenOS преследует каноны unix-подобных операционных систем. И директория для исполняемых файлов, не являющихся частью операционной системы, там тоже предусмотрена - /usr/bin. Помимо каноничности, как уже упомянул @Laine_prikol, такое размещение позволит пользователю запускать программу независимо от текущей директории. А что касается файлов, которые генерирует программа - соглашусь, что их запись в текущий каталог непредусмотрительна. Опять же, следуя канонам, достаточно создать директорию /home/.paint и записывать данные туда.
В 21.08.2022 в 16:00, logic сказал:вот более "правильная" команда для установки: mkdir /usr/bin; wget https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/paint/paint.lua /usr/bin/paint.lua
Ещё добавлю, что, с точки зрения пользователя, не совсем удобно вручную прописывать иерархию файлов программы. Для этих целей отлично подойдёт pastebin, учитывая, что клиент уже встроен в ОС. Достаточно сохранить на сайте скрипт:
os.execute("mkdir /usr/bin; wget https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/paint/paint.lua /usr/bin/paint.lua")А в качестве инструкции по установке раздавать юзерам команду pastebin run XXXXXXXX
-
На первый взгляд симпатично.
С точки зрения пользователя, интерфейс неприятно мигает, хотелось бы видеть двойную буферизацию, особенно теперь, когда с видеопамятью запилить её проще простого. На тир 3 мониторе программа уменьшает разрешение, но не восстанавливает после выхода. Тоже неприятно
Если честно, с этой программой подбор подходящих псевдографических символов (путём редактирования их шестнадцатеричного кода) для меня не стал более удобен, по сравнению со стоковой программкой symbols из MineOS, которая по сути перечисляет их список. Однако удобной фичей остаётся составление из этих символов полноценного изображения. Годным дополнением для твоей проги стал бы встроенный браузер символов, наподобие той-же symbols.
-
В 22.11.2022 в 20:42, logic сказал:почему мне пришло уведомления на это сообщения?
Я послал.
-
3 минуты назад, eu_tomat сказал:Вот более эффективный вариант сравнения таблиц игроков. При среднем онлайне 20 игроков такой способ сравнения выполняется в 3-4 раза быстрее твоего решения в лоб.
---------- конвертация предыдущего списка lastPlayers = {} for i=1, #players do lastPlayers[players[i]] = true end ---------- получение текущего списка players = getPlayers() difference = { removed={}, added={} } ---------- поиск игроков, зашедших на сервер for i, player in ipairs(players) do if lastPlayers[player] then lastPlayers[player] = nil else table.insert( difference.added, player ) end end ---------- поиск игроков, покинувших сервер for player in pairs(lastPlayers) do table.insert( difference.removed, player ) end
Это, скорее всего, не предел. Чисто алгоритмически потенциал для дальнейшего ускорения имеется, но удастся ли реализовать его именно на языке Lua, на вскидку я сказать не могу.
Ну вот, другое дело! Возьму алгоритм на заметку
-
7 минут назад, eu_tomat сказал:В первом приближении, конечно, подойдёт. Но, судя по коду, это лагодром:
- В лог пишется время с точностью до секунды, хотя программа зачем-то уточняет список игроков 20 раз в секунду.
- Время сервера зачем-то запрашивается при каждом вызове функции log, хотя она при очередном обновлении списка может вызываться более одного раза.
- Сравнение списков реализовано крайне неэффективно. При онлайне 20 игроков для оценки изменений в списке потребуется 800 сравнений строк, хотя достаточно было бы лишь 20 раз запросить поле таблицы. Во-первых, два прохода списков не требуются, всё можно сделать за один проход. Во-вторых, ассоциативные свойства таблиц позволяют отказаться от перебора одной из таблиц в длинном цикле, тем самым ускорив поиск нужного значения.
Очень дельное замечание... Было бы, если бы среди задач программы была производительность. В действительности же, в распоряжении программы целый компьютер, которому больше нечем заняться, кроме исполнения единственной программы. Лагать просто нечему. Там нет интерфейса.
Допустим, я бы ограничил частоту проверки игроков до 1 раза в секунду. Что программа будет делать остальные 950 миллисекунд?
Что ж, замечания у тебя делать получается, а вот твоего варианта программы всё нет. С нетерпением жду эффективный вариант, который, уверен, пригодится ОП, а эффективный метод сравнения таблиц я возьму себе на заметку
-
Делал пару лет назад такую прожку на очках из openglasses. Если ещё актуально могу накодить
-
Мне в голову пришло две идеи: использовать чатбокс из computronics, или дебаг-карту из opencomputers. Однако идея с чатбоксом оказалась неудачной, он не стал ловить сообщения о подключении игроков, а дебаг-карта требует наличия креатива.
В любом случае, сделать лог подключения игроков при помощи дебаг-карты у меня получилось, так что, если у тебя есть возможность её использовать, эта программа подойдёт:
Скрытый текстlocal component = require ("component") local computer = require ("computer") local fs = require ("filesystem") local dbg = component.debug ---------------------------------------------------- local timezone = 3 -- GMT+3, Moscow ---------------------------------------------------- local function getRealTime () local handle, reason = fs.open ("/tmp/timestamp", "w") if not handle then error ("failed to open " .. reason) end handle:close () local timestamp = 60*60*timezone + fs.lastModified ("/tmp/timestamp") / 1000 fs.remove ("/tmp/timestamp") return timestamp end local function log (format, ...) local text = string.format ( "[%s]: %s", os.date ("%d.%m.%Y, %X", getRealTime ()), string.format (format, ...) ) print (text) local handle, reason = fs.open ("/players.log", "a") if not handle then error (reason) end handle:write (text .. "\n") handle:close () end local function copyTable (src) local copy = {} for key, value in pairs (src) do copy[key] = value end return copy end local function findRemovedElements (src, res) local removedElements = {} for srcIndex = 1, #src do found = false for resIndex = 1, #res do if src[srcIndex] == res[resIndex] then found = true break end end if not found then table.insert (removedElements, src[srcIndex]) end end return removedElements end local function compareTableValues (a, b) return { removed = findRemovedElements (a, b), added = findRemovedElements (b, a) } end ---------------------------------------------------- print ("Press Q to exit") local running, lastPlayers = true while running do local players = dbg.getPlayers () if lastPlayers then local difference = compareTableValues (lastPlayers, players) if #difference.added > 0 then log ("%s joined the game", table.concat (difference.added, ", ")) end if #difference.removed > 0 then log ("%s left the game", table.concat (difference.removed, ", ")) end end lastPlayers = copyTable (players) local eventType, _, key = computer.pullSignal (0) if eventType == "key_down" and string.char (key) == "q" then running = false end end ----------------------------------------------------
Программа работает на OpenOS; Информация о подключении/выходе игроков отобразится на экране и запишется в файл /players.log
-
1
-
-
Поменяйте комбинацию выхода из edit.lua с ctrl+e на ctrl+w, не вижу смысла этого в десктопной версии
-
В 19.09.2022 в 05:46, Totoro сказал:Обновление приехало!
Даже сразу до 1.7.7.
(Скачивать как обычно тут - ссылка не меняется.)Скрытый текст
-
1
-
-
Проблема решена.
-
7 минут назад, Bumer_32 сказал:Ого виртуальная машина!
слева сверху на скрине конеч попадос
и да оперативе не будет хана?
Да, полноценная виртуалка, обязательно выпущу пост о ней, когда будет готова
За скрин сори) это случайно попало
Оперативы вполне хватает. Изображение экрана хранится в видеопамяти (что, кстати, минус, из-за необходимости версии мода 1.7.6).
Майнось показывает 30-40%, а в ней, между прочим, ещё и RAM-буфер юзается. Но not enough memory всё же возникает, если перезапускать виртуалку много раз подряд. Процесс сборки мусора никак не спровоцировать
-
Я готовлю большой проект - виртуальную машину OpenComputers для OpenOS, и уже достиг некоторых успехов. Но появилась серьёзная проблема:
Запустив MineOS своей виртуальной машиной и открыв там приложение palette, после пика любого цвета возникает ошибка
Заранее извиняюсь за скриншот ошибки, но отлов и сохранение её в текстовом виде занял бы много времени.
Ошибка возникает когда что-то пытается открыть файл /home/VirtualMachine1/mineos/lib/process.lua
В том месте, где это происходит, - в функции filesystem.lines апи MineOS, я дампнул стек вызовов. Вот он:
stack traceback: /Libraries/Filesystem.lua:572: in field 'lines' /Libraries/System.lua:2174: in field 'error' /OS.lua:231: in main chunk [C]: in function 'xpcall' machine:799: in global 'xpcall' virtual_bios:179: in upvalue 'executeString' virtual_bios:219: in upvalue 'boot' virtual_bios:473: in local 'tryBootFromAny' virtual_bios:485: in main chunk [C]: in function 'xpcall' machine:799: in global 'xpcall' /usr/lib/libvm.lua:110: in method 'start' /usr/bin/vm.lua:40: in main chunk (...tail calls...) [C]: in function 'xpcall' machine:799: in global 'xpcall' /lib/process.lua:63: in function </lib/process.lua:59>
Из него становится ясно, что инициатором сего действия является библиотека OpenOS - /lib/process.lua.
Тут надо немного объяснить, как вообще работает файловая система в моей виртуальной машине:
Фактически, она полностью имитирует компонент файловой системы, но ограничивает её до конкретной директории. Простыми словами, open ("/test.txt") превращается в open ("/home/VirtualMachine1/mineos/test.txt"). То же самое происходит и здесь: система пытается открыть файл "/lib/process.lua", который действительно существует, но виртуальный компонент превращает его в "/home/VirtualMachine1/mineos/lib/process.lua".
Кажется, всё и так понятно. Но с чего майноси вообще открывать системный файл OpenOS?
Тут в дело вступает трейсбек, который говорит, что нечто происходит в 63 строке модуля process. Вот ссылка на эту самую строку в гитхабе.
Здесь используется coroutine.create, которая, видимо, исполняет переданную ей функцию при пике цвета в палитре MineOS. Это всё, что мне удалось выяснить, и я понятия не имею, что с этим делать. Корутины и как они работают я знаю меньше всего из lua и opencomputers, так что буду очень рад помощи.
-
1
-
-
В 08.09.2022 в 00:04, Bumer_32 сказал:было бы ещё хорошо (хотя бы в далёком будущем) добавить поддержку аддонов
ну и полноэкранный режим (пазязя очень нада)
И зум!
-
1
-
-
Очень жду обновление до opencomputers 1.7.6
-
1
-


Цветной оболочка
в Графика
Опубликовано:
Другой цвета. Нежные больше цвет добавляет, до жути на фоне тьмы ввысь белым бил фонтан