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

Anon

Пользователи
  • Публикации

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

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные пользователем Anon


  1. У меня давно была идея реализовать на опенкомпах клиент для какого-нибудь протокола, позволяющего подключиться к полноценному удалённому шеллу. В голову сразу приходит 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 строке (ну или где-то рядом).

     

    telnet.png

     

    В данный момент единственная проблема - escape последовательности. OpenOS обрабатывает некоторые из них сама, но далеко не все, из-за чего можно наблюдать различные текстовые артефакты в более-менее графонистых программах.

    • Нравится 3
    • Одобряю 1

  2. 1 час назад, eu_tomat сказал:

    И это относится практически ко всем языкам программирования

    Если сравнивать операторы и функции в моём родном с++, то, например, использование переопределённого оператора будет совершенно идентично вызову функции. Например, a + b в результате компиляции будет эквивалентно вызову operator+(a, b). Мне не удалось вспомнить ни одной операции над литеральными типами, которая в c/c++ дублировалась бы функцией, наподобие с bit32.lshift и << в луа, но, думаю, если бы я её нашёл, разницы в производительности бы не было. Сделаю предположение, что аналогичной ситуации подвергнуты почти любые компилируемые языки, и лишь скриптовые имеют подобную проблему. Например, оператор возведения в степень ** в питоне, как утверждает гугл, аж в пять раз быстрее аналогичной ему math.pow.


  3. В 08.08.2022 в 18:16, VBerezin сказал:

    данный форк не поддерживает Lua 5.2, исключительно версию 5.3, так как используются некоторые функции, которые не поддерживаются в версии 5.2

    Если это так, значит форк уже имеет минусы относительно оригинальной MineOS, которая запустится и на lua 5.2:smile44:. Если вы действительно так серьезно подошли к делу, то вы не могли не заметить старания @ECS для поддержки обеих архитектур: в зависимости от используемой в данный момент архитектуры, например, при загрузки библиотеки Color, исполняется разные версии кода. Хочу заметить, что архитектура lua 5.3 в MineOS используется вовсе не ради удобства разработчика, а в целях улучшения производительности. Битовые операторы хороши не только своим удобством, но и тем, что не требуют вызова функции, ведь в OC вызов каждой функции, в отличие от оператора, намеренно вызывает задержку.


  4. Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [268220; 270335] число c максимальной суммой делителей, имеющее не более четырех делителей. Для найденного числа выведите сумму делителей и количество делителей.

    • Грусть 3

  5. 11 час назад, WheatComp сказал:

    Не совсем понял эту фразу. Во время игры пользоваться внеигровыми символьными ссылками? Чтобы программа робота обращалась к папке вне корневой папки Майнкрафта? Так мне это и требовалось. И как можно это реализовать?

    Очень интересная идея. Да, из опенкомпов можно использовать симлинки, но простого ярлыка будет недостаточно - в игре он окажется обычным файлом с расширением .lnk. 

     

    Чтобы (на windows) засунуть в игровой хдд симлинк директории, нужно в cmd.exe (именно в cmd.exe, PowerShell, почему-то, такой команды не знает) прописать:

    mklink /D <название ссылки> <путь к целевой директории>

     

    Например, засунем в папки /home двух компов ссылку на директорию "C:\Test". Вуяля:

    symlink.gif

    • Нравится 2

  6. Цитата
    
    -- Получаем компонент модема, вставленный в робота
    local modem = component.proxy(component.list("modem")())
    Цитата
    
    -- Получаем компонент модема, вставленный в робота, и
    -- открываем любой порт по вкусу
    local modem = component.modem

    @ECS, не опечатка ли это? В предложенном тобою коде дважды получается инстанс модема, причём, в первом случае это работать будет, а во втором, поскольку голый апи компонента не умеет возвращать прокси через точку, нет. Скорее всего, в modem запишется nil


  7. Цитата

    у меня windows 10 pro 2019

    Не надо недоговаривать. У тебя сломанная windows 10 pro 2019, из которой, насколько я знаю, удалены некоторые системные компоненты. Учитывая эти обстоятельства, разбираться в проблеме практически становится бесполезно. Переустанавливай винду или неси в сервис.

    • Ха-ха 2
    • Грусть 1

  8. В 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 :D


  9. На первый взгляд симпатично.

     

    С точки зрения пользователя, интерфейс неприятно мигает, хотелось бы видеть двойную буферизацию, особенно теперь, когда с видеопамятью запилить её проще простого. На тир 3 мониторе программа уменьшает разрешение, но не восстанавливает после выхода. Тоже неприятно

     

    Если честно, с этой программой подбор подходящих псевдографических символов (путём редактирования их шестнадцатеричного кода) для меня не стал более удобен, по сравнению со стоковой программкой symbols из MineOS, которая по сути перечисляет их список. Однако удобной фичей остаётся составление из этих символов полноценного изображения. Годным дополнением для твоей проги стал бы встроенный браузер символов, наподобие той-же symbols.

     

     


  10. 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, на вскидку я сказать не могу.

     

    Ну вот, другое дело! Возьму алгоритм на заметку


  11. 7 минут назад, eu_tomat сказал:

    В первом приближении, конечно, подойдёт. Но, судя по коду, это лагодром:

    • В лог пишется время с точностью до секунды, хотя программа зачем-то уточняет список игроков 20 раз в секунду.
    • Время сервера зачем-то запрашивается при каждом вызове функции log, хотя она при очередном обновлении списка может вызываться более одного раза.
    • Сравнение списков реализовано крайне неэффективно. При онлайне 20 игроков для оценки изменений в списке потребуется 800 сравнений строк, хотя достаточно было бы лишь 20 раз запросить поле таблицы. Во-первых, два прохода списков не требуются, всё можно сделать за один проход. Во-вторых, ассоциативные свойства таблиц позволяют отказаться от перебора одной из таблиц в длинном цикле, тем самым ускорив поиск нужного значения.

     

    Очень дельное замечание... Было бы, если бы среди задач программы была производительность. В действительности же, в распоряжении программы целый компьютер, которому больше нечем заняться, кроме исполнения единственной программы. Лагать просто нечему. Там нет интерфейса. 

    Допустим, я бы ограничил частоту проверки игроков до 1 раза в секунду. Что программа будет делать остальные 950 миллисекунд?

    Что ж, замечания у тебя делать получается, а вот твоего варианта программы всё нет. С нетерпением жду эффективный вариант, который, уверен, пригодится ОП, а эффективный метод сравнения таблиц я возьму себе на заметку


  12. Мне в голову пришло две идеи: использовать чатбокс из 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
    
    ----------------------------------------------------

     

    209249138-2d098f17-2d55-4d8a-89ab-63e2c9

     

    Программа работает на OpenOS; Информация о подключении/выходе игроков отобразится на экране и запишется в файл /players.log

    • Нравится 1

  13. 7 минут назад, Bumer_32 сказал:

    Ого виртуальная машина!

    слева сверху на скрине конеч попадос

    и да оперативе не будет хана?

    Да, полноценная виртуалка, обязательно выпущу пост о ней, когда будет готова

    За скрин сори) это случайно попало

    Оперативы вполне хватает. Изображение экрана хранится в видеопамяти (что, кстати, минус, из-за необходимости версии мода 1.7.6).

    Майнось показывает 30-40%, а в ней, между прочим, ещё и RAM-буфер юзается. Но not enough memory всё же возникает, если перезапускать виртуалку много раз подряд. Процесс сборки мусора никак не спровоцировать


  14. Я готовлю большой проект - виртуальную машину OpenComputers для OpenOS, и уже достиг некоторых успехов. Но появилась серьёзная проблема:

    Запустив MineOS своей виртуальной машиной и открыв там приложение palette, после пика любого цвета возникает ошибка

    image.thumb.png.20731e6b3701156e33c4ec38ab1e9dc9.png

     

    Заранее извиняюсь за скриншот ошибки, но отлов и сохранение её в текстовом виде занял бы много времени.

    Ошибка возникает когда что-то пытается открыть файл /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
×
×
  • Создать...