Bs0Dd
-
Публикации
124 -
Зарегистрирован
-
Посещение
-
Победитель дней
44
Сообщения, опубликованные пользователем Bs0Dd
-
-
Для опенкомпов уже есть достаточно подробная утилита OpenFetch, писанная нами на пару с _ethernalsteve в 2021 году.
Работает под OpenOS, Plan9k и даже MineOS (через "низкоуровневую" имитацию консоли)
По виду, в целом, максимально близок к NeoFetch-у
-
Очередное "Лучше поздно, чем никогда". У игры еще месяцев 8 назад появился редактор задач - VVPTask.
В этом редакторе можно создавать свои собственные "таски" для игры.
Задачи хранятся по пути Tasks/task*.vtf, где * — номер задачи. Заменяя или добавляя задания, вы можете изменять игру, упрощая или усложняя ее.
-
2
-
-
В кои-то веки вспомнил про незакоммиченный (уж год как) мелкий багфикс, связанный со списком доп. компонентов для установки.
Подправил и обновил. Лучше поздно, чем никогда.
-
4
-
-
-
12 часа назад, rootmaster сказал:ос не готова от слова совсем
Так и зачем ты ее выложил тогда. Я ни одну из своих программ не выкладывал ДО тех пор, пока программа не будет более-менее адекватно работать. Ты выкладываешь какую-то сырую-кривую недоОС которая выглядит ужасно, многооконностью тут и не пахнет, багов-ошибок небось до черти (грамматических точно хватает).
Короче эта лайкОС - полный
Бонус: Можно круто крашнуть пэинт, если при запросе названия указать недопустимые символы (паинт все равно откроется), а потом попытаться сохранить добро)
-
1
-
1
-
-
1 час назад, vford сказал:Здесь могла бы помочь вставка прямой ссылки на картинку, лежащую на каком-нибудь хостинге (upload.ee, например). Но вопрос, разрешено ли это здесь?
Как раз таки тут это по моему приветствуется
У меня вот все картинки тут вставлены в виде ссылок на imgur.com
И никаких проблем
-
5 минут назад, ECS сказал:А для простого скроллинга достаточно вычислить размер самой длинной строки в исходном тексте и выставить его в качестве лимита прокрутки скроллбара
У меня так и сделано. Текст бьется на строки, вычисляется размер самой длинной и этот размер ставится на лимит. Вообще изначально и перенос текста был посимвольный, но тогда у лицензий "верстка" ехала к чертям и я чет передумал. Один черт формальная фишка.
-
42 минуты назад, rootmaster сказал:ок, не знал, да и знать не мог
Кстати, у инсталлятора вообще-то самостоятельное название есть - WebWyse. И задумывался он как универсальный продукт, который любой желающий может в своих целях использовать.
Насчет лицензии - по факту она тут задумывалась чисто как формальность. Никто один черт их обычно не читает. Ну а скролл по горизонтали... и как же это его реализовать то можно?
Впрочем, по горизонтали там можно перемещаться стрелками и клавишами HOME да END.
-
2
-
1
-
-
3 часа назад, rootmaster сказал:библиотека будет хорошо работать в Opendroid(ос которую я шас пишу)
Оооо, готовится очередная топОС от маэстро программирования
3 часа назад, rootmaster сказал:но ты просто сделай как я тебе сказал
А ты вообще в курсе, что говоришь это НЕ автору библиотеки?
Автор тут не появлялся с 30 января 2021 года, а потому тебя скорее всего не услышит))0
-
2
-
-
Думаю авторы, чьи программы состоят более чем из одного файла, задумываются о том, как все эти файлы грузить конечному пользователю.
Этой проблемой задался и я, а потому изначально воспользовался слегка модифицированным установщиком Игоря.
Однако данный инсталлятор. в силу своей простоты, не очень удобен и малофункционален. Поэтому возникло желание сделать свой.
Сегодня я представляю вашему вниманию универсальный, удобный и легко конфигурируемый установщик WebWyse.
Основной функционал:
- Возможность встроить лицензионное соглашение (не приняв его пользователь не установит софт)
- Проверка компьютерного оборудования на соответствие системным требованиям
- Возможность устанавливать (или не устанавливать) дополнительные компоненты
- Выбор папки, куда будет установлена программа
- Интерфейс, адаптированный под все три тира видеосистем
Заготовки можно найти в Репозитории GitHub.
В качестве примера также можно использовать конфигурации установщиков для других моих продуктов вроде Mempisto, TapFAT, ВычВыжПром и MC Plus.
-
6
-
Обновление: Версия 0.03a
Исправления:
- Переписана существенная часть кода
- Выкинута поддержка видеосистемы 2 уровня из-за недостаточной производительности
- Добавлен журнал сайтов (в пределах одного сеанса) и кнопки на панели для перемещения
- Добавлен просмотрщик OCIF картинок (в адресной строке укажите путь до картинки на сайте/диске и браузер ее откроет)
- Теперь используется новый установщик (WebWyse)
-
1
-
1
-
Обновление: Версия 1.3a
Исправления:
- Небольшие баг-фиксы
- Менеджер сам создает конфиг-файл со стандартными настройками при его отсутствии
- Заменен почтовый адрес в справке (протух)
- Теперь используется новый установщик (WebWyse)
-
2
-
1
-
1
-
https://github.com/IgorTimofeev/OCIFImageConverter
Аккурат недавно я ее чутка дорабатывал для поддержки свежих оцифов
Ой, пока писал, Игорь ответил))0)
-
18 минут назад, rootmaster сказал:советовал бы заколабиться с моим модом для openOS
Самореклама, она такая)
19 минут назад, rootmaster сказал:почему autorun.lua? он же будет всеми компами запускаться к которым диск подключают(если автозагрузка включена) правильнее было бы реализовать свою автозагрузку
Так это же система для планшетов, а насколько я помню, диск оттуда можно вытащить только разобрав его. Так что в данном случае я не вижу никакого смысла в этом.
-
2 часа назад, rootmaster сказал:lua все кто с этим модом играют знают, без этого не как
Прекрасно помню 2014-15 год, когда познакомился с СС (а Майноська еще была лишь простенькой оболочкой для него) и OC.
И Lua я тогда не знал, но тем не менее компики тыкал и возился, используя готовый софт. А язык освоил только году в 19, до тех пор продолжая играть с ОС. Так что вышесказанное сообщение правдивым не является ибо, думаю, людей, как я в 15 году, возможно, даже больше тех, что умеет кодить. А потому данное программное решение я бы ругать не стал, каждому свое, как говорится.
-
3
-
1
-
-
2 часа назад, rootmaster сказал:нада сам разберись
Гениально, просто лучший ответ разработчика. В таком случае, не стоит удивляться, если твоим софтом будут пользоваться по схеме "надо, сам и пользуйся".
А кстати подобная фишка у меня была кажется... точно -
Только тут все задокументировано).
-
3
-
-
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
-
-
Упс, косякнул, удалите)
-
35 минут назад, rootmaster сказал:на этом тему моей не грамотности пожалуй стоит закрыть
Не стоит). Если никто не жалуется, это еще не значит, что проблем нет. Вон, механик пожаловался, это раз. Я тоже решил высказать недовольство, это два. Думаю, еще много кто на форуме хотел бы высказать, но, из приличия и нежелания флудить, воздерживаются. Ну есть же элементарные онлайн-сервисы по проверке грамотности. Хоть ими то можно воспользоваться, чтоб текст не так по глазам резал? Читаешь документацию, ей богу, местами абсолютно не понятно, что к чему и как вообще.
35 минут назад, rootmaster сказал:а больше и ненада не че
С таким девизом далеко по жизни не пойдешь, говорю сразу. Попомнишь мои слова потом, через несколько лет...
-
дмю этг вже дстчн чтб сдлть св вывад а сыстэмэ))00)
-
4
-
-
Вааау, какой сногсшибательный дизайн, и какой богатый функционал, как все удобно и приятно в использовании (нет).
Вообще не вижу смысла плодить всякие недоОС на основе стандартной.
-
17 минут назад, rootmaster сказал:КАК? че за браиль такой, и де он живет
https://ru.wikipedia.org/wiki/Шрифт_Брайля
В опенкомпах получаются по стандартным юникодовским адресам
-
2 минуты назад, ItsMakar сказал:я имею ввиду component
Фуууух, уже же было сказано. В компьютер вшиты три библиотеки: component, computer и unicode. Они существуют сами по себе и OpenOS при загрузке только добавляет в component (и в computer вроде тоже) свои, программные функции. Потому луа файла этих библиотек и нету.
-
loadfile и dofile отличаются тем, что первая загружает код из указанного файла и (с помощью вшитой в Lua-машину функции load) возвращает его в виде функции, которую мы можем выполнить, когда захотим. А вторая через loadfile загружает файл и сразу же его выполняет, возвращая пользователю результат функции.
Обе функции реализованы программно
Про require уже было сказано тут. Она ищет библиотеку либо в своей кеш-таблице (если ее уже загружали), либо ищет по стандартным путям и если находит, через loadfile загружает ее, сохраняет в кеш-таблицу и отдает пользователю.
-
2
-

Кассетная псевдо ФС
в Библиотеки
Опубликовано:
Лучше уж TapFAT поставить, он куда более полноценный, да и вроде на актуальном Lua работает
Хотя я давно уже ее забросил, развития в любом случае не будет...