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

Bs0Dd

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

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

  • Посещение

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

    44

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


  1. Для опенкомпов уже есть достаточно подробная утилита OpenFetch, писанная нами на пару с _ethernalsteve в 2021 году.

    Работает под OpenOS, Plan9k и даже MineOS (через "низкоуровневую" имитацию консоли)

    По виду, в целом, максимально близок к NeoFetch-у


  2. Очередное "Лучше поздно, чем никогда". У игры еще месяцев 8 назад появился редактор задач - VVPTask.

    В этом редакторе можно создавать свои собственные "таски" для игры.

    Задачи хранятся по пути Tasks/task*.vtf, где * — номер задачи. Заменяя или добавляя задания, вы можете изменять игру, упрощая или усложняя ее.

     

    VVPTStart.png VVPTInt.png

    • Нравится 2

  3. 12 часа назад, rootmaster сказал:

    ос не готова от слова совсем

    Так и зачем ты ее выложил тогда. Я ни одну из своих программ не выкладывал ДО тех пор, пока программа не будет более-менее адекватно работать. Ты выкладываешь какую-то сырую-кривую недоОС которая выглядит ужасно, многооконностью тут и не пахнет, багов-ошибок небось до черти (грамматических точно хватает).

     

    Короче эта лайкОС - полный    a8pn4QW.png :smile3:

     

     

    Бонус: Можно круто крашнуть пэинт, если при запросе названия указать недопустимые символы (паинт все равно откроется), а потом попытаться сохранить добро)

    NWQ57dn.png

    • Спасибо 1
    • Ха-ха 1

  4. 1 час назад, vford сказал:

    Здесь могла бы помочь вставка прямой ссылки на картинку, лежащую на каком-нибудь хостинге (upload.ee, например). Но вопрос, разрешено ли это здесь?

    Как раз таки тут это по моему приветствуется

    У меня вот все картинки тут вставлены в виде ссылок на imgur.com

    И никаких проблем


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

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

    У меня так и сделано. Текст бьется на строки, вычисляется размер самой длинной и этот размер ставится на лимит. Вообще изначально и перенос текста был посимвольный, но тогда у лицензий "верстка" ехала к чертям и я чет передумал. Один черт формальная фишка.


  6. 42 минуты назад, rootmaster сказал:

    ок, не знал, да и знать не мог

    Кстати, у инсталлятора вообще-то самостоятельное название есть - WebWyse. И задумывался он как универсальный продукт, который любой желающий может в своих целях использовать.

    Насчет лицензии - по факту она тут задумывалась чисто как формальность. Никто один черт их обычно не читает. Ну а скролл по горизонтали... и как же это его реализовать то можно? :blink:

    Впрочем, по горизонтали там можно перемещаться стрелками и клавишами HOME да END.

    • Нравится 2
    • Спасибо 1

  7. 3 часа назад, rootmaster сказал:

    библиотека будет хорошо работать в Opendroid(ос которую я шас пишу)

    Оооо, готовится очередная топОС от маэстро программирования :D

     

    3 часа назад, rootmaster сказал:

    но ты просто сделай как я тебе сказал

    А ты вообще в курсе, что говоришь это НЕ автору библиотеки?

    Автор тут не появлялся с 30 января 2021 года, а потому тебя скорее всего не услышит))0

    • Одобряю 2

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

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

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

     

    Сегодня я представляю вашему вниманию универсальный, удобный и легко конфигурируемый установщик WebWyse.

     

    Video1.png Video2.png Video3.png

     

    Основной функционал:

    • Возможность встроить лицензионное соглашение (не приняв его пользователь не установит софт)
    • Проверка компьютерного оборудования на соответствие системным требованиям
    • Возможность устанавливать (или не устанавливать) дополнительные компоненты
    • Выбор папки, куда будет установлена программа
    • Интерфейс, адаптированный под все три тира видеосистем

     

    Заготовки можно найти в Репозитории GitHub.

    В качестве примера также можно использовать конфигурации установщиков для других моих продуктов вроде Mempisto, TapFAT, ВычВыжПром и MC Plus.

    • Нравится 6

  9. Обновление: Версия 0.03a

     

    Исправления:

    • Переписана существенная часть кода
    • Выкинута поддержка видеосистемы 2 уровня из-за недостаточной производительности
    • Добавлен журнал сайтов (в пределах одного сеанса) и кнопки на панели для перемещения

              vKMLitX.png

    • Добавлен просмотрщик OCIF картинок (в адресной строке укажите путь до картинки на сайте/диске и браузер ее откроет)
    • Теперь используется новый установщик (WebWyse)
    • Нравится 1
    • Одобряю 1

  10. Обновление: Версия 1.3a

     

    Исправления:

    • Небольшие баг-фиксы
    • Менеджер сам создает конфиг-файл со стандартными настройками при его отсутствии
    • Заменен почтовый адрес в справке (протух)
    • Теперь используется новый установщик (WebWyse)
    • Нравится 2
    • Спасибо 1
    • В шоке 1

  11. 18 минут назад, rootmaster сказал:

    советовал бы заколабиться с моим модом для openOS

    Самореклама, она такая)

     

    19 минут назад, rootmaster сказал:

    почему autorun.lua? он же будет всеми компами запускаться к которым диск подключают(если автозагрузка включена) правильнее было бы реализовать свою автозагрузку

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


  12. 2 часа назад, rootmaster сказал:

    lua все кто с этим модом играют знают, без этого не как

    Прекрасно помню 2014-15 год, когда познакомился с СС (а Майноська еще была лишь простенькой оболочкой для него) и OC.

    И Lua я тогда не знал, но тем не менее компики тыкал и возился, используя готовый софт. А язык освоил только году в 19, до тех пор продолжая играть с ОС. Так что вышесказанное сообщение правдивым не является ибо, думаю, людей, как я в 15 году, возможно, даже больше тех, что умеет кодить. А потому данное программное решение я бы ругать не стал, каждому свое, как говорится.

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

  13. 2 часа назад, rootmaster сказал:

    нада сам разберись

    Гениально, просто лучший ответ разработчика. В таком случае, не стоит удивляться, если твоим софтом будут пользоваться по схеме "надо, сам и пользуйся".

     

    А кстати подобная фишка у меня была кажется... точно - 

    Только тут все задокументировано).

     

    • Нравится 3

  14. 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

     

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

  15. 35 минут назад, rootmaster сказал:

    на этом тему моей не грамотности пожалуй стоит закрыть

    Не стоит). Если никто не жалуется, это еще не значит, что проблем нет. Вон, механик пожаловался, это раз. Я тоже решил высказать недовольство, это два. Думаю, еще много кто на форуме хотел бы высказать, но, из приличия и нежелания флудить, воздерживаются. Ну есть же элементарные онлайн-сервисы по проверке грамотности. Хоть ими то можно воспользоваться, чтоб текст не так по глазам резал? Читаешь документацию, ей богу, местами абсолютно не понятно, что к чему и как вообще.

     

    35 минут назад, rootmaster сказал:

    а больше и ненада не че

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


  16. Вааау, какой сногсшибательный дизайн, и какой богатый функционал, как все удобно и приятно в использовании (нет).

    w7XjTAx.png  V9KtqrA.png  7wYztvU.png  biDYHvd.png

     

    Вообще не вижу смысла плодить всякие недоОС на основе стандартной.


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

    я имею ввиду component

    Фуууух, уже же было сказано. В компьютер вшиты три библиотеки: component, computer и unicode. Они существуют сами по себе и OpenOS при загрузке только добавляет в component (и в computer вроде тоже) свои, программные функции. Потому луа файла этих библиотек и нету.


  18. loadfile и dofile отличаются тем, что первая загружает код из указанного файла и (с помощью вшитой в Lua-машину функции load) возвращает его в виде функции, которую мы можем выполнить, когда захотим. А вторая через loadfile загружает файл и сразу же его выполняет, возвращая пользователю результат функции.

    Обе функции реализованы программно

    https://github.com/MightyPirates/OpenComputers/blob/master-MC1.7.10/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua#L1-L30

     

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

    • Нравится 2
×
×
  • Создать...