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

logic

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

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

  • Посещение

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

    13

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


  1. вчера решил залепить простой устоновшик для своего мода для openOS

    я хотел сделать просто утилиту командной строки а получилось это:

    2022-03-15_11_30_17.thumb.png.f69e05d5785942ace9108f26d27b5d48.png

    это выглядит красиво на все 3 тирах мониторах, и даже на первом все красиво и корректно отображаеться

    поддерживает как сенсорный так и ввод с клавиатуры что позволит провести установку на роботе

     

    сам устоновшик:

    wget https://raw.githubusercontent.com/igorkll/openOSpath/main/installer.lua /tmp/ins.lua -f; /tmp/ins.lua


  2. 4 часа назад, ECS сказал:

    Ты используешь getenv не по назначению, отсюда и проблемы. При инициализации библиотек путь к ним не записывается в env, при запуске файлов вручную через filesystem proxy тоже, при чтении rc.d тоже. Это скорее прикладная софтверная фича OpenOS, которую удобно юзать при работе с shell для получения быстрых путей к переменным окружения, и она вовсе не является частью API файловой системы, как может показаться. Поэтому при исполнении файла через shell.execute env будет обновлен, а при исполнении через dofile/loadfile - нет

     

    OpenOS:

    
    shell.resolve(process.info().path)

    MineOS:

    
    system.getCurrentScript()

    Что угодно, включая EEPROM:

    
    local function getCurrentScriptPath()
      local info
    
      for runLevel = 0, math.huge do
        info = debug.getinfo(runLevel)
    
        if info then
          if info.what == "main" then
            return info.source:sub(2, -1)
          end
        else
          error("Failed to get debug info for runlevel " .. runLevel)
        end
      end
    end

     

    для openOS нерабочую конструкцию дал, она возвращает первую часть команды которая была выполнена в следствии чего открылась прога


  3. раньше использовал os.getenv("_") но затем окозалось что в rc это не катит(моя модификация rc делает os.setenv("_", path) а стандартная нет)

    да и на бибилтеки тоже не катит хотя и библиотеки могут состоять из нескольких файлов использовать это не реально из за этого ограницения

    так как быть? есть ли "легальный" способ узнать где лежит скрипт?


  4. В 05.06.2020 в 23:35, BrightYC сказал:

    Решил написать свой мультизагрузчик. Возможно, он похож на тот, что поставляется с комплектом MineOS, так что в целом является неплохой заменой стандартного биоса. 

     

    Установка:

     

    Для OpenOS, просто запустите эту команду:

    
    wget -f https://raw.githubusercontent.com/BrightYC/Cyan/master/installer.lua /tmp/installer.lua && /tmp/installer.lua

    Для MineOS же есть приложение в местном AppMarket, под названием Cyan BIOS. Там тоже довольно элементарно.

     

    Исходники лежат тут: https://github.com/BrightYC/Cyan

     

    Что он может?

    • Возможность загрузки/доступа к загрузчику по "белому" списку
    • Lua-интерпретатор
    • Возможность подключения компонентов "на лету"
    • Возможность отформатировать/переименовать файловую систему
    • Загрузка по интернету
       

    Доступ по белому списку:

    Ограничивает возможность управления биосом (на программном уровне), так же, если установить require user input, биос будет ждать нажатие от пользователя в белом списке.


    Shell:


    Позволяет выполнять некий код "на лету". Имплементированы следующие функции:

    • print(...)
    • proxy(componentName: string): component proxy or nil
    • sleep([timeout: number])

    Демонстрация:
     

      Показать содержимое

    WWiX2tQ.png

    pnFC0cO.png

    6QXw6LX.png

    Yi7v2n2.png


    P.S Огромное спасибо @Fingercomp за лекцию по экранированию символов.

    единственное что не понятно это зачем столько кешировать в коде, при минификации это имеет смысл

    при сжатии же это только уменьшет размер исходника но скорее всего даже увеличит размер файла после сжатия

    при сжатии кешировать имеет слысл только те переменные которые будут использоваться уже после загрузки OS(так как система может удалить их из _ENV)


  5. 1 минуту назад, eu_tomat сказал:

      

    Сильный ход. Наконец-то исходный код защищён.

     

    Темы в разделе программ без самих программ перемещаются на свалку.

    а когда будет переместиш обратно, я больше не будут исходники прятать только не бульте меня


  6. 16 часов назад, Laine_prikol сказал:

    А интернет магазин "безопасных модов" будет?

    каких безопасных модов? у меня один мод для openOS, это сборник моих библиотек приправленный исправлениям багов и перепилкой пары стандартных api он нужен для упрощения мне создания софта


  7. системы пока что не существует это только концепт

     

    начнем с первого, это не будет bios это будет ос со своими

    api и библиотеками просто записываемая на чип eeprom

    система будет приминаться преимущественно в микроконтроллерах и дронах

    а так же торговых точках на варпах

     

    у нее будет свой ui который смогут использовать программы

    а так же будет версию ос с userspace для настройки прямиком с устройства


  8. 2 часа назад, ProgramCrafter сказал:

    @rootmaster Против слива исполняемого кода не поможет ничто, если ты этот код собираешься распространять.

     

    Каким образом достать код Lua из запускаемой программы? Секрет фирмы...

      Скрыть содержимое

    Например, можно подменить функцию load, чтобы она не только компилировала текстовый код Lua в байткод, но и записывала на диск тот код, который ей скормили.

    При этом можно сделать так, чтобы этот "мод для OpenOS" не мог перезагрузить компьютер и вернуть load в исходное состояние.

     

    Так и event.push не очень много кто и что использует.

     

    Я-то уже понял. Единственная проблема - почему тот, кто читает эту тему, узнаёт об этом только на 9 комментарии? :blink:

    код можно проше достать string.dump он возврашает byte code но от туда легко выпарсить исходник

    • В шоке 1

  9. 1 час назад, ProgramCrafter сказал:

    @rootmaster Против слива исполняемого кода не поможет ничто, если ты этот код собираешься распространять.

     

    Каким образом достать код Lua из запускаемой программы? Секрет фирмы...

      Показать содержимое

    Например, можно подменить функцию load, чтобы она не только компилировала текстовый код Lua в байткод, но и записывала на диск тот код, который ей скормили.

    При этом можно сделать так, чтобы этот "мод для OpenOS" не мог перезагрузить компьютер и вернуть load в исходное состояние.

     

    Так и event.push не очень много кто и что использует.

     

    Я-то уже понял. Единственная проблема - почему тот, кто читает эту тему, узнаёт об этом только на 9 комментарии? :blink:

    так нада


  10. 20 часов назад, Bs0Dd сказал:

    It's time to analyze code))0

      Скрыть содержимое
    
    
    local a = require("event")
    local b = require("computer")
    local c = require("serialization")
    local d = require("text")
    local e = require("thread")
    local f = require("component")
    local g = require("shell")
    local h
    local i, j = g.parse(...)
    local function k(l, m)
        return h.yesno("new state at: " .. l, true, m and 2 or 1)
    end
    local function n(l)
        local o = h.inputZone(l)
        if not o or o == "" then
            return nil
        end
        if o == "inf" then
            return math.huge
        end
        if o == "-inf" then
            return -math.huge
        end
        return tonumber(o or "*")
    end
    local function p()
        _G.openHaker = {}
        _G.openHaker.settings = {}
        _G.openHaker.settings.beepAllow = true
        _G.openHaker.settings.timersTickAllow = true
        _G.openHaker.settings.listensTickAllow = true
        _G.openHaker.settings.pushAllow = true
        _G.openHaker.settings.beepCard = false
        _G.openHaker.event = {}
        _G.openHaker.event.timers = {}
        _G.openHaker.event.listens = {}
        _G.openHaker.event.registerListens = true
        _G.openHaker.event.registerTimers = true
        _G.openHaker.event.pull = a.pull
        _G.openHaker.event.push = a.push
        _G.openHaker.event.timer = a.timer
        _G.openHaker.event.listen = a.listen
        _G.openHaker.event.register = a.register
        _G.openHaker.event.cancel = a.cancel
        _G.openHaker.event.ignore = a.ignore
        _G.openHaker.computer = {}
        _G.openHaker.computer.beep = b.beep
        _G.openHaker.thread = {}
        _G.openHaker.thread.create = e.create
        _G.openHaker.thread.threads = {}
        a.push = function(...)
            if _G.openHaker.settings.pushAllow then
                return _G.openHaker.event.push(...)
            else
                return true
            end
        end
        a.timer = function(q, r, s, ...)
            if not _G.openHaker.event.registerTimers then
                return _G.openHaker.event.timer(q, r, s, ...)
            end
            checkArg(1, q, "number")
            checkArg(2, r, "function")
            checkArg(3, s, "number", "nil")
            if not s then
                s = 1
            end
            local t = r
            local u
            local v
            local function w(...)
                local x
                for y = 1, #_G.openHaker.event.timers do
                    if _G.openHaker.event.timers[y][1] == u then
                        x = y
                        break
                    end
                end
                if not x then
                    return false
                end
                if _G.openHaker.settings.timersTickAllow and _G.openHaker.event.timers[x][5] then
                    local z = {pcall(t, ...)}
                    v[4] = math.floor(v[4] - 1)
                    if z[1] then
                        if z[2] == false or v[4] <= 0 then
                            table.remove(_G.openHaker.event.timers, x)
                        end
                        return table.unpack(z, 2)
                    else
                        if v[4] <= 0 then
                            table.remove(_G.openHaker.event.timers, x)
                        end
                        error(z[2])
                    end
                end
            end
            local A = _G.openHaker.event.timer(q, w, s, ...)
            v = {A, q, t, s, true}
            table.insert(_G.openHaker.event.timers, v)
            u = A
            return A
        end
        a.register = function(l, r, ...)
            if not _G.openHaker.event.registerListens then
                return _G.openHaker.event.register(l, r, ...)
            end
            checkArg(1, l, "string", "nil", "boolean")
            checkArg(2, r, "function")
            local t = r
            local u
            local B = ({...})[2]
            local function w(...)
                local x
                for y = 1, #_G.openHaker.event.listens do
                    if _G.openHaker.event.listens[y][4] == u then
                        x = y
                        break
                    end
                end
                if not x then
                    return false
                end
                if _G.openHaker.settings.listensTickAllow and _G.openHaker.event.listens[x][5] then
                    local z = {pcall(t, ...)}
                    B = math.floor(B - 1)
                    if z[1] then
                        if z[2] == false or B <= 0 then
                            table.remove(_G.openHaker.event.listens, x)
                        end
                        return table.unpack(z, 2)
                    else
                        if B <= 0 then
                            table.remove(_G.openHaker.event.listens, x)
                        end
                        error(z[2])
                    end
                end
            end
            local A = _G.openHaker.event.register(l, w, ...)
            table.insert(_G.openHaker.event.listens, {l, t, w, A, true})
            u = A
            return A
        end
        a.ignore = function(l, r, ...)
            checkArg(1, l, "string", "nil", "boolean")
            checkArg(2, r, "function")
            local u
            local w = r
            for y = 1, #_G.openHaker.event.listens do
                if _G.openHaker.event.listens[y][2] == r and _G.openHaker.event.listens[y][1] == l then
                    w = _G.openHaker.event.listens[y][3]
                    u = y
                    break
                end
            end
            local z = _G.openHaker.event.ignore(l, w, ...)
            if z and u then
                table.remove(_G.openHaker.event.listens, u)
            end
            return z
        end
        a.cancel = function(A)
            checkArg(1, A, "number")
            for y = 1, #_G.openHaker.event.listens do
                if A == _G.openHaker.event.listens[y][4] then
                    _G.openHaker.event.cancel(_G.openHaker.event.listens[y][4])
                    table.remove(_G.openHaker.event.listens, y)
                    for y = 1, #_G.openHaker.event.timers do
                        if A == _G.openHaker.event.timers[y][1] then
                            _G.openHaker.event.cancel(_G.openHaker.event.timers[y][1])
                            table.remove(_G.openHaker.event.timers, y)
                            return true
                        end
                    end
                    return true
                end
            end
            return false
        end
        b.beep = function(...)
            if _G.openHaker.settings.beepAllow then
                local i = {...}
                if not i[1] then
                    i[1] = 440
                end
                if not i[2] then
                    i[2] = 0.1
                end
                if _G.openHaker.settings.beepCard and type(i[1]) ~= "string" and f.isAvailable("beep") then
                    f.beep.beep({[i[1]] = i[2]})
                    os.sleep(i[2])
                else
                    _G.openHaker.computer.beep(...)
                end
            end
        end
        e.create = function(r, ...)
            local C = _G.openHaker.thread.create(r, ...)
            table.insert(_G.openHaker.thread.threads, C)
            return C
        end
    end
    local function D()
        local E
        local function F()
            E = {"back"}
            for y = 1, #_G.openHaker.event.timers do
                local G = _G.openHaker.event.timers[y]
                table.insert(
                    E,
                    "index: " ..
                        y ..
                            ", num: " ..
                                math.floor(G[1]) ..
                                    ", pereud: " .. G[2] .. ", times: " .. G[4] .. ", active: " .. tostring(G[5])
                )
            end
        end
        while true do
            F()
            while true do
                local A = h.menu("timers", E)
                if A == 1 then
                    return
                else
                    A = A - 1
                    local G = _G.openHaker.event.timers[A]
                    while true do
                        F()
                        local H = ": " .. E[A + 1]
                        local I =
                            h.menu("timer control " .. H, {"back", "kill", "set pereud", "set times", "call", "set active"})
                        if I == 1 then
                            break
                        elseif I == 2 then
                            a.cancel(G[1])
                            break
                        elseif I == 3 then
                            local J = n("pereud")
                            a.cancel(G[1])
                            G[2] = J
                            a.timer(table.unpack(G, 2))
                            A = #_G.openHaker.event.timers
                        elseif I == 4 then
                            local J = n("times")
                            a.cancel(G[1])
                            G[4] = J
                            a.timer(table.unpack(G, 2))
                            A = #_G.openHaker.event.timers
                        elseif I == 5 then
                            local z = {xpcall(G[3], debug.traceback)}
                            if #z > 1 or z[1] == false then
                                local K = c.serialize(z)
                                h.splash(d.detab(K))
                            end
                        elseif I == 6 then
                            G[5] = k("activate", G[5])
                        end
                    end
                end
            end
        end
    end
    local function L()
        local E
        local function F()
            E = {"back"}
            for y = 1, #_G.openHaker.event.listens do
                local M = _G.openHaker.event.listens[y]
                table.insert(
                    E,
                    "index: " ..
                        y ..
                            ", num: " .. math.floor(M[4]) .. ", event: " .. tostring(M[1]) .. ", active: " .. tostring(M[5])
                )
            end
        end
        while true do
            F()
            local A = h.menu("listens", E)
            if A == 1 then
                return
            else
                A = A - 1
                local M = _G.openHaker.event.listens[A]
                while true do
                    F()
                    local H = ": " .. E[A + 1]
                    local I = h.menu("listen control" .. H, {"back", "kill", "call", "set active"})
                    if I == 1 then
                        break
                    elseif I == 2 then
                        a.cancel(M[4])
                        break
                    elseif I == 3 then
                        local z = {xpcall(M[2], debug.traceback)}
                        if #z > 1 or z[1] == false then
                            local K = c.serialize(z)
                            h.splash(d.detab(K))
                        end
                    elseif I == 4 then
                        M[5] = k("activate", M[5])
                    end
                end
            end
        end
    end
    local function N()
        local E
        local function F()
            E = {"back"}
            for y = 1, #_G.openHaker.thread.threads do
                local C = _G.openHaker.thread.threads[y]
                table.insert(E, "index: " .. y .. ", state: " .. C:status())
            end
        end
        while true do
            F()
            local A = h.menu("threads", E)
            if A == 1 then
                return
            else
                A = A - 1
                local C = _G.openHaker.thread.threads[A]
                while true do
                    F()
                    local H = ": " .. E[A + 1]
                    local I = h.menu("thread control" .. H, {"back", "kill", "suspend(stop)", "resume(start)"})
                    if I == 1 then
                        break
                    elseif I == 2 then
                        C:kill()
                        table.remove(_G.openHaker.thread.threads, A)
                        break
                    elseif I == 3 then
                        C:suspend()
                    elseif I == 4 then
                        C:resume()
                    end
                end
            end
        end
    end
    local function O()
        while true do
            local A =
                h.menu(
                "event",
                {"push allow", "timer tick allow", "listen tick allow", "timer menager", "listen menager", "back"}
            )
            if A == 1 then
                _G.openHaker.settings.pushAllow = k("pushAllow", _G.openHaker.settings.pushAllow)
            elseif A == 2 then
                _G.openHaker.settings.timersTickAllow = k("timersTickAllow", _G.openHaker.settings.timersTickAllow)
            elseif A == 3 then
                _G.openHaker.settings.listensTickAllow = k("listensTickAllow", _G.openHaker.settings.listensTickAllow)
            elseif A == 4 then
                D()
            elseif A == 5 then
                L()
            elseif A == 6 then
                return
            end
        end
    end
    local function P()
        while true do
            local A = h.menu("thread", {"thread menager", "back"})
            if A == 1 then
                N()
            elseif A == 2 then
                return
            end
        end
    end
    local function Q()
        while true do
            local A = h.menu("optimization", {"computer.beep to beep card", "back"})
            if A == 1 then
                _G.openHaker.settings.beepCard = k("set", _G.openHaker.settings.beepCard)
            elseif A == 2 then
                return
            end
        end
    end
    if not _G.openHaker then
        p()
    end
    if not j.l then
        h = require("simpleGui2").create()
    end
    while not j.l do
        local A = h.menu("open haker", {"event", "thread", "optimization", "back"})
        if A == 1 then
            O()
        elseif A == 2 then
            P()
        elseif A == 3 then
            Q()
        elseif A == 4 then
            h.exit()
        end
    end

     

    как мне данаело что мой код сливают, все со следующим обновлениям все проги будут ставиться прям в исполняемый файл market а лицензия проверяться через интернет если я бы хотел я сам бы выложил исходник но для конкретно этой программы я не захотел выкладывать исходник(так как на мой взгляд там плохой код), и теперь все программы с закрытым исходным кодом я буду именно так выкладывать как описал выше

    • Ха-ха 1

  11. 2 часа назад, ProgramCrafter сказал:

    It's time to go deeper :)

     

    Насколько выявил анализ кода, эта программа при запуске заменяет библиотеки event, thread на свои; то же происходит с computer.beep.

    Это позволяет управлять программами, запущенными после этого - а точнее, не давать им создавать свои события (хорошо, что никто не знает про computer.pullSignal), регистрировать слушателей, в любой момент приостанавливвать потоки - в общем, инструмент для тестов программ, наверно, был бы неплох.

    лол, computer.pushSignal почьти некто не юзает, если уж на то пошло то в _G.openHacker лежат все старые методы и настройки проги, это прога для отладки и поиграться

    • Грусть 1

  12. 41 минуту назад, Asior сказал:

    Перепроверь все ссылки, некоторые выдают 404.

     

    последняя ссылка в той теме это часть ссылки на файл(вторая часть находиться в программе getinstaller), при простом открытии она и должна выдавать 404 но если добавить к ней /filelist.txt она приведет на список файлов мода


  13. 1 минуту назад, Asior сказал:

    Потому-что нет ничего слаще, чем вскрыть "защищенный" код и разобраться как оно работает.

     

    кстати это слово пишется иначе.

    я не знаю англиканский

    • Грусть 1

  14. 1 час назад, Asior сказал:

    Для тех, кому охота поглядеть на примерный код. (спс bpm140)

      Показать содержимое
    
    
    local function a(type) return component.proxy(component.list(type)() or "") end
    local b = a("eeprom")
    local c = a("internet")
    local d = component.invoke;
    computer.setArchitecture = nil;
    local component, error, xpcall, assert, e, checkArg, pairs, type, f, g =
        component, error, xpcall, assert, computer.shutdown, checkArg, pairs, type,
        table.unpack, debug.traceback;
    local h = {
        makeReadonly = false,
        get = "",
        set = {nil, "storage is readonly"},
        setData = {nil, "storage is readonly"},
        getData = "",
        getChecksum = ""
    }
    local function i(j, k, ...)
        checkArg(1, j, "string")
        checkArg(2, k, "string")
        if j == b.address then
            for l, m in pairs(h) do
                if l == k then
                    local n = type(m)
                    if n == "table" then
                        return f(m)
                    elseif n == "function" then
                        return m(...)
                    else
                        return m
                    end
                end
            end
            return d(j, k, ...)
        else
            return d(j, k, ...)
        end
    end
    local function o() component.invoke = i end
    local function p() component.invoke = d end
    local q = a("gpu")
    local r;
    local s;
    local t, u;
    local function v()
        q = {}
        setmetatable(q, {__index = function() error("gpu and screen required") end})
    end
    if not q then
        v()
    else
        r = component.list("screen")()
        if r then
            q.bind(r)
            t, u = q.getResolution()
            s = component.invoke(r, "getKeyboards")[1]
        else
            v()
        end
    end
    local function w() q.setForeground(q.setBackground(q.getForeground())) end
    local function x() q.fill(1, 1, t, u, " ") end
    local function y(z, A)
        q.setBackground(z or 0xFFFFFF)
        q.setForeground(A or 0)
    end
    local function B(z, A)
        y(z, A)
        x()
    end
    local function C(D, E) q.set(math.ceil(t / 2 - unicode.len(D) / 2), E, D) end
    local function F(G, H, I)
        local J = I or 1;
        local E = u // 2 - #H // 2 - 1;
        if E < 0 then E = 0 end
        while true do
            B()
            local K = J // u * u;
            local L = E;
            if K == 0 then
                if q.getDepth() == 1 then
                    w()
                    C(G, 1 + L)
                    w()
                else
                    C(G, 1 + L)
                    y(nil, 0x888888)
                end
            else
                L = 0
            end
            for M = 1, #H do
                local N = M + 1 + L - K;
                if N >= 1 and N <= u then
                    if s and J == M then w() end
                    C(H[M], N)
                    if s and J == M then w() end
                end
            end
            local O, P, Q, R, S = computer.pullSignal()
            if O == "key_down" and P == s then
                if R == 200 and J > 1 then J = J - 1 end
                if R == 208 and J < #H then J = J + 1 end
                if R == 28 then return J end
            elseif O == "touch" and P == r and S == 0 then
                R = R + K - L;
                R = R - 1;
                if R >= 1 and R <= #H then return R end
            elseif O == "scroll" and P == r then
                if S == 1 and J > 1 then J = J - 1 end
                if S == -1 and J < #H then J = J + 1 end
            end
        end
    end
    local function T(G) return F(G, {"no", "no", "yes", "no"}) == 3 end
    local function U(V, E)
        if not s then error("keyboard required") end
        local W = ""
        while true do
            q.set(V, E, "_")
            local O, P, X, R = computer.pullSignal()
            if O == "key_down" and P == s then
                if R == 28 then
                    return W
                elseif R == 14 then
                    if unicode.len(W) > 0 then
                        W = unicode.sub(W, 1, unicode.len(W) - 1)
                        q.set(V, E, " ")
                        V = V - 1;
                        q.set(V, E, " ")
                    end
                elseif X ~= 0 then
                    W = W .. unicode.char(X)
                    q.set(V, E, unicode.char(X))
                    V = V + 1
                end
            elseif O == "clipboard" and P == s then
                W = W .. X;
                q.set(V, E, X)
                V = V + unicode.len(X)
                if unicode.sub(X, unicode.len(X), unicode.len(X)) == "\n" then
                    return unicode.sub(W, 1, unicode.len(W) - 1)
                end
            end
        end
    end
    local function Y(Z)
        if not r then return end
        B()
        q.set(1, 1, Z)
        q.set(1, 2, "press enter to continue...")
        while true do
            local O, P, Q, R = computer.pullSignal()
            if O == "key_down" and P == s then
                if R == 28 then break end
            elseif O == "touch" and P == r then
                break
            end
        end
    end
    local function _(D)
        B()
        q.set(1, 1, D .. ": ")
        return U(unicode.len(D) + 3, 1)
    end
    local function a0(Z, a1)
        local parts, a2 = {}, 1;
        for M = 1, #Z do
            local X = Z:sub(M, M)
            if not parts[a2] then parts[a2] = "" end
            if X == a1 then
                a2 = a2 + 1
            else
                parts[a2] = parts[a2] .. X
            end
        end
        return parts
    end
    local function a3(a4, a5)
        local a6, a7 = a4.open(a5)
        if not a6 then return nil, a7 end
        local W = ""
        while true do
            local a8 = a4.read(a6, math.huge)
            if not a8 then break end
            W = W .. a8
        end
        a4.close(a6)
        return W
    end
    local function a9(a4, a5, aa)
        local a6, a7 = a4.open(a5, "w")
        if not a6 then return nil, a7 end
        a4.write(a6, aa)
        a4.close(a6)
        return true
    end
    local function ab(ac) return a0(b.getData(), "\n")[ac] or "" end
    local function ad(ac, ae)
        if ae:find("\n") then error("\\n char") end
        parts = a0(b.getData(), "\n")
        for M = ac, 1, -1 do if not parts[M] then parts[M] = "" end end
        parts[ac] = ae;
        b.setData(table.concat(parts, "\n"))
    end
    local function af(G, P)
        local aa = {n = {}, a = {}}
        for j in component.list("filesystem") do
            aa.n[#aa.n + 1] = table.concat({
                j:sub(1, 6), component.proxy(j).getLabel()
            }, ":")
            aa.a[#aa.a + 1] = j
        end
        aa.n[#aa.n + 1] = "back"
        local I = 1;
        for M = 1, #aa.a do
            if aa.a[M] == P then
                I = M;
                break
            end
        end
        local J = F(G, aa.n, I)
        local j = aa.a[J]
        return component.proxy(j or "") and j
    end
    local function ag() if r then q.setResolution(q.maxResolution()) end end
    local function ah(j)
        local a4, aa = component.proxy(j)
        if a4.exists("/init.lua") then
            computer.getBootAddress = function() return j end;
            computer.setBootAddress = function(j)
                p()
                ad(1, j)
                o()
            end;
            aa = a3(a4, "/init.lua")
        elseif a4.exists("/OS.lua") then
            h.getData = j;
            h.setData = function(j)
                p()
                ad(1, j)
                o()
            end;
            aa = a3(a4, "/OS.lua")
        else
            error("boot file not found")
        end
        o()
        ag()
        assert(xpcall(assert(load(aa, "=init")), g))
        e()
    end
    local function ai(aj)
        if not c then return nil, "internet card is not found" end
        local ak, aa, al, am = c.request(aj), ""
        if ak then
            while true do
                al, am = ak.read(mathHuge)
                if al then
                    aa = aa .. al
                else
                    ak.close()
                    if am then
                        return nil, am
                    else
                        return aa
                    end
                end
            end
        else
            return nil, "unvalid address"
        end
    end
    local function an(ao)
        if not c then
            if not ao then Y("internet card is not found") end
            return true
        end
    end
    local function ap()
        return r and (s or math.floor(computer.getDeviceInfo()[r].width) ~= 1)
    end
    local function aq()
        local j = af("select", ab(1))
        if j then
            p()
            ad(1, j)
        end
    end
    local function ar()
        local j = af("fastboot")
        if j then ah(j) end
    end
    local function as(at)
        if an() then return end
        local aj = at;
        if not aj then
            aj = _("url")
            if aj == "" then return end
        end
        local W, a7 = ai(aj)
        if not W then
            Y(a7 or "unkown")
            return
        end
        o()
        computer.getBootAddress = function() return aj end;
        ag()
        assert(xpcall(assert(load(W, "=init")), g))
        e()
    end
    local function au()
        while true do
            B()
            q.set(1, 1, "lua: ")
            local a8 = U(6, 1)
            if a8 == "" then return end
            local R, a7 = load(a8, nil, "=lua")
            if not R then
                Y(a7 or "unkown")
            else
                o()
                local av, a7 = pcall(R)
                Y(tostring(a7 or "nil"))
            end
        end
    end
    local function aw()
        local function ax()
            local function ay(j)
                if component.proxy(j).isReadOnly() then
                    Y("drive is read only")
                    return true
                end
            end
            while true do
                local J = F("disk menager",
                            {"rename", "format", "install", "clone", "back"})
                if J == 1 then
                    local j = af("renamer")
                    if j then
                        if ay(j) then break end
                        B()
                        q.set(1, 1, "new name: ")
                        local a8 = U(11, 1)
                        if a8 ~= "" then
                            component.proxy(j).setLabel(a8)
                        end
                    end
                elseif J == 2 then
                    local j = af("formater")
                    if j then
                        if ay(j) then break end
                        if T("format? " .. j:sub(1, 6)) then
                            component.proxy(j).remove("/")
                        end
                    end
                elseif J == 3 or J == 4 then
                    local az = af("drive1")
                    if az then
                        local aA = af("drive2")
                        if aA and
                            T(
                                (J == 3 and "install" or "clone") .. " from " ..
                                    az:sub(1, 6) .. " to " .. aA:sub(1, 6) .. "?") then
                            local az = component.proxy(az)
                            local aA = component.proxy(aA)
                            if J == 4 then aA.remove("/") end
                            local function aB(a5)
                                local aa = ""
                                for aC in a5:gmatch("[^/\\]+") do
                                    aa = aC
                                end
                                return aa
                            end
                            local function aD(aE, aF, a5, aG)
                                for Q, aa in ipairs(aE.list(a5)) do
                                    local aH = a5 .. aa;
                                    if aB(aH):sub(1, 1) ~= "." or not aG then
                                        if aE.isDirectory(aH) then
                                            aF.makeDirectory(aH)
                                            aD(aE, aF, aH, aG)
                                        else
                                            assert(a9(aF, aH, assert(a3(aE, aH))))
                                        end
                                    end
                                end
                            end
                            aD(az, aA, "/", J == 3)
                        end
                    end
                elseif J == 5 then
                    return
                end
            end
        end
        local av, a7 = pcall(ax)
        if not av then Y(a7 or "unkown") end
    end
    local function aI()
        while true do
            local J = F("apps", {
                "fastboot", "internet boot", "lua", "disk menager", "back"
            })
            if J == 1 then
                ar()
            elseif J == 2 then
                as()
            elseif J == 3 then
                au()
            elseif J == 4 then
                aw()
            elseif J == 5 then
                return
            end
        end
    end
    local function aJ()
        while true do
            local J = F("top recovery", {"select", "apps", "shutdown", "back"})
            if J == 1 then
                aq()
            elseif J == 2 then
                aI()
            elseif J == 3 then
                e()
            elseif J == 4 then
                return
            end
        end
    end
    p()
    if component.proxy(ab(1)) then
        if ap() then
            B()
            q.set(1, 1, "RECOVERY MENU")
            q.set(1, 1, "boot: " .. ab(1):sub(1, 6))
            q.set(1, 2, "alt-menu")
            q.set(1, 3, "enter-boot")
            for M = 1, 50 do
                local O, P, Q, R, S = computer.pullSignal(0.1)
                if O == "key_down" and P == s then
                    if R == 56 then
                        aJ()
                        break
                    elseif R == 28 then
                        break
                    end
                elseif O == "touch" and P == r and S == 0 then
                    if R == 2 then
                        aJ()
                        break
                    elseif R == 3 then
                        break
                    end
                end
            end
        end
    else
        if ap() then
            while not component.proxy(ab(1)) do aJ() end
        else
            for j in component.list("filesystem") do
                if component.invoke(j, "exists", "/init.lua") or
                    component.invoke(j, "exists", "/OS.lua") then
                    ad(1, j)
                    break
                end
            end
        end
    end
    p()
    if not component.proxy(ab(1)) then error("boot file in not found") end
    ah(ab(1))

     

     

    поч все всегда сливают мои исходники, я то не против но я не давал вам на это разрешения

    • Нравится 1
    • Ха-ха 4
    • Грусть 2

  15. биос имеющий возможность клонировать, переименовывать и форматировать диски, а так же устонавливать с диска на диск(отличия устоновки от клонирования что при устоновке диск не форматируеться в так же пропускаються файлы начинаюшиеся с .)

     

    из фичь:

    internet boot

    зашита(биос невозможно отредактировать или прочитать из системмы хотя он не readonly)

    fastboot

    lua

    disk menager

    удален метод setArchitecture для большей безопастности

    загрузка в mineOS

    сенсорное управления

    работа без gpu и screen и keyboard(если не возможности произвести ввод(нет клавиатуры или экрана или он первого уровня) то если не будет выставленого загрузочьного диска он выбериться автоматически)

     

    устоновка:

    выберите архитектуру Lua 5.3

    введите команду "pastebin get e98eL0DX /tmp/bios.bin; flash /tmp/bios.bin -q; reboot"

     

    премичания:

    я это в mineOS app market не выкладывал какой то "человек" сделал это без указания авторства, чел пожалуйста либо укажи автора тоесть меня либо удали устоновшик из app market

    • Грусть 4

  16. 13 часа назад, eu_tomat сказал:

    Я рад, что мы по большей части понимаем друг друга. А то, что не понимаем, попробуем прояснить. Я, конечно, не филолог, но попытаюсь как-то сформулировать.

     

    Существует слово "блин". Если мы с тобой говорим о выпечке блинов, или об их вкусовых достоинствах, то это обычное, нейтральное слово. Но если ты его употребляешь, обращаясь к собеседнику, то мы все знаем, что это эвфемизм. И если ты употребил это слово, то значит, чем-то раздосадован. Собеседник, владеющий языком, воспринимает эту эмоцию именно как твою досаду. Но собеседник не знает, что с тобой происходит. Может, у тебя зуб болит. Может, ты не хочешь, чтобы он тебя спрашивал. Может, собеседник не нравится тебе лично. Он не знает, и поэтому додумывает причину сам, на свой выбор. Но на всякий случай не общается с тобой.

     

    Я приведу твоё типичное выражение "да, блин, я хз, чо там". "Блин" намекает собеседнику, что ты чем-то недоволен. "ХЗ" сообщает, что ты чего-то не знаешь, и знать не желаешь. "Да и чо ты ко мне вообще привязался" — это между строк читается. А если ты этого не имел в виду, то зачем используешь грубую форму? Что мешает сказать нейтральное "я не знаю"? Эвфемизм не меняет смысла слов. Он позволяет обойти формальные фильтры. Но мы же тут не роботы, чтобы всё воспринимать формально, все скрытые смыслы нам известны. Мы же знаем, что фраза "следить за базаром" к торговле не имеет никакого отношения. Но звучит грубо, согласись?

    молодец доходчиво объяснил, большое тебе спасибо, в предь буду менее грубым и более грамотным


  17. 18 минут назад, Totoro сказал:

    Плюс за активность и за софтину.
    Но я если честно не совсем понял в чём идея?
    То есть, при каких условиях я, как пользователь, могу захотеть установить этот пакет?
     

    Перетасованы файлы автозапуска, зачем? В чём безопасность и от кого защищаемся?
     

    Есть на дискетке. Она редко нужна, так что обычно просто диск засоряет, который не особо большой.
     

    Алиас для dmesg?
     

    Алиас для cp?
     

    Алиас для zn? )
     

    Алиас для ls -a?

     

    Они вроде и так закрывались, когда закрывалась родительская программа.

     

    Килл уже был, а почему прерывания ограничены - не особо понятно.
    Выглядит как урезание функционала Thread API.
    Далее тоже какие-то перестановки того что уже и так было.

     

    Хук для отключения достаточно просто добавляется в любую программу.
    Одна строка, если ничего не путаю.
    Не уверен что есть смысл иметь его на уровне системы, но допустим.

     

    Снова ограничения. И как определяется "первая" клава?
    Primary компонент? А если это не та которую надо?

     

    Я проверял, OpenOS работает без видеокарты и экрана.
    Просто смысла в ней меньше. Когда не нужен экран и видекарта обычно пишут код под EEPROM на микроконтроллер.

     

    Типа для компа, которому почему-то надо много видюх, но они не используются?
    Довольно редкий кейс.

    Короч, коммент уже довольно длинный, но когда читаешь вот такого рода вопросы и возникают.

    Всё вместе выглядит как рандомный набор программ и библиотек разной степени нужности.
    Это редко нужно на одном компьютере, потому что места всегда мало и его хочется экономить.

    Плюс изменения стандартного поведения библиотек OpenOS и урезание функционала.
    Это обычно плохая идея потому что вносит неразбериху в привычный порядок вещей, а профит который ты получаешь взамен не очень очевиден.

    и к стати в новой версии автозагрузка уже не выпилена из системы, а просто отключена и ее можно включить, так же теперь автозагрузка openOS не будет открывать файл из rootfs это делает мой код живущий в init.lua в следствии чего автозагрузочьный файл в rootfs будет загружен только в самую последнюю очередь


  18. 9 минут назад, Totoro сказал:

    Плюс за активность и за софтину.
    Но я если честно не совсем понял в чём идея?
    То есть, при каких условиях я, как пользователь, могу захотеть установить этот пакет?
     

    Перетасованы файлы автозапуска, зачем? В чём безопасность и от кого защищаемся?
     

    Есть на дискетке. Она редко нужна, так что обычно просто диск засоряет, который не особо большой.
     

    Алиас для dmesg?
     

    Алиас для cp?
     

    Алиас для zn? )
     

    Алиас для ls -a?

     

    Они вроде и так закрывались, когда закрывалась родительская программа.

     

    Килл уже был, а почему прерывания ограничены - не особо понятно.
    Выглядит как урезание функционала Thread API.
    Далее тоже какие-то перестановки того что уже и так было.

     

    Хук для отключения достаточно просто добавляется в любую программу.
    Одна строка, если ничего не путаю.
    Не уверен что есть смысл иметь его на уровне системы, но допустим.

     

    Снова ограничения. И как определяется "первая" клава?
    Primary компонент? А если это не та которую надо?

     

    Я проверял, OpenOS работает без видеокарты и экрана.
    Просто смысла в ней меньше. Когда не нужен экран и видекарта обычно пишут код под EEPROM на микроконтроллер.

     

    Типа для компа, которому почему-то надо много видюх, но они не используются?
    Довольно редкий кейс.

    Короч, коммент уже довольно длинный, но когда читаешь вот такого рода вопросы и возникают.

    Всё вместе выглядит как рандомный набор программ и библиотек разной степени нужности.
    Это редко нужно на одном компьютере, потому что места всегда мало и его хочется экономить.

    Плюс изменения стандартного поведения библиотек OpenOS и урезание функционала.
    Это обычно плохая идея потому что вносит неразбериху в привычный порядок вещей, а профит который ты получаешь взамен не очень очевиден.

    про ls -a я даже и не знал, а это изменения даже забыл включить в мод, про dmesg я тоже не знал, нет не алис для cp это отдельная программа, про zn я вообще не знал и ответ нет так как nchat это гуишная красивая программа использующая bigchat(моя библиотека) для ретрансляции сообщений между компиками поддерживает несколько модемов и даже соединенные карты, да openOS сама умеет работать без видеокарт просто решил написать об это в доке чтобы было понятно что я это не испортил, потоки работали на мой взгляд я это подчеркиваю очень глючно я исправил как посчитал нужным, а настройки в новых версиях уже не переноситься просто в новых версиях видеокарта подключенная в прошлый раз стоит выше приоритетом для системы а если раньше видеокарта подключена не была то система с большей "охотой" выберет самую лучшею видеокарту(вдруг у кого то apu и дискретка) и монитор


  19. 2 минуты назад, eu_tomat сказал:

    Многие наши форумчане не понимают, о чём ты пишешь. И когда ты задаёшь вопросы, тебе не отвечают не потому, что не владеют предметом, а потому что не понимают твоего вопроса. Большинство проходит мимо. Если для тебя это не проблема, то пусть так и будет. Ты имеешь право разговаривать на птичьем языке, другие имеют право с тобой не общаться. Это нормально.

     

    Но прежде чем закрывать тему грамотности, надо закрыть тему мата. И также любых намёков на мат. А то ты порой так пишешь, будто тебя кто-о заставляет писать. Вроде такого: вот, получите, только отвяжитесь. Не надо так. Людей это нервирует, они порой тоже хамят в ответ. А мы тут всё-таки привыкли расслабленно вести интеллектуальные беседы, нас читают дети, у которых психика пока не уравновешена. Не надо нам тут мата и всяких грубых выражений. 

     

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

     

    Полностью поддерживаю.

     

    А, кстати, почему не учишься-то. И каким языком владеешь? Русский-то язык ты можешь и не знать. Но существует, например, англоязычный форум. Там тоже ребята интересные.

    я тебя понимаю, в предь буду пытаться писать грамотно, а по поводу мата я его не употребляю есть блин это в вашем понимании мат то я не знаю что говорить можно, я больше не буду использовать грубые выражения и не буду писать то что потенциально сможет кого то оскорбить или расстроить, а русский единственный язык(помимо языков програмирования) который я знаю, ещё немного знаю англиканский, но на уровне базовых вещей не достаточных для общения

    • Спасибо 1

  20. 1 минуту назад, MeXaN1cK сказал:

    А нужно учиться, если хочешь с другими людьми коммуницировать и что-то им показывать. Без этого никуда.

    некто не жалуеться я норм пишу читать можно понимать тоже, я даже запятые ставить умею а больше и ненада не че меня все понимают и этого достаточьно на этом тему моей не грамотности пожалуй стоит закрыть

×
×
  • Создать...