logic
-
Публикации
287 -
Зарегистрирован
-
Посещение
-
Победитель дней
13
Сообщения, опубликованные пользователем logic
-
-
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 нерабочую конструкцию дал, она возвращает первую часть команды которая была выполнена в следствии чего открылась прога
-
раньше использовал os.getenv("_") но затем окозалось что в rc это не катит(моя модификация rc делает os.setenv("_", path) а стандартная нет)
да и на бибилтеки тоже не катит хотя и библиотеки могут состоять из нескольких файлов использовать это не реально из за этого ограницения
так как быть? есть ли "легальный" способ узнать где лежит скрипт?
-
В 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])
Демонстрация:
P.S Огромное спасибо @Fingercomp за лекцию по экранированию символов.единственное что не понятно это зачем столько кешировать в коде, при минификации это имеет смысл
при сжатии же это только уменьшет размер исходника но скорее всего даже увеличит размер файла после сжатия
при сжатии кешировать имеет слысл только те переменные которые будут использоваться уже после загрузки OS(так как система может удалить их из _ENV)
-
-
16 часов назад, Laine_prikol сказал:А интернет магазин "безопасных модов" будет?
каких безопасных модов? у меня один мод для openOS, это сборник моих библиотек приправленный исправлениям багов и перепилкой пары стандартных api он нужен для упрощения мне создания софта
-
системы пока что не существует это только концепт
начнем с первого, это не будет bios это будет ос со своими
api и библиотеками просто записываемая на чип eeprom
система будет приминаться преимущественно в микроконтроллерах и дронах
а так же торговых точках на варпах
у нее будет свой ui который смогут использовать программы
а так же будет версию ос с userspace для настройки прямиком с устройства
-
2 часа назад, ProgramCrafter сказал:@rootmaster Против слива исполняемого кода не поможет ничто, если ты этот код собираешься распространять.
Каким образом достать код Lua из запускаемой программы? Секрет фирмы...
Например, можно подменить функцию load, чтобы она не только компилировала текстовый код Lua в байткод, но и записывала на диск тот код, который ей скормили.
При этом можно сделать так, чтобы этот "мод для OpenOS" не мог перезагрузить компьютер и вернуть load в исходное состояние.
Так и event.push не очень много кто и что использует.
Я-то уже понял. Единственная проблема - почему тот, кто читает эту тему, узнаёт об этом только на 9 комментарии?
код можно проше достать string.dump он возврашает byte code но от туда легко выпарсить исходник
-
1
-
-
1 час назад, ProgramCrafter сказал:@rootmaster Против слива исполняемого кода не поможет ничто, если ты этот код собираешься распространять.
Каким образом достать код Lua из запускаемой программы? Секрет фирмы...
Например, можно подменить функцию load, чтобы она не только компилировала текстовый код Lua в байткод, но и записывала на диск тот код, который ей скормили.
При этом можно сделать так, чтобы этот "мод для OpenOS" не мог перезагрузить компьютер и вернуть load в исходное состояние.
Так и event.push не очень много кто и что использует.
Я-то уже понял. Единственная проблема - почему тот, кто читает эту тему, узнаёт об этом только на 9 комментарии?
так нада
-
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
-
-
2 часа назад, ProgramCrafter сказал:It's time to go deeper
Насколько выявил анализ кода, эта программа при запуске заменяет библиотеки event, thread на свои; то же происходит с computer.beep.
Это позволяет управлять программами, запущенными после этого - а точнее, не давать им создавать свои события (хорошо, что никто не знает про computer.pullSignal), регистрировать слушателей, в любой момент приостанавливвать потоки - в общем, инструмент для тестов программ, наверно, был бы неплох.
лол, computer.pushSignal почьти некто не юзает, если уж на то пошло то в _G.openHacker лежат все старые методы и настройки проги, это прога для отладки и поиграться
-
1
-
-
41 минуту назад, Asior сказал:Перепроверь все ссылки, некоторые выдают 404.
последняя ссылка в той теме это часть ссылки на файл(вторая часть находиться в программе getinstaller), при простом открытии она и должна выдавать 404 но если добавить к ней /filelist.txt она приведет на список файлов мода
-
43 минуты назад, eu_tomat сказал:@rootmaster Расскажи, зачем нужна эта тема со ссылкой на старую тему?
это тема программы, та тема моего мода для openOS, эта тема нужна чтобы привлечь больше людей к моиму софту
-
исправляем ошибки прошлого
-
1
-
-
1 минуту назад, Asior сказал:Потому-что нет ничего слаще, чем вскрыть "защищенный" код и разобраться как оно работает.
кстати это слово пишется иначе.
я не знаю англиканский
-
1
-
-
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
-
-
биос имеющий возможность клонировать, переименовывать и форматировать диски, а так же устонавливать с диска на диск(отличия устоновки от клонирования что при устоновке диск не форматируеться в так же пропускаються файлы начинаюшиеся с .)
из фичь:
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
-
-
почему удалили метод maxPacketSize у модема, и раз уж на то пошло почему у туннельной карты он остался
и почему отсутствует метод media у серверного дисковода
-
6 часов назад, kaka888 сказал:А можно хотя бы точки расставить в этом "тексте"?
да я уже довно во всем разобрался))
-
1
-
-
не качает клиент для игры для сервера этого форума
скачал в ручьную перейди по ссылке server1.computercraft.ru/Launcher.exe
-
13 часа назад, eu_tomat сказал:Я рад, что мы по большей части понимаем друг друга. А то, что не понимаем, попробуем прояснить. Я, конечно, не филолог, но попытаюсь как-то сформулировать.
Существует слово "блин". Если мы с тобой говорим о выпечке блинов, или об их вкусовых достоинствах, то это обычное, нейтральное слово. Но если ты его употребляешь, обращаясь к собеседнику, то мы все знаем, что это эвфемизм. И если ты употребил это слово, то значит, чем-то раздосадован. Собеседник, владеющий языком, воспринимает эту эмоцию именно как твою досаду. Но собеседник не знает, что с тобой происходит. Может, у тебя зуб болит. Может, ты не хочешь, чтобы он тебя спрашивал. Может, собеседник не нравится тебе лично. Он не знает, и поэтому додумывает причину сам, на свой выбор. Но на всякий случай не общается с тобой.
Я приведу твоё типичное выражение "да, блин, я хз, чо там". "Блин" намекает собеседнику, что ты чем-то недоволен. "ХЗ" сообщает, что ты чего-то не знаешь, и знать не желаешь. "Да и чо ты ко мне вообще привязался" — это между строк читается. А если ты этого не имел в виду, то зачем используешь грубую форму? Что мешает сказать нейтральное "я не знаю"? Эвфемизм не меняет смысла слов. Он позволяет обойти формальные фильтры. Но мы же тут не роботы, чтобы всё воспринимать формально, все скрытые смыслы нам известны. Мы же знаем, что фраза "следить за базаром" к торговле не имеет никакого отношения. Но звучит грубо, согласись?
молодец доходчиво объяснил, большое тебе спасибо, в предь буду менее грубым и более грамотным
-
18 минут назад, Totoro сказал:Плюс за активность и за софтину.
Но я если честно не совсем понял в чём идея?
То есть, при каких условиях я, как пользователь, могу захотеть установить этот пакет?
Перетасованы файлы автозапуска, зачем? В чём безопасность и от кого защищаемся?
Есть на дискетке. Она редко нужна, так что обычно просто диск засоряет, который не особо большой.
Алиас для dmesg?
Алиас для cp?
Алиас для zn? )
Алиас для ls -a?
Они вроде и так закрывались, когда закрывалась родительская программа.
Килл уже был, а почему прерывания ограничены - не особо понятно.
Выглядит как урезание функционала Thread API.
Далее тоже какие-то перестановки того что уже и так было.
Хук для отключения достаточно просто добавляется в любую программу.
Одна строка, если ничего не путаю.
Не уверен что есть смысл иметь его на уровне системы, но допустим.
Снова ограничения. И как определяется "первая" клава?
Primary компонент? А если это не та которую надо?
Я проверял, OpenOS работает без видеокарты и экрана.
Просто смысла в ней меньше. Когда не нужен экран и видекарта обычно пишут код под EEPROM на микроконтроллер.
Типа для компа, которому почему-то надо много видюх, но они не используются?
Довольно редкий кейс.
Короч, коммент уже довольно длинный, но когда читаешь вот такого рода вопросы и возникают.
Всё вместе выглядит как рандомный набор программ и библиотек разной степени нужности.
Это редко нужно на одном компьютере, потому что места всегда мало и его хочется экономить.
Плюс изменения стандартного поведения библиотек OpenOS и урезание функционала.
Это обычно плохая идея потому что вносит неразбериху в привычный порядок вещей, а профит который ты получаешь взамен не очень очевиден.и к стати в новой версии автозагрузка уже не выпилена из системы, а просто отключена и ее можно включить, так же теперь автозагрузка openOS не будет открывать файл из rootfs это делает мой код живущий в init.lua в следствии чего автозагрузочьный файл в rootfs будет загружен только в самую последнюю очередь
-
9 минут назад, Totoro сказал:Плюс за активность и за софтину.
Но я если честно не совсем понял в чём идея?
То есть, при каких условиях я, как пользователь, могу захотеть установить этот пакет?
Перетасованы файлы автозапуска, зачем? В чём безопасность и от кого защищаемся?
Есть на дискетке. Она редко нужна, так что обычно просто диск засоряет, который не особо большой.
Алиас для dmesg?
Алиас для cp?
Алиас для zn? )
Алиас для ls -a?
Они вроде и так закрывались, когда закрывалась родительская программа.
Килл уже был, а почему прерывания ограничены - не особо понятно.
Выглядит как урезание функционала Thread API.
Далее тоже какие-то перестановки того что уже и так было.
Хук для отключения достаточно просто добавляется в любую программу.
Одна строка, если ничего не путаю.
Не уверен что есть смысл иметь его на уровне системы, но допустим.
Снова ограничения. И как определяется "первая" клава?
Primary компонент? А если это не та которую надо?
Я проверял, OpenOS работает без видеокарты и экрана.
Просто смысла в ней меньше. Когда не нужен экран и видекарта обычно пишут код под EEPROM на микроконтроллер.
Типа для компа, которому почему-то надо много видюх, но они не используются?
Довольно редкий кейс.
Короч, коммент уже довольно длинный, но когда читаешь вот такого рода вопросы и возникают.
Всё вместе выглядит как рандомный набор программ и библиотек разной степени нужности.
Это редко нужно на одном компьютере, потому что места всегда мало и его хочется экономить.
Плюс изменения стандартного поведения библиотек OpenOS и урезание функционала.
Это обычно плохая идея потому что вносит неразбериху в привычный порядок вещей, а профит который ты получаешь взамен не очень очевиден.про ls -a я даже и не знал, а это изменения даже забыл включить в мод, про dmesg я тоже не знал, нет не алис для cp это отдельная программа, про zn я вообще не знал и ответ нет так как nchat это гуишная красивая программа использующая bigchat(моя библиотека) для ретрансляции сообщений между компиками поддерживает несколько модемов и даже соединенные карты, да openOS сама умеет работать без видеокарт просто решил написать об это в доке чтобы было понятно что я это не испортил, потоки работали на мой взгляд я это подчеркиваю очень глючно я исправил как посчитал нужным, а настройки в новых версиях уже не переноситься просто в новых версиях видеокарта подключенная в прошлый раз стоит выше приоритетом для системы а если раньше видеокарта подключена не была то система с большей "охотой" выберет самую лучшею видеокарту(вдруг у кого то apu и дискретка) и монитор
-
2 минуты назад, eu_tomat сказал:Многие наши форумчане не понимают, о чём ты пишешь. И когда ты задаёшь вопросы, тебе не отвечают не потому, что не владеют предметом, а потому что не понимают твоего вопроса. Большинство проходит мимо. Если для тебя это не проблема, то пусть так и будет. Ты имеешь право разговаривать на птичьем языке, другие имеют право с тобой не общаться. Это нормально.
Но прежде чем закрывать тему грамотности, надо закрыть тему мата. И также любых намёков на мат. А то ты порой так пишешь, будто тебя кто-о заставляет писать. Вроде такого: вот, получите, только отвяжитесь. Не надо так. Людей это нервирует, они порой тоже хамят в ответ. А мы тут всё-таки привыкли расслабленно вести интеллектуальные беседы, нас читают дети, у которых психика пока не уравновешена. Не надо нам тут мата и всяких грубых выражений.
Вот, ты обещал мне не использовать эвфемизмов матерных слов, но всё-таки использовал. Предлагаю тебе самостоятельно всё подчистить, потому что в следующий раз я не поленюсь, пролистаю все твои старые посты и за каждый старый выдам предупреждение, и всё это вместе потянет на временный бан. Ты не сочувствуешь людям, которые тебя читают, и я тоже не буду проявлять сочувствие.
Полностью поддерживаю.
А, кстати, почему не учишься-то. И каким языком владеешь? Русский-то язык ты можешь и не знать. Но существует, например, англоязычный форум. Там тоже ребята интересные.
я тебя понимаю, в предь буду пытаться писать грамотно, а по поводу мата я его не употребляю есть блин это в вашем понимании мат то я не знаю что говорить можно, я больше не буду использовать грубые выражения и не буду писать то что потенциально сможет кого то оскорбить или расстроить, а русский единственный язык(помимо языков програмирования) который я знаю, ещё немного знаю англиканский, но на уровне базовых вещей не достаточных для общения
-
1
-
-
1 минуту назад, MeXaN1cK сказал:А нужно учиться, если хочешь с другими людьми коммуницировать и что-то им показывать. Без этого никуда.
некто не жалуеться я норм пишу читать можно понимать тоже, я даже запятые ставить умею а больше и ненада не че меня все понимают и этого достаточьно на этом тему моей не грамотности пожалуй стоит закрыть





стильный устоновшик
в Графика
Опубликовано: · Изменено пользователем rootmaster
вчера решил залепить простой устоновшик для своего мода для openOS
я хотел сделать просто утилиту командной строки а получилось это:
это выглядит красиво на все 3 тирах мониторах, и даже на первом все красиво и корректно отображаеться
поддерживает как сенсорный так и ввод с клавиатуры что позволит провести установку на роботе
сам устоновшик:
wget https://raw.githubusercontent.com/igorkll/openOSpath/main/installer.lua /tmp/ins.lua -f; /tmp/ins.lua